root/drivers/net/ethernet/broadcom/bnge/bnge_hw_def.h
/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright (c) 2025 Broadcom */

#ifndef _BNGE_HW_DEF_H_
#define _BNGE_HW_DEF_H_

#define TX_BD_FLAGS_TCP_UDP_CHKSUM      BIT(0)
#define TX_BD_FLAGS_IP_CKSUM            BIT(1)
#define TX_BD_FLAGS_NO_CRC              BIT(2)
#define TX_BD_FLAGS_STAMP               BIT(3)
#define TX_BD_FLAGS_T_IP_CHKSUM         BIT(4)
#define TX_BD_FLAGS_LSO                 BIT(5)
#define TX_BD_FLAGS_IPID_FMT            BIT(6)
#define TX_BD_FLAGS_T_IPID              BIT(7)
#define TX_BD_HSIZE                     GENMASK(23, 16)
#define TX_BD_HSIZE_SHIFT               16

#define TX_BD_CFA_ACTION                GENMASK(31, 16)
#define TX_BD_CFA_ACTION_SHIFT          16

#define TX_BD_CFA_META_MASK             0xfffffff
#define TX_BD_CFA_META_VID_MASK         0xfff
#define TX_BD_CFA_META_PRI_MASK         GENMASK(15, 12)
#define TX_BD_CFA_META_PRI_SHIFT        12
#define TX_BD_CFA_META_TPID_MASK        GENMASK(17, 16)
#define TX_BD_CFA_META_TPID_SHIFT       16
#define TX_BD_CFA_META_KEY              GENMASK(31, 28)
#define TX_BD_CFA_META_KEY_SHIFT        28
#define TX_BD_CFA_META_KEY_VLAN         BIT(28)

struct tx_bd_ext {
        __le32 tx_bd_hsize_lflags;
        __le32 tx_bd_mss;
        __le32 tx_bd_cfa_action;
        __le32 tx_bd_cfa_meta;
};

#define TX_CMP_SQ_CONS_IDX(txcmp)                                       \
        (le32_to_cpu((txcmp)->sq_cons_idx) & TX_CMP_SQ_CONS_IDX_MASK)

#define RX_CMP_CMP_TYPE                         GENMASK(5, 0)
#define RX_CMP_FLAGS_ERROR                      BIT(6)
#define RX_CMP_FLAGS_PLACEMENT                  GENMASK(9, 7)
#define RX_CMP_FLAGS_RSS_VALID                  BIT(10)
#define RX_CMP_FLAGS_PKT_METADATA_PRESENT       BIT(11)
#define RX_CMP_FLAGS_ITYPES_SHIFT               12
#define RX_CMP_FLAGS_ITYPES_MASK                0xf000
#define RX_CMP_FLAGS_ITYPE_UNKNOWN              (0 << 12)
#define RX_CMP_FLAGS_ITYPE_IP                   (1 << 12)
#define RX_CMP_FLAGS_ITYPE_TCP                  (2 << 12)
#define RX_CMP_FLAGS_ITYPE_UDP                  (3 << 12)
#define RX_CMP_FLAGS_ITYPE_FCOE                 (4 << 12)
#define RX_CMP_FLAGS_ITYPE_ROCE                 (5 << 12)
#define RX_CMP_FLAGS_ITYPE_PTP_WO_TS            (8 << 12)
#define RX_CMP_FLAGS_ITYPE_PTP_W_TS             (9 << 12)
#define RX_CMP_LEN                              GENMASK(31, 16)
#define RX_CMP_LEN_SHIFT                        16

#define RX_CMP_V1                               BIT(0)
#define RX_CMP_AGG_BUFS                         GENMASK(5, 1)
#define RX_CMP_AGG_BUFS_SHIFT                   1
#define RX_CMP_RSS_HASH_TYPE                    GENMASK(15, 9)
#define RX_CMP_RSS_HASH_TYPE_SHIFT              9
#define RX_CMP_V3_RSS_EXT_OP_LEGACY             GENMASK(15, 12)
#define RX_CMP_V3_RSS_EXT_OP_LEGACY_SHIFT       12
#define RX_CMP_V3_RSS_EXT_OP_NEW                GENMASK(11, 8)
#define RX_CMP_V3_RSS_EXT_OP_NEW_SHIFT          8
#define RX_CMP_PAYLOAD_OFFSET                   GENMASK(23, 16)
#define RX_CMP_PAYLOAD_OFFSET_SHIFT             16
#define RX_CMP_SUB_NS_TS                        GENMASK(19, 16)
#define RX_CMP_SUB_NS_TS_SHIFT                  16
#define RX_CMP_METADATA1                        GENMASK(31, 28)
#define RX_CMP_METADATA1_SHIFT                  28
#define RX_CMP_METADATA1_TPID_SEL               GENMASK(30, 28)
#define RX_CMP_METADATA1_TPID_8021Q             BIT(28)
#define RX_CMP_METADATA1_TPID_8021AD            (0x0 << 28)
#define RX_CMP_METADATA1_VALID                  BIT(31)

struct rx_cmp {
        __le32 rx_cmp_len_flags_type;
        u32 rx_cmp_opaque;
        __le32 rx_cmp_misc_v1;
        __le32 rx_cmp_rss_hash;
};

#define RX_CMP_FLAGS2_IP_CS_CALC                        BIT(0)
#define RX_CMP_FLAGS2_L4_CS_CALC                        BIT(1)
#define RX_CMP_FLAGS2_T_IP_CS_CALC                      BIT(2)
#define RX_CMP_FLAGS2_T_L4_CS_CALC                      BIT(3)
#define RX_CMP_FLAGS2_META_FORMAT_VLAN                  BIT(4)

#define RX_CMP_FLAGS2_METADATA_TCI_MASK                 GENMASK(15, 0)
#define RX_CMP_FLAGS2_METADATA_VID_MASK                 GENMASK(11, 0)
#define RX_CMP_FLAGS2_METADATA_TPID_MASK                GENMASK(31, 16)
#define RX_CMP_FLAGS2_METADATA_TPID_SFT                 16

#define RX_CMP_V                                        BIT(0)
#define RX_CMPL_ERRORS_MASK                             GENMASK(15, 1)
#define RX_CMPL_ERRORS_SFT                              1
#define RX_CMPL_ERRORS_BUFFER_ERROR_MASK                GENMASK(3, 1)
#define RX_CMPL_ERRORS_BUFFER_ERROR_NO_BUFFER           (0x0 << 1)
#define RX_CMPL_ERRORS_BUFFER_ERROR_DID_NOT_FIT         (0x1 << 1)
#define RX_CMPL_ERRORS_BUFFER_ERROR_NOT_ON_CHIP         (0x2 << 1)
#define RX_CMPL_ERRORS_BUFFER_ERROR_BAD_FORMAT          (0x3 << 1)
#define RX_CMPL_ERRORS_IP_CS_ERROR                      BIT(4)
#define RX_CMPL_ERRORS_L4_CS_ERROR                      BIT(5)
#define RX_CMPL_ERRORS_T_IP_CS_ERROR                    BIT(6)
#define RX_CMPL_ERRORS_T_L4_CS_ERROR                    BIT(7)
#define RX_CMPL_ERRORS_CRC_ERROR                        BIT(8)
#define RX_CMPL_ERRORS_T_PKT_ERROR_MASK                 GENMASK(11, 9)
#define RX_CMPL_ERRORS_T_PKT_ERROR_NO_ERROR             (0x0 << 9)
#define RX_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_VERSION     (0x1 << 9)
#define RX_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_HDR_LEN     (0x2 << 9)
#define RX_CMPL_ERRORS_T_PKT_ERROR_TUNNEL_TOTAL_ERROR   (0x3 << 9)
#define RX_CMPL_ERRORS_T_PKT_ERROR_T_IP_TOTAL_ERROR     (0x4 << 9)
#define RX_CMPL_ERRORS_T_PKT_ERROR_T_UDP_TOTAL_ERROR    (0x5 << 9)
#define RX_CMPL_ERRORS_T_PKT_ERROR_T_L3_BAD_TTL         (0x6 << 9)
#define RX_CMPL_ERRORS_PKT_ERROR_MASK                   GENMASK(15, 12)
#define RX_CMPL_ERRORS_PKT_ERROR_NO_ERROR               (0x0 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_L3_BAD_VERSION         (0x1 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_L3_BAD_HDR_LEN         (0x2 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_L3_BAD_TTL             (0x3 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_IP_TOTAL_ERROR         (0x4 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_UDP_TOTAL_ERROR        (0x5 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN         (0x6 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_L4_BAD_HDR_LEN_TOO_SMALL (0x7 << 12)
#define RX_CMPL_ERRORS_PKT_ERROR_L4_BAD_OPT_LEN         (0x8 << 12)

#define RX_CMPL_CFA_CODE_MASK                           GENMASK(31, 16)
#define RX_CMPL_CFA_CODE_SFT                            16
#define RX_CMPL_METADATA0_TCI_MASK                      GENMASK(31, 16)
#define RX_CMPL_METADATA0_VID_MASK                      GENMASK(27, 16)
#define RX_CMPL_METADATA0_SFT                           16

struct rx_cmp_ext {
        __le32 rx_cmp_flags2;
        __le32 rx_cmp_meta_data;
        __le32 rx_cmp_cfa_code_errors_v2;
        __le32 rx_cmp_timestamp;
};

#define RX_AGG_CMP_TYPE                 GENMASK(5, 0)
#define RX_AGG_CMP_LEN                  GENMASK(31, 16)
#define RX_AGG_CMP_LEN_SHIFT            16
#define RX_AGG_CMP_V                    BIT(0)
#define RX_AGG_CMP_AGG_ID               GENMASK(25, 16)
#define RX_AGG_CMP_AGG_ID_SHIFT         16

struct rx_agg_cmp {
        __le32 rx_agg_cmp_len_flags_type;
        u32 rx_agg_cmp_opaque;
        __le32 rx_agg_cmp_v;
        __le32 rx_agg_cmp_unused;
};

#define RX_CMP_L2_ERRORS                                                \
        cpu_to_le32(RX_CMPL_ERRORS_BUFFER_ERROR_MASK | RX_CMPL_ERRORS_CRC_ERROR)

#define RX_CMP_L4_CS_BITS                                               \
        (cpu_to_le32(RX_CMP_FLAGS2_L4_CS_CALC | RX_CMP_FLAGS2_T_L4_CS_CALC))

#define RX_CMP_L4_CS_ERR_BITS                                           \
        (cpu_to_le32(RX_CMPL_ERRORS_L4_CS_ERROR | RX_CMPL_ERRORS_T_L4_CS_ERROR))

#define RX_CMP_L4_CS_OK(rxcmp1)                                         \
            (((rxcmp1)->rx_cmp_flags2 & RX_CMP_L4_CS_BITS) &&           \
             !((rxcmp1)->rx_cmp_cfa_code_errors_v2 & RX_CMP_L4_CS_ERR_BITS))

#define RX_CMP_METADATA0_TCI(rxcmp1)                                    \
        ((le32_to_cpu((rxcmp1)->rx_cmp_cfa_code_errors_v2) &            \
          RX_CMPL_METADATA0_TCI_MASK) >> RX_CMPL_METADATA0_SFT)

#define RX_CMP_ENCAP(rxcmp1)                                            \
            ((le32_to_cpu((rxcmp1)->rx_cmp_flags2) &                    \
             RX_CMP_FLAGS2_T_L4_CS_CALC) >> 3)

#define RX_CMP_V3_HASH_TYPE_LEGACY(rxcmp)                               \
        ((le32_to_cpu((rxcmp)->rx_cmp_misc_v1) &                        \
          RX_CMP_V3_RSS_EXT_OP_LEGACY) >> RX_CMP_V3_RSS_EXT_OP_LEGACY_SHIFT)

#define RX_CMP_V3_HASH_TYPE_NEW(rxcmp)                          \
        ((le32_to_cpu((rxcmp)->rx_cmp_misc_v1) & RX_CMP_V3_RSS_EXT_OP_NEW) >>\
         RX_CMP_V3_RSS_EXT_OP_NEW_SHIFT)

#define RX_CMP_V3_HASH_TYPE(bd, rxcmp)                          \
        (((bd)->rss_cap & BNGE_RSS_CAP_RSS_TCAM) ?              \
          RX_CMP_V3_HASH_TYPE_NEW(rxcmp) :                      \
          RX_CMP_V3_HASH_TYPE_LEGACY(rxcmp))

#define EXT_OP_INNER_4          0x0
#define EXT_OP_OUTER_4          0x2
#define EXT_OP_INNFL_3          0x8
#define EXT_OP_OUTFL_3          0xa

#define RX_CMP_VLAN_VALID(rxcmp)                                \
        ((rxcmp)->rx_cmp_misc_v1 & cpu_to_le32(RX_CMP_METADATA1_VALID))

#define RX_CMP_VLAN_TPID_SEL(rxcmp)                             \
        (le32_to_cpu((rxcmp)->rx_cmp_misc_v1) & RX_CMP_METADATA1_TPID_SEL)

#define RSS_PROFILE_ID_MASK     GENMASK(4, 0)

#define RX_CMP_HASH_TYPE(rxcmp)                                 \
        (((le32_to_cpu((rxcmp)->rx_cmp_misc_v1) & RX_CMP_RSS_HASH_TYPE) >>\
          RX_CMP_RSS_HASH_TYPE_SHIFT) & RSS_PROFILE_ID_MASK)

#define RX_CMP_HASH_VALID(rxcmp)                                \
        ((rxcmp)->rx_cmp_len_flags_type & cpu_to_le32(RX_CMP_FLAGS_RSS_VALID))

#define TPA_AGG_AGG_ID(rx_agg)                          \
        ((le32_to_cpu((rx_agg)->rx_agg_cmp_v) &         \
         RX_AGG_CMP_AGG_ID) >> RX_AGG_CMP_AGG_ID_SHIFT)

#define RX_TPA_START_CMP_TYPE                           GENMASK(5, 0)
#define RX_TPA_START_CMP_FLAGS                          GENMASK(15, 6)
#define RX_TPA_START_CMP_FLAGS_SHIFT                    6
#define RX_TPA_START_CMP_FLAGS_ERROR                    BIT(6)
#define RX_TPA_START_CMP_FLAGS_PLACEMENT                GENMASK(9, 7)
#define RX_TPA_START_CMP_FLAGS_PLACEMENT_SHIFT          7
#define RX_TPA_START_CMP_FLAGS_PLACEMENT_JUMBO          BIT(7)
#define RX_TPA_START_CMP_FLAGS_PLACEMENT_HDS            (0x2 << 7)
#define RX_TPA_START_CMP_FLAGS_PLACEMENT_GRO_JUMBO      (0x5 << 7)
#define RX_TPA_START_CMP_FLAGS_PLACEMENT_GRO_HDS        (0x6 << 7)
#define RX_TPA_START_CMP_FLAGS_RSS_VALID                BIT(10)
#define RX_TPA_START_CMP_FLAGS_TIMESTAMP                BIT(11)
#define RX_TPA_START_CMP_FLAGS_ITYPES                   GENMASK(15, 12)
#define RX_TPA_START_CMP_FLAGS_ITYPES_SHIFT             12
#define RX_TPA_START_CMP_FLAGS_ITYPE_TCP                (0x2 << 12)
#define RX_TPA_START_CMP_LEN                            GENMASK(31, 16)
#define RX_TPA_START_CMP_LEN_SHIFT                      16
#define RX_TPA_START_CMP_V1                             BIT(0)
#define RX_TPA_START_CMP_RSS_HASH_TYPE                  GENMASK(15, 9)
#define RX_TPA_START_CMP_RSS_HASH_TYPE_SHIFT            9
#define RX_TPA_START_CMP_V3_RSS_HASH_TYPE               GENMASK(15, 7)
#define RX_TPA_START_CMP_V3_RSS_HASH_TYPE_SHIFT         7
#define RX_TPA_START_CMP_AGG_ID                         GENMASK(25, 16)
#define RX_TPA_START_CMP_AGG_ID_SHIFT                   16
#define RX_TPA_START_CMP_METADATA1                      GENMASK(31, 28)
#define RX_TPA_START_CMP_METADATA1_SHIFT                28
#define RX_TPA_START_METADATA1_TPID_SEL                 GENMASK(30, 28)
#define RX_TPA_START_METADATA1_TPID_8021Q               BIT(28)
#define RX_TPA_START_METADATA1_TPID_8021AD              (0x0 << 28)
#define RX_TPA_START_METADATA1_VALID                    BIT(31)

struct rx_tpa_start_cmp {
        __le32 rx_tpa_start_cmp_len_flags_type;
        u32 rx_tpa_start_cmp_opaque;
        __le32 rx_tpa_start_cmp_misc_v1;
        __le32 rx_tpa_start_cmp_rss_hash;
};

#define TPA_START_HASH_VALID(rx_tpa_start)                              \
        ((rx_tpa_start)->rx_tpa_start_cmp_len_flags_type &              \
         cpu_to_le32(RX_TPA_START_CMP_FLAGS_RSS_VALID))

#define TPA_START_HASH_TYPE(rx_tpa_start)                               \
        (((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_misc_v1) &      \
           RX_TPA_START_CMP_RSS_HASH_TYPE) >>                           \
          RX_TPA_START_CMP_RSS_HASH_TYPE_SHIFT) & RSS_PROFILE_ID_MASK)

#define TPA_START_V3_HASH_TYPE(rx_tpa_start)                            \
        (((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_misc_v1) &      \
           RX_TPA_START_CMP_V3_RSS_HASH_TYPE) >>                        \
          RX_TPA_START_CMP_V3_RSS_HASH_TYPE_SHIFT) & RSS_PROFILE_ID_MASK)

#define TPA_START_AGG_ID(rx_tpa_start)                          \
        ((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_misc_v1) &       \
         RX_TPA_START_CMP_AGG_ID) >> RX_TPA_START_CMP_AGG_ID_SHIFT)

#define TPA_START_ERROR(rx_tpa_start)                                   \
        ((rx_tpa_start)->rx_tpa_start_cmp_len_flags_type &              \
         cpu_to_le32(RX_TPA_START_CMP_FLAGS_ERROR))

#define TPA_START_VLAN_VALID(rx_tpa_start)                              \
        ((rx_tpa_start)->rx_tpa_start_cmp_misc_v1 &                     \
         cpu_to_le32(RX_TPA_START_METADATA1_VALID))

#define TPA_START_VLAN_TPID_SEL(rx_tpa_start)                           \
        (le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_misc_v1) &        \
         RX_TPA_START_METADATA1_TPID_SEL)

#define RX_TPA_START_CMP_FLAGS2_IP_CS_CALC              BIT(0)
#define RX_TPA_START_CMP_FLAGS2_L4_CS_CALC              BIT(1)
#define RX_TPA_START_CMP_FLAGS2_T_IP_CS_CALC            BIT(2)
#define RX_TPA_START_CMP_FLAGS2_T_L4_CS_CALC            BIT(3)
#define RX_TPA_START_CMP_FLAGS2_IP_TYPE                 BIT(8)
#define RX_TPA_START_CMP_FLAGS2_CSUM_CMPL_VALID         BIT(9)
#define RX_TPA_START_CMP_FLAGS2_EXT_META_FORMAT         GENMASK(11, 10)
#define RX_TPA_START_CMP_FLAGS2_EXT_META_FORMAT_SHIFT   10
#define RX_TPA_START_CMP_V3_FLAGS2_T_IP_TYPE            BIT(10)
#define RX_TPA_START_CMP_V3_FLAGS2_AGG_GRO              BIT(11)
#define RX_TPA_START_CMP_FLAGS2_CSUM_CMPL               GENMASK(31, 16)
#define RX_TPA_START_CMP_FLAGS2_CSUM_CMPL_SHIFT         16
#define RX_TPA_START_CMP_V2                             BIT(0)
#define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_MASK       GENMASK(3, 1)
#define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_SHIFT      1
#define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_NO_BUFFER  (0x0 << 1)
#define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_BAD_FORMAT (0x3 << 1)
#define RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_FLUSH      (0x5 << 1)
#define RX_TPA_START_CMP_CFA_CODE                       GENMASK(31, 16)
#define RX_TPA_START_CMPL_CFA_CODE_SHIFT                16
#define RX_TPA_START_CMP_METADATA0_TCI_MASK             GENMASK(31, 16)
#define RX_TPA_START_CMP_METADATA0_VID_MASK             GENMASK(27, 16)
#define RX_TPA_START_CMP_METADATA0_SFT                  16

struct rx_tpa_start_cmp_ext {
        __le32 rx_tpa_start_cmp_flags2;
        __le32 rx_tpa_start_cmp_metadata;
        __le32 rx_tpa_start_cmp_cfa_code_v2;
        __le32 rx_tpa_start_cmp_hdr_info;
};

#define TPA_START_CFA_CODE(rx_tpa_start)                                \
        ((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_cfa_code_v2) &   \
         RX_TPA_START_CMP_CFA_CODE) >> RX_TPA_START_CMPL_CFA_CODE_SHIFT)

#define TPA_START_IS_IPV6(rx_tpa_start)                         \
        (!!((rx_tpa_start)->rx_tpa_start_cmp_flags2 &           \
            cpu_to_le32(RX_TPA_START_CMP_FLAGS2_IP_TYPE)))

#define TPA_START_ERROR_CODE(rx_tpa_start)                              \
        ((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_cfa_code_v2) &   \
          RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_MASK) >>                 \
         RX_TPA_START_CMP_ERRORS_BUFFER_ERROR_SHIFT)

#define TPA_START_METADATA0_TCI(rx_tpa_start)                           \
        ((le32_to_cpu((rx_tpa_start)->rx_tpa_start_cmp_cfa_code_v2) &   \
          RX_TPA_START_CMP_METADATA0_TCI_MASK) >>                       \
         RX_TPA_START_CMP_METADATA0_SFT)

#define RX_TPA_END_CMP_TYPE                             GENMASK(5, 0)
#define RX_TPA_END_CMP_FLAGS                            GENMASK(15, 6)
#define RX_TPA_END_CMP_FLAGS_SHIFT                      6
#define RX_TPA_END_CMP_FLAGS_PLACEMENT                  GENMASK(9, 7)
#define RX_TPA_END_CMP_FLAGS_PLACEMENT_SHIFT            7
#define RX_TPA_END_CMP_FLAGS_PLACEMENT_JUMBO            BIT(7)
#define RX_TPA_END_CMP_FLAGS_PLACEMENT_HDS              (0x2 << 7)
#define RX_TPA_END_CMP_FLAGS_PLACEMENT_GRO_JUMBO        (0x5 << 7)
#define RX_TPA_END_CMP_FLAGS_PLACEMENT_GRO_HDS          (0x6 << 7)
#define RX_TPA_END_CMP_FLAGS_RSS_VALID                  BIT(10)
#define RX_TPA_END_CMP_FLAGS_ITYPES                     GENMASK(15, 12)
#define RX_TPA_END_CMP_FLAGS_ITYPES_SHIFT               12
#define RX_TPA_END_CMP_FLAGS_ITYPE_TCP                  (0x2 << 12)
#define RX_TPA_END_CMP_LEN                              GENMASK(31, 16)
#define RX_TPA_END_CMP_LEN_SHIFT                        16
#define RX_TPA_END_CMP_V1                               BIT(0)
#define RX_TPA_END_CMP_TPA_SEGS                         GENMASK(15, 8)
#define RX_TPA_END_CMP_TPA_SEGS_SHIFT                   8
#define RX_TPA_END_CMP_AGG_ID                           GENMASK(25, 16)
#define RX_TPA_END_CMP_AGG_ID_SHIFT                     16
#define RX_TPA_END_GRO_TS                               BIT(31)

struct rx_tpa_end_cmp {
        __le32 rx_tpa_end_cmp_len_flags_type;
        u32 rx_tpa_end_cmp_opaque;
        __le32 rx_tpa_end_cmp_misc_v1;
        __le32 rx_tpa_end_cmp_tsdelta;
};

#define TPA_END_AGG_ID(rx_tpa_end)                                      \
        ((le32_to_cpu((rx_tpa_end)->rx_tpa_end_cmp_misc_v1) &           \
         RX_TPA_END_CMP_AGG_ID) >> RX_TPA_END_CMP_AGG_ID_SHIFT)

#define TPA_END_TPA_SEGS(rx_tpa_end)                                    \
        ((le32_to_cpu((rx_tpa_end)->rx_tpa_end_cmp_misc_v1) &           \
         RX_TPA_END_CMP_TPA_SEGS) >> RX_TPA_END_CMP_TPA_SEGS_SHIFT)

#define RX_TPA_END_CMP_FLAGS_PLACEMENT_ANY_GRO                          \
        cpu_to_le32(RX_TPA_END_CMP_FLAGS_PLACEMENT_GRO_JUMBO &          \
                    RX_TPA_END_CMP_FLAGS_PLACEMENT_GRO_HDS)

#define TPA_END_GRO(rx_tpa_end)                                         \
        ((rx_tpa_end)->rx_tpa_end_cmp_len_flags_type &                  \
         RX_TPA_END_CMP_FLAGS_PLACEMENT_ANY_GRO)

#define TPA_END_GRO_TS(rx_tpa_end)                                      \
        (!!((rx_tpa_end)->rx_tpa_end_cmp_tsdelta &                      \
            cpu_to_le32(RX_TPA_END_GRO_TS)))

#define RX_TPA_END_CMP_TPA_DUP_ACKS                     GENMASK(3, 0)
#define RX_TPA_END_CMP_PAYLOAD_OFFSET                   GENMASK(23, 16)
#define RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT             16
#define RX_TPA_END_CMP_AGG_BUFS                         GENMASK(31, 24)
#define RX_TPA_END_CMP_AGG_BUFS_SHIFT                   24
#define RX_TPA_END_CMP_TPA_SEG_LEN                      GENMASK(15, 0)
#define RX_TPA_END_CMP_V2                               BIT(0)
#define RX_TPA_END_CMP_ERRORS                           GENMASK(2, 1)
#define RX_TPA_END_CMPL_ERRORS_SHIFT                    1
#define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_NO_BUFFER    (0x0 << 1)
#define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_NOT_ON_CHIP  (0x2 << 1)
#define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_BAD_FORMAT   (0x3 << 1)
#define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_RSV_ERROR    (0x4 << 1)
#define RX_TPA_END_CMP_ERRORS_BUFFER_ERROR_FLUSH        (0x5 << 1)

struct rx_tpa_end_cmp_ext {
        __le32 rx_tpa_end_cmp_dup_acks;
        __le32 rx_tpa_end_cmp_seg_len;
        __le32 rx_tpa_end_cmp_errors_v2;
        u32 rx_tpa_end_cmp_start_opaque;
};

#define TPA_END_ERRORS(rx_tpa_end_ext)                                  \
        ((rx_tpa_end_ext)->rx_tpa_end_cmp_errors_v2 &                   \
         cpu_to_le32(RX_TPA_END_CMP_ERRORS))

#define TPA_END_PAYLOAD_OFF(rx_tpa_end_ext)                             \
        ((le32_to_cpu((rx_tpa_end_ext)->rx_tpa_end_cmp_dup_acks) &      \
         RX_TPA_END_CMP_PAYLOAD_OFFSET) >>                              \
        RX_TPA_END_CMP_PAYLOAD_OFFSET_SHIFT)

#define TPA_END_AGG_BUFS(rx_tpa_end_ext)                                \
        ((le32_to_cpu((rx_tpa_end_ext)->rx_tpa_end_cmp_dup_acks) &      \
         RX_TPA_END_CMP_AGG_BUFS) >> RX_TPA_END_CMP_AGG_BUFS_SHIFT)

#define EVENT_DATA1_RESET_NOTIFY_FATAL(data1)                           \
        (((data1) &                                                     \
          ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\
         ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_EXCEPTION_FATAL)

#define EVENT_DATA1_RESET_NOTIFY_FW_ACTIVATION(data1)                   \
        (((data1) &                                                     \
          ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_MASK) ==\
        ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA1_REASON_CODE_FW_ACTIVATION)

#define EVENT_DATA2_RESET_NOTIFY_FW_STATUS_CODE(data2)                  \
        ((data2) &                                                      \
        ASYNC_EVENT_CMPL_RESET_NOTIFY_EVENT_DATA2_FW_STATUS_CODE_MASK)

#define EVENT_DATA1_RECOVERY_MASTER_FUNC(data1)                         \
        (!!((data1) &                                                   \
           ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_MASTER_FUNC))

#define EVENT_DATA1_RECOVERY_ENABLED(data1)                             \
        (!!((data1) &                                                   \
           ASYNC_EVENT_CMPL_ERROR_RECOVERY_EVENT_DATA1_FLAGS_RECOVERY_ENABLED))

#define BNGE_EVENT_ERROR_REPORT_TYPE(data1)                             \
        (((data1) &                                                     \
          ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_MASK) >>\
         ASYNC_EVENT_CMPL_ERROR_REPORT_BASE_EVENT_DATA1_ERROR_TYPE_SFT)

#define BNGE_EVENT_INVALID_SIGNAL_DATA(data2)                           \
        (((data2) &                                                     \
          ASYNC_EVENT_CMPL_ERROR_REPORT_INVALID_SIGNAL_EVENT_DATA2_PIN_ID_MASK) >>\
         ASYNC_EVENT_CMPL_ERROR_REPORT_INVALID_SIGNAL_EVENT_DATA2_PIN_ID_SFT)
#endif /* _BNGE_HW_DEF_H_ */