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 103fe15c64SLorenzo Bianconi #include <linux/debugfs.h> 11b38f4ff0SLorenzo Bianconi #include <linux/etherdevice.h> 12b38f4ff0SLorenzo Bianconi #include <linux/iopoll.h> 13b38f4ff0SLorenzo Bianconi #include <linux/kernel.h> 14b38f4ff0SLorenzo Bianconi #include <linux/netdevice.h> 15b38f4ff0SLorenzo Bianconi #include <linux/reset.h> 1600a76783SLorenzo Bianconi #include <net/dsa.h> 17b38f4ff0SLorenzo Bianconi 1880369686SLorenzo Bianconi #define AIROHA_MAX_NUM_GDM_PORTS 4 19b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_QDMA 2 20f252493eSLorenzo Bianconi #define AIROHA_MAX_NUM_IRQ_BANKS 4 21af3cf757SLorenzo Bianconi #define AIROHA_MAX_DSA_PORTS 7 22b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_RSTS 3 23b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_NUM_XSI_RSTS 5 24168ef0c1SLorenzo Bianconi #define AIROHA_MAX_MTU 9216 25b38f4ff0SLorenzo Bianconi #define AIROHA_MAX_PACKET_SIZE 2048 26b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_CHANNELS 4 27b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_QOS_QUEUES 8 28b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_RING 32 29b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_RX_RING 32 30b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_NETDEV_TX_RINGS (AIROHA_NUM_TX_RING + \ 31b38f4ff0SLorenzo Bianconi AIROHA_NUM_QOS_CHANNELS) 32b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_TABLE 64 33b38f4ff0SLorenzo Bianconi #define AIROHA_FE_MC_MAX_VLAN_PORT 16 34b38f4ff0SLorenzo Bianconi #define AIROHA_NUM_TX_IRQ 2 35b38f4ff0SLorenzo Bianconi #define HW_DSCP_NUM 2048 36b38f4ff0SLorenzo Bianconi #define IRQ_QUEUE_LEN(_n) ((_n) ? 1024 : 2048) 37b38f4ff0SLorenzo Bianconi #define TX_DSCP_NUM 1024 38b38f4ff0SLorenzo Bianconi #define RX_DSCP_NUM(_n) \ 39b38f4ff0SLorenzo Bianconi ((_n) == 2 ? 128 : \ 40b38f4ff0SLorenzo Bianconi (_n) == 11 ? 128 : \ 41b38f4ff0SLorenzo Bianconi (_n) == 15 ? 128 : \ 42b38f4ff0SLorenzo Bianconi (_n) == 0 ? 1024 : 16) 43b38f4ff0SLorenzo Bianconi 44b38f4ff0SLorenzo Bianconi #define PSE_RSV_PAGES 128 45b38f4ff0SLorenzo Bianconi #define PSE_QUEUE_RSV_PAGES 64 46b38f4ff0SLorenzo Bianconi 47b38f4ff0SLorenzo Bianconi #define QDMA_METER_IDX(_n) ((_n) & 0xff) 48b38f4ff0SLorenzo Bianconi #define QDMA_METER_GROUP(_n) (((_n) >> 8) & 0x3) 49b38f4ff0SLorenzo Bianconi 5000a76783SLorenzo Bianconi #define PPE_NUM 2 5100a76783SLorenzo Bianconi #define PPE1_SRAM_NUM_ENTRIES (8 * 1024) 5200a76783SLorenzo Bianconi #define PPE_SRAM_NUM_ENTRIES (2 * PPE1_SRAM_NUM_ENTRIES) 53b81e0f2bSLorenzo Bianconi #ifdef CONFIG_NET_AIROHA_FLOW_STATS 54b81e0f2bSLorenzo Bianconi #define PPE1_STATS_NUM_ENTRIES (4 * 1024) 55b81e0f2bSLorenzo Bianconi #else 56b81e0f2bSLorenzo Bianconi #define PPE1_STATS_NUM_ENTRIES 0 57b81e0f2bSLorenzo Bianconi #endif /* CONFIG_NET_AIROHA_FLOW_STATS */ 58b81e0f2bSLorenzo Bianconi #define PPE_STATS_NUM_ENTRIES (2 * PPE1_STATS_NUM_ENTRIES) 59b81e0f2bSLorenzo Bianconi #define PPE1_SRAM_NUM_DATA_ENTRIES (PPE1_SRAM_NUM_ENTRIES - PPE1_STATS_NUM_ENTRIES) 60b81e0f2bSLorenzo Bianconi #define PPE_SRAM_NUM_DATA_ENTRIES (2 * PPE1_SRAM_NUM_DATA_ENTRIES) 6100a76783SLorenzo Bianconi #define PPE_DRAM_NUM_ENTRIES (16 * 1024) 6200a76783SLorenzo Bianconi #define PPE_NUM_ENTRIES (PPE_SRAM_NUM_ENTRIES + PPE_DRAM_NUM_ENTRIES) 6300a76783SLorenzo Bianconi #define PPE_HASH_MASK (PPE_NUM_ENTRIES - 1) 6400a76783SLorenzo Bianconi #define PPE_ENTRY_SIZE 80 6500a76783SLorenzo Bianconi #define PPE_RAM_NUM_ENTRIES_SHIFT(_n) (__ffs((_n) >> 10)) 6600a76783SLorenzo Bianconi 67af3cf757SLorenzo Bianconi #define MTK_HDR_LEN 4 68af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_8100 1 69af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_88A8 2 70af3cf757SLorenzo Bianconi 71b38f4ff0SLorenzo Bianconi enum { 72b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX0, 73b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX1, 74b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX2, 75b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX3, 76b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX4, 77b38f4ff0SLorenzo Bianconi QDMA_INT_REG_MAX 78b38f4ff0SLorenzo Bianconi }; 79b38f4ff0SLorenzo Bianconi 80b38f4ff0SLorenzo Bianconi enum { 819cd451d4SLorenzo Bianconi HSGMII_LAN_PCIE0_SRCPORT = 0x16, 829cd451d4SLorenzo Bianconi HSGMII_LAN_PCIE1_SRCPORT, 839cd451d4SLorenzo Bianconi HSGMII_LAN_ETH_SRCPORT, 849cd451d4SLorenzo Bianconi HSGMII_LAN_USB_SRCPORT, 859cd451d4SLorenzo Bianconi }; 869cd451d4SLorenzo Bianconi 879cd451d4SLorenzo Bianconi enum { 88b38f4ff0SLorenzo Bianconi XSI_PCIE0_VIP_PORT_MASK = BIT(22), 89b38f4ff0SLorenzo Bianconi XSI_PCIE1_VIP_PORT_MASK = BIT(23), 90b38f4ff0SLorenzo Bianconi XSI_USB_VIP_PORT_MASK = BIT(25), 91b38f4ff0SLorenzo Bianconi XSI_ETH_VIP_PORT_MASK = BIT(24), 92b38f4ff0SLorenzo Bianconi }; 93b38f4ff0SLorenzo Bianconi 94b38f4ff0SLorenzo Bianconi enum { 95b38f4ff0SLorenzo Bianconi DEV_STATE_INITIALIZED, 96b38f4ff0SLorenzo Bianconi }; 97b38f4ff0SLorenzo Bianconi 98b38f4ff0SLorenzo Bianconi enum { 99b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q1 = 1, 100b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q5 = 5, 101b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q6 = 6, 102b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q15 = 15, 103b38f4ff0SLorenzo Bianconi }; 104b38f4ff0SLorenzo Bianconi 105b38f4ff0SLorenzo Bianconi enum { 106b38f4ff0SLorenzo Bianconi CRSN_08 = 0x8, 107b38f4ff0SLorenzo Bianconi CRSN_21 = 0x15, /* KA */ 108b38f4ff0SLorenzo Bianconi CRSN_22 = 0x16, /* hit bind and force route to CPU */ 109b38f4ff0SLorenzo Bianconi CRSN_24 = 0x18, 110b38f4ff0SLorenzo Bianconi CRSN_25 = 0x19, 111b38f4ff0SLorenzo Bianconi }; 112b38f4ff0SLorenzo Bianconi 113b38f4ff0SLorenzo Bianconi enum { 114b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM1, 115b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM1, 116b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM2, 117b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM3, 118b38f4ff0SLorenzo Bianconi FE_PSE_PORT_PPE1, 119b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM2, 120b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM3, 121b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM4, 122b38f4ff0SLorenzo Bianconi FE_PSE_PORT_PPE2, 123b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM4, 124b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM5, 125b38f4ff0SLorenzo Bianconi FE_PSE_PORT_DROP = 0xf, 126b38f4ff0SLorenzo Bianconi }; 127b38f4ff0SLorenzo Bianconi 128b38f4ff0SLorenzo Bianconi enum tx_sched_mode { 129b38f4ff0SLorenzo Bianconi TC_SCH_WRR8, 130b38f4ff0SLorenzo Bianconi TC_SCH_SP, 131b38f4ff0SLorenzo Bianconi TC_SCH_WRR7, 132b38f4ff0SLorenzo Bianconi TC_SCH_WRR6, 133b38f4ff0SLorenzo Bianconi TC_SCH_WRR5, 134b38f4ff0SLorenzo Bianconi TC_SCH_WRR4, 135b38f4ff0SLorenzo Bianconi TC_SCH_WRR3, 136b38f4ff0SLorenzo Bianconi TC_SCH_WRR2, 137b38f4ff0SLorenzo Bianconi }; 138b38f4ff0SLorenzo Bianconi 139df8398fbSLorenzo Bianconi enum trtcm_unit_type { 140df8398fbSLorenzo Bianconi TRTCM_BYTE_UNIT, 141df8398fbSLorenzo Bianconi TRTCM_PACKET_UNIT, 142df8398fbSLorenzo Bianconi }; 143df8398fbSLorenzo Bianconi 144b38f4ff0SLorenzo Bianconi enum trtcm_param_type { 145b38f4ff0SLorenzo Bianconi TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */ 146b38f4ff0SLorenzo Bianconi TRTCM_TOKEN_RATE_MODE, 147b38f4ff0SLorenzo Bianconi TRTCM_BUCKETSIZE_SHIFT_MODE, 148b38f4ff0SLorenzo Bianconi TRTCM_BUCKET_COUNTER_MODE, 149b38f4ff0SLorenzo Bianconi }; 150b38f4ff0SLorenzo Bianconi 151b38f4ff0SLorenzo Bianconi enum trtcm_mode_type { 152b38f4ff0SLorenzo Bianconi TRTCM_COMMIT_MODE, 153b38f4ff0SLorenzo Bianconi TRTCM_PEAK_MODE, 154b38f4ff0SLorenzo Bianconi }; 155b38f4ff0SLorenzo Bianconi 156b38f4ff0SLorenzo Bianconi enum trtcm_param { 157b38f4ff0SLorenzo Bianconi TRTCM_TICK_SEL = BIT(0), 158b38f4ff0SLorenzo Bianconi TRTCM_PKT_MODE = BIT(1), 159b38f4ff0SLorenzo Bianconi TRTCM_METER_MODE = BIT(2), 160b38f4ff0SLorenzo Bianconi }; 161b38f4ff0SLorenzo Bianconi 162b38f4ff0SLorenzo Bianconi #define MIN_TOKEN_SIZE 4096 163b38f4ff0SLorenzo Bianconi #define MAX_TOKEN_SIZE_OFFSET 17 164b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_MASK GENMASK(23, 6) 165b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_FRACTION_MASK GENMASK(5, 0) 166b38f4ff0SLorenzo Bianconi 167b38f4ff0SLorenzo Bianconi struct airoha_queue_entry { 168b38f4ff0SLorenzo Bianconi union { 169b38f4ff0SLorenzo Bianconi void *buf; 170b38f4ff0SLorenzo Bianconi struct sk_buff *skb; 171b38f4ff0SLorenzo Bianconi }; 172b38f4ff0SLorenzo Bianconi dma_addr_t dma_addr; 173b38f4ff0SLorenzo Bianconi u16 dma_len; 174b38f4ff0SLorenzo Bianconi }; 175b38f4ff0SLorenzo Bianconi 176b38f4ff0SLorenzo Bianconi struct airoha_queue { 177b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 178b38f4ff0SLorenzo Bianconi 179b38f4ff0SLorenzo Bianconi /* protect concurrent queue accesses */ 180b38f4ff0SLorenzo Bianconi spinlock_t lock; 181b38f4ff0SLorenzo Bianconi struct airoha_queue_entry *entry; 182b38f4ff0SLorenzo Bianconi struct airoha_qdma_desc *desc; 183b38f4ff0SLorenzo Bianconi u16 head; 184b38f4ff0SLorenzo Bianconi u16 tail; 185b38f4ff0SLorenzo Bianconi 186b38f4ff0SLorenzo Bianconi int queued; 187b38f4ff0SLorenzo Bianconi int ndesc; 188b38f4ff0SLorenzo Bianconi int free_thr; 189b38f4ff0SLorenzo Bianconi int buf_size; 190b38f4ff0SLorenzo Bianconi 191b38f4ff0SLorenzo Bianconi struct napi_struct napi; 192b38f4ff0SLorenzo Bianconi struct page_pool *page_pool; 193e12182ddSLorenzo Bianconi struct sk_buff *skb; 194b38f4ff0SLorenzo Bianconi }; 195b38f4ff0SLorenzo Bianconi 196b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue { 197b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 198b38f4ff0SLorenzo Bianconi 199b38f4ff0SLorenzo Bianconi struct napi_struct napi; 200b38f4ff0SLorenzo Bianconi 201b38f4ff0SLorenzo Bianconi int size; 202b38f4ff0SLorenzo Bianconi u32 *q; 203b38f4ff0SLorenzo Bianconi }; 204b38f4ff0SLorenzo Bianconi 205b38f4ff0SLorenzo Bianconi struct airoha_hw_stats { 206b38f4ff0SLorenzo Bianconi /* protect concurrent hw_stats accesses */ 207b38f4ff0SLorenzo Bianconi spinlock_t lock; 208b38f4ff0SLorenzo Bianconi struct u64_stats_sync syncp; 209b38f4ff0SLorenzo Bianconi 210b38f4ff0SLorenzo Bianconi /* get_stats64 */ 211b38f4ff0SLorenzo Bianconi u64 rx_ok_pkts; 212b38f4ff0SLorenzo Bianconi u64 tx_ok_pkts; 213b38f4ff0SLorenzo Bianconi u64 rx_ok_bytes; 214b38f4ff0SLorenzo Bianconi u64 tx_ok_bytes; 215b38f4ff0SLorenzo Bianconi u64 rx_multicast; 216b38f4ff0SLorenzo Bianconi u64 rx_errors; 217b38f4ff0SLorenzo Bianconi u64 rx_drops; 218b38f4ff0SLorenzo Bianconi u64 tx_drops; 219b38f4ff0SLorenzo Bianconi u64 rx_crc_error; 220b38f4ff0SLorenzo Bianconi u64 rx_over_errors; 221b38f4ff0SLorenzo Bianconi /* ethtool stats */ 222b38f4ff0SLorenzo Bianconi u64 tx_broadcast; 223b38f4ff0SLorenzo Bianconi u64 tx_multicast; 224b38f4ff0SLorenzo Bianconi u64 tx_len[7]; 225b38f4ff0SLorenzo Bianconi u64 rx_broadcast; 226b38f4ff0SLorenzo Bianconi u64 rx_fragment; 227b38f4ff0SLorenzo Bianconi u64 rx_jabber; 228b38f4ff0SLorenzo Bianconi u64 rx_len[7]; 229b38f4ff0SLorenzo Bianconi }; 230b38f4ff0SLorenzo Bianconi 23100a76783SLorenzo Bianconi enum { 23200a76783SLorenzo Bianconi PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f, 23300a76783SLorenzo Bianconi }; 23400a76783SLorenzo Bianconi 23500a76783SLorenzo Bianconi enum { 23600a76783SLorenzo Bianconi AIROHA_FOE_STATE_INVALID, 23700a76783SLorenzo Bianconi AIROHA_FOE_STATE_UNBIND, 23800a76783SLorenzo Bianconi AIROHA_FOE_STATE_BIND, 23900a76783SLorenzo Bianconi AIROHA_FOE_STATE_FIN 24000a76783SLorenzo Bianconi }; 24100a76783SLorenzo Bianconi 24200a76783SLorenzo Bianconi enum { 24300a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_HNAPT = 0, 24400a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_ROUTE = 1, 24500a76783SLorenzo Bianconi PPE_PKT_TYPE_BRIDGE = 2, 24600a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_DSLITE = 3, 24700a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_ROUTE_3T = 4, 24800a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_ROUTE_5T = 5, 24900a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_6RD = 7, 25000a76783SLorenzo Bianconi }; 25100a76783SLorenzo Bianconi 25200a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_SMAC_ID GENMASK(20, 16) 25300a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_PPPOE_ID GENMASK(15, 0) 25400a76783SLorenzo Bianconi 25500a76783SLorenzo Bianconi struct airoha_foe_mac_info_common { 25600a76783SLorenzo Bianconi u16 vlan1; 25700a76783SLorenzo Bianconi u16 etype; 25800a76783SLorenzo Bianconi 25900a76783SLorenzo Bianconi u32 dest_mac_hi; 26000a76783SLorenzo Bianconi 26100a76783SLorenzo Bianconi u16 vlan2; 26200a76783SLorenzo Bianconi u16 dest_mac_lo; 26300a76783SLorenzo Bianconi 26400a76783SLorenzo Bianconi u32 src_mac_hi; 26500a76783SLorenzo Bianconi }; 26600a76783SLorenzo Bianconi 26700a76783SLorenzo Bianconi struct airoha_foe_mac_info { 26800a76783SLorenzo Bianconi struct airoha_foe_mac_info_common common; 26900a76783SLorenzo Bianconi 27000a76783SLorenzo Bianconi u16 pppoe_id; 27100a76783SLorenzo Bianconi u16 src_mac_lo; 272b81e0f2bSLorenzo Bianconi 273b81e0f2bSLorenzo Bianconi u32 meter; 27400a76783SLorenzo Bianconi }; 27500a76783SLorenzo Bianconi 27600a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PREBIND BIT(24) 27700a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8) 27800a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0) 27900a76783SLorenzo Bianconi 28000a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATIC BIT(31) 28100a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_UDP BIT(30) 28200a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATE GENMASK(29, 28) 28300a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PACKET_TYPE GENMASK(27, 25) 28400a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TTL BIT(24) 28500a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP BIT(23) 28600a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PPPOE BIT(22) 28700a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VPM GENMASK(21, 20) 28800a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VLAN_LAYER GENMASK(19, 16) 28900a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_KEEPALIVE BIT(15) 29000a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0) 29100a76783SLorenzo Bianconi 29200a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_DSCP GENMASK(31, 24) 29300a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PORT_AG GENMASK(23, 13) 29400a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PCP BIT(12) 29500a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_MULTICAST BIT(11) 29600a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_FAST_PATH BIT(10) 29700a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_QOS BIT(9) 29800a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_PORT GENMASK(8, 5) 29900a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_NBQ GENMASK(4, 0) 30000a76783SLorenzo Bianconi 30100a76783SLorenzo Bianconi #define AIROHA_FOE_ACTDP GENMASK(31, 24) 30200a76783SLorenzo Bianconi #define AIROHA_FOE_SHAPER_ID GENMASK(23, 16) 30300a76783SLorenzo Bianconi #define AIROHA_FOE_CHANNEL GENMASK(15, 11) 30400a76783SLorenzo Bianconi #define AIROHA_FOE_QID GENMASK(10, 8) 30500a76783SLorenzo Bianconi #define AIROHA_FOE_DPI BIT(7) 30600a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL BIT(6) 30700a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL_ID GENMASK(5, 0) 30800a76783SLorenzo Bianconi 309b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_TUNNEL_MTU GENMASK(31, 16) 310b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_ACNT_GRP3 GENMASK(15, 9) 311b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_METER_GRP3 GENMASK(8, 5) 312b81e0f2bSLorenzo Bianconi #define AIROHA_FOE_METER_GRP2 GENMASK(4, 0) 313b81e0f2bSLorenzo Bianconi 31400a76783SLorenzo Bianconi struct airoha_foe_bridge { 31500a76783SLorenzo Bianconi u32 dest_mac_hi; 31600a76783SLorenzo Bianconi 31700a76783SLorenzo Bianconi u16 src_mac_hi; 31800a76783SLorenzo Bianconi u16 dest_mac_lo; 31900a76783SLorenzo Bianconi 32000a76783SLorenzo Bianconi u32 src_mac_lo; 32100a76783SLorenzo Bianconi 32200a76783SLorenzo Bianconi u32 ib2; 32300a76783SLorenzo Bianconi 32400a76783SLorenzo Bianconi u32 rsv[5]; 32500a76783SLorenzo Bianconi 32600a76783SLorenzo Bianconi u32 data; 32700a76783SLorenzo Bianconi 32800a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 32900a76783SLorenzo Bianconi }; 33000a76783SLorenzo Bianconi 33100a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple { 33200a76783SLorenzo Bianconi u32 src_ip; 33300a76783SLorenzo Bianconi u32 dest_ip; 33400a76783SLorenzo Bianconi union { 33500a76783SLorenzo Bianconi struct { 33600a76783SLorenzo Bianconi u16 dest_port; 33700a76783SLorenzo Bianconi u16 src_port; 33800a76783SLorenzo Bianconi }; 33900a76783SLorenzo Bianconi struct { 34000a76783SLorenzo Bianconi u8 protocol; 34100a76783SLorenzo Bianconi u8 _pad[3]; /* fill with 0xa5a5a5 */ 34200a76783SLorenzo Bianconi }; 34300a76783SLorenzo Bianconi u32 ports; 34400a76783SLorenzo Bianconi }; 34500a76783SLorenzo Bianconi }; 34600a76783SLorenzo Bianconi 34700a76783SLorenzo Bianconi struct airoha_foe_ipv4 { 34800a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple orig_tuple; 34900a76783SLorenzo Bianconi 35000a76783SLorenzo Bianconi u32 ib2; 35100a76783SLorenzo Bianconi 35200a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple new_tuple; 35300a76783SLorenzo Bianconi 35400a76783SLorenzo Bianconi u32 rsv[2]; 35500a76783SLorenzo Bianconi 35600a76783SLorenzo Bianconi u32 data; 35700a76783SLorenzo Bianconi 35800a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 35900a76783SLorenzo Bianconi }; 36000a76783SLorenzo Bianconi 36100a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite { 36200a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple ip4; 36300a76783SLorenzo Bianconi 36400a76783SLorenzo Bianconi u32 ib2; 36500a76783SLorenzo Bianconi 36600a76783SLorenzo Bianconi u8 flow_label[3]; 36700a76783SLorenzo Bianconi u8 priority; 36800a76783SLorenzo Bianconi 36900a76783SLorenzo Bianconi u32 rsv[4]; 37000a76783SLorenzo Bianconi 37100a76783SLorenzo Bianconi u32 data; 37200a76783SLorenzo Bianconi 37300a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 37400a76783SLorenzo Bianconi }; 37500a76783SLorenzo Bianconi 37600a76783SLorenzo Bianconi struct airoha_foe_ipv6 { 37700a76783SLorenzo Bianconi u32 src_ip[4]; 37800a76783SLorenzo Bianconi u32 dest_ip[4]; 37900a76783SLorenzo Bianconi 38000a76783SLorenzo Bianconi union { 38100a76783SLorenzo Bianconi struct { 38200a76783SLorenzo Bianconi u16 dest_port; 38300a76783SLorenzo Bianconi u16 src_port; 38400a76783SLorenzo Bianconi }; 38500a76783SLorenzo Bianconi struct { 38600a76783SLorenzo Bianconi u8 protocol; 38700a76783SLorenzo Bianconi u8 pad[3]; 38800a76783SLorenzo Bianconi }; 38900a76783SLorenzo Bianconi u32 ports; 39000a76783SLorenzo Bianconi }; 39100a76783SLorenzo Bianconi 39200a76783SLorenzo Bianconi u32 data; 39300a76783SLorenzo Bianconi 39400a76783SLorenzo Bianconi u32 ib2; 39500a76783SLorenzo Bianconi 39600a76783SLorenzo Bianconi struct airoha_foe_mac_info_common l2; 397b81e0f2bSLorenzo Bianconi 398b81e0f2bSLorenzo Bianconi u32 meter; 39900a76783SLorenzo Bianconi }; 40000a76783SLorenzo Bianconi 40100a76783SLorenzo Bianconi struct airoha_foe_entry { 40200a76783SLorenzo Bianconi union { 40300a76783SLorenzo Bianconi struct { 40400a76783SLorenzo Bianconi u32 ib1; 40500a76783SLorenzo Bianconi union { 40600a76783SLorenzo Bianconi struct airoha_foe_bridge bridge; 40700a76783SLorenzo Bianconi struct airoha_foe_ipv4 ipv4; 40800a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite dslite; 40900a76783SLorenzo Bianconi struct airoha_foe_ipv6 ipv6; 41000a76783SLorenzo Bianconi DECLARE_FLEX_ARRAY(u32, d); 41100a76783SLorenzo Bianconi }; 41200a76783SLorenzo Bianconi }; 41300a76783SLorenzo Bianconi u8 data[PPE_ENTRY_SIZE]; 41400a76783SLorenzo Bianconi }; 41500a76783SLorenzo Bianconi }; 41600a76783SLorenzo Bianconi 417b81e0f2bSLorenzo Bianconi struct airoha_foe_stats { 418b81e0f2bSLorenzo Bianconi u32 bytes; 419b81e0f2bSLorenzo Bianconi u32 packets; 420b81e0f2bSLorenzo Bianconi }; 421b81e0f2bSLorenzo Bianconi 422b81e0f2bSLorenzo Bianconi struct airoha_foe_stats64 { 423b81e0f2bSLorenzo Bianconi u64 bytes; 424b81e0f2bSLorenzo Bianconi u64 packets; 425b81e0f2bSLorenzo Bianconi }; 426b81e0f2bSLorenzo Bianconi 42700a76783SLorenzo Bianconi struct airoha_flow_data { 42800a76783SLorenzo Bianconi struct ethhdr eth; 42900a76783SLorenzo Bianconi 43000a76783SLorenzo Bianconi union { 43100a76783SLorenzo Bianconi struct { 43200a76783SLorenzo Bianconi __be32 src_addr; 43300a76783SLorenzo Bianconi __be32 dst_addr; 43400a76783SLorenzo Bianconi } v4; 43500a76783SLorenzo Bianconi 43600a76783SLorenzo Bianconi struct { 43700a76783SLorenzo Bianconi struct in6_addr src_addr; 43800a76783SLorenzo Bianconi struct in6_addr dst_addr; 43900a76783SLorenzo Bianconi } v6; 44000a76783SLorenzo Bianconi }; 44100a76783SLorenzo Bianconi 44200a76783SLorenzo Bianconi __be16 src_port; 44300a76783SLorenzo Bianconi __be16 dst_port; 44400a76783SLorenzo Bianconi 44500a76783SLorenzo Bianconi struct { 44600a76783SLorenzo Bianconi struct { 44700a76783SLorenzo Bianconi u16 id; 44800a76783SLorenzo Bianconi __be16 proto; 44900a76783SLorenzo Bianconi } hdr[2]; 45000a76783SLorenzo Bianconi u8 num; 45100a76783SLorenzo Bianconi } vlan; 45200a76783SLorenzo Bianconi struct { 45300a76783SLorenzo Bianconi u16 sid; 45400a76783SLorenzo Bianconi u8 num; 45500a76783SLorenzo Bianconi } pppoe; 45600a76783SLorenzo Bianconi }; 45700a76783SLorenzo Bianconi 458b4916f67SLorenzo Bianconi enum airoha_flow_entry_type { 459b4916f67SLorenzo Bianconi FLOW_TYPE_L4, 460b4916f67SLorenzo Bianconi FLOW_TYPE_L2, 461b4916f67SLorenzo Bianconi FLOW_TYPE_L2_SUBFLOW, 462b4916f67SLorenzo Bianconi }; 463b4916f67SLorenzo Bianconi 46400a76783SLorenzo Bianconi struct airoha_flow_table_entry { 465b4916f67SLorenzo Bianconi union { 466b4916f67SLorenzo Bianconi struct hlist_node list; /* PPE L3 flow entry */ 467cd53f622SLorenzo Bianconi struct { 468b4916f67SLorenzo Bianconi struct rhash_head l2_node; /* L2 flow entry */ 469cd53f622SLorenzo Bianconi struct hlist_head l2_flows; /* PPE L2 subflows list */ 470cd53f622SLorenzo Bianconi }; 471b4916f67SLorenzo Bianconi }; 47200a76783SLorenzo Bianconi 47300a76783SLorenzo Bianconi struct airoha_foe_entry data; 474cd53f622SLorenzo Bianconi struct hlist_node l2_subflow_node; /* PPE L2 subflow entry */ 47500a76783SLorenzo Bianconi u32 hash; 47600a76783SLorenzo Bianconi 477b81e0f2bSLorenzo Bianconi struct airoha_foe_stats64 stats; 478b4916f67SLorenzo Bianconi enum airoha_flow_entry_type type; 479b4916f67SLorenzo Bianconi 48000a76783SLorenzo Bianconi struct rhash_head node; 48100a76783SLorenzo Bianconi unsigned long cookie; 48200a76783SLorenzo Bianconi }; 48300a76783SLorenzo Bianconi 484f252493eSLorenzo Bianconi /* RX queue to IRQ mapping: BIT(q) in IRQ(n) */ 485f252493eSLorenzo Bianconi #define RX_IRQ0_BANK_PIN_MASK 0x839f 486f252493eSLorenzo Bianconi #define RX_IRQ1_BANK_PIN_MASK 0x7fe00000 487f252493eSLorenzo Bianconi #define RX_IRQ2_BANK_PIN_MASK 0x20 488f252493eSLorenzo Bianconi #define RX_IRQ3_BANK_PIN_MASK 0x40 489f252493eSLorenzo Bianconi #define RX_IRQ_BANK_PIN_MASK(_n) \ 490f252493eSLorenzo Bianconi (((_n) == 3) ? RX_IRQ3_BANK_PIN_MASK : \ 491f252493eSLorenzo Bianconi ((_n) == 2) ? RX_IRQ2_BANK_PIN_MASK : \ 492f252493eSLorenzo Bianconi ((_n) == 1) ? RX_IRQ1_BANK_PIN_MASK : \ 493f252493eSLorenzo Bianconi RX_IRQ0_BANK_PIN_MASK) 494f252493eSLorenzo Bianconi 4959439db26SLorenzo Bianconi struct airoha_irq_bank { 4969439db26SLorenzo Bianconi struct airoha_qdma *qdma; 497b38f4ff0SLorenzo Bianconi 498b38f4ff0SLorenzo Bianconi /* protect concurrent irqmask accesses */ 499b38f4ff0SLorenzo Bianconi spinlock_t irq_lock; 500b38f4ff0SLorenzo Bianconi u32 irqmask[QDMA_INT_REG_MAX]; 501b38f4ff0SLorenzo Bianconi int irq; 5029439db26SLorenzo Bianconi }; 5039439db26SLorenzo Bianconi 5049439db26SLorenzo Bianconi struct airoha_qdma { 5059439db26SLorenzo Bianconi struct airoha_eth *eth; 5069439db26SLorenzo Bianconi void __iomem *regs; 507b38f4ff0SLorenzo Bianconi 50880369686SLorenzo Bianconi atomic_t users; 50980369686SLorenzo Bianconi 5109439db26SLorenzo Bianconi struct airoha_irq_bank irq_banks[AIROHA_MAX_NUM_IRQ_BANKS]; 5119439db26SLorenzo Bianconi 512b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ]; 513b38f4ff0SLorenzo Bianconi 514b38f4ff0SLorenzo Bianconi struct airoha_queue q_tx[AIROHA_NUM_TX_RING]; 515b38f4ff0SLorenzo Bianconi struct airoha_queue q_rx[AIROHA_NUM_RX_RING]; 516b38f4ff0SLorenzo Bianconi }; 517b38f4ff0SLorenzo Bianconi 518b38f4ff0SLorenzo Bianconi struct airoha_gdm_port { 519b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 520b38f4ff0SLorenzo Bianconi struct net_device *dev; 521b38f4ff0SLorenzo Bianconi int id; 522b38f4ff0SLorenzo Bianconi 523b38f4ff0SLorenzo Bianconi struct airoha_hw_stats stats; 524b38f4ff0SLorenzo Bianconi 525b38f4ff0SLorenzo Bianconi DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS); 526b38f4ff0SLorenzo Bianconi 527b38f4ff0SLorenzo Bianconi /* qos stats counters */ 528b38f4ff0SLorenzo Bianconi u64 cpu_tx_packets; 529b38f4ff0SLorenzo Bianconi u64 fwd_tx_packets; 530af3cf757SLorenzo Bianconi 531af3cf757SLorenzo Bianconi struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS]; 532b38f4ff0SLorenzo Bianconi }; 533b38f4ff0SLorenzo Bianconi 53400a76783SLorenzo Bianconi #define AIROHA_RXD4_PPE_CPU_REASON GENMASK(20, 16) 53500a76783SLorenzo Bianconi #define AIROHA_RXD4_FOE_ENTRY GENMASK(15, 0) 53600a76783SLorenzo Bianconi 53700a76783SLorenzo Bianconi struct airoha_ppe { 53800a76783SLorenzo Bianconi struct airoha_eth *eth; 53900a76783SLorenzo Bianconi 54000a76783SLorenzo Bianconi void *foe; 54100a76783SLorenzo Bianconi dma_addr_t foe_dma; 54200a76783SLorenzo Bianconi 543b4916f67SLorenzo Bianconi struct rhashtable l2_flows; 544b4916f67SLorenzo Bianconi 54500a76783SLorenzo Bianconi struct hlist_head *foe_flow; 54600a76783SLorenzo Bianconi u16 foe_check_time[PPE_NUM_ENTRIES]; 5473fe15c64SLorenzo Bianconi 548b81e0f2bSLorenzo Bianconi struct airoha_foe_stats *foe_stats; 549b81e0f2bSLorenzo Bianconi dma_addr_t foe_stats_dma; 550b81e0f2bSLorenzo Bianconi 5513fe15c64SLorenzo Bianconi struct dentry *debugfs_dir; 55200a76783SLorenzo Bianconi }; 55300a76783SLorenzo Bianconi 554b38f4ff0SLorenzo Bianconi struct airoha_eth { 555b38f4ff0SLorenzo Bianconi struct device *dev; 556b38f4ff0SLorenzo Bianconi 557b38f4ff0SLorenzo Bianconi unsigned long state; 558b38f4ff0SLorenzo Bianconi void __iomem *fe_regs; 559b38f4ff0SLorenzo Bianconi 56023290c7bSLorenzo Bianconi struct airoha_npu __rcu *npu; 56123290c7bSLorenzo Bianconi 56200a76783SLorenzo Bianconi struct airoha_ppe *ppe; 56300a76783SLorenzo Bianconi struct rhashtable flow_table; 56400a76783SLorenzo Bianconi 565b38f4ff0SLorenzo Bianconi struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS]; 566b38f4ff0SLorenzo Bianconi struct reset_control_bulk_data xsi_rsts[AIROHA_MAX_NUM_XSI_RSTS]; 567b38f4ff0SLorenzo Bianconi 568b38f4ff0SLorenzo Bianconi struct net_device *napi_dev; 569b38f4ff0SLorenzo Bianconi 570b38f4ff0SLorenzo Bianconi struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA]; 571b38f4ff0SLorenzo Bianconi struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS]; 572b38f4ff0SLorenzo Bianconi }; 573b38f4ff0SLorenzo Bianconi 574e0758a86SLorenzo Bianconi u32 airoha_rr(void __iomem *base, u32 offset); 575e0758a86SLorenzo Bianconi void airoha_wr(void __iomem *base, u32 offset, u32 val); 576e0758a86SLorenzo Bianconi u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val); 577e0758a86SLorenzo Bianconi 578e0758a86SLorenzo Bianconi #define airoha_fe_rr(eth, offset) \ 579e0758a86SLorenzo Bianconi airoha_rr((eth)->fe_regs, (offset)) 580e0758a86SLorenzo Bianconi #define airoha_fe_wr(eth, offset, val) \ 581e0758a86SLorenzo Bianconi airoha_wr((eth)->fe_regs, (offset), (val)) 582e0758a86SLorenzo Bianconi #define airoha_fe_rmw(eth, offset, mask, val) \ 583e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), (mask), (val)) 584e0758a86SLorenzo Bianconi #define airoha_fe_set(eth, offset, val) \ 585e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), 0, (val)) 586e0758a86SLorenzo Bianconi #define airoha_fe_clear(eth, offset, val) \ 587e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), (val), 0) 588e0758a86SLorenzo Bianconi 589e0758a86SLorenzo Bianconi #define airoha_qdma_rr(qdma, offset) \ 590e0758a86SLorenzo Bianconi airoha_rr((qdma)->regs, (offset)) 591e0758a86SLorenzo Bianconi #define airoha_qdma_wr(qdma, offset, val) \ 592e0758a86SLorenzo Bianconi airoha_wr((qdma)->regs, (offset), (val)) 593e0758a86SLorenzo Bianconi #define airoha_qdma_rmw(qdma, offset, mask, val) \ 594e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), (mask), (val)) 595e0758a86SLorenzo Bianconi #define airoha_qdma_set(qdma, offset, val) \ 596e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), 0, (val)) 597e0758a86SLorenzo Bianconi #define airoha_qdma_clear(qdma, offset, val) \ 598e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), (val), 0) 599e0758a86SLorenzo Bianconi 600c683e378SLorenzo Bianconi static inline bool airhoa_is_lan_gdm_port(struct airoha_gdm_port *port) 601c683e378SLorenzo Bianconi { 602c683e378SLorenzo Bianconi /* GDM1 port on EN7581 SoC is connected to the lan dsa switch. 603c683e378SLorenzo Bianconi * GDM{2,3,4} can be used as wan port connected to an external 604c683e378SLorenzo Bianconi * phy module. 605c683e378SLorenzo Bianconi */ 606c683e378SLorenzo Bianconi return port->id == 1; 607c683e378SLorenzo Bianconi } 608c683e378SLorenzo Bianconi 60909bccf56SLorenzo Bianconi bool airoha_is_valid_gdm_port(struct airoha_eth *eth, 61009bccf56SLorenzo Bianconi struct airoha_gdm_port *port); 61109bccf56SLorenzo Bianconi 612cd53f622SLorenzo Bianconi void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb, 613cd53f622SLorenzo Bianconi u16 hash); 614df8398fbSLorenzo Bianconi int airoha_ppe_setup_tc_block_cb(struct net_device *dev, void *type_data); 61500a76783SLorenzo Bianconi int airoha_ppe_init(struct airoha_eth *eth); 61600a76783SLorenzo Bianconi void airoha_ppe_deinit(struct airoha_eth *eth); 617*a869d3a5SLorenzo Bianconi void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port); 6183fe15c64SLorenzo Bianconi struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe, 6193fe15c64SLorenzo Bianconi u32 hash); 620b81e0f2bSLorenzo Bianconi void airoha_ppe_foe_entry_get_stats(struct airoha_ppe *ppe, u32 hash, 621b81e0f2bSLorenzo Bianconi struct airoha_foe_stats64 *stats); 6223fe15c64SLorenzo Bianconi 62308d0185eSArnd Bergmann #ifdef CONFIG_DEBUG_FS 6243fe15c64SLorenzo Bianconi int airoha_ppe_debugfs_init(struct airoha_ppe *ppe); 6253fe15c64SLorenzo Bianconi #else 6263fe15c64SLorenzo Bianconi static inline int airoha_ppe_debugfs_init(struct airoha_ppe *ppe) 6273fe15c64SLorenzo Bianconi { 6283fe15c64SLorenzo Bianconi return 0; 6293fe15c64SLorenzo Bianconi } 6303fe15c64SLorenzo Bianconi #endif 63100a76783SLorenzo Bianconi 632b38f4ff0SLorenzo Bianconi #endif /* AIROHA_ETH_H */ 633