OSDN Git Service

ice: Add package PTYPE enable information
authorHaiyue Wang <haiyue.wang@intel.com>
Fri, 16 Jul 2021 22:16:42 +0000 (15:16 -0700)
committerTony Nguyen <anthony.l.nguyen@intel.com>
Tue, 14 Dec 2021 16:06:47 +0000 (08:06 -0800)
Scan the 'Marker Ptype TCAM' section to retrieve the Rx parser PTYPE
enable information from the current package.

Signed-off-by: Haiyue Wang <haiyue.wang@intel.com>
Tested-by: Tony Brelinski <tony.brelinski@intel.com>
Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
drivers/net/ethernet/intel/ice/ice_flex_pipe.c
drivers/net/ethernet/intel/ice/ice_flex_pipe.h
drivers/net/ethernet/intel/ice/ice_flex_type.h
drivers/net/ethernet/intel/ice/ice_type.h

index 6ad1c25..8b8209a 100644 (file)
@@ -314,6 +314,78 @@ ice_pkg_enum_entry(struct ice_seg *ice_seg, struct ice_pkg_enum *state,
 }
 
 /**
+ * ice_hw_ptype_ena - check if the PTYPE is enabled or not
+ * @hw: pointer to the HW structure
+ * @ptype: the hardware PTYPE
+ */
+bool ice_hw_ptype_ena(struct ice_hw *hw, u16 ptype)
+{
+       return ptype < ICE_FLOW_PTYPE_MAX &&
+              test_bit(ptype, hw->hw_ptype);
+}
+
+/**
+ * ice_marker_ptype_tcam_handler
+ * @sect_type: section type
+ * @section: pointer to section
+ * @index: index of the Marker PType TCAM entry to be returned
+ * @offset: pointer to receive absolute offset, always 0 for ptype TCAM sections
+ *
+ * This is a callback function that can be passed to ice_pkg_enum_entry.
+ * Handles enumeration of individual Marker PType TCAM entries.
+ */
+static void *
+ice_marker_ptype_tcam_handler(u32 sect_type, void *section, u32 index,
+                             u32 *offset)
+{
+       struct ice_marker_ptype_tcam_section *marker_ptype;
+
+       if (sect_type != ICE_SID_RXPARSER_MARKER_PTYPE)
+               return NULL;
+
+       if (index > ICE_MAX_MARKER_PTYPE_TCAMS_IN_BUF)
+               return NULL;
+
+       if (offset)
+               *offset = 0;
+
+       marker_ptype = section;
+       if (index >= le16_to_cpu(marker_ptype->count))
+               return NULL;
+
+       return marker_ptype->tcam + index;
+}
+
+/**
+ * ice_fill_hw_ptype - fill the enabled PTYPE bit information
+ * @hw: pointer to the HW structure
+ */
+static void ice_fill_hw_ptype(struct ice_hw *hw)
+{
+       struct ice_marker_ptype_tcam_entry *tcam;
+       struct ice_seg *seg = hw->seg;
+       struct ice_pkg_enum state;
+
+       bitmap_zero(hw->hw_ptype, ICE_FLOW_PTYPE_MAX);
+       if (!seg)
+               return;
+
+       memset(&state, 0, sizeof(state));
+
+       do {
+               tcam = ice_pkg_enum_entry(seg, &state,
+                                         ICE_SID_RXPARSER_MARKER_PTYPE, NULL,
+                                         ice_marker_ptype_tcam_handler);
+               if (tcam &&
+                   le16_to_cpu(tcam->addr) < ICE_MARKER_PTYPE_TCAM_ADDR_MAX &&
+                   le16_to_cpu(tcam->ptype) < ICE_FLOW_PTYPE_MAX)
+                       set_bit(le16_to_cpu(tcam->ptype), hw->hw_ptype);
+
+               seg = NULL;
+       } while (tcam);
+}
+
+/**
  * ice_boost_tcam_handler
  * @sect_type: section type
  * @section: pointer to section
@@ -1488,6 +1560,7 @@ enum ice_status ice_init_pkg(struct ice_hw *hw, u8 *buf, u32 len)
                 */
                ice_init_pkg_regs(hw);
                ice_fill_blk_tbls(hw);
+               ice_fill_hw_ptype(hw);
                ice_get_prof_index_max(hw);
        } else {
                ice_debug(hw, ICE_DBG_INIT, "package load failed, %d\n",
index a2863f3..863a3f5 100644 (file)
@@ -40,6 +40,10 @@ int ice_udp_tunnel_set_port(struct net_device *netdev, unsigned int table,
 int ice_udp_tunnel_unset_port(struct net_device *netdev, unsigned int table,
                              unsigned int idx, struct udp_tunnel_info *ti);
 
+/* Rx parser PTYPE functions */
+bool ice_hw_ptype_ena(struct ice_hw *hw, u16 ptype);
+
+/* XLT2/VSI group functions */
 enum ice_status
 ice_add_prof(struct ice_hw *hw, enum ice_block blk, u64 id, u8 ptypes[],
             const struct ice_ptype_attributes *attr, u16 attr_cnt,
index 0f572a3..a8246fb 100644 (file)
@@ -160,6 +160,7 @@ struct ice_meta_sect {
 #define ICE_SID_CDID_KEY_BUILDER_RSS   47
 #define ICE_SID_CDID_REDIR_RSS         48
 
+#define ICE_SID_RXPARSER_MARKER_PTYPE  55
 #define ICE_SID_RXPARSER_BOOST_TCAM    56
 #define ICE_SID_TXPARSER_BOOST_TCAM    66
 
@@ -329,6 +330,25 @@ struct ice_boost_tcam_section {
        sizeof(struct ice_boost_tcam_entry), \
        sizeof(struct ice_boost_tcam_entry))
 
+/* package Marker Ptype TCAM entry */
+struct ice_marker_ptype_tcam_entry {
+#define ICE_MARKER_PTYPE_TCAM_ADDR_MAX 1024
+       __le16 addr;
+       __le16 ptype;
+       u8 keys[20];
+};
+
+struct ice_marker_ptype_tcam_section {
+       __le16 count;
+       __le16 reserved;
+       struct ice_marker_ptype_tcam_entry tcam[];
+};
+
+#define ICE_MAX_MARKER_PTYPE_TCAMS_IN_BUF      \
+       ICE_MAX_ENTRIES_IN_BUF(struct_size((struct ice_marker_ptype_tcam_section *)0, tcam, 1) - \
+       sizeof(struct ice_marker_ptype_tcam_entry), \
+       sizeof(struct ice_marker_ptype_tcam_entry))
+
 struct ice_xlt1_section {
        __le16 count;
        __le16 offset;
index 9e0c292..1f35821 100644 (file)
@@ -919,6 +919,7 @@ struct ice_hw {
        struct mutex rss_locks; /* protect RSS configuration */
        struct list_head rss_list_head;
        struct ice_mbx_snapshot mbx_snapshot;
+       DECLARE_BITMAP(hw_ptype, ICE_FLOW_PTYPE_MAX);
        u16 io_expander_handle;
 };