@@ -482,7 +482,8 @@ static void
hns3_parse_capability(struct hns3_hw *hw,
struct hns3_query_version_cmd *cmd)
{
- uint32_t caps = rte_le_to_cpu_32(cmd->caps[0]);
+ uint64_t caps = ((uint64_t)rte_le_to_cpu_32(cmd->caps[1]) << 32) |
+ rte_le_to_cpu_32(cmd->caps[0]);
if (hns3_get_bit(caps, HNS3_CAPS_FD_QUEUE_REGION_B))
hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_FD_QUEUE_REGION_B,
@@ -524,6 +525,8 @@ hns3_parse_capability(struct hns3_hw *hw,
hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_FC_AUTO_B, 1);
if (hns3_get_bit(caps, HNS3_CAPS_GRO_B))
hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_GRO_B, 1);
+ if (hns3_get_bit(caps, HNS3_CAPS_VF_MULTI_TCS_B))
+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, 1);
}
static uint32_t
@@ -326,6 +326,7 @@ enum HNS3_CAPS_BITS {
HNS3_CAPS_TM_B = 19,
HNS3_CAPS_GRO_B = 20,
HNS3_CAPS_FC_AUTO_B = 30,
+ HNS3_CAPS_VF_MULTI_TCS_B = 34,
};
/* Capabilities of VF dependent on the PF */
@@ -335,6 +336,7 @@ enum HNS3VF_CAPS_BITS {
* in kernel side PF.
*/
HNS3VF_CAPS_VLAN_FLT_MOD_B = 0,
+ HNS3VF_CAPS_MULTI_TCS_B = 1,
};
enum HNS3_API_CAP_BITS {
@@ -105,7 +105,8 @@ hns3_get_dev_feature_capability(FILE *file, struct hns3_hw *hw)
{HNS3_DEV_SUPPORT_TM_B, "TM"},
{HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, "VF VLAN FILTER MOD"},
{HNS3_DEV_SUPPORT_FC_AUTO_B, "FC AUTO"},
- {HNS3_DEV_SUPPORT_GRO_B, "GRO"}
+ {HNS3_DEV_SUPPORT_GRO_B, "GRO"},
+ {HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, "VF MULTI TCS"},
};
uint32_t i;
@@ -916,6 +916,7 @@ enum hns3_dev_cap {
HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B,
HNS3_DEV_SUPPORT_FC_AUTO_B,
HNS3_DEV_SUPPORT_GRO_B,
+ HNS3_DEV_SUPPORT_VF_MULTI_TCS_B,
};
#define hns3_dev_get_support(hw, _name) \
@@ -815,12 +815,45 @@ hns3vf_get_queue_info(struct hns3_hw *hw)
return hns3vf_check_tqp_info(hw);
}
+static void
+hns3vf_update_multi_tcs_cap(struct hns3_hw *hw, uint32_t pf_multi_tcs_bit)
+{
+ uint8_t resp_msg[HNS3_MBX_MAX_RESP_DATA_SIZE];
+ struct hns3_vf_to_pf_msg req;
+ int ret;
+
+ if (!hns3_dev_get_support(hw, VF_MULTI_TCS))
+ return;
+
+ if (pf_multi_tcs_bit == 0) {
+ /*
+ * Early PF driver versions may don't report
+ * HNS3VF_CAPS_MULTI_TCS_B when VF query basic info, so clear
+ * the corresponding capability bit.
+ */
+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, 0);
+ return;
+ }
+
+ /*
+ * Early PF driver versions may also report HNS3VF_CAPS_MULTI_TCS_B
+ * when VF query basic info, but they don't support query TC info
+ * mailbox message, so clear the corresponding capability bit.
+ */
+ hns3vf_mbx_setup(&req, HNS3_MBX_GET_TC, HNS3_MBX_GET_PRIO_MAP);
+ ret = hns3vf_mbx_send(hw, &req, true, resp_msg, sizeof(resp_msg));
+ if (ret)
+ hns3_set_bit(hw->capability, HNS3_DEV_SUPPORT_VF_MULTI_TCS_B, 0);
+}
+
static void
hns3vf_update_caps(struct hns3_hw *hw, uint32_t caps)
{
if (hns3_get_bit(caps, HNS3VF_CAPS_VLAN_FLT_MOD_B))
hns3_set_bit(hw->capability,
HNS3_DEV_SUPPORT_VF_VLAN_FLT_MOD_B, 1);
+
+ hns3vf_update_multi_tcs_cap(hw, hns3_get_bit(caps, HNS3VF_CAPS_MULTI_TCS_B));
}
static int
@@ -48,6 +48,9 @@ enum HNS3_MBX_OPCODE {
HNS3_MBX_HANDLE_VF_TBL = 38, /* (VF -> PF) store/clear hw cfg tbl */
HNS3_MBX_GET_RING_VECTOR_MAP, /* (VF -> PF) get ring-to-vector map */
+
+ HNS3_MBX_GET_TC = 47, /* (VF -> PF) get tc info of PF configured */
+
HNS3_MBX_PUSH_LINK_STATUS = 201, /* (IMP -> PF) get port link status */
};
@@ -59,6 +62,10 @@ struct hns3_basic_info {
uint32_t caps;
};
+enum hns3_mbx_get_tc_subcode {
+ HNS3_MBX_GET_PRIO_MAP = 0, /* query priority to tc map */
+};
+
/* below are per-VF mac-vlan subcodes */
enum hns3_mbx_mac_vlan_subcode {
HNS3_MBX_MAC_VLAN_UC_MODIFY = 0, /* modify UC mac addr */