1b38f4ff0SLorenzo Bianconi /* SPDX-License-Identifier: GPL-2.0-only */ 2b38f4ff0SLorenzo Bianconi /* 3b38f4ff0SLorenzo Bianconi * Copyright (c) 2024 AIROHA Inc 4b38f4ff0SLorenzo Bianconi * Author: Lorenzo Bianconi <lorenzo@kernel.org> 5b38f4ff0SLorenzo Bianconi */ 6b38f4ff0SLorenzo Bianconi 7b38f4ff0SLorenzo Bianconi #ifndef AIROHA_ETH_H 8b38f4ff0SLorenzo Bianconi #define AIROHA_ETH_H 9b38f4ff0SLorenzo Bianconi 10b38f4ff0SLorenzo Bianconi #include <linux/etherdevice.h> 11b38f4ff0SLorenzo Bianconi #include <linux/iopoll.h> 12b38f4ff0SLorenzo Bianconi #include <linux/kernel.h> 13b38f4ff0SLorenzo Bianconi #include <linux/netdevice.h> 14b38f4ff0SLorenzo Bianconi #include <linux/reset.h> 15*00a76783SLorenzo Bianconi #include <net/dsa.h> 16b38f4ff0SLorenzo Bianconi 1780369686SLorenzo Bianconi #define AIROHA_MAX_NUM_GDM_PORTS 4 18b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_QDMA 2 19af3cf757SLorenzo Bianconi #define AIROHA_MAX_DSA_PORTS 7 20b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_RSTS 3 21b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_XSI_RSTS 5 22b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_MTU 2000 23b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_PACKET_SIZE 2048 24b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_CHANNELS 4 25b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_QUEUES 8 26b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_RING 32 27b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_RX_RING 32 28b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_NETDEV_TX_RINGS (AIROHA_NUM_TX_RING + \ 29b38f4ff0SLorenzo Bianconi AIROHA_NUM_QOS_CHANNELS) 30b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_TABLE 64 31b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_PORT 16 32b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_IRQ 2 33b38f4ff0SLorenzo Bianconi #define HW_DSCP_NUM 2048 34b38f4ff0SLorenzo Bianconi #define IRQ_QUEUE_LEN(_n) ((_n) ? 1024 : 2048) 35b38f4ff0SLorenzo Bianconi #define TX_DSCP_NUM 1024 36b38f4ff0SLorenzo Bianconi #define RX_DSCP_NUM(_n) \ 37b38f4ff0SLorenzo Bianconi ((_n) == 2 ? 128 : \ 38b38f4ff0SLorenzo Bianconi (_n) == 11 ? 128 : \ 39b38f4ff0SLorenzo Bianconi (_n) == 15 ? 128 : \ 40b38f4ff0SLorenzo Bianconi (_n) == 0 ? 1024 : 16) 41b38f4ff0SLorenzo Bianconi 42b38f4ff0SLorenzo Bianconi #define PSE_RSV_PAGES 128 43b38f4ff0SLorenzo Bianconi #define PSE_QUEUE_RSV_PAGES 64 44b38f4ff0SLorenzo Bianconi 45b38f4ff0SLorenzo Bianconi #define QDMA_METER_IDX(_n) ((_n) & 0xff) 46b38f4ff0SLorenzo Bianconi #define QDMA_METER_GROUP(_n) (((_n) >> 8) & 0x3) 47b38f4ff0SLorenzo Bianconi 48*00a76783SLorenzo Bianconi #define PPE_NUM 2 49*00a76783SLorenzo Bianconi #define PPE1_SRAM_NUM_ENTRIES (8 * 1024) 50*00a76783SLorenzo Bianconi #define PPE_SRAM_NUM_ENTRIES (2 * PPE1_SRAM_NUM_ENTRIES) 51*00a76783SLorenzo Bianconi #define PPE_DRAM_NUM_ENTRIES (16 * 1024) 52*00a76783SLorenzo Bianconi #define PPE_NUM_ENTRIES (PPE_SRAM_NUM_ENTRIES + PPE_DRAM_NUM_ENTRIES) 53*00a76783SLorenzo Bianconi #define PPE_HASH_MASK (PPE_NUM_ENTRIES - 1) 54*00a76783SLorenzo Bianconi #define PPE_ENTRY_SIZE 80 55*00a76783SLorenzo Bianconi #define PPE_RAM_NUM_ENTRIES_SHIFT(_n) (__ffs((_n) >> 10)) 56*00a76783SLorenzo Bianconi 57af3cf757SLorenzo Bianconi #define MTK_HDR_LEN 4 58af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_8100 1 59af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_88A8 2 60af3cf757SLorenzo Bianconi 61b38f4ff0SLorenzo Bianconi enum { 62b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX0, 63b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX1, 64b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX2, 65b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX3, 66b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX4, 67b38f4ff0SLorenzo Bianconi QDMA_INT_REG_MAX 68b38f4ff0SLorenzo Bianconi }; 69b38f4ff0SLorenzo Bianconi 70b38f4ff0SLorenzo Bianconi enum { 71b38f4ff0SLorenzo Bianconi XSI_PCIE0_VIP_PORT_MASK = BIT(22), 72b38f4ff0SLorenzo Bianconi XSI_PCIE1_VIP_PORT_MASK = BIT(23), 73b38f4ff0SLorenzo Bianconi XSI_USB_VIP_PORT_MASK = BIT(25), 74b38f4ff0SLorenzo Bianconi XSI_ETH_VIP_PORT_MASK = BIT(24), 75b38f4ff0SLorenzo Bianconi }; 76b38f4ff0SLorenzo Bianconi 77b38f4ff0SLorenzo Bianconi enum { 78b38f4ff0SLorenzo Bianconi DEV_STATE_INITIALIZED, 79b38f4ff0SLorenzo Bianconi }; 80b38f4ff0SLorenzo Bianconi 81b38f4ff0SLorenzo Bianconi enum { 82b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q1 = 1, 83b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q5 = 5, 84b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q6 = 6, 85b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q15 = 15, 86b38f4ff0SLorenzo Bianconi }; 87b38f4ff0SLorenzo Bianconi 88b38f4ff0SLorenzo Bianconi enum { 89b38f4ff0SLorenzo Bianconi CRSN_08 = 0x8, 90b38f4ff0SLorenzo Bianconi CRSN_21 = 0x15, /* KA */ 91b38f4ff0SLorenzo Bianconi CRSN_22 = 0x16, /* hit bind and force route to CPU */ 92b38f4ff0SLorenzo Bianconi CRSN_24 = 0x18, 93b38f4ff0SLorenzo Bianconi CRSN_25 = 0x19, 94b38f4ff0SLorenzo Bianconi }; 95b38f4ff0SLorenzo Bianconi 96b38f4ff0SLorenzo Bianconi enum { 97b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM1, 98b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM1, 99b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM2, 100b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM3, 101b38f4ff0SLorenzo Bianconi FE_PSE_PORT_PPE1, 102b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM2, 103b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM3, 104b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM4, 105b38f4ff0SLorenzo Bianconi FE_PSE_PORT_PPE2, 106b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM4, 107b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM5, 108b38f4ff0SLorenzo Bianconi FE_PSE_PORT_DROP = 0xf, 109b38f4ff0SLorenzo Bianconi }; 110b38f4ff0SLorenzo Bianconi 111b38f4ff0SLorenzo Bianconi enum tx_sched_mode { 112b38f4ff0SLorenzo Bianconi TC_SCH_WRR8, 113b38f4ff0SLorenzo Bianconi TC_SCH_SP, 114b38f4ff0SLorenzo Bianconi TC_SCH_WRR7, 115b38f4ff0SLorenzo Bianconi TC_SCH_WRR6, 116b38f4ff0SLorenzo Bianconi TC_SCH_WRR5, 117b38f4ff0SLorenzo Bianconi TC_SCH_WRR4, 118b38f4ff0SLorenzo Bianconi TC_SCH_WRR3, 119b38f4ff0SLorenzo Bianconi TC_SCH_WRR2, 120b38f4ff0SLorenzo Bianconi }; 121b38f4ff0SLorenzo Bianconi 122b38f4ff0SLorenzo Bianconi enum trtcm_param_type { 123b38f4ff0SLorenzo Bianconi TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */ 124b38f4ff0SLorenzo Bianconi TRTCM_TOKEN_RATE_MODE, 125b38f4ff0SLorenzo Bianconi TRTCM_BUCKETSIZE_SHIFT_MODE, 126b38f4ff0SLorenzo Bianconi TRTCM_BUCKET_COUNTER_MODE, 127b38f4ff0SLorenzo Bianconi }; 128b38f4ff0SLorenzo Bianconi 129b38f4ff0SLorenzo Bianconi enum trtcm_mode_type { 130b38f4ff0SLorenzo Bianconi TRTCM_COMMIT_MODE, 131b38f4ff0SLorenzo Bianconi TRTCM_PEAK_MODE, 132b38f4ff0SLorenzo Bianconi }; 133b38f4ff0SLorenzo Bianconi 134b38f4ff0SLorenzo Bianconi enum trtcm_param { 135b38f4ff0SLorenzo Bianconi TRTCM_TICK_SEL = BIT(0), 136b38f4ff0SLorenzo Bianconi TRTCM_PKT_MODE = BIT(1), 137b38f4ff0SLorenzo Bianconi TRTCM_METER_MODE = BIT(2), 138b38f4ff0SLorenzo Bianconi }; 139b38f4ff0SLorenzo Bianconi 140b38f4ff0SLorenzo Bianconi #define MIN_TOKEN_SIZE 4096 141b38f4ff0SLorenzo Bianconi #define MAX_TOKEN_SIZE_OFFSET 17 142b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_MASK GENMASK(23, 6) 143b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_FRACTION_MASK GENMASK(5, 0) 144b38f4ff0SLorenzo Bianconi 145b38f4ff0SLorenzo Bianconi struct airoha_queue_entry { 146b38f4ff0SLorenzo Bianconi union { 147b38f4ff0SLorenzo Bianconi void *buf; 148b38f4ff0SLorenzo Bianconi struct sk_buff *skb; 149b38f4ff0SLorenzo Bianconi }; 150b38f4ff0SLorenzo Bianconi dma_addr_t dma_addr; 151b38f4ff0SLorenzo Bianconi u16 dma_len; 152b38f4ff0SLorenzo Bianconi }; 153b38f4ff0SLorenzo Bianconi 154b38f4ff0SLorenzo Bianconi struct airoha_queue { 155b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 156b38f4ff0SLorenzo Bianconi 157b38f4ff0SLorenzo Bianconi /* protect concurrent queue accesses */ 158b38f4ff0SLorenzo Bianconi spinlock_t lock; 159b38f4ff0SLorenzo Bianconi struct airoha_queue_entry *entry; 160b38f4ff0SLorenzo Bianconi struct airoha_qdma_desc *desc; 161b38f4ff0SLorenzo Bianconi u16 head; 162b38f4ff0SLorenzo Bianconi u16 tail; 163b38f4ff0SLorenzo Bianconi 164b38f4ff0SLorenzo Bianconi int queued; 165b38f4ff0SLorenzo Bianconi int ndesc; 166b38f4ff0SLorenzo Bianconi int free_thr; 167b38f4ff0SLorenzo Bianconi int buf_size; 168b38f4ff0SLorenzo Bianconi 169b38f4ff0SLorenzo Bianconi struct napi_struct napi; 170b38f4ff0SLorenzo Bianconi struct page_pool *page_pool; 171b38f4ff0SLorenzo Bianconi }; 172b38f4ff0SLorenzo Bianconi 173b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue { 174b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 175b38f4ff0SLorenzo Bianconi 176b38f4ff0SLorenzo Bianconi struct napi_struct napi; 177b38f4ff0SLorenzo Bianconi 178b38f4ff0SLorenzo Bianconi int size; 179b38f4ff0SLorenzo Bianconi u32 *q; 180b38f4ff0SLorenzo Bianconi }; 181b38f4ff0SLorenzo Bianconi 182b38f4ff0SLorenzo Bianconi struct airoha_hw_stats { 183b38f4ff0SLorenzo Bianconi /* protect concurrent hw_stats accesses */ 184b38f4ff0SLorenzo Bianconi spinlock_t lock; 185b38f4ff0SLorenzo Bianconi struct u64_stats_sync syncp; 186b38f4ff0SLorenzo Bianconi 187b38f4ff0SLorenzo Bianconi /* get_stats64 */ 188b38f4ff0SLorenzo Bianconi u64 rx_ok_pkts; 189b38f4ff0SLorenzo Bianconi u64 tx_ok_pkts; 190b38f4ff0SLorenzo Bianconi u64 rx_ok_bytes; 191b38f4ff0SLorenzo Bianconi u64 tx_ok_bytes; 192b38f4ff0SLorenzo Bianconi u64 rx_multicast; 193b38f4ff0SLorenzo Bianconi u64 rx_errors; 194b38f4ff0SLorenzo Bianconi u64 rx_drops; 195b38f4ff0SLorenzo Bianconi u64 tx_drops; 196b38f4ff0SLorenzo Bianconi u64 rx_crc_error; 197b38f4ff0SLorenzo Bianconi u64 rx_over_errors; 198b38f4ff0SLorenzo Bianconi /* ethtool stats */ 199b38f4ff0SLorenzo Bianconi u64 tx_broadcast; 200b38f4ff0SLorenzo Bianconi u64 tx_multicast; 201b38f4ff0SLorenzo Bianconi u64 tx_len[7]; 202b38f4ff0SLorenzo Bianconi u64 rx_broadcast; 203b38f4ff0SLorenzo Bianconi u64 rx_fragment; 204b38f4ff0SLorenzo Bianconi u64 rx_jabber; 205b38f4ff0SLorenzo Bianconi u64 rx_len[7]; 206b38f4ff0SLorenzo Bianconi }; 207b38f4ff0SLorenzo Bianconi 208*00a76783SLorenzo Bianconi enum { 209*00a76783SLorenzo Bianconi PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f, 210*00a76783SLorenzo Bianconi }; 211*00a76783SLorenzo Bianconi 212*00a76783SLorenzo Bianconi enum { 213*00a76783SLorenzo Bianconi AIROHA_FOE_STATE_INVALID, 214*00a76783SLorenzo Bianconi AIROHA_FOE_STATE_UNBIND, 215*00a76783SLorenzo Bianconi AIROHA_FOE_STATE_BIND, 216*00a76783SLorenzo Bianconi AIROHA_FOE_STATE_FIN 217*00a76783SLorenzo Bianconi }; 218*00a76783SLorenzo Bianconi 219*00a76783SLorenzo Bianconi enum { 220*00a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_HNAPT = 0, 221*00a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_ROUTE = 1, 222*00a76783SLorenzo Bianconi PPE_PKT_TYPE_BRIDGE = 2, 223*00a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_DSLITE = 3, 224*00a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_ROUTE_3T = 4, 225*00a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_ROUTE_5T = 5, 226*00a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_6RD = 7, 227*00a76783SLorenzo Bianconi }; 228*00a76783SLorenzo Bianconi 229*00a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_SMAC_ID GENMASK(20, 16) 230*00a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_PPPOE_ID GENMASK(15, 0) 231*00a76783SLorenzo Bianconi 232*00a76783SLorenzo Bianconi struct airoha_foe_mac_info_common { 233*00a76783SLorenzo Bianconi u16 vlan1; 234*00a76783SLorenzo Bianconi u16 etype; 235*00a76783SLorenzo Bianconi 236*00a76783SLorenzo Bianconi u32 dest_mac_hi; 237*00a76783SLorenzo Bianconi 238*00a76783SLorenzo Bianconi u16 vlan2; 239*00a76783SLorenzo Bianconi u16 dest_mac_lo; 240*00a76783SLorenzo Bianconi 241*00a76783SLorenzo Bianconi u32 src_mac_hi; 242*00a76783SLorenzo Bianconi }; 243*00a76783SLorenzo Bianconi 244*00a76783SLorenzo Bianconi struct airoha_foe_mac_info { 245*00a76783SLorenzo Bianconi struct airoha_foe_mac_info_common common; 246*00a76783SLorenzo Bianconi 247*00a76783SLorenzo Bianconi u16 pppoe_id; 248*00a76783SLorenzo Bianconi u16 src_mac_lo; 249*00a76783SLorenzo Bianconi }; 250*00a76783SLorenzo Bianconi 251*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PREBIND BIT(24) 252*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8) 253*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0) 254*00a76783SLorenzo Bianconi 255*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATIC BIT(31) 256*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_UDP BIT(30) 257*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATE GENMASK(29, 28) 258*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PACKET_TYPE GENMASK(27, 25) 259*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TTL BIT(24) 260*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP BIT(23) 261*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PPPOE BIT(22) 262*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VPM GENMASK(21, 20) 263*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VLAN_LAYER GENMASK(19, 16) 264*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_KEEPALIVE BIT(15) 265*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0) 266*00a76783SLorenzo Bianconi 267*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_DSCP GENMASK(31, 24) 268*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PORT_AG GENMASK(23, 13) 269*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PCP BIT(12) 270*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_MULTICAST BIT(11) 271*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_FAST_PATH BIT(10) 272*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_QOS BIT(9) 273*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_PORT GENMASK(8, 5) 274*00a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_NBQ GENMASK(4, 0) 275*00a76783SLorenzo Bianconi 276*00a76783SLorenzo Bianconi #define AIROHA_FOE_ACTDP GENMASK(31, 24) 277*00a76783SLorenzo Bianconi #define AIROHA_FOE_SHAPER_ID GENMASK(23, 16) 278*00a76783SLorenzo Bianconi #define AIROHA_FOE_CHANNEL GENMASK(15, 11) 279*00a76783SLorenzo Bianconi #define AIROHA_FOE_QID GENMASK(10, 8) 280*00a76783SLorenzo Bianconi #define AIROHA_FOE_DPI BIT(7) 281*00a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL BIT(6) 282*00a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL_ID GENMASK(5, 0) 283*00a76783SLorenzo Bianconi 284*00a76783SLorenzo Bianconi struct airoha_foe_bridge { 285*00a76783SLorenzo Bianconi u32 dest_mac_hi; 286*00a76783SLorenzo Bianconi 287*00a76783SLorenzo Bianconi u16 src_mac_hi; 288*00a76783SLorenzo Bianconi u16 dest_mac_lo; 289*00a76783SLorenzo Bianconi 290*00a76783SLorenzo Bianconi u32 src_mac_lo; 291*00a76783SLorenzo Bianconi 292*00a76783SLorenzo Bianconi u32 ib2; 293*00a76783SLorenzo Bianconi 294*00a76783SLorenzo Bianconi u32 rsv[5]; 295*00a76783SLorenzo Bianconi 296*00a76783SLorenzo Bianconi u32 data; 297*00a76783SLorenzo Bianconi 298*00a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 299*00a76783SLorenzo Bianconi }; 300*00a76783SLorenzo Bianconi 301*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple { 302*00a76783SLorenzo Bianconi u32 src_ip; 303*00a76783SLorenzo Bianconi u32 dest_ip; 304*00a76783SLorenzo Bianconi union { 305*00a76783SLorenzo Bianconi struct { 306*00a76783SLorenzo Bianconi u16 dest_port; 307*00a76783SLorenzo Bianconi u16 src_port; 308*00a76783SLorenzo Bianconi }; 309*00a76783SLorenzo Bianconi struct { 310*00a76783SLorenzo Bianconi u8 protocol; 311*00a76783SLorenzo Bianconi u8 _pad[3]; /* fill with 0xa5a5a5 */ 312*00a76783SLorenzo Bianconi }; 313*00a76783SLorenzo Bianconi u32 ports; 314*00a76783SLorenzo Bianconi }; 315*00a76783SLorenzo Bianconi }; 316*00a76783SLorenzo Bianconi 317*00a76783SLorenzo Bianconi struct airoha_foe_ipv4 { 318*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple orig_tuple; 319*00a76783SLorenzo Bianconi 320*00a76783SLorenzo Bianconi u32 ib2; 321*00a76783SLorenzo Bianconi 322*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple new_tuple; 323*00a76783SLorenzo Bianconi 324*00a76783SLorenzo Bianconi u32 rsv[2]; 325*00a76783SLorenzo Bianconi 326*00a76783SLorenzo Bianconi u32 data; 327*00a76783SLorenzo Bianconi 328*00a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 329*00a76783SLorenzo Bianconi }; 330*00a76783SLorenzo Bianconi 331*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite { 332*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple ip4; 333*00a76783SLorenzo Bianconi 334*00a76783SLorenzo Bianconi u32 ib2; 335*00a76783SLorenzo Bianconi 336*00a76783SLorenzo Bianconi u8 flow_label[3]; 337*00a76783SLorenzo Bianconi u8 priority; 338*00a76783SLorenzo Bianconi 339*00a76783SLorenzo Bianconi u32 rsv[4]; 340*00a76783SLorenzo Bianconi 341*00a76783SLorenzo Bianconi u32 data; 342*00a76783SLorenzo Bianconi 343*00a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 344*00a76783SLorenzo Bianconi }; 345*00a76783SLorenzo Bianconi 346*00a76783SLorenzo Bianconi struct airoha_foe_ipv6 { 347*00a76783SLorenzo Bianconi u32 src_ip[4]; 348*00a76783SLorenzo Bianconi u32 dest_ip[4]; 349*00a76783SLorenzo Bianconi 350*00a76783SLorenzo Bianconi union { 351*00a76783SLorenzo Bianconi struct { 352*00a76783SLorenzo Bianconi u16 dest_port; 353*00a76783SLorenzo Bianconi u16 src_port; 354*00a76783SLorenzo Bianconi }; 355*00a76783SLorenzo Bianconi struct { 356*00a76783SLorenzo Bianconi u8 protocol; 357*00a76783SLorenzo Bianconi u8 pad[3]; 358*00a76783SLorenzo Bianconi }; 359*00a76783SLorenzo Bianconi u32 ports; 360*00a76783SLorenzo Bianconi }; 361*00a76783SLorenzo Bianconi 362*00a76783SLorenzo Bianconi u32 data; 363*00a76783SLorenzo Bianconi 364*00a76783SLorenzo Bianconi u32 ib2; 365*00a76783SLorenzo Bianconi 366*00a76783SLorenzo Bianconi struct airoha_foe_mac_info_common l2; 367*00a76783SLorenzo Bianconi }; 368*00a76783SLorenzo Bianconi 369*00a76783SLorenzo Bianconi struct airoha_foe_entry { 370*00a76783SLorenzo Bianconi union { 371*00a76783SLorenzo Bianconi struct { 372*00a76783SLorenzo Bianconi u32 ib1; 373*00a76783SLorenzo Bianconi union { 374*00a76783SLorenzo Bianconi struct airoha_foe_bridge bridge; 375*00a76783SLorenzo Bianconi struct airoha_foe_ipv4 ipv4; 376*00a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite dslite; 377*00a76783SLorenzo Bianconi struct airoha_foe_ipv6 ipv6; 378*00a76783SLorenzo Bianconi DECLARE_FLEX_ARRAY(u32, d); 379*00a76783SLorenzo Bianconi }; 380*00a76783SLorenzo Bianconi }; 381*00a76783SLorenzo Bianconi u8 data[PPE_ENTRY_SIZE]; 382*00a76783SLorenzo Bianconi }; 383*00a76783SLorenzo Bianconi }; 384*00a76783SLorenzo Bianconi 385*00a76783SLorenzo Bianconi struct airoha_flow_data { 386*00a76783SLorenzo Bianconi struct ethhdr eth; 387*00a76783SLorenzo Bianconi 388*00a76783SLorenzo Bianconi union { 389*00a76783SLorenzo Bianconi struct { 390*00a76783SLorenzo Bianconi __be32 src_addr; 391*00a76783SLorenzo Bianconi __be32 dst_addr; 392*00a76783SLorenzo Bianconi } v4; 393*00a76783SLorenzo Bianconi 394*00a76783SLorenzo Bianconi struct { 395*00a76783SLorenzo Bianconi struct in6_addr src_addr; 396*00a76783SLorenzo Bianconi struct in6_addr dst_addr; 397*00a76783SLorenzo Bianconi } v6; 398*00a76783SLorenzo Bianconi }; 399*00a76783SLorenzo Bianconi 400*00a76783SLorenzo Bianconi __be16 src_port; 401*00a76783SLorenzo Bianconi __be16 dst_port; 402*00a76783SLorenzo Bianconi 403*00a76783SLorenzo Bianconi struct { 404*00a76783SLorenzo Bianconi struct { 405*00a76783SLorenzo Bianconi u16 id; 406*00a76783SLorenzo Bianconi __be16 proto; 407*00a76783SLorenzo Bianconi } hdr[2]; 408*00a76783SLorenzo Bianconi u8 num; 409*00a76783SLorenzo Bianconi } vlan; 410*00a76783SLorenzo Bianconi struct { 411*00a76783SLorenzo Bianconi u16 sid; 412*00a76783SLorenzo Bianconi u8 num; 413*00a76783SLorenzo Bianconi } pppoe; 414*00a76783SLorenzo Bianconi }; 415*00a76783SLorenzo Bianconi 416*00a76783SLorenzo Bianconi struct airoha_flow_table_entry { 417*00a76783SLorenzo Bianconi struct hlist_node list; 418*00a76783SLorenzo Bianconi 419*00a76783SLorenzo Bianconi struct airoha_foe_entry data; 420*00a76783SLorenzo Bianconi u32 hash; 421*00a76783SLorenzo Bianconi 422*00a76783SLorenzo Bianconi struct rhash_head node; 423*00a76783SLorenzo Bianconi unsigned long cookie; 424*00a76783SLorenzo Bianconi }; 425*00a76783SLorenzo Bianconi 426b38f4ff0SLorenzo Bianconi struct airoha_qdma { 427b38f4ff0SLorenzo Bianconi struct airoha_eth *eth; 428b38f4ff0SLorenzo Bianconi void __iomem *regs; 429b38f4ff0SLorenzo Bianconi 430b38f4ff0SLorenzo Bianconi /* protect concurrent irqmask accesses */ 431b38f4ff0SLorenzo Bianconi spinlock_t irq_lock; 432b38f4ff0SLorenzo Bianconi u32 irqmask[QDMA_INT_REG_MAX]; 433b38f4ff0SLorenzo Bianconi int irq; 434b38f4ff0SLorenzo Bianconi 43580369686SLorenzo Bianconi atomic_t users; 43680369686SLorenzo Bianconi 437b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ]; 438b38f4ff0SLorenzo Bianconi 439b38f4ff0SLorenzo Bianconi struct airoha_queue q_tx[AIROHA_NUM_TX_RING]; 440b38f4ff0SLorenzo Bianconi struct airoha_queue q_rx[AIROHA_NUM_RX_RING]; 441b38f4ff0SLorenzo Bianconi 442b38f4ff0SLorenzo Bianconi /* descriptor and packet buffers for qdma hw forward */ 443b38f4ff0SLorenzo Bianconi struct { 444b38f4ff0SLorenzo Bianconi void *desc; 445b38f4ff0SLorenzo Bianconi void *q; 446b38f4ff0SLorenzo Bianconi } hfwd; 447b38f4ff0SLorenzo Bianconi }; 448b38f4ff0SLorenzo Bianconi 449b38f4ff0SLorenzo Bianconi struct airoha_gdm_port { 450b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 451b38f4ff0SLorenzo Bianconi struct net_device *dev; 452b38f4ff0SLorenzo Bianconi int id; 453b38f4ff0SLorenzo Bianconi 454b38f4ff0SLorenzo Bianconi struct airoha_hw_stats stats; 455b38f4ff0SLorenzo Bianconi 456b38f4ff0SLorenzo Bianconi DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS); 457b38f4ff0SLorenzo Bianconi 458b38f4ff0SLorenzo Bianconi /* qos stats counters */ 459b38f4ff0SLorenzo Bianconi u64 cpu_tx_packets; 460b38f4ff0SLorenzo Bianconi u64 fwd_tx_packets; 461af3cf757SLorenzo Bianconi 462af3cf757SLorenzo Bianconi struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS]; 463b38f4ff0SLorenzo Bianconi }; 464b38f4ff0SLorenzo Bianconi 465*00a76783SLorenzo Bianconi #define AIROHA_RXD4_PPE_CPU_REASON GENMASK(20, 16) 466*00a76783SLorenzo Bianconi #define AIROHA_RXD4_FOE_ENTRY GENMASK(15, 0) 467*00a76783SLorenzo Bianconi 468*00a76783SLorenzo Bianconi struct airoha_ppe { 469*00a76783SLorenzo Bianconi struct airoha_eth *eth; 470*00a76783SLorenzo Bianconi 471*00a76783SLorenzo Bianconi void *foe; 472*00a76783SLorenzo Bianconi dma_addr_t foe_dma; 473*00a76783SLorenzo Bianconi 474*00a76783SLorenzo Bianconi struct hlist_head *foe_flow; 475*00a76783SLorenzo Bianconi u16 foe_check_time[PPE_NUM_ENTRIES]; 476*00a76783SLorenzo Bianconi }; 477*00a76783SLorenzo Bianconi 478b38f4ff0SLorenzo Bianconi struct airoha_eth { 479b38f4ff0SLorenzo Bianconi struct device *dev; 480b38f4ff0SLorenzo Bianconi 481b38f4ff0SLorenzo Bianconi unsigned long state; 482b38f4ff0SLorenzo Bianconi void __iomem *fe_regs; 483b38f4ff0SLorenzo Bianconi 48423290c7bSLorenzo Bianconi struct airoha_npu __rcu *npu; 48523290c7bSLorenzo Bianconi 486*00a76783SLorenzo Bianconi struct airoha_ppe *ppe; 487*00a76783SLorenzo Bianconi struct rhashtable flow_table; 488*00a76783SLorenzo Bianconi 489b38f4ff0SLorenzo Bianconi struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS]; 490b38f4ff0SLorenzo Bianconi struct reset_control_bulk_data xsi_rsts[AIROHA_MAX_NUM_XSI_RSTS]; 491b38f4ff0SLorenzo Bianconi 492b38f4ff0SLorenzo Bianconi struct net_device *napi_dev; 493b38f4ff0SLorenzo Bianconi 494b38f4ff0SLorenzo Bianconi struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA]; 495b38f4ff0SLorenzo Bianconi struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS]; 496b38f4ff0SLorenzo Bianconi }; 497b38f4ff0SLorenzo Bianconi 498e0758a86SLorenzo Bianconi u32 airoha_rr(void __iomem *base, u32 offset); 499e0758a86SLorenzo Bianconi void airoha_wr(void __iomem *base, u32 offset, u32 val); 500e0758a86SLorenzo Bianconi u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val); 501e0758a86SLorenzo Bianconi 502e0758a86SLorenzo Bianconi #define airoha_fe_rr(eth, offset) \ 503e0758a86SLorenzo Bianconi airoha_rr((eth)->fe_regs, (offset)) 504e0758a86SLorenzo Bianconi #define airoha_fe_wr(eth, offset, val) \ 505e0758a86SLorenzo Bianconi airoha_wr((eth)->fe_regs, (offset), (val)) 506e0758a86SLorenzo Bianconi #define airoha_fe_rmw(eth, offset, mask, val) \ 507e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), (mask), (val)) 508e0758a86SLorenzo Bianconi #define airoha_fe_set(eth, offset, val) \ 509e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), 0, (val)) 510e0758a86SLorenzo Bianconi #define airoha_fe_clear(eth, offset, val) \ 511e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), (val), 0) 512e0758a86SLorenzo Bianconi 513e0758a86SLorenzo Bianconi #define airoha_qdma_rr(qdma, offset) \ 514e0758a86SLorenzo Bianconi airoha_rr((qdma)->regs, (offset)) 515e0758a86SLorenzo Bianconi #define airoha_qdma_wr(qdma, offset, val) \ 516e0758a86SLorenzo Bianconi airoha_wr((qdma)->regs, (offset), (val)) 517e0758a86SLorenzo Bianconi #define airoha_qdma_rmw(qdma, offset, mask, val) \ 518e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), (mask), (val)) 519e0758a86SLorenzo Bianconi #define airoha_qdma_set(qdma, offset, val) \ 520e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), 0, (val)) 521e0758a86SLorenzo Bianconi #define airoha_qdma_clear(qdma, offset, val) \ 522e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), (val), 0) 523e0758a86SLorenzo Bianconi 524*00a76783SLorenzo Bianconi void airoha_ppe_check_skb(struct airoha_ppe *ppe, u16 hash); 525*00a76783SLorenzo Bianconi int airoha_ppe_setup_tc_block_cb(enum tc_setup_type type, void *type_data, 526*00a76783SLorenzo Bianconi void *cb_priv); 527*00a76783SLorenzo Bianconi int airoha_ppe_init(struct airoha_eth *eth); 528*00a76783SLorenzo Bianconi void airoha_ppe_deinit(struct airoha_eth *eth); 529*00a76783SLorenzo Bianconi 530b38f4ff0SLorenzo Bianconi #endif /* AIROHA_ETH_H */ 531