net/ngbe: add simple Rx flow
[dpdk.git] / drivers / common / iavf / virtchnl.h
index e3eb767..1cf0866 100644 (file)
@@ -6,8 +6,9 @@
 #define _VIRTCHNL_H_
 
 /* Description:
- * This header file describes the VF-PF communication protocol used
- * by the drivers for all devices starting from our 40G product line
+ * This header file describes the Virtual Function (VF) - Physical Function
+ * (PF) communication protocol used by the drivers for all devices starting
+ * from our 40G product line
  *
  * Admin queue buffer usage:
  * desc->opcode is always aqc_opc_send_msg_to_pf
@@ -21,8 +22,8 @@
  * have a maximum of sixteen queues for all of its VSIs.
  *
  * The PF is required to return a status code in v_retval for all messages
- * except RESET_VF, which does not require any response. The return value
- * is of status_code type, defined in the shared type.h.
+ * except RESET_VF, which does not require any response. The returned value
+ * is of virtchnl_status_code type, defined in the shared type.h.
  *
  * In general, VF driver initialization should roughly follow the order of
  * these opcodes. The VF driver must first validate the API version of the
@@ -84,6 +85,10 @@ enum virtchnl_rx_hsplit {
        VIRTCHNL_RX_HSPLIT_SPLIT_SCTP    = 8,
 };
 
+enum virtchnl_bw_limit_type {
+       VIRTCHNL_BW_SHAPER = 0,
+};
+
 #define VIRTCHNL_ETH_LENGTH_OF_ADDRESS 6
 /* END GENERIC DEFINES */
 
@@ -129,6 +134,7 @@ enum virtchnl_ops {
        VIRTCHNL_OP_ADD_CLOUD_FILTER = 32,
        VIRTCHNL_OP_DEL_CLOUD_FILTER = 33,
        /* opcodes 34, 35, 36, and 37 are reserved */
+       VIRTCHNL_OP_DCF_CONFIG_BW = 37,
        VIRTCHNL_OP_DCF_VLAN_OFFLOAD = 38,
        VIRTCHNL_OP_DCF_CMD_DESC = 39,
        VIRTCHNL_OP_DCF_CMD_BUFF = 40,
@@ -151,6 +157,8 @@ enum virtchnl_ops {
        VIRTCHNL_OP_DISABLE_VLAN_INSERTION_V2 = 57,
        VIRTCHNL_OP_ENABLE_VLAN_FILTERING_V2 = 58,
        VIRTCHNL_OP_DISABLE_VLAN_FILTERING_V2 = 59,
+       VIRTCHNL_OP_GET_QOS_CAPS = 66,
+       VIRTCHNL_OP_CONFIG_QUEUE_TC_MAP = 67,
        VIRTCHNL_OP_ENABLE_QUEUES_V2 = 107,
        VIRTCHNL_OP_DISABLE_QUEUES_V2 = 108,
        VIRTCHNL_OP_MAP_QUEUE_VECTOR = 111,
@@ -287,8 +295,12 @@ static inline const char *virtchnl_op_str(enum virtchnl_ops v_opcode)
 
 struct virtchnl_msg {
        u8 pad[8];                       /* AQ flags/opcode/len/retval fields */
-       enum virtchnl_ops v_opcode; /* avoid confusion with desc->opcode */
-       enum virtchnl_status_code v_retval;  /* ditto for desc->retval */
+
+       /* avoid confusion with desc->opcode */
+       enum virtchnl_ops v_opcode;
+
+       /* ditto for desc->retval */
+       enum virtchnl_status_code v_retval;
        u32 vfid;                        /* used by PF when sending to VF */
 };
 
@@ -354,7 +366,9 @@ enum virtchnl_vsi_type {
 struct virtchnl_vsi_resource {
        u16 vsi_id;
        u16 num_queue_pairs;
-       enum virtchnl_vsi_type vsi_type;
+
+       /* see enum virtchnl_vsi_type */
+       s32 vsi_type;
        u16 qset_handle;
        u8 default_mac_addr[VIRTCHNL_ETH_LENGTH_OF_ADDRESS];
 };
@@ -365,36 +379,36 @@ VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_vsi_resource);
  * VIRTCHNL_VF_OFFLOAD_L2 flag is inclusive of base mode L2 offloads including
  * TX/RX Checksum offloading and TSO for non-tunnelled packets.
  */
-#define VIRTCHNL_VF_OFFLOAD_L2                 0x00000001
-#define VIRTCHNL_VF_OFFLOAD_IWARP              0x00000002
-#define VIRTCHNL_VF_OFFLOAD_RSVD               0x00000004
-#define VIRTCHNL_VF_OFFLOAD_RSS_AQ             0x00000008
-#define VIRTCHNL_VF_OFFLOAD_RSS_REG            0x00000010
-#define VIRTCHNL_VF_OFFLOAD_WB_ON_ITR          0x00000020
-#define VIRTCHNL_VF_OFFLOAD_REQ_QUEUES         0x00000040
-#define VIRTCHNL_VF_OFFLOAD_CRC                        0x00000080
-       /* 0X00000100 is reserved */
-#define VIRTCHNL_VF_LARGE_NUM_QPAIRS           0x00000200
-#define VIRTCHNL_VF_OFFLOAD_VLAN_V2            0x00008000
-#define VIRTCHNL_VF_OFFLOAD_VLAN               0x00010000
-#define VIRTCHNL_VF_OFFLOAD_RX_POLLING         0x00020000
-#define VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2      0x00040000
-#define VIRTCHNL_VF_OFFLOAD_RSS_PF             0X00080000
-#define VIRTCHNL_VF_OFFLOAD_ENCAP              0X00100000
-#define VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM         0X00200000
-#define VIRTCHNL_VF_OFFLOAD_RX_ENCAP_CSUM      0X00400000
-#define VIRTCHNL_VF_OFFLOAD_ADQ                        0X00800000
-#define VIRTCHNL_VF_OFFLOAD_ADQ_V2             0X01000000
-#define VIRTCHNL_VF_OFFLOAD_USO                        0X02000000
-#define VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC       0X04000000
-#define VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF         0X08000000
-#define VIRTCHNL_VF_OFFLOAD_FDIR_PF            0X10000000
-       /* 0X20000000 is reserved */
-#define VIRTCHNL_VF_CAP_DCF                    0X40000000
-       /* 0X80000000 is reserved */
-
-/* Define below the capability flags that are not offloads */
-#define VIRTCHNL_VF_CAP_ADV_LINK_SPEED         0x00000080
+#define VIRTCHNL_VF_OFFLOAD_L2                 BIT(0)
+#define VIRTCHNL_VF_OFFLOAD_IWARP              BIT(1)
+#define VIRTCHNL_VF_OFFLOAD_RSVD               BIT(2)
+#define VIRTCHNL_VF_OFFLOAD_RSS_AQ             BIT(3)
+#define VIRTCHNL_VF_OFFLOAD_RSS_REG            BIT(4)
+#define VIRTCHNL_VF_OFFLOAD_WB_ON_ITR          BIT(5)
+#define VIRTCHNL_VF_OFFLOAD_REQ_QUEUES         BIT(6)
+/* used to negotiate communicating link speeds in Mbps */
+#define VIRTCHNL_VF_CAP_ADV_LINK_SPEED         BIT(7)
+       /* BIT(8) is reserved */
+#define VIRTCHNL_VF_LARGE_NUM_QPAIRS           BIT(9)
+#define VIRTCHNL_VF_OFFLOAD_CRC                        BIT(10)
+#define VIRTCHNL_VF_OFFLOAD_VLAN_V2            BIT(15)
+#define VIRTCHNL_VF_OFFLOAD_VLAN               BIT(16)
+#define VIRTCHNL_VF_OFFLOAD_RX_POLLING         BIT(17)
+#define VIRTCHNL_VF_OFFLOAD_RSS_PCTYPE_V2      BIT(18)
+#define VIRTCHNL_VF_OFFLOAD_RSS_PF             BIT(19)
+#define VIRTCHNL_VF_OFFLOAD_ENCAP              BIT(20)
+#define VIRTCHNL_VF_OFFLOAD_ENCAP_CSUM         BIT(21)
+#define VIRTCHNL_VF_OFFLOAD_RX_ENCAP_CSUM      BIT(22)
+#define VIRTCHNL_VF_OFFLOAD_ADQ                        BIT(23)
+#define VIRTCHNL_VF_OFFLOAD_ADQ_V2             BIT(24)
+#define VIRTCHNL_VF_OFFLOAD_USO                        BIT(25)
+#define VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC       BIT(26)
+#define VIRTCHNL_VF_OFFLOAD_ADV_RSS_PF         BIT(27)
+#define VIRTCHNL_VF_OFFLOAD_FDIR_PF            BIT(28)
+#define VIRTCHNL_VF_OFFLOAD_QOS                BIT(29)
+#define VIRTCHNL_VF_CAP_DCF                    BIT(30)
+       /* BIT(31) is reserved */
+
 #define VF_BASE_MODE_OFFLOADS (VIRTCHNL_VF_OFFLOAD_L2 | \
                               VIRTCHNL_VF_OFFLOAD_VLAN | \
                               VIRTCHNL_VF_OFFLOAD_RSS_PF)
@@ -432,6 +446,54 @@ struct virtchnl_txq_info {
 
 VIRTCHNL_CHECK_STRUCT_LEN(24, virtchnl_txq_info);
 
+/* RX descriptor IDs (range from 0 to 63) */
+enum virtchnl_rx_desc_ids {
+       VIRTCHNL_RXDID_0_16B_BASE               = 0,
+       /* 32B_BASE and FLEX_SPLITQ share desc ids as default descriptors
+        * because they can be differentiated based on queue model; e.g. single
+        * queue model can only use 32B_BASE and split queue model can only use
+        * FLEX_SPLITQ.  Having these as 1 allows them to be used as default
+        * descriptors without negotiation.
+        */
+       VIRTCHNL_RXDID_1_32B_BASE               = 1,
+       VIRTCHNL_RXDID_1_FLEX_SPLITQ            = 1,
+       VIRTCHNL_RXDID_2_FLEX_SQ_NIC            = 2,
+       VIRTCHNL_RXDID_3_FLEX_SQ_SW             = 3,
+       VIRTCHNL_RXDID_4_FLEX_SQ_NIC_VEB        = 4,
+       VIRTCHNL_RXDID_5_FLEX_SQ_NIC_ACL        = 5,
+       VIRTCHNL_RXDID_6_FLEX_SQ_NIC_2          = 6,
+       VIRTCHNL_RXDID_7_HW_RSVD                = 7,
+       /* 9 through 15 are reserved */
+       VIRTCHNL_RXDID_16_COMMS_GENERIC         = 16,
+       VIRTCHNL_RXDID_17_COMMS_AUX_VLAN        = 17,
+       VIRTCHNL_RXDID_18_COMMS_AUX_IPV4        = 18,
+       VIRTCHNL_RXDID_19_COMMS_AUX_IPV6        = 19,
+       VIRTCHNL_RXDID_20_COMMS_AUX_FLOW        = 20,
+       VIRTCHNL_RXDID_21_COMMS_AUX_TCP         = 21,
+       /* 22 through 63 are reserved */
+};
+
+/* RX descriptor ID bitmasks */
+enum virtchnl_rx_desc_id_bitmasks {
+       VIRTCHNL_RXDID_0_16B_BASE_M             = BIT(VIRTCHNL_RXDID_0_16B_BASE),
+       VIRTCHNL_RXDID_1_32B_BASE_M             = BIT(VIRTCHNL_RXDID_1_32B_BASE),
+       VIRTCHNL_RXDID_1_FLEX_SPLITQ_M          = BIT(VIRTCHNL_RXDID_1_FLEX_SPLITQ),
+       VIRTCHNL_RXDID_2_FLEX_SQ_NIC_M          = BIT(VIRTCHNL_RXDID_2_FLEX_SQ_NIC),
+       VIRTCHNL_RXDID_3_FLEX_SQ_SW_M           = BIT(VIRTCHNL_RXDID_3_FLEX_SQ_SW),
+       VIRTCHNL_RXDID_4_FLEX_SQ_NIC_VEB_M      = BIT(VIRTCHNL_RXDID_4_FLEX_SQ_NIC_VEB),
+       VIRTCHNL_RXDID_5_FLEX_SQ_NIC_ACL_M      = BIT(VIRTCHNL_RXDID_5_FLEX_SQ_NIC_ACL),
+       VIRTCHNL_RXDID_6_FLEX_SQ_NIC_2_M        = BIT(VIRTCHNL_RXDID_6_FLEX_SQ_NIC_2),
+       VIRTCHNL_RXDID_7_HW_RSVD_M              = BIT(VIRTCHNL_RXDID_7_HW_RSVD),
+       /* 9 through 15 are reserved */
+       VIRTCHNL_RXDID_16_COMMS_GENERIC_M       = BIT(VIRTCHNL_RXDID_16_COMMS_GENERIC),
+       VIRTCHNL_RXDID_17_COMMS_AUX_VLAN_M      = BIT(VIRTCHNL_RXDID_17_COMMS_AUX_VLAN),
+       VIRTCHNL_RXDID_18_COMMS_AUX_IPV4_M      = BIT(VIRTCHNL_RXDID_18_COMMS_AUX_IPV4),
+       VIRTCHNL_RXDID_19_COMMS_AUX_IPV6_M      = BIT(VIRTCHNL_RXDID_19_COMMS_AUX_IPV6),
+       VIRTCHNL_RXDID_20_COMMS_AUX_FLOW_M      = BIT(VIRTCHNL_RXDID_20_COMMS_AUX_FLOW),
+       VIRTCHNL_RXDID_21_COMMS_AUX_TCP_M       = BIT(VIRTCHNL_RXDID_21_COMMS_AUX_TCP),
+       /* 22 through 63 are reserved */
+};
+
 /* VIRTCHNL_OP_CONFIG_RX_QUEUE
  * VF sends this message to set up parameters for one RX queue.
  * External data buffer contains one instance of virtchnl_rxq_info.
@@ -454,11 +516,17 @@ struct virtchnl_rxq_info {
        u32 databuffer_size;
        u32 max_pkt_size;
        u8 crc_disable;
-       /* only used when VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC is supported */
+       /* see enum virtchnl_rx_desc_ids;
+        * only used when VIRTCHNL_VF_OFFLOAD_RX_FLEX_DESC is supported. Note
+        * that when the offload is not supported, the descriptor format aligns
+        * with VIRTCHNL_RXDID_1_32B_BASE.
+        */
        u8 rxdid;
        u8 pad1[2];
        u64 dma_ring_addr;
-       enum virtchnl_rx_hsplit rx_split_pos; /* deprecated with AVF 1.0 */
+
+       /* see enum virtchnl_rx_hsplit; deprecated with AVF 1.0 */
+       s32 rx_split_pos;
        u32 pad2;
 };
 
@@ -1213,14 +1281,26 @@ enum virtchnl_flow_type {
 struct virtchnl_filter {
        union   virtchnl_flow_spec data;
        union   virtchnl_flow_spec mask;
-       enum    virtchnl_flow_type flow_type;
-       enum    virtchnl_action action;
+
+       /* see enum virtchnl_flow_type */
+       s32     flow_type;
+
+       /* see enum virtchnl_action */
+       s32     action;
        u32     action_meta;
        u8      field_flags;
 };
 
 VIRTCHNL_CHECK_STRUCT_LEN(272, virtchnl_filter);
 
+struct virtchnl_shaper_bw {
+       /* Unit is Kbps */
+       u32 committed;
+       u32 peak;
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(8, virtchnl_shaper_bw);
+
 /* VIRTCHNL_OP_DCF_GET_VSI_MAP
  * VF sends this message to get VSI mapping table.
  * PF responds with an indirect message containing VF's
@@ -1293,7 +1373,39 @@ struct virtchnl_dcf_vlan_offload {
 
 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_dcf_vlan_offload);
 
+struct virtchnl_dcf_bw_cfg {
+       u8 tc_num;
+#define VIRTCHNL_DCF_BW_CIR            BIT(0)
+#define VIRTCHNL_DCF_BW_PIR            BIT(1)
+       u8 bw_type;
+       u8 pad[2];
+       enum virtchnl_bw_limit_type type;
+       union {
+               struct virtchnl_shaper_bw shaper;
+               u8 pad2[32];
+       };
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_dcf_bw_cfg);
+
+/* VIRTCHNL_OP_DCF_CONFIG_BW
+ * VF send this message to set the bandwidth configuration of each
+ * TC with a specific vf id. The flag node_type is to indicate that
+ * this message is to configure VSI node or TC node bandwidth.
+ */
+struct virtchnl_dcf_bw_cfg_list {
+       u16 vf_id;
+       u8 num_elem;
+#define VIRTCHNL_DCF_TARGET_TC_BW      0
+#define VIRTCHNL_DCF_TARGET_VF_BW      1
+       u8 node_type;
+       struct virtchnl_dcf_bw_cfg cfg[1];
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(44, virtchnl_dcf_bw_cfg_list);
+
 struct virtchnl_supported_rxdids {
+       /* see enum virtchnl_rx_desc_id_bitmasks */
        u64 supported_rxdids;
 };
 
@@ -1318,7 +1430,8 @@ enum virtchnl_event_codes {
 #define PF_EVENT_SEVERITY_CERTAIN_DOOM 255
 
 struct virtchnl_pf_event {
-       enum virtchnl_event_codes event;
+       /* see enum virtchnl_event_codes */
+       s32 event;
        union {
                /* If the PF driver does not support the new speed reporting
                 * capabilities then use link_event else use link_event_adv to
@@ -1415,9 +1528,7 @@ enum virtchnl_proto_hdr_type {
        VIRTCHNL_PROTO_HDR_S_VLAN,
        VIRTCHNL_PROTO_HDR_C_VLAN,
        VIRTCHNL_PROTO_HDR_IPV4,
-       VIRTCHNL_PROTO_HDR_IPV4_FRAG,
        VIRTCHNL_PROTO_HDR_IPV6,
-       VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
        VIRTCHNL_PROTO_HDR_TCP,
        VIRTCHNL_PROTO_HDR_UDP,
        VIRTCHNL_PROTO_HDR_SCTP,
@@ -1432,6 +1543,15 @@ enum virtchnl_proto_hdr_type {
        VIRTCHNL_PROTO_HDR_PFCP,
        VIRTCHNL_PROTO_HDR_GTPC,
        VIRTCHNL_PROTO_HDR_ECPRI,
+       VIRTCHNL_PROTO_HDR_L2TPV2,
+       VIRTCHNL_PROTO_HDR_PPP,
+       /* IPv4 and IPv6 Fragment header types are only associated to
+        * VIRTCHNL_PROTO_HDR_IPV4 and VIRTCHNL_PROTO_HDR_IPV6 respectively,
+        * cannot be used independently.
+        */
+       VIRTCHNL_PROTO_HDR_IPV4_FRAG,
+       VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG,
+       VIRTCHNL_PROTO_HDR_GRE,
 };
 
 /* Protocol header field within a protocol header. */
@@ -1454,8 +1574,6 @@ enum virtchnl_proto_hdr_field {
        VIRTCHNL_PROTO_HDR_IPV4_DSCP,
        VIRTCHNL_PROTO_HDR_IPV4_TTL,
        VIRTCHNL_PROTO_HDR_IPV4_PROT,
-       VIRTCHNL_PROTO_HDR_IPV4_FRAG_PKID =
-               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4_FRAG),
        /* IPV6 */
        VIRTCHNL_PROTO_HDR_IPV6_SRC =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6),
@@ -1476,9 +1594,6 @@ enum virtchnl_proto_hdr_field {
        VIRTCHNL_PROTO_HDR_IPV6_PREFIX64_DST,
        VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_SRC,
        VIRTCHNL_PROTO_HDR_IPV6_PREFIX96_DST,
-       /* IPv6 Extension Header Fragment */
-       VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID =
-               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG),
        /* TCP */
        VIRTCHNL_PROTO_HDR_TCP_SRC_PORT =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_TCP),
@@ -1521,10 +1636,17 @@ enum virtchnl_proto_hdr_field {
        VIRTCHNL_PROTO_HDR_ECPRI_MSG_TYPE =
                PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_ECPRI),
        VIRTCHNL_PROTO_HDR_ECPRI_PC_RTC_ID,
+       /* IPv4 Dummy Fragment */
+       VIRTCHNL_PROTO_HDR_IPV4_FRAG_PKID =
+               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV4_FRAG),
+       /* IPv6 Extension Fragment */
+       VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG_PKID =
+               PROTO_HDR_FIELD_START(VIRTCHNL_PROTO_HDR_IPV6_EH_FRAG),
 };
 
 struct virtchnl_proto_hdr {
-       enum virtchnl_proto_hdr_type type;
+       /* see enum virtchnl_proto_hdr_type */
+       s32 type;
        u32 field_selector; /* a bit mask to select field for header type */
        u8 buffer[64];
        /**
@@ -1553,7 +1675,9 @@ VIRTCHNL_CHECK_STRUCT_LEN(2312, virtchnl_proto_hdrs);
 
 struct virtchnl_rss_cfg {
        struct virtchnl_proto_hdrs proto_hdrs;     /* protocol headers */
-       enum virtchnl_rss_algorithm rss_algorithm; /* rss algorithm type */
+
+       /* see enum virtchnl_rss_algorithm; rss algorithm type */
+       s32 rss_algorithm;
        u8 reserved[128];                          /* reserve for future */
 };
 
@@ -1561,7 +1685,8 @@ VIRTCHNL_CHECK_STRUCT_LEN(2444, virtchnl_rss_cfg);
 
 /* action configuration for FDIR */
 struct virtchnl_filter_action {
-       enum virtchnl_action type;
+       /* see enum virtchnl_action type */
+       s32 type;
        union {
                /* used for queue and qgroup action */
                struct {
@@ -1668,7 +1793,9 @@ struct virtchnl_fdir_add {
        u16 validate_only; /* INPUT */
        u32 flow_id;       /* OUTPUT */
        struct virtchnl_fdir_rule rule_cfg; /* INPUT */
-       enum virtchnl_fdir_prgm_status status; /* OUTPUT */
+
+       /* see enum virtchnl_fdir_prgm_status; OUTPUT */
+       s32 status;
 };
 
 VIRTCHNL_CHECK_STRUCT_LEN(2616, virtchnl_fdir_add);
@@ -1681,11 +1808,69 @@ struct virtchnl_fdir_del {
        u16 vsi_id;  /* INPUT */
        u16 pad;
        u32 flow_id; /* INPUT */
-       enum virtchnl_fdir_prgm_status status; /* OUTPUT */
+
+       /* see enum virtchnl_fdir_prgm_status; OUTPUT */
+       s32 status;
 };
 
 VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_fdir_del);
 
+/* VIRTCHNL_OP_GET_QOS_CAPS
+ * VF sends this message to get its QoS Caps, such as
+ * TC number, Arbiter and Bandwidth.
+ */
+struct virtchnl_qos_cap_elem {
+       u8 tc_num;
+       u8 tc_prio;
+#define VIRTCHNL_ABITER_STRICT      0
+#define VIRTCHNL_ABITER_ETS         2
+       u8 arbiter;
+#define VIRTCHNL_STRICT_WEIGHT      1
+       u8 weight;
+       enum virtchnl_bw_limit_type type;
+       union {
+               struct virtchnl_shaper_bw shaper;
+               u8 pad2[32];
+       };
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(40, virtchnl_qos_cap_elem);
+
+struct virtchnl_qos_cap_list {
+       u16 vsi_id;
+       u16 num_elem;
+       struct virtchnl_qos_cap_elem cap[1];
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(44, virtchnl_qos_cap_list);
+
+/* VIRTCHNL_OP_CONFIG_QUEUE_TC_MAP
+ * VF sends message virtchnl_queue_tc_mapping to set queue to tc
+ * mapping for all the Tx and Rx queues with a specified VSI, and
+ * would get response about bitmap of valid user priorities
+ * associated with queues.
+ */
+struct virtchnl_queue_tc_mapping {
+       u16 vsi_id;
+       u16 num_tc;
+       u16 num_queue_pairs;
+       u8 pad[2];
+       union {
+               struct {
+                       u16 start_queue_id;
+                       u16 queue_count;
+               } req;
+               struct {
+#define VIRTCHNL_USER_PRIO_TYPE_UP     0
+#define VIRTCHNL_USER_PRIO_TYPE_DSCP   1
+                       u16 prio_type;
+                       u16 valid_prio_bitmap;
+               } resp;
+       } tc[1];
+};
+
+VIRTCHNL_CHECK_STRUCT_LEN(12, virtchnl_queue_tc_mapping);
+
 /* VIRTCHNL_OP_QUERY_FDIR_FILTER
  * VF sends this request to PF by filling out vsi_id,
  * flow_id and reset_counter. PF will return query_info
@@ -1697,7 +1882,9 @@ struct virtchnl_fdir_query {
        u32 flow_id;  /* INPUT */
        u32 reset_counter:1; /* INPUT */
        struct virtchnl_fdir_query_info query_info; /* OUTPUT */
-       enum virtchnl_fdir_prgm_status status;  /* OUTPUT */
+
+       /* see enum virtchnl_fdir_prgm_status; OUTPUT */
+       s32 status;
        u32 pad2;
 };
 
@@ -1720,7 +1907,8 @@ enum virtchnl_queue_type {
 
 /* structure to specify a chunk of contiguous queues */
 struct virtchnl_queue_chunk {
-       enum virtchnl_queue_type type;
+       /* see enum virtchnl_queue_type */
+       s32 type;
        u16 start_queue_id;
        u16 num_queues;
 };
@@ -1773,8 +1961,12 @@ struct virtchnl_queue_vector {
        u16 queue_id;
        u16 vector_id;
        u8 pad[4];
-       enum virtchnl_itr_idx itr_idx;
-       enum virtchnl_queue_type queue_type;
+
+       /* see enum virtchnl_itr_idx */
+       s32 itr_idx;
+
+       /* see enum virtchnl_queue_type */
+       s32 queue_type;
 };
 
 VIRTCHNL_CHECK_STRUCT_LEN(16, virtchnl_queue_vector);
@@ -2029,6 +2221,19 @@ virtchnl_vc_validate_vf_msg(struct virtchnl_version_info *ver, u32 v_opcode,
        case VIRTCHNL_OP_DCF_GET_VSI_MAP:
        case VIRTCHNL_OP_DCF_GET_PKG_INFO:
                break;
+       case VIRTCHNL_OP_DCF_CONFIG_BW:
+               valid_len = sizeof(struct virtchnl_dcf_bw_cfg_list);
+               if (msglen >= valid_len) {
+                       struct virtchnl_dcf_bw_cfg_list *cfg_list =
+                               (struct virtchnl_dcf_bw_cfg_list *)msg;
+                       if (cfg_list->num_elem == 0) {
+                               err_msg_format = true;
+                               break;
+                       }
+                       valid_len += (cfg_list->num_elem - 1) *
+                                        sizeof(struct virtchnl_dcf_bw_cfg);
+               }
+               break;
        case VIRTCHNL_OP_GET_SUPPORTED_RXDIDS:
                break;
        case VIRTCHNL_OP_ADD_RSS_CFG:
@@ -2044,6 +2249,21 @@ virtchnl_vc_validate_vf_msg(struct virtchnl_version_info *ver, u32 v_opcode,
        case VIRTCHNL_OP_QUERY_FDIR_FILTER:
                valid_len = sizeof(struct virtchnl_fdir_query);
                break;
+       case VIRTCHNL_OP_GET_QOS_CAPS:
+               break;
+       case VIRTCHNL_OP_CONFIG_QUEUE_TC_MAP:
+               valid_len = sizeof(struct virtchnl_queue_tc_mapping);
+               if (msglen >= valid_len) {
+                       struct virtchnl_queue_tc_mapping *q_tc =
+                               (struct virtchnl_queue_tc_mapping *)msg;
+                       if (q_tc->num_tc == 0) {
+                               err_msg_format = true;
+                               break;
+                       }
+                       valid_len += (q_tc->num_tc - 1) *
+                                        sizeof(q_tc->tc[0]);
+               }
+               break;
        case VIRTCHNL_OP_GET_OFFLOAD_VLAN_V2_CAPS:
                break;
        case VIRTCHNL_OP_ADD_VLAN_V2: