net/ice: fix VXLAN/NVGRE flow matching
[dpdk.git] / drivers / net / dpaa2 / mc / fsl_dpni.h
index 0359a2b..8b1cfba 100644 (file)
@@ -91,6 +91,10 @@ struct fsl_mc_io;
  * All Tx traffic classes will use a single sender (ignore num_queueus for tx)
  */
 #define DPNI_OPT_SINGLE_SENDER                 0x000100
+/**
+ * Define a custom number of congestion groups
+ */
+#define DPNI_OPT_CUSTOM_CG                             0x000200
 
 int dpni_open(struct fsl_mc_io *mc_io,
              uint32_t cmd_flags,
@@ -172,6 +176,7 @@ struct dpni_cfg {
        uint8_t  num_tcs;
        uint8_t  num_rx_tcs;
        uint8_t  qos_entries;
+       uint8_t  num_cgs;
 };
 
 int dpni_create(struct fsl_mc_io *mc_io,
@@ -326,6 +331,7 @@ struct dpni_attr {
        uint8_t  qos_key_size;
        uint8_t  fs_key_size;
        uint16_t wriop_version;
+       uint8_t  num_cgs;
 };
 
 int dpni_get_attributes(struct fsl_mc_io *mc_io,
@@ -638,6 +644,36 @@ union dpni_statistics {
  */
 #define DPNI_LINK_OPT_PFC_PAUSE        0x0000000000000010ULL
 
+/**
+ * Advertise 10MB full duplex
+ */
+#define DPNI_ADVERTISED_10BASET_FULL           0x0000000000000001ULL
+/**
+ * Advertise 100MB full duplex
+ */
+#define DPNI_ADVERTISED_100BASET_FULL          0x0000000000000002ULL
+/**
+ * Advertise 1GB full duplex
+ */
+#define DPNI_ADVERTISED_1000BASET_FULL         0x0000000000000004ULL
+/**
+ * Advertise auto-negotiation enable
+ */
+#define DPNI_ADVERTISED_AUTONEG                0x0000000000000008ULL
+/**
+ * Advertise 10GB full duplex
+ */
+#define DPNI_ADVERTISED_10000BASET_FULL        0x0000000000000010ULL
+/**
+ * Advertise 2.5GB full duplex
+ */
+#define DPNI_ADVERTISED_2500BASEX_FULL         0x0000000000000020ULL
+/**
+ * Advertise 5GB full duplex
+ */
+#define DPNI_ADVERTISED_5000BASET_FULL         0x0000000000000040ULL
+
+
 /**
  * struct - Structure representing DPNI link configuration
  * @rate: Rate
@@ -668,7 +704,7 @@ struct dpni_link_state {
        uint32_t rate;
        uint64_t options;
        int up;
-       int     state_valid;
+       int state_valid;
        uint64_t supported;
        uint64_t advertising;
 };
@@ -850,7 +886,6 @@ enum dpni_congestion_unit {
        DPNI_CONGESTION_UNIT_FRAMES
 };
 
-
 /**
  * enum dpni_dest - DPNI destination types
  * @DPNI_DEST_NONE: Unassigned destination; The queue is set in parked mode and
@@ -924,6 +959,25 @@ struct dpni_dest_cfg {
  */
 #define DPNI_CONG_OPT_FLOW_CONTROL     0x00000040
 
+/**
+ * enum dpni_congestion_point - Structure representing congestion point
+ * @DPNI_CP_QUEUE:     Set congestion per queue, identified by QUEUE_TYPE, TC
+ *                     and QUEUE_INDEX
+ * @DPNI_CP_GROUP:     Set congestion per queue group. Depending on options
+ *                     used to define the DPNI this can be either per
+ *                     TC (default) or per interface
+ *                     (DPNI_OPT_SHARED_CONGESTION set at DPNI create).
+ *                     QUEUE_INDEX is ignored if this type is used.
+ * @DPNI_CP_CONGESTION_GROUP: Set per congestion group id. This will work
+ *             only if the DPNI is created with  DPNI_OPT_CUSTOM_CG option
+ */
+
+enum dpni_congestion_point {
+       DPNI_CP_QUEUE,
+       DPNI_CP_GROUP,
+       DPNI_CP_CONGESTION_GROUP,
+};
+
 /**
  * struct dpni_congestion_notification_cfg - congestion notification
  *             configuration
@@ -937,6 +991,8 @@ struct dpni_dest_cfg {
  *     contained in 'options'
  * @dest_cfg: CSCN can be send to either DPIO or DPCON WQ channel
  * @notification_mode: Mask of available options; use 'DPNI_CONG_OPT_<X>' values
+ * @cg_point: Congestion point settings
+ * @cgid: id of the congestion group. The index is relative to dpni.
  */
 
 struct dpni_congestion_notification_cfg {
@@ -947,6 +1003,8 @@ struct dpni_congestion_notification_cfg {
        uint64_t message_iova;
        struct dpni_dest_cfg dest_cfg;
        uint16_t notification_mode;
+       enum dpni_congestion_point cg_point;
+       int cgid;
 };
 
 int dpni_set_congestion_notification(struct fsl_mc_io *mc_io,
@@ -1016,6 +1074,7 @@ int dpni_get_congestion_notification(struct fsl_mc_io *mc_io,
  *      FD[OFFSET].
  *      For more details check the Frame Descriptor section in the
  *      hardware documentation.
+ *@cgid :indicate the cgid to set relative to dpni
  */
 struct dpni_queue {
        struct {
@@ -1029,6 +1088,7 @@ struct dpni_queue {
                uint64_t value;
                char stash_control;
        } flc;
+       int cgid;
 };
 
 /**
@@ -1071,6 +1131,123 @@ int dpni_get_tx_confirmation_mode(struct fsl_mc_io *mc_io,
                                  uint16_t token,
                                  enum dpni_confirmation_mode *mode);
 
+/**
+ * struct dpni_qos_tbl_cfg - Structure representing QOS table configuration
+ * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
+ *             key extractions to be used as the QoS criteria by calling
+ *             dpkg_prepare_key_cfg()
+ * @discard_on_miss: Set to '1' to discard frames in case of no match (miss);
+ *             '0' to use the 'default_tc' in such cases
+ * @keep_entries: if set to one will not delele existing table entries. This
+ *             option will work properly only for dpni objects created with
+ *             DPNI_OPT_HAS_KEY_MASKING option. All previous QoS entries must
+ *             be compatible with new key composition rule.
+ *             It is the caller's job to delete incompatible entries before
+ *             executing this function.
+ * @default_tc: Used in case of no-match and 'discard_on_miss'= 0
+ */
+struct dpni_qos_tbl_cfg {
+       uint64_t key_cfg_iova;
+       int discard_on_miss;
+       int keep_entries;
+       uint8_t default_tc;
+};
+
+int dpni_set_qos_table(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
+                      uint16_t token,
+                      const struct dpni_qos_tbl_cfg *cfg);
+
+/**
+ * struct dpni_rule_cfg - Rule configuration for table lookup
+ * @key_iova: I/O virtual address of the key (must be in DMA-able memory)
+ * @mask_iova: I/O virtual address of the mask (must be in DMA-able memory)
+ * @key_size: key and mask size (in bytes)
+ */
+struct dpni_rule_cfg {
+       uint64_t key_iova;
+       uint64_t mask_iova;
+       uint8_t key_size;
+};
+
+int dpni_add_qos_entry(struct fsl_mc_io *mc_io,
+                      uint32_t cmd_flags,
+                      uint16_t token,
+                      const struct dpni_rule_cfg *cfg,
+                      uint8_t tc_id,
+                      uint16_t index);
+
+int dpni_remove_qos_entry(struct fsl_mc_io *mc_io,
+                         uint32_t cmd_flags,
+                         uint16_t token,
+                         const struct dpni_rule_cfg *cfg);
+
+int dpni_clear_qos_table(struct fsl_mc_io *mc_io,
+                        uint32_t cmd_flags,
+                        uint16_t token);
+
+/**
+ * Discard matching traffic.  If set, this takes precedence over any other
+ * configuration and matching traffic is always discarded.
+ */
+ #define DPNI_FS_OPT_DISCARD            0x1
+
+/**
+ * Set FLC value.  If set, flc member of truct dpni_fs_action_cfg is used to
+ * override the FLC value set per queue.
+ * For more details check the Frame Descriptor section in the hardware
+ * documentation.
+ */
+#define DPNI_FS_OPT_SET_FLC            0x2
+
+/*
+ * Indicates whether the 6 lowest significant bits of FLC are used for stash
+ * control.  If set, the 6 least significant bits in value are interpreted as
+ * follows:
+ *     - bits 0-1: indicates the number of 64 byte units of context that are
+ *     stashed.  FLC value is interpreted as a memory address in this case,
+ *     excluding the 6 LS bits.
+ *     - bits 2-3: indicates the number of 64 byte units of frame annotation
+ *     to be stashed.  Annotation is placed at FD[ADDR].
+ *     - bits 4-5: indicates the number of 64 byte units of frame data to be
+ *     stashed.  Frame data is placed at FD[ADDR] + FD[OFFSET].
+ * This flag is ignored if DPNI_FS_OPT_SET_FLC is not specified.
+ */
+#define DPNI_FS_OPT_SET_STASH_CONTROL  0x4
+
+/**
+ * struct dpni_fs_action_cfg - Action configuration for table look-up
+ * @flc: FLC value for traffic matching this rule.  Please check the Frame
+ * Descriptor section in the hardware documentation for more information.
+ * @flow_id: Identifies the Rx queue used for matching traffic.  Supported
+ *     values are in range 0 to num_queue-1.
+ * @options: Any combination of DPNI_FS_OPT_ values.
+ */
+struct dpni_fs_action_cfg {
+       uint64_t flc;
+       uint16_t flow_id;
+       uint16_t options;
+};
+
+int dpni_add_fs_entry(struct fsl_mc_io *mc_io,
+                     uint32_t cmd_flags,
+                     uint16_t token,
+                     uint8_t tc_id,
+                     uint16_t index,
+                     const struct dpni_rule_cfg *cfg,
+                     const struct dpni_fs_action_cfg *action);
+
+int dpni_remove_fs_entry(struct fsl_mc_io *mc_io,
+                        uint32_t cmd_flags,
+                        uint16_t token,
+                        uint8_t tc_id,
+                        const struct dpni_rule_cfg *cfg);
+
+int dpni_clear_fs_entries(struct fsl_mc_io *mc_io,
+                         uint32_t cmd_flags,
+                         uint16_t token,
+                         uint8_t tc_id);
+
 int dpni_get_api_version(struct fsl_mc_io *mc_io,
                         uint32_t cmd_flags,
                         uint16_t *major_ver,
@@ -1101,6 +1278,9 @@ int dpni_get_api_version(struct fsl_mc_io *mc_io,
  */
 #define DPNI_QUEUE_OPT_HOLD_ACTIVE     0x00000008
 
+#define DPNI_QUEUE_OPT_SET_CGID                                0x00000040
+#define DPNI_QUEUE_OPT_CLEAR_CGID                      0x00000080
+
 int dpni_set_queue(struct fsl_mc_io *mc_io,
                   uint32_t cmd_flags,
                   uint16_t token,
@@ -1123,28 +1303,13 @@ int dpni_get_statistics(struct fsl_mc_io *mc_io,
                        uint32_t cmd_flags,
                        uint16_t token,
                        uint8_t page,
-                       uint8_t param,
+                       uint16_t param,
                        union dpni_statistics *stat);
 
 int dpni_reset_statistics(struct fsl_mc_io *mc_io,
                          uint32_t cmd_flags,
                          uint16_t token);
 
-/**
- * enum dpni_congestion_point - Structure representing congestion point
- * @DPNI_CP_QUEUE:     Set taildrop per queue, identified by QUEUE_TYPE, TC and
- *                             QUEUE_INDEX
- * @DPNI_CP_GROUP:     Set taildrop per queue group. Depending on options used
- *                             to define the DPNI this can be either per
- *                             TC (default) or per interface
- *                             (DPNI_OPT_SHARED_CONGESTION set at DPNI create).
- *                             QUEUE_INDEX is ignored if this type is used.
- */
-enum dpni_congestion_point {
-       DPNI_CP_QUEUE,
-       DPNI_CP_GROUP,
-};
-
 /**
  * struct dpni_taildrop - Structure representing the taildrop
  * @enable:    Indicates whether the taildrop is active or not.
@@ -1202,6 +1367,43 @@ int dpni_get_opr(struct fsl_mc_io *mc_io,
                 struct opr_cfg *cfg,
                 struct opr_qry *qry);
 
+/**
+ * When used for queue_idx in function dpni_set_rx_dist_default_queue will
+ * signal to dpni to drop all unclassified frames
+ */
+#define DPNI_FS_MISS_DROP              ((uint16_t)-1)
+
+/**
+ * struct dpni_rx_dist_cfg - distribution configuration
+ * @dist_size: distribution size; supported values: 1,2,3,4,6,7,8,
+ *             12,14,16,24,28,32,48,56,64,96,112,128,192,224,256,384,448,
+ *             512,768,896,1024
+ * @key_cfg_iova: I/O virtual address of 256 bytes DMA-able memory filled with
+ *             the extractions to be used for the distribution key by calling
+ *             dpkg_prepare_key_cfg() relevant only when enable!=0 otherwise
+ *             it can be '0'
+ * @enable: enable/disable the distribution.
+ * @tc: TC id for which distribution is set
+ * @fs_miss_flow_id: when packet misses all rules from flow steering table and
+ *             hash is disabled it will be put into this queue id; use
+ *             DPNI_FS_MISS_DROP to drop frames. The value of this field is
+ *             used only when flow steering distribution is enabled and hash
+ *             distribution is disabled
+ */
+struct dpni_rx_dist_cfg {
+       uint16_t dist_size;
+       uint64_t key_cfg_iova;
+       uint8_t enable;
+       uint8_t tc;
+       uint16_t fs_miss_flow_id;
+};
+
+int dpni_set_rx_fs_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, const struct dpni_rx_dist_cfg *cfg);
+
+int dpni_set_rx_hash_dist(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, const struct dpni_rx_dist_cfg *cfg);
+
 int dpni_add_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
                uint16_t token, uint16_t tpid);