net/ngbe: add simple Rx flow
[dpdk.git] / drivers / common / iavf / virtchnl.h
index d794f11..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,35 +379,35 @@ 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_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         0x00000080
-       /* 0X00000100 is reserved */
-#define VIRTCHNL_VF_LARGE_NUM_QPAIRS           0x00000200
-#define VIRTCHNL_VF_OFFLOAD_CRC                        0x00000400
-#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 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 | \
@@ -510,7 +524,9 @@ struct virtchnl_rxq_info {
        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;
 };
 
@@ -1265,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
@@ -1345,6 +1373,37 @@ 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;
@@ -1371,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
@@ -1468,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,
@@ -1487,6 +1545,13 @@ enum virtchnl_proto_hdr_type {
        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. */
@@ -1509,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),
@@ -1531,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),
@@ -1576,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];
        /**
@@ -1608,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 */
 };
 
@@ -1616,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 {
@@ -1723,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);
@@ -1736,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
@@ -1752,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;
 };
 
@@ -1775,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;
 };
@@ -1828,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);
@@ -2084,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:
@@ -2099,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: