f-stack/dpdk/drivers/common/octeontx2/hw/otx2_npc.h

483 lines
13 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(C) 2019 Marvell International Ltd.
*/
#ifndef __OTX2_NPC_HW_H__
#define __OTX2_NPC_HW_H__
/* Register offsets */
#define NPC_AF_CFG (0x0ull)
#define NPC_AF_ACTIVE_PC (0x10ull)
#define NPC_AF_CONST (0x20ull)
#define NPC_AF_CONST1 (0x30ull)
#define NPC_AF_BLK_RST (0x40ull)
#define NPC_AF_MCAM_SCRUB_CTL (0xa0ull)
#define NPC_AF_KCAM_SCRUB_CTL (0xb0ull)
#define NPC_AF_KPUX_CFG(a) \
(0x500ull | (uint64_t)(a) << 3)
#define NPC_AF_PCK_CFG (0x600ull)
#define NPC_AF_PCK_DEF_OL2 (0x610ull)
#define NPC_AF_PCK_DEF_OIP4 (0x620ull)
#define NPC_AF_PCK_DEF_OIP6 (0x630ull)
#define NPC_AF_PCK_DEF_IIP4 (0x640ull)
#define NPC_AF_KEX_LDATAX_FLAGS_CFG(a) \
(0x800ull | (uint64_t)(a) << 3)
#define NPC_AF_INTFX_KEX_CFG(a) \
(0x1010ull | (uint64_t)(a) << 8)
#define NPC_AF_PKINDX_ACTION0(a) \
(0x80000ull | (uint64_t)(a) << 6)
#define NPC_AF_PKINDX_ACTION1(a) \
(0x80008ull | (uint64_t)(a) << 6)
#define NPC_AF_PKINDX_CPI_DEFX(a, b) \
(0x80020ull | (uint64_t)(a) << 6 | (uint64_t)(b) << 3)
#define NPC_AF_CHLEN90B_PKIND (0x3bull)
#define NPC_AF_KPUX_ENTRYX_CAMX(a, b, c) \
(0x100000ull | (uint64_t)(a) << 14 | (uint64_t)(b) << 6 | \
(uint64_t)(c) << 3)
#define NPC_AF_KPUX_ENTRYX_ACTION0(a, b) \
(0x100020ull | (uint64_t)(a) << 14 | (uint64_t)(b) << 6)
#define NPC_AF_KPUX_ENTRYX_ACTION1(a, b) \
(0x100028ull | (uint64_t)(a) << 14 | (uint64_t)(b) << 6)
#define NPC_AF_KPUX_ENTRY_DISX(a, b) \
(0x180000ull | (uint64_t)(a) << 6 | (uint64_t)(b) << 3)
#define NPC_AF_CPIX_CFG(a) \
(0x200000ull | (uint64_t)(a) << 3)
#define NPC_AF_INTFX_LIDX_LTX_LDX_CFG(a, b, c, d) \
(0x900000ull | (uint64_t)(a) << 16 | (uint64_t)(b) << 12 | \
(uint64_t)(c) << 5 | (uint64_t)(d) << 3)
#define NPC_AF_INTFX_LDATAX_FLAGSX_CFG(a, b, c) \
(0x980000ull | (uint64_t)(a) << 16 | (uint64_t)(b) << 12 | \
(uint64_t)(c) << 3)
#define NPC_AF_MCAMEX_BANKX_CAMX_INTF(a, b, c) \
(0x1000000ull | (uint64_t)(a) << 10 | (uint64_t)(b) << 6 | \
(uint64_t)(c) << 3)
#define NPC_AF_MCAMEX_BANKX_CAMX_W0(a, b, c) \
(0x1000010ull | (uint64_t)(a) << 10 | (uint64_t)(b) << 6 | \
(uint64_t)(c) << 3)
#define NPC_AF_MCAMEX_BANKX_CAMX_W1(a, b, c) \
(0x1000020ull | (uint64_t)(a) << 10 | (uint64_t)(b) << 6 | \
(uint64_t)(c) << 3)
#define NPC_AF_MCAMEX_BANKX_CFG(a, b) \
(0x1800000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
#define NPC_AF_MCAMEX_BANKX_STAT_ACT(a, b) \
(0x1880000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
#define NPC_AF_MATCH_STATX(a) \
(0x1880008ull | (uint64_t)(a) << 8)
#define NPC_AF_INTFX_MISS_STAT_ACT(a) \
(0x1880040ull + (uint64_t)(a) * 0x8)
#define NPC_AF_MCAMEX_BANKX_ACTION(a, b) \
(0x1900000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
#define NPC_AF_MCAMEX_BANKX_TAG_ACT(a, b) \
(0x1900008ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
#define NPC_AF_INTFX_MISS_ACT(a) \
(0x1a00000ull | (uint64_t)(a) << 4)
#define NPC_AF_INTFX_MISS_TAG_ACT(a) \
(0x1b00008ull | (uint64_t)(a) << 4)
#define NPC_AF_MCAM_BANKX_HITX(a, b) \
(0x1c80000ull | (uint64_t)(a) << 8 | (uint64_t)(b) << 4)
#define NPC_AF_LKUP_CTL (0x2000000ull)
#define NPC_AF_LKUP_DATAX(a) \
(0x2000200ull | (uint64_t)(a) << 4)
#define NPC_AF_LKUP_RESULTX(a) \
(0x2000400ull | (uint64_t)(a) << 4)
#define NPC_AF_INTFX_STAT(a) \
(0x2000800ull | (uint64_t)(a) << 4)
#define NPC_AF_DBG_CTL (0x3000000ull)
#define NPC_AF_DBG_STATUS (0x3000010ull)
#define NPC_AF_KPUX_DBG(a) \
(0x3000020ull | (uint64_t)(a) << 8)
#define NPC_AF_IKPU_ERR_CTL (0x3000080ull)
#define NPC_AF_KPUX_ERR_CTL(a) \
(0x30000a0ull | (uint64_t)(a) << 8)
#define NPC_AF_MCAM_DBG (0x3001000ull)
#define NPC_AF_DBG_DATAX(a) \
(0x3001400ull | (uint64_t)(a) << 4)
#define NPC_AF_DBG_RESULTX(a) \
(0x3001800ull | (uint64_t)(a) << 4)
/* Enum offsets */
#define NPC_INTF_NIX0_RX (0x0ull)
#define NPC_INTF_NIX0_TX (0x1ull)
#define NPC_LKUPOP_PKT (0x0ull)
#define NPC_LKUPOP_KEY (0x1ull)
#define NPC_MCAM_KEY_X1 (0x0ull)
#define NPC_MCAM_KEY_X2 (0x1ull)
#define NPC_MCAM_KEY_X4 (0x2ull)
enum NPC_ERRLEV_E {
NPC_ERRLEV_RE = 0,
NPC_ERRLEV_LA = 1,
NPC_ERRLEV_LB = 2,
NPC_ERRLEV_LC = 3,
NPC_ERRLEV_LD = 4,
NPC_ERRLEV_LE = 5,
NPC_ERRLEV_LF = 6,
NPC_ERRLEV_LG = 7,
NPC_ERRLEV_LH = 8,
NPC_ERRLEV_R9 = 9,
NPC_ERRLEV_R10 = 10,
NPC_ERRLEV_R11 = 11,
NPC_ERRLEV_R12 = 12,
NPC_ERRLEV_R13 = 13,
NPC_ERRLEV_R14 = 14,
NPC_ERRLEV_NIX = 15,
NPC_ERRLEV_ENUM_LAST = 16,
};
enum npc_kpu_err_code {
NPC_EC_NOERR = 0, /* has to be zero */
NPC_EC_UNK,
NPC_EC_IH_LENGTH,
NPC_EC_EDSA_UNK,
NPC_EC_L2_K1,
NPC_EC_L2_K2,
NPC_EC_L2_K3,
NPC_EC_L2_K3_ETYPE_UNK,
NPC_EC_L2_K4,
NPC_EC_MPLS_2MANY,
NPC_EC_MPLS_UNK,
NPC_EC_NSH_UNK,
NPC_EC_IP_TTL_0,
NPC_EC_IP_FRAG_OFFSET_1,
NPC_EC_IP_VER,
NPC_EC_IP6_HOP_0,
NPC_EC_IP6_VER,
NPC_EC_TCP_FLAGS_FIN_ONLY,
NPC_EC_TCP_FLAGS_ZERO,
NPC_EC_TCP_FLAGS_RST_FIN,
NPC_EC_TCP_FLAGS_URG_SYN,
NPC_EC_TCP_FLAGS_RST_SYN,
NPC_EC_TCP_FLAGS_SYN_FIN,
NPC_EC_VXLAN,
NPC_EC_NVGRE,
NPC_EC_GRE,
NPC_EC_GRE_VER1,
NPC_EC_L4,
NPC_EC_OIP4_CSUM,
NPC_EC_IIP4_CSUM,
NPC_EC_LAST /* has to be the last item */
};
enum NPC_LID_E {
NPC_LID_LA = 0,
NPC_LID_LB,
NPC_LID_LC,
NPC_LID_LD,
NPC_LID_LE,
NPC_LID_LF,
NPC_LID_LG,
NPC_LID_LH,
};
#define NPC_LT_NA 0
enum npc_kpu_la_ltype {
NPC_LT_LA_8023 = 1,
NPC_LT_LA_ETHER,
NPC_LT_LA_IH_NIX_ETHER,
NPC_LT_LA_IH_8_ETHER,
NPC_LT_LA_IH_4_ETHER,
NPC_LT_LA_IH_2_ETHER,
NPC_LT_LA_HIGIG2_ETHER,
NPC_LT_LA_IH_NIX_HIGIG2_ETHER,
NPC_LT_LA_CH_LEN_90B_ETHER, /* Custom L2 header of length 90 bytes */
};
enum npc_kpu_lb_ltype {
NPC_LT_LB_ETAG = 1,
NPC_LT_LB_CTAG,
NPC_LT_LB_STAG_QINQ,
NPC_LT_LB_BTAG,
NPC_LT_LB_ITAG,
NPC_LT_LB_DSA,
NPC_LT_LB_DSA_VLAN,
NPC_LT_LB_EDSA,
NPC_LT_LB_EDSA_VLAN,
NPC_LT_LB_EXDSA,
NPC_LT_LB_EXDSA_VLAN,
};
enum npc_kpu_lc_ltype {
NPC_LT_LC_PTP = 1,
NPC_LT_LC_IP,
NPC_LT_LC_IP_OPT,
NPC_LT_LC_IP6,
NPC_LT_LC_IP6_EXT,
NPC_LT_LC_ARP,
NPC_LT_LC_RARP,
NPC_LT_LC_MPLS,
NPC_LT_LC_NSH,
NPC_LT_LC_FCOE,
};
/* Don't modify Ltypes up to SCTP, otherwise it will
* effect flow tag calculation and thus RSS.
*/
enum npc_kpu_ld_ltype {
NPC_LT_LD_TCP = 1,
NPC_LT_LD_UDP,
NPC_LT_LD_ICMP,
NPC_LT_LD_SCTP,
NPC_LT_LD_ICMP6,
NPC_LT_LD_IGMP = 8,
NPC_LT_LD_AH,
NPC_LT_LD_GRE,
NPC_LT_LD_NVGRE,
NPC_LT_LD_NSH,
NPC_LT_LD_TU_MPLS_IN_NSH,
NPC_LT_LD_TU_MPLS_IN_IP,
};
enum npc_kpu_le_ltype {
NPC_LT_LE_VXLAN = 1,
NPC_LT_LE_GENEVE,
NPC_LT_LE_ESP,
NPC_LT_LE_GTPU = 4,
NPC_LT_LE_VXLANGPE,
NPC_LT_LE_GTPC,
NPC_LT_LE_NSH,
NPC_LT_LE_TU_MPLS_IN_GRE,
NPC_LT_LE_TU_NSH_IN_GRE,
NPC_LT_LE_TU_MPLS_IN_UDP,
};
enum npc_kpu_lf_ltype {
NPC_LT_LF_TU_ETHER = 1,
NPC_LT_LF_TU_PPP,
NPC_LT_LF_TU_MPLS_IN_VXLANGPE,
NPC_LT_LF_TU_NSH_IN_VXLANGPE,
NPC_LT_LF_TU_MPLS_IN_NSH,
NPC_LT_LF_TU_3RD_NSH,
};
enum npc_kpu_lg_ltype {
NPC_LT_LG_TU_IP = 1,
NPC_LT_LG_TU_IP6,
NPC_LT_LG_TU_ARP,
NPC_LT_LG_TU_ETHER_IN_NSH,
};
/* Don't modify Ltypes up to SCTP, otherwise it will
* effect flow tag calculation and thus RSS.
*/
enum npc_kpu_lh_ltype {
NPC_LT_LH_TU_TCP = 1,
NPC_LT_LH_TU_UDP,
NPC_LT_LH_TU_ICMP,
NPC_LT_LH_TU_SCTP,
NPC_LT_LH_TU_ICMP6,
NPC_LT_LH_TU_IGMP = 8,
NPC_LT_LH_TU_ESP,
NPC_LT_LH_TU_AH,
};
/* Structures definitions */
struct npc_kpu_profile_cam {
uint8_t state;
uint8_t state_mask;
uint16_t dp0;
uint16_t dp0_mask;
uint16_t dp1;
uint16_t dp1_mask;
uint16_t dp2;
uint16_t dp2_mask;
};
struct npc_kpu_profile_action {
uint8_t errlev;
uint8_t errcode;
uint8_t dp0_offset;
uint8_t dp1_offset;
uint8_t dp2_offset;
uint8_t bypass_count;
uint8_t parse_done;
uint8_t next_state;
uint8_t ptr_advance;
uint8_t cap_ena;
uint8_t lid;
uint8_t ltype;
uint8_t flags;
uint8_t offset;
uint8_t mask;
uint8_t right;
uint8_t shift;
};
struct npc_kpu_profile {
int cam_entries;
int action_entries;
struct npc_kpu_profile_cam *cam;
struct npc_kpu_profile_action *action;
};
/* NPC KPU register formats */
struct npc_kpu_cam {
uint64_t dp0_data : 16;
uint64_t dp1_data : 16;
uint64_t dp2_data : 16;
uint64_t state : 8;
uint64_t rsvd_63_56 : 8;
};
struct npc_kpu_action0 {
uint64_t var_len_shift : 3;
uint64_t var_len_right : 1;
uint64_t var_len_mask : 8;
uint64_t var_len_offset : 8;
uint64_t ptr_advance : 8;
uint64_t capture_flags : 8;
uint64_t capture_ltype : 4;
uint64_t capture_lid : 3;
uint64_t rsvd_43 : 1;
uint64_t next_state : 8;
uint64_t parse_done : 1;
uint64_t capture_ena : 1;
uint64_t byp_count : 3;
uint64_t rsvd_63_57 : 7;
};
struct npc_kpu_action1 {
uint64_t dp0_offset : 8;
uint64_t dp1_offset : 8;
uint64_t dp2_offset : 8;
uint64_t errcode : 8;
uint64_t errlev : 4;
uint64_t rsvd_63_36 : 28;
};
struct npc_kpu_pkind_cpi_def {
uint64_t cpi_base : 10;
uint64_t rsvd_11_10 : 2;
uint64_t add_shift : 3;
uint64_t rsvd_15 : 1;
uint64_t add_mask : 8;
uint64_t add_offset : 8;
uint64_t flags_mask : 8;
uint64_t flags_match : 8;
uint64_t ltype_mask : 4;
uint64_t ltype_match : 4;
uint64_t lid : 3;
uint64_t rsvd_62_59 : 4;
uint64_t ena : 1;
};
struct nix_rx_action {
uint64_t op :4;
uint64_t pf_func :16;
uint64_t index :20;
uint64_t match_id :16;
uint64_t flow_key_alg :5;
uint64_t rsvd_63_61 :3;
};
struct nix_tx_action {
uint64_t op :4;
uint64_t rsvd_11_4 :8;
uint64_t index :20;
uint64_t match_id :16;
uint64_t rsvd_63_48 :16;
};
/* NPC layer parse information structure */
struct npc_layer_info_s {
uint32_t lptr : 8;
uint32_t flags : 8;
uint32_t ltype : 4;
uint32_t rsvd_31_20 : 12;
};
/* NPC layer mcam search key extract structure */
struct npc_layer_kex_s {
uint16_t flags : 8;
uint16_t ltype : 4;
uint16_t rsvd_15_12 : 4;
};
/* NPC mcam search key x1 structure */
struct npc_mcam_key_x1_s {
uint64_t intf : 2;
uint64_t rsvd_63_2 : 62;
uint64_t kw0 : 64; /* W1 */
uint64_t kw1 : 48;
uint64_t rsvd_191_176 : 16;
};
/* NPC mcam search key x2 structure */
struct npc_mcam_key_x2_s {
uint64_t intf : 2;
uint64_t rsvd_63_2 : 62;
uint64_t kw0 : 64; /* W1 */
uint64_t kw1 : 64; /* W2 */
uint64_t kw2 : 64; /* W3 */
uint64_t kw3 : 32;
uint64_t rsvd_319_288 : 32;
};
/* NPC mcam search key x4 structure */
struct npc_mcam_key_x4_s {
uint64_t intf : 2;
uint64_t rsvd_63_2 : 62;
uint64_t kw0 : 64; /* W1 */
uint64_t kw1 : 64; /* W2 */
uint64_t kw2 : 64; /* W3 */
uint64_t kw3 : 64; /* W4 */
uint64_t kw4 : 64; /* W5 */
uint64_t kw5 : 64; /* W6 */
uint64_t kw6 : 64; /* W7 */
};
/* NPC parse key extract structure */
struct npc_parse_kex_s {
uint64_t chan : 12;
uint64_t errlev : 4;
uint64_t errcode : 8;
uint64_t l2m : 1;
uint64_t l2b : 1;
uint64_t l3m : 1;
uint64_t l3b : 1;
uint64_t la : 12;
uint64_t lb : 12;
uint64_t lc : 12;
uint64_t ld : 12;
uint64_t le : 12;
uint64_t lf : 12;
uint64_t lg : 12;
uint64_t lh : 12;
uint64_t rsvd_127_124 : 4;
};
/* NPC result structure */
struct npc_result_s {
uint64_t intf : 2;
uint64_t pkind : 6;
uint64_t chan : 12;
uint64_t errlev : 4;
uint64_t errcode : 8;
uint64_t l2m : 1;
uint64_t l2b : 1;
uint64_t l3m : 1;
uint64_t l3b : 1;
uint64_t eoh_ptr : 8;
uint64_t rsvd_63_44 : 20;
uint64_t action : 64; /* W1 */
uint64_t vtag_action : 64; /* W2 */
uint64_t la : 20;
uint64_t lb : 20;
uint64_t lc : 20;
uint64_t rsvd_255_252 : 4;
uint64_t ld : 20;
uint64_t le : 20;
uint64_t lf : 20;
uint64_t rsvd_319_316 : 4;
uint64_t lg : 20;
uint64_t lh : 20;
uint64_t rsvd_383_360 : 24;
};
#endif /* __OTX2_NPC_HW_H__ */