net/softnic: fix useless address check
[dpdk.git] / drivers / net / dpaa2 / mc / fsl_dpni.h
index de1bcb5..469ab9b 100644 (file)
@@ -1,7 +1,7 @@
 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
  *
  * Copyright 2013-2016 Freescale Semiconductor Inc.
- * Copyright 2016-2017 NXP
+ * Copyright 2016-2021 NXP
  *
  */
 #ifndef __FSL_DPNI_H
@@ -19,6 +19,11 @@ struct fsl_mc_io;
 
 /** General DPNI macros */
 
+/**
+ * Maximum size of a key
+ */
+#define DPNI_MAX_KEY_SIZE              56
+
 /**
  * Maximum number of traffic classes
  */
@@ -91,6 +96,26 @@ 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
+/**
+ * Define a custom number of order point records
+ */
+#define DPNI_OPT_CUSTOM_OPR                            0x000400
+/**
+ * Hash key is shared between all traffic classes
+ */
+#define DPNI_OPT_SHARED_HASH_KEY               0x000800
+/**
+ * Flow steering table is shared between all traffic classes
+ */
+#define DPNI_OPT_SHARED_FS                             0x001000
+/**
+ * Software sequence maximum layout size
+ */
+#define DPNI_SW_SEQUENCE_LAYOUT_SIZE 33
 
 int dpni_open(struct fsl_mc_io *mc_io,
              uint32_t cmd_flags,
@@ -172,6 +197,9 @@ struct dpni_cfg {
        uint8_t  num_tcs;
        uint8_t  num_rx_tcs;
        uint8_t  qos_entries;
+       uint8_t  num_cgs;
+       uint16_t num_opr;
+       uint8_t  dist_key_size;
 };
 
 int dpni_create(struct fsl_mc_io *mc_io,
@@ -188,6 +216,8 @@ int dpni_destroy(struct fsl_mc_io *mc_io,
 /**
  * struct dpni_pools_cfg - Structure representing buffer pools configuration
  * @num_dpbp:  Number of DPBPs
+ * @pool_options: Buffer assignment options
+ *                This field is a combination of DPNI_POOL_ASSOC_flags
  * @pools:     Array of buffer pools parameters; The number of valid entries
  *             must match 'num_dpbp' value
  * @pools.dpbp_id:     DPBP object ID
@@ -196,8 +226,13 @@ int dpni_destroy(struct fsl_mc_io *mc_io,
  * @pools.buffer_size: Buffer size
  * @pools.backup_pool: Backup pool
  */
+
+#define DPNI_POOL_ASSOC_QPRI   0
+#define DPNI_POOL_ASSOC_QDBIN  1
+
 struct dpni_pools_cfg {
        uint8_t num_dpbp;
+       uint8_t pool_options;
        struct {
                int             dpbp_id;
                uint8_t         priority_mask;
@@ -326,6 +361,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,
@@ -347,28 +383,45 @@ int dpni_get_attributes(struct fsl_mc_io *mc_io,
 /**
  * Extract out of frame header error
  */
-#define DPNI_ERROR_EOFHE       0x00020000
+#define DPNI_ERROR_MS                  0x40000000
+#define DPNI_ERROR_PTP                 0x08000000
+/* Ethernet multicast frame */
+#define DPNI_ERROR_MC                  0x04000000
+/* Ethernet broadcast frame */
+#define DPNI_ERROR_BC                  0x02000000
+#define DPNI_ERROR_KSE                 0x00040000
+#define DPNI_ERROR_EOFHE               0x00020000
+#define DPNI_ERROR_MNLE                        0x00010000
+#define DPNI_ERROR_TIDE                        0x00008000
+#define DPNI_ERROR_PIEE                        0x00004000
 /**
  * Frame length error
  */
-#define DPNI_ERROR_FLE         0x00002000
+#define DPNI_ERROR_FLE                 0x00002000
 /**
  * Frame physical error
  */
-#define DPNI_ERROR_FPE         0x00001000
+#define DPNI_ERROR_FPE                 0x00001000
+#define DPNI_ERROR_PTE                 0x00000080
+#define DPNI_ERROR_ISP                 0x00000040
 /**
  * Parsing header error
  */
-#define DPNI_ERROR_PHE         0x00000020
+#define DPNI_ERROR_PHE                 0x00000020
+
+#define DPNI_ERROR_BLE                 0x00000010
 /**
  * Parser L3 checksum error
  */
-#define DPNI_ERROR_L3CE                0x00000004
+#define DPNI_ERROR_L3CV                        0x00000008
+
+#define DPNI_ERROR_L3CE                        0x00000004
 /**
- * Parser L3 checksum error
+ * Parser L4 checksum error
  */
-#define DPNI_ERROR_L4CE                0x00000001
+#define DPNI_ERROR_L4CV                        0x00000002
 
+#define DPNI_ERROR_L4CE                        0x00000001
 /**
  * enum dpni_error_action - Defines DPNI behavior for errors
  * @DPNI_ERROR_ACTION_DISCARD: Discard the frame
@@ -436,6 +489,10 @@ int dpni_set_errors_behavior(struct fsl_mc_io *mc_io,
  * Select to modify the sw-opaque value setting
  */
 #define DPNI_BUF_LAYOUT_OPT_SW_OPAQUE          0x00000080
+/**
+ * Select to disable Scatter Gather and use single buffer
+ */
+#define DPNI_BUF_LAYOUT_OPT_NO_SG              0x00000100
 
 /**
  * struct dpni_buffer_layout - Structure representing DPNI buffer layout
@@ -569,6 +626,7 @@ int dpni_get_tx_data_offset(struct fsl_mc_io *mc_io,
  * @page_5.policer_cnt_green: number of green colored frames
  * @page_5.policer_cnt_re_red: number of recolored red frames
  * @page_5.policer_cnt_re_yellow: number of recolored yellow frames
+ * @page_6.tx_pending_frames_cnt: total number of frames pending in Tx queues
  * @raw: raw statistics structure, used to index counters
  */
 union dpni_statistics {
@@ -612,6 +670,9 @@ union dpni_statistics {
                uint64_t policer_cnt_re_red;
                uint64_t policer_cnt_re_yellow;
        } page_5;
+       struct {
+               uint64_t tx_pending_frames_cnt;
+       } page_6;
        struct {
                uint64_t counter[DPNI_STATISTICS_CNT];
        } raw;
@@ -638,6 +699,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 +759,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;
 };
@@ -678,6 +769,23 @@ int dpni_get_link_state(struct fsl_mc_io *mc_io,
                        uint16_t token,
                        struct dpni_link_state *state);
 
+/**
+ * struct dpni_tx_shaping - Structure representing DPNI tx shaping configuration
+ * @rate_limit:                Rate in Mbits/s
+ * @max_burst_size:    Burst size in bytes (up to 64KB)
+ */
+struct dpni_tx_shaping_cfg {
+       uint32_t rate_limit;
+       uint16_t max_burst_size;
+};
+
+int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
+                       uint16_t token,
+                       const struct dpni_tx_shaping_cfg *tx_cr_shaper,
+                       const struct dpni_tx_shaping_cfg *tx_er_shaper,
+                       int coupled);
+
 int dpni_set_max_frame_length(struct fsl_mc_io *mc_io,
                              uint32_t cmd_flags,
                              uint16_t token,
@@ -728,10 +836,18 @@ int dpni_get_primary_mac_addr(struct fsl_mc_io *mc_io,
                              uint16_t token,
                              uint8_t mac_addr[6]);
 
+/**
+ * Set mac addr queue action
+ */
+#define DPNI_MAC_SET_QUEUE_ACTION 1
+
 int dpni_add_mac_addr(struct fsl_mc_io *mc_io,
                      uint32_t cmd_flags,
                      uint16_t token,
-                     const uint8_t mac_addr[6]);
+                     const uint8_t mac_addr[6],
+                         uint8_t flags,
+                         uint8_t tc_id,
+                         uint8_t flow_id);
 
 int dpni_remove_mac_addr(struct fsl_mc_io *mc_io,
                         uint32_t cmd_flags,
@@ -754,10 +870,18 @@ int dpni_enable_vlan_filter(struct fsl_mc_io *mc_io,
                            uint16_t token,
                            int en);
 
+/**
+ * Set vlan filter queue action
+ */
+#define DPNI_VLAN_SET_QUEUE_ACTION 1
+
 int dpni_add_vlan_id(struct fsl_mc_io *mc_io,
                     uint32_t cmd_flags,
                     uint16_t token,
-                    uint16_t vlan_id);
+                    uint16_t vlan_id,
+                        uint8_t flags,
+                        uint8_t tc_id,
+                        uint8_t flow_id);
 
 int dpni_remove_vlan_id(struct fsl_mc_io *mc_io,
                        uint32_t cmd_flags,
@@ -768,6 +892,49 @@ int dpni_clear_vlan_filters(struct fsl_mc_io *mc_io,
                            uint32_t cmd_flags,
                            uint16_t token);
 
+/**
+ * enum dpni_tx_schedule_mode - DPNI Tx scheduling mode
+ * @DPNI_TX_SCHED_STRICT_PRIORITY: strict priority
+ * @DPNI_TX_SCHED_WEIGHTED_A: weighted based scheduling in group A
+ * @DPNI_TX_SCHED_WEIGHTED_B: weighted based scheduling in group B
+ */
+enum dpni_tx_schedule_mode {
+       DPNI_TX_SCHED_STRICT_PRIORITY = 0,
+       DPNI_TX_SCHED_WEIGHTED_A,
+       DPNI_TX_SCHED_WEIGHTED_B,
+};
+
+/**
+ * struct dpni_tx_schedule_cfg - Structure representing Tx scheduling conf
+ * @mode:              Scheduling mode
+ * @delta_bandwidth:   Bandwidth represented in weights from 100 to 10000;
+ *     not applicable for 'strict-priority' mode;
+ */
+struct dpni_tx_schedule_cfg {
+       enum dpni_tx_schedule_mode      mode;
+       uint16_t                        delta_bandwidth;
+};
+
+/**
+ * struct dpni_tx_priorities_cfg - Structure representing transmission
+ *                                     priorities for DPNI TCs
+ * @tc_sched:  An array of traffic-classes
+ * @prio_group_A: Priority of group A
+ * @prio_group_B: Priority of group B
+ * @separate_groups: Treat A and B groups as separate
+ */
+struct dpni_tx_priorities_cfg {
+       struct dpni_tx_schedule_cfg tc_sched[DPNI_MAX_TC];
+       uint32_t prio_group_A;
+       uint32_t prio_group_B;
+       uint8_t separate_groups;
+};
+
+int dpni_set_tx_priorities(struct fsl_mc_io                    *mc_io,
+                          uint32_t                             cmd_flags,
+                          uint16_t                             token,
+                          const struct dpni_tx_priorities_cfg  *cfg);
+
 /**
  * enum dpni_dist_mode - DPNI distribution mode
  * @DPNI_DIST_MODE_NONE: No distribution
@@ -840,6 +1007,90 @@ int dpni_set_rx_tc_dist(struct fsl_mc_io *mc_io,
                        uint8_t tc_id,
                        const struct dpni_rx_tc_dist_cfg *cfg);
 
+/**
+ * Set to select color aware mode (otherwise - color blind)
+ */
+#define DPNI_POLICER_OPT_COLOR_AWARE   0x00000001
+/**
+ * Set to discard frame with RED color
+ */
+#define DPNI_POLICER_OPT_DISCARD_RED   0x00000002
+
+/**
+ * enum dpni_policer_mode - selecting the policer mode
+ * @DPNI_POLICER_MODE_NONE: Policer is disabled
+ * @DPNI_POLICER_MODE_PASS_THROUGH: Policer pass through
+ * @DPNI_POLICER_MODE_RFC_2698: Policer algorithm RFC 2698
+ * @DPNI_POLICER_MODE_RFC_4115: Policer algorithm RFC 4115
+ */
+enum dpni_policer_mode {
+       DPNI_POLICER_MODE_NONE = 0,
+       DPNI_POLICER_MODE_PASS_THROUGH,
+       DPNI_POLICER_MODE_RFC_2698,
+       DPNI_POLICER_MODE_RFC_4115
+};
+
+/**
+ * enum dpni_policer_unit - DPNI policer units
+ * @DPNI_POLICER_UNIT_BYTES: bytes units
+ * @DPNI_POLICER_UNIT_FRAMES: frames units
+ */
+enum dpni_policer_unit {
+       DPNI_POLICER_UNIT_BYTES = 0,
+       DPNI_POLICER_UNIT_FRAMES
+};
+
+/**
+ * enum dpni_policer_color - selecting the policer color
+ * @DPNI_POLICER_COLOR_GREEN: Green color
+ * @DPNI_POLICER_COLOR_YELLOW: Yellow color
+ * @DPNI_POLICER_COLOR_RED: Red color
+ */
+enum dpni_policer_color {
+       DPNI_POLICER_COLOR_GREEN = 0,
+       DPNI_POLICER_COLOR_YELLOW,
+       DPNI_POLICER_COLOR_RED
+};
+
+/**
+ * struct dpni_rx_tc_policing_cfg - Policer configuration
+ * @options: Mask of available options; use 'DPNI_POLICER_OPT_<X>' values
+ * @mode: policer mode
+ * @default_color: For pass-through mode the policer re-colors with this
+ *     color any incoming packets. For Color aware non-pass-through mode:
+ *     policer re-colors with this color all packets with FD[DROPP]>2.
+ * @units: Bytes or Packets
+ * @cir: Committed information rate (CIR) in Kbps or packets/second
+ * @cbs: Committed burst size (CBS) in bytes or packets
+ * @eir: Peak information rate (PIR, rfc2698) in Kbps or packets/second
+ *      Excess information rate (EIR, rfc4115) in Kbps or packets/second
+ * @ebs: Peak burst size (PBS, rfc2698) in bytes or packets
+ *       Excess burst size (EBS, rfc4115) in bytes or packets
+ */
+struct dpni_rx_tc_policing_cfg {
+       uint32_t options;
+       enum dpni_policer_mode mode;
+       enum dpni_policer_unit units;
+       enum dpni_policer_color default_color;
+       uint32_t cir;
+       uint32_t cbs;
+       uint32_t eir;
+       uint32_t ebs;
+};
+
+
+int dpni_set_rx_tc_policing(struct fsl_mc_io *mc_io,
+                           uint32_t cmd_flags,
+                           uint16_t token,
+                           uint8_t tc_id,
+                           const struct dpni_rx_tc_policing_cfg *cfg);
+
+int dpni_get_rx_tc_policing(struct fsl_mc_io *mc_io,
+                           uint32_t cmd_flags,
+                           uint16_t token,
+                           uint8_t tc_id,
+                           struct dpni_rx_tc_policing_cfg *cfg);
+
 /**
  * enum dpni_congestion_unit - DPNI congestion units
  * @DPNI_CONGESTION_UNIT_BYTES: bytes units
@@ -850,6 +1101,69 @@ enum dpni_congestion_unit {
        DPNI_CONGESTION_UNIT_FRAMES
 };
 
+/**
+ * enum dpni_early_drop_mode - DPNI early drop mode
+ * @DPNI_EARLY_DROP_MODE_NONE: early drop is disabled
+ * @DPNI_EARLY_DROP_MODE_TAIL: early drop in taildrop mode
+ * @DPNI_EARLY_DROP_MODE_WRED: early drop in WRED mode
+ */
+enum dpni_early_drop_mode {
+       DPNI_EARLY_DROP_MODE_NONE = 0,
+       DPNI_EARLY_DROP_MODE_TAIL,
+       DPNI_EARLY_DROP_MODE_WRED
+};
+
+/**
+ * struct dpni_wred_cfg - WRED configuration
+ * @max_threshold: maximum threshold that packets may be discarded. Above this
+ *       threshold all packets are discarded; must be less than 2^39;
+ *       approximated to be expressed as (x+256)*2^(y-1) due to HW
+ *       implementation.
+ * @min_threshold: minimum threshold that packets may be discarded at
+ * @drop_probability: probability that a packet will be discarded (1-100,
+ *                     associated with the max_threshold).
+ */
+struct dpni_wred_cfg {
+       uint64_t max_threshold;
+       uint64_t min_threshold;
+       uint8_t drop_probability;
+};
+
+/**
+ * struct dpni_early_drop_cfg - early-drop configuration
+ * @enable: drop enable
+ * @units: units type
+ * @green: WRED - 'green' configuration
+ * @yellow: WRED - 'yellow' configuration
+ * @red: WRED - 'red' configuration
+ */
+struct dpni_early_drop_cfg {
+       uint8_t enable;
+       enum dpni_congestion_unit units;
+       struct dpni_wred_cfg green;
+       struct dpni_wred_cfg yellow;
+       struct dpni_wred_cfg red;
+};
+
+void dpni_prepare_early_drop(const struct dpni_early_drop_cfg *cfg,
+                            uint8_t *early_drop_buf);
+
+void dpni_extract_early_drop(struct dpni_early_drop_cfg *cfg,
+                            const uint8_t *early_drop_buf);
+
+int dpni_set_early_drop(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
+                       uint16_t token,
+                       enum dpni_queue_type qtype,
+                       uint8_t tc_id,
+                       uint64_t early_drop_iova);
+
+int dpni_get_early_drop(struct fsl_mc_io *mc_io,
+                       uint32_t cmd_flags,
+                       uint16_t token,
+                       enum dpni_queue_type qtype,
+                       uint8_t tc_id,
+                       uint64_t early_drop_iova);
 
 /**
  * enum dpni_dest - DPNI destination types
@@ -924,6 +1238,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 +1270,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 +1282,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 +1353,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 +1367,7 @@ struct dpni_queue {
                uint64_t value;
                char stash_control;
        } flc;
+       int cgid;
 };
 
 /**
@@ -1071,6 +1410,149 @@ 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,
+                          uint8_t flags,
+                          uint8_t flow_id);
+
+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
+
+/**
+ * Redirect matching traffic to Rx part of another dpni object. The frame
+ * will be classified according to new qos and flow steering rules from
+ * target dpni object.
+ */
+#define DPNI_FS_OPT_REDIRECT_TO_DPNI_RX                0x08
+
+/**
+ * Redirect matching traffic into Tx queue of another dpni object. The
+ * frame will be transmitted directly
+ */
+#define DPNI_FS_OPT_REDIRECT_TO_DPNI_TX                0x10
+
+/**
+ * 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.
+ * @redirect_obj_token: token that identifies the object where frame is
+ * redirected when this rule is hit. This paraneter is used only when one of the
+ * flags DPNI_FS_OPT_REDIRECT_TO_DPNI_RX or DPNI_FS_OPT_REDIRECT_TO_DPNI_TX is
+ * set.
+ * The token is obtained using dpni_open() API call. The object must stay
+ * open during the operation to ensure the fact that application has access
+ * on it. If the object is destroyed of closed next actions will take place:
+ * - if DPNI_FS_OPT_DISCARD is set the frame will be discarded by current dpni
+ * - if DPNI_FS_OPT_DISCARD is cleared the frame will be enqueued in queue with
+ *   index provided in flow_id parameter.
+ * @options: Any combination of DPNI_FS_OPT_ values.
+ */
+struct dpni_fs_action_cfg {
+       uint64_t flc;
+       uint16_t flow_id;
+       uint16_t redirect_obj_token;
+       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 +1583,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 +1608,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.
@@ -1192,7 +1662,8 @@ int dpni_set_opr(struct fsl_mc_io *mc_io,
                 uint8_t tc,
                 uint8_t index,
                 uint8_t options,
-                struct opr_cfg *cfg);
+                struct opr_cfg *cfg,
+                uint8_t opr_id);
 
 int dpni_get_opr(struct fsl_mc_io *mc_io,
                 uint32_t cmd_flags,
@@ -1200,6 +1671,235 @@ int dpni_get_opr(struct fsl_mc_io *mc_io,
                 uint8_t tc,
                 uint8_t index,
                 struct opr_cfg *cfg,
-                struct opr_qry *qry);
+                struct opr_qry *qry,
+                uint8_t flags,
+                uint8_t opr_id);
+
+/**
+ * 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);
+
+int dpni_remove_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, uint16_t tpid);
+
+/**
+ * struct dpni_custom_tpid_cfg - custom TPID configuration. Contains custom TPID
+ *     values used in current dpni object to detect 802.1q frames.
+ *     @tpid1: first tag. Not used if zero.
+ *     @tpid2: second tag. Not used if zero.
+ */
+struct dpni_custom_tpid_cfg {
+       uint16_t tpid1;
+       uint16_t tpid2;
+};
+
+int dpni_get_custom_tpid(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, struct dpni_custom_tpid_cfg *tpid);
+
+/**
+ * enum dpni_soft_sequence_dest - Enumeration of WRIOP software sequence
+ *                             destinations
+ * @DPNI_SS_INGRESS: Ingress parser
+ * @DPNI_SS_EGRESS: Egress parser
+ */
+enum dpni_soft_sequence_dest {
+       DPNI_SS_INGRESS = 0,
+       DPNI_SS_EGRESS = 1,
+};
+
+/**
+ * struct dpni_load_ss_cfg - Structure for Software Sequence load configuration
+ * @dest:      Destination of the Software Sequence: ingress or egress parser
+ * @ss_size: Size of the Software Sequence
+ * @ss_offset: The offset where to load the Software Sequence (0x20-0x7FD)
+ * @ss_iova: I/O virtual address of the Software Sequence
+ */
+struct dpni_load_ss_cfg {
+       enum dpni_soft_sequence_dest dest;
+       uint16_t ss_size;
+       uint16_t ss_offset;
+       uint64_t ss_iova;
+};
+
+/**
+ * struct dpni_enable_ss_cfg - Structure for software sequence enable
+ *                             configuration
+ * @dest:      Destination of the Software Sequence: ingress or egress parser
+ * @hxs: HXS to attach the software sequence to
+ * @set_start: If the Software Sequence or HDR it is attached to is set as
+ *             parser start
+ *             If hxs=DUMMY_LAST_HXS the ss_offset is set directly as parser
+ *                     start else the hdr index code is set as parser start
+ * @ss_offset: The offset of the Software Sequence to enable or set as parse
+ *             start
+ * @param_size: Size of the software sequence parameters
+ * @param_offset: Offset in the parameter zone for the software sequence
+ *                     parameters
+ * @param_iova: I/O virtual address of the parameters
+ */
+struct dpni_enable_ss_cfg {
+       enum dpni_soft_sequence_dest dest;
+       uint16_t hxs;
+       uint8_t set_start;
+       uint16_t ss_offset;
+       uint8_t param_size;
+       uint8_t param_offset;
+       uint64_t param_iova;
+};
+
+/**
+ * dpni_load_sw_sequence() - Loads a software sequence in parser memory.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cfg:       Software sequence load configuration
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_load_sw_sequence(struct fsl_mc_io *mc_io,
+             uint32_t cmd_flags,
+             uint16_t token,
+                 struct dpni_load_ss_cfg *cfg);
+
+/**
+ * dpni_eanble_sw_sequence() - Enables a software sequence in the parser
+ *                             profile
+ * corresponding to the ingress or egress of the DPNI.
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @cfg:       Software sequence enable configuration
+ * Return:     '0' on Success; Error code otherwise.
+ */
+int dpni_enable_sw_sequence(struct fsl_mc_io *mc_io,
+                           uint32_t cmd_flags,
+                           uint16_t token,
+                           struct dpni_enable_ss_cfg *cfg);
+
+/**
+ * struct dpni_sw_sequence_layout - Structure for software sequence enable
+ *                             configuration
+ * @num_ss:    Number of software sequences returned
+ * @ss: Array of software sequence entries. The number of valid entries
+ *                     must match 'num_ss' value
+ */
+struct dpni_sw_sequence_layout {
+       uint8_t num_ss;
+       struct {
+               uint16_t ss_offset;
+               uint16_t ss_size;
+               uint8_t param_offset;
+               uint8_t param_size;
+       } ss[DPNI_SW_SEQUENCE_LAYOUT_SIZE];
+};
+
+/**
+ * dpni_get_sw_sequence_layout() - Get the soft sequence layout
+ * @mc_io:     Pointer to MC portal's I/O object
+ * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
+ * @token:     Token of DPNI object
+ * @src:       Source of the layout (WRIOP Rx or Tx)
+ * @ss_layout_iova:  I/O virtual address of 264 bytes DMA-able memory
+ *
+ * warning: After calling this function, call dpni_extract_sw_sequence_layout()
+ *             to get the layout
+ *
+ * Return:     '0' on Success; error code otherwise.
+ */
+int dpni_get_sw_sequence_layout(struct fsl_mc_io *mc_io,
+                               uint32_t cmd_flags,
+                               uint16_t token,
+                               enum dpni_soft_sequence_dest src,
+                               uint64_t ss_layout_iova);
+
+/**
+ * dpni_extract_sw_sequence_layout() - extract the software sequence layout
+ * @layout:    software sequence layout
+ * @sw_sequence_layout_buf:Zeroed 264 bytes of memory before mapping it to DMA
+ *
+ * This function has to be called after dpni_get_sw_sequence_layout
+ */
+void dpni_extract_sw_sequence_layout(struct dpni_sw_sequence_layout *layout,
+                                    const uint8_t *sw_sequence_layout_buf);
+
+/**
+ * struct dpni_ptp_cfg - configure single step PTP (IEEE 1588)
+ *     @en: enable single step PTP. When enabled the PTPv1 functionality will
+ *             not work. If the field is zero, offset and ch_update parameters
+ *             will be ignored
+ *     @offset: start offset from the beginning of the frame where timestamp
+ *             field is found. The offset must respect all MAC headers, VLAN
+ *     tags and other protocol headers
+ *     @ch_update: when set UDP checksum will be updated inside packet
+ *     @peer_delay: For peer-to-peer transparent clocks add this value to the
+ *             correction field in addition to the transient time update. The
+ *             value expresses nanoseconds.
+ */
+struct dpni_single_step_cfg {
+       uint8_t en;
+       uint8_t ch_update;
+       uint16_t offset;
+       uint32_t peer_delay;
+};
+
+int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, struct dpni_single_step_cfg *ptp_cfg);
+
+int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, struct dpni_single_step_cfg *ptp_cfg);
+
+/**
+ * loopback_en field is valid when calling function dpni_set_port_cfg
+ */
+#define DPNI_PORT_CFG_LOOPBACK         0x01
+
+/**
+ * struct dpni_port_cfg - custom configuration for dpni physical port
+ *     @loopback_en: port loopback enabled
+ */
+struct dpni_port_cfg {
+       int loopback_en;
+};
+
+int dpni_set_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, uint32_t flags, struct dpni_port_cfg *port_cfg);
+
+int dpni_get_port_cfg(struct fsl_mc_io *mc_io, uint32_t cmd_flags,
+               uint16_t token, struct dpni_port_cfg *port_cfg);
 
 #endif /* __FSL_DPNI_H */