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 20*f252493eSLorenzo 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) 5300a76783SLorenzo Bianconi #define PPE_DRAM_NUM_ENTRIES (16 * 1024) 5400a76783SLorenzo Bianconi #define PPE_NUM_ENTRIES (PPE_SRAM_NUM_ENTRIES + PPE_DRAM_NUM_ENTRIES) 5500a76783SLorenzo Bianconi #define PPE_HASH_MASK (PPE_NUM_ENTRIES - 1) 5600a76783SLorenzo Bianconi #define PPE_ENTRY_SIZE 80 5700a76783SLorenzo Bianconi #define PPE_RAM_NUM_ENTRIES_SHIFT(_n) (__ffs((_n) >> 10)) 5800a76783SLorenzo Bianconi 59af3cf757SLorenzo Bianconi #define MTK_HDR_LEN 4 60af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_8100 1 61af3cf757SLorenzo Bianconi #define MTK_HDR_XMIT_TAGGED_TPID_88A8 2 62af3cf757SLorenzo Bianconi 63b38f4ff0SLorenzo Bianconi enum { 64b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX0, 65b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX1, 66b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX2, 67b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX3, 68b38f4ff0SLorenzo Bianconi QDMA_INT_REG_IDX4, 69b38f4ff0SLorenzo Bianconi QDMA_INT_REG_MAX 70b38f4ff0SLorenzo Bianconi }; 71b38f4ff0SLorenzo Bianconi 72b38f4ff0SLorenzo Bianconi enum { 739cd451d4SLorenzo Bianconi HSGMII_LAN_PCIE0_SRCPORT = 0x16, 749cd451d4SLorenzo Bianconi HSGMII_LAN_PCIE1_SRCPORT, 759cd451d4SLorenzo Bianconi HSGMII_LAN_ETH_SRCPORT, 769cd451d4SLorenzo Bianconi HSGMII_LAN_USB_SRCPORT, 779cd451d4SLorenzo Bianconi }; 789cd451d4SLorenzo Bianconi 799cd451d4SLorenzo Bianconi enum { 80b38f4ff0SLorenzo Bianconi XSI_PCIE0_VIP_PORT_MASK = BIT(22), 81b38f4ff0SLorenzo Bianconi XSI_PCIE1_VIP_PORT_MASK = BIT(23), 82b38f4ff0SLorenzo Bianconi XSI_USB_VIP_PORT_MASK = BIT(25), 83b38f4ff0SLorenzo Bianconi XSI_ETH_VIP_PORT_MASK = BIT(24), 84b38f4ff0SLorenzo Bianconi }; 85b38f4ff0SLorenzo Bianconi 86b38f4ff0SLorenzo Bianconi enum { 87b38f4ff0SLorenzo Bianconi DEV_STATE_INITIALIZED, 88b38f4ff0SLorenzo Bianconi }; 89b38f4ff0SLorenzo Bianconi 90b38f4ff0SLorenzo Bianconi enum { 91b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q1 = 1, 92b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q5 = 5, 93b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q6 = 6, 94b38f4ff0SLorenzo Bianconi CDM_CRSN_QSEL_Q15 = 15, 95b38f4ff0SLorenzo Bianconi }; 96b38f4ff0SLorenzo Bianconi 97b38f4ff0SLorenzo Bianconi enum { 98b38f4ff0SLorenzo Bianconi CRSN_08 = 0x8, 99b38f4ff0SLorenzo Bianconi CRSN_21 = 0x15, /* KA */ 100b38f4ff0SLorenzo Bianconi CRSN_22 = 0x16, /* hit bind and force route to CPU */ 101b38f4ff0SLorenzo Bianconi CRSN_24 = 0x18, 102b38f4ff0SLorenzo Bianconi CRSN_25 = 0x19, 103b38f4ff0SLorenzo Bianconi }; 104b38f4ff0SLorenzo Bianconi 105b38f4ff0SLorenzo Bianconi enum { 106b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM1, 107b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM1, 108b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM2, 109b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM3, 110b38f4ff0SLorenzo Bianconi FE_PSE_PORT_PPE1, 111b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM2, 112b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM3, 113b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM4, 114b38f4ff0SLorenzo Bianconi FE_PSE_PORT_PPE2, 115b38f4ff0SLorenzo Bianconi FE_PSE_PORT_GDM4, 116b38f4ff0SLorenzo Bianconi FE_PSE_PORT_CDM5, 117b38f4ff0SLorenzo Bianconi FE_PSE_PORT_DROP = 0xf, 118b38f4ff0SLorenzo Bianconi }; 119b38f4ff0SLorenzo Bianconi 120b38f4ff0SLorenzo Bianconi enum tx_sched_mode { 121b38f4ff0SLorenzo Bianconi TC_SCH_WRR8, 122b38f4ff0SLorenzo Bianconi TC_SCH_SP, 123b38f4ff0SLorenzo Bianconi TC_SCH_WRR7, 124b38f4ff0SLorenzo Bianconi TC_SCH_WRR6, 125b38f4ff0SLorenzo Bianconi TC_SCH_WRR5, 126b38f4ff0SLorenzo Bianconi TC_SCH_WRR4, 127b38f4ff0SLorenzo Bianconi TC_SCH_WRR3, 128b38f4ff0SLorenzo Bianconi TC_SCH_WRR2, 129b38f4ff0SLorenzo Bianconi }; 130b38f4ff0SLorenzo Bianconi 131df8398fbSLorenzo Bianconi enum trtcm_unit_type { 132df8398fbSLorenzo Bianconi TRTCM_BYTE_UNIT, 133df8398fbSLorenzo Bianconi TRTCM_PACKET_UNIT, 134df8398fbSLorenzo Bianconi }; 135df8398fbSLorenzo Bianconi 136b38f4ff0SLorenzo Bianconi enum trtcm_param_type { 137b38f4ff0SLorenzo Bianconi TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */ 138b38f4ff0SLorenzo Bianconi TRTCM_TOKEN_RATE_MODE, 139b38f4ff0SLorenzo Bianconi TRTCM_BUCKETSIZE_SHIFT_MODE, 140b38f4ff0SLorenzo Bianconi TRTCM_BUCKET_COUNTER_MODE, 141b38f4ff0SLorenzo Bianconi }; 142b38f4ff0SLorenzo Bianconi 143b38f4ff0SLorenzo Bianconi enum trtcm_mode_type { 144b38f4ff0SLorenzo Bianconi TRTCM_COMMIT_MODE, 145b38f4ff0SLorenzo Bianconi TRTCM_PEAK_MODE, 146b38f4ff0SLorenzo Bianconi }; 147b38f4ff0SLorenzo Bianconi 148b38f4ff0SLorenzo Bianconi enum trtcm_param { 149b38f4ff0SLorenzo Bianconi TRTCM_TICK_SEL = BIT(0), 150b38f4ff0SLorenzo Bianconi TRTCM_PKT_MODE = BIT(1), 151b38f4ff0SLorenzo Bianconi TRTCM_METER_MODE = BIT(2), 152b38f4ff0SLorenzo Bianconi }; 153b38f4ff0SLorenzo Bianconi 154b38f4ff0SLorenzo Bianconi #define MIN_TOKEN_SIZE 4096 155b38f4ff0SLorenzo Bianconi #define MAX_TOKEN_SIZE_OFFSET 17 156b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_MASK GENMASK(23, 6) 157b38f4ff0SLorenzo Bianconi #define TRTCM_TOKEN_RATE_FRACTION_MASK GENMASK(5, 0) 158b38f4ff0SLorenzo Bianconi 159b38f4ff0SLorenzo Bianconi struct airoha_queue_entry { 160b38f4ff0SLorenzo Bianconi union { 161b38f4ff0SLorenzo Bianconi void *buf; 162b38f4ff0SLorenzo Bianconi struct sk_buff *skb; 163b38f4ff0SLorenzo Bianconi }; 164b38f4ff0SLorenzo Bianconi dma_addr_t dma_addr; 165b38f4ff0SLorenzo Bianconi u16 dma_len; 166b38f4ff0SLorenzo Bianconi }; 167b38f4ff0SLorenzo Bianconi 168b38f4ff0SLorenzo Bianconi struct airoha_queue { 169b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 170b38f4ff0SLorenzo Bianconi 171b38f4ff0SLorenzo Bianconi /* protect concurrent queue accesses */ 172b38f4ff0SLorenzo Bianconi spinlock_t lock; 173b38f4ff0SLorenzo Bianconi struct airoha_queue_entry *entry; 174b38f4ff0SLorenzo Bianconi struct airoha_qdma_desc *desc; 175b38f4ff0SLorenzo Bianconi u16 head; 176b38f4ff0SLorenzo Bianconi u16 tail; 177b38f4ff0SLorenzo Bianconi 178b38f4ff0SLorenzo Bianconi int queued; 179b38f4ff0SLorenzo Bianconi int ndesc; 180b38f4ff0SLorenzo Bianconi int free_thr; 181b38f4ff0SLorenzo Bianconi int buf_size; 182b38f4ff0SLorenzo Bianconi 183b38f4ff0SLorenzo Bianconi struct napi_struct napi; 184b38f4ff0SLorenzo Bianconi struct page_pool *page_pool; 185e12182ddSLorenzo Bianconi struct sk_buff *skb; 186b38f4ff0SLorenzo Bianconi }; 187b38f4ff0SLorenzo Bianconi 188b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue { 189b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 190b38f4ff0SLorenzo Bianconi 191b38f4ff0SLorenzo Bianconi struct napi_struct napi; 192b38f4ff0SLorenzo Bianconi 193b38f4ff0SLorenzo Bianconi int size; 194b38f4ff0SLorenzo Bianconi u32 *q; 195b38f4ff0SLorenzo Bianconi }; 196b38f4ff0SLorenzo Bianconi 197b38f4ff0SLorenzo Bianconi struct airoha_hw_stats { 198b38f4ff0SLorenzo Bianconi /* protect concurrent hw_stats accesses */ 199b38f4ff0SLorenzo Bianconi spinlock_t lock; 200b38f4ff0SLorenzo Bianconi struct u64_stats_sync syncp; 201b38f4ff0SLorenzo Bianconi 202b38f4ff0SLorenzo Bianconi /* get_stats64 */ 203b38f4ff0SLorenzo Bianconi u64 rx_ok_pkts; 204b38f4ff0SLorenzo Bianconi u64 tx_ok_pkts; 205b38f4ff0SLorenzo Bianconi u64 rx_ok_bytes; 206b38f4ff0SLorenzo Bianconi u64 tx_ok_bytes; 207b38f4ff0SLorenzo Bianconi u64 rx_multicast; 208b38f4ff0SLorenzo Bianconi u64 rx_errors; 209b38f4ff0SLorenzo Bianconi u64 rx_drops; 210b38f4ff0SLorenzo Bianconi u64 tx_drops; 211b38f4ff0SLorenzo Bianconi u64 rx_crc_error; 212b38f4ff0SLorenzo Bianconi u64 rx_over_errors; 213b38f4ff0SLorenzo Bianconi /* ethtool stats */ 214b38f4ff0SLorenzo Bianconi u64 tx_broadcast; 215b38f4ff0SLorenzo Bianconi u64 tx_multicast; 216b38f4ff0SLorenzo Bianconi u64 tx_len[7]; 217b38f4ff0SLorenzo Bianconi u64 rx_broadcast; 218b38f4ff0SLorenzo Bianconi u64 rx_fragment; 219b38f4ff0SLorenzo Bianconi u64 rx_jabber; 220b38f4ff0SLorenzo Bianconi u64 rx_len[7]; 221b38f4ff0SLorenzo Bianconi }; 222b38f4ff0SLorenzo Bianconi 22300a76783SLorenzo Bianconi enum { 22400a76783SLorenzo Bianconi PPE_CPU_REASON_HIT_UNBIND_RATE_REACHED = 0x0f, 22500a76783SLorenzo Bianconi }; 22600a76783SLorenzo Bianconi 22700a76783SLorenzo Bianconi enum { 22800a76783SLorenzo Bianconi AIROHA_FOE_STATE_INVALID, 22900a76783SLorenzo Bianconi AIROHA_FOE_STATE_UNBIND, 23000a76783SLorenzo Bianconi AIROHA_FOE_STATE_BIND, 23100a76783SLorenzo Bianconi AIROHA_FOE_STATE_FIN 23200a76783SLorenzo Bianconi }; 23300a76783SLorenzo Bianconi 23400a76783SLorenzo Bianconi enum { 23500a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_HNAPT = 0, 23600a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_ROUTE = 1, 23700a76783SLorenzo Bianconi PPE_PKT_TYPE_BRIDGE = 2, 23800a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV4_DSLITE = 3, 23900a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_ROUTE_3T = 4, 24000a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_ROUTE_5T = 5, 24100a76783SLorenzo Bianconi PPE_PKT_TYPE_IPV6_6RD = 7, 24200a76783SLorenzo Bianconi }; 24300a76783SLorenzo Bianconi 24400a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_SMAC_ID GENMASK(20, 16) 24500a76783SLorenzo Bianconi #define AIROHA_FOE_MAC_PPPOE_ID GENMASK(15, 0) 24600a76783SLorenzo Bianconi 24700a76783SLorenzo Bianconi struct airoha_foe_mac_info_common { 24800a76783SLorenzo Bianconi u16 vlan1; 24900a76783SLorenzo Bianconi u16 etype; 25000a76783SLorenzo Bianconi 25100a76783SLorenzo Bianconi u32 dest_mac_hi; 25200a76783SLorenzo Bianconi 25300a76783SLorenzo Bianconi u16 vlan2; 25400a76783SLorenzo Bianconi u16 dest_mac_lo; 25500a76783SLorenzo Bianconi 25600a76783SLorenzo Bianconi u32 src_mac_hi; 25700a76783SLorenzo Bianconi }; 25800a76783SLorenzo Bianconi 25900a76783SLorenzo Bianconi struct airoha_foe_mac_info { 26000a76783SLorenzo Bianconi struct airoha_foe_mac_info_common common; 26100a76783SLorenzo Bianconi 26200a76783SLorenzo Bianconi u16 pppoe_id; 26300a76783SLorenzo Bianconi u16 src_mac_lo; 26400a76783SLorenzo Bianconi }; 26500a76783SLorenzo Bianconi 26600a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PREBIND BIT(24) 26700a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_PACKETS GENMASK(23, 8) 26800a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_UNBIND_TIMESTAMP GENMASK(7, 0) 26900a76783SLorenzo Bianconi 27000a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATIC BIT(31) 27100a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_UDP BIT(30) 27200a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_STATE GENMASK(29, 28) 27300a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PACKET_TYPE GENMASK(27, 25) 27400a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TTL BIT(24) 27500a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP BIT(23) 27600a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_PPPOE BIT(22) 27700a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VPM GENMASK(21, 20) 27800a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_VLAN_LAYER GENMASK(19, 16) 27900a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_KEEPALIVE BIT(15) 28000a76783SLorenzo Bianconi #define AIROHA_FOE_IB1_BIND_TIMESTAMP GENMASK(14, 0) 28100a76783SLorenzo Bianconi 28200a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_DSCP GENMASK(31, 24) 28300a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PORT_AG GENMASK(23, 13) 28400a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PCP BIT(12) 28500a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_MULTICAST BIT(11) 28600a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_FAST_PATH BIT(10) 28700a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_QOS BIT(9) 28800a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_PSE_PORT GENMASK(8, 5) 28900a76783SLorenzo Bianconi #define AIROHA_FOE_IB2_NBQ GENMASK(4, 0) 29000a76783SLorenzo Bianconi 29100a76783SLorenzo Bianconi #define AIROHA_FOE_ACTDP GENMASK(31, 24) 29200a76783SLorenzo Bianconi #define AIROHA_FOE_SHAPER_ID GENMASK(23, 16) 29300a76783SLorenzo Bianconi #define AIROHA_FOE_CHANNEL GENMASK(15, 11) 29400a76783SLorenzo Bianconi #define AIROHA_FOE_QID GENMASK(10, 8) 29500a76783SLorenzo Bianconi #define AIROHA_FOE_DPI BIT(7) 29600a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL BIT(6) 29700a76783SLorenzo Bianconi #define AIROHA_FOE_TUNNEL_ID GENMASK(5, 0) 29800a76783SLorenzo Bianconi 29900a76783SLorenzo Bianconi struct airoha_foe_bridge { 30000a76783SLorenzo Bianconi u32 dest_mac_hi; 30100a76783SLorenzo Bianconi 30200a76783SLorenzo Bianconi u16 src_mac_hi; 30300a76783SLorenzo Bianconi u16 dest_mac_lo; 30400a76783SLorenzo Bianconi 30500a76783SLorenzo Bianconi u32 src_mac_lo; 30600a76783SLorenzo Bianconi 30700a76783SLorenzo Bianconi u32 ib2; 30800a76783SLorenzo Bianconi 30900a76783SLorenzo Bianconi u32 rsv[5]; 31000a76783SLorenzo Bianconi 31100a76783SLorenzo Bianconi u32 data; 31200a76783SLorenzo Bianconi 31300a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 31400a76783SLorenzo Bianconi }; 31500a76783SLorenzo Bianconi 31600a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple { 31700a76783SLorenzo Bianconi u32 src_ip; 31800a76783SLorenzo Bianconi u32 dest_ip; 31900a76783SLorenzo Bianconi union { 32000a76783SLorenzo Bianconi struct { 32100a76783SLorenzo Bianconi u16 dest_port; 32200a76783SLorenzo Bianconi u16 src_port; 32300a76783SLorenzo Bianconi }; 32400a76783SLorenzo Bianconi struct { 32500a76783SLorenzo Bianconi u8 protocol; 32600a76783SLorenzo Bianconi u8 _pad[3]; /* fill with 0xa5a5a5 */ 32700a76783SLorenzo Bianconi }; 32800a76783SLorenzo Bianconi u32 ports; 32900a76783SLorenzo Bianconi }; 33000a76783SLorenzo Bianconi }; 33100a76783SLorenzo Bianconi 33200a76783SLorenzo Bianconi struct airoha_foe_ipv4 { 33300a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple orig_tuple; 33400a76783SLorenzo Bianconi 33500a76783SLorenzo Bianconi u32 ib2; 33600a76783SLorenzo Bianconi 33700a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple new_tuple; 33800a76783SLorenzo Bianconi 33900a76783SLorenzo Bianconi u32 rsv[2]; 34000a76783SLorenzo Bianconi 34100a76783SLorenzo Bianconi u32 data; 34200a76783SLorenzo Bianconi 34300a76783SLorenzo Bianconi struct airoha_foe_mac_info l2; 34400a76783SLorenzo Bianconi }; 34500a76783SLorenzo Bianconi 34600a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite { 34700a76783SLorenzo Bianconi struct airoha_foe_ipv4_tuple ip4; 34800a76783SLorenzo Bianconi 34900a76783SLorenzo Bianconi u32 ib2; 35000a76783SLorenzo Bianconi 35100a76783SLorenzo Bianconi u8 flow_label[3]; 35200a76783SLorenzo Bianconi u8 priority; 35300a76783SLorenzo Bianconi 35400a76783SLorenzo Bianconi u32 rsv[4]; 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_ipv6 { 36200a76783SLorenzo Bianconi u32 src_ip[4]; 36300a76783SLorenzo Bianconi u32 dest_ip[4]; 36400a76783SLorenzo Bianconi 36500a76783SLorenzo Bianconi union { 36600a76783SLorenzo Bianconi struct { 36700a76783SLorenzo Bianconi u16 dest_port; 36800a76783SLorenzo Bianconi u16 src_port; 36900a76783SLorenzo Bianconi }; 37000a76783SLorenzo Bianconi struct { 37100a76783SLorenzo Bianconi u8 protocol; 37200a76783SLorenzo Bianconi u8 pad[3]; 37300a76783SLorenzo Bianconi }; 37400a76783SLorenzo Bianconi u32 ports; 37500a76783SLorenzo Bianconi }; 37600a76783SLorenzo Bianconi 37700a76783SLorenzo Bianconi u32 data; 37800a76783SLorenzo Bianconi 37900a76783SLorenzo Bianconi u32 ib2; 38000a76783SLorenzo Bianconi 38100a76783SLorenzo Bianconi struct airoha_foe_mac_info_common l2; 38200a76783SLorenzo Bianconi }; 38300a76783SLorenzo Bianconi 38400a76783SLorenzo Bianconi struct airoha_foe_entry { 38500a76783SLorenzo Bianconi union { 38600a76783SLorenzo Bianconi struct { 38700a76783SLorenzo Bianconi u32 ib1; 38800a76783SLorenzo Bianconi union { 38900a76783SLorenzo Bianconi struct airoha_foe_bridge bridge; 39000a76783SLorenzo Bianconi struct airoha_foe_ipv4 ipv4; 39100a76783SLorenzo Bianconi struct airoha_foe_ipv4_dslite dslite; 39200a76783SLorenzo Bianconi struct airoha_foe_ipv6 ipv6; 39300a76783SLorenzo Bianconi DECLARE_FLEX_ARRAY(u32, d); 39400a76783SLorenzo Bianconi }; 39500a76783SLorenzo Bianconi }; 39600a76783SLorenzo Bianconi u8 data[PPE_ENTRY_SIZE]; 39700a76783SLorenzo Bianconi }; 39800a76783SLorenzo Bianconi }; 39900a76783SLorenzo Bianconi 40000a76783SLorenzo Bianconi struct airoha_flow_data { 40100a76783SLorenzo Bianconi struct ethhdr eth; 40200a76783SLorenzo Bianconi 40300a76783SLorenzo Bianconi union { 40400a76783SLorenzo Bianconi struct { 40500a76783SLorenzo Bianconi __be32 src_addr; 40600a76783SLorenzo Bianconi __be32 dst_addr; 40700a76783SLorenzo Bianconi } v4; 40800a76783SLorenzo Bianconi 40900a76783SLorenzo Bianconi struct { 41000a76783SLorenzo Bianconi struct in6_addr src_addr; 41100a76783SLorenzo Bianconi struct in6_addr dst_addr; 41200a76783SLorenzo Bianconi } v6; 41300a76783SLorenzo Bianconi }; 41400a76783SLorenzo Bianconi 41500a76783SLorenzo Bianconi __be16 src_port; 41600a76783SLorenzo Bianconi __be16 dst_port; 41700a76783SLorenzo Bianconi 41800a76783SLorenzo Bianconi struct { 41900a76783SLorenzo Bianconi struct { 42000a76783SLorenzo Bianconi u16 id; 42100a76783SLorenzo Bianconi __be16 proto; 42200a76783SLorenzo Bianconi } hdr[2]; 42300a76783SLorenzo Bianconi u8 num; 42400a76783SLorenzo Bianconi } vlan; 42500a76783SLorenzo Bianconi struct { 42600a76783SLorenzo Bianconi u16 sid; 42700a76783SLorenzo Bianconi u8 num; 42800a76783SLorenzo Bianconi } pppoe; 42900a76783SLorenzo Bianconi }; 43000a76783SLorenzo Bianconi 431b4916f67SLorenzo Bianconi enum airoha_flow_entry_type { 432b4916f67SLorenzo Bianconi FLOW_TYPE_L4, 433b4916f67SLorenzo Bianconi FLOW_TYPE_L2, 434b4916f67SLorenzo Bianconi FLOW_TYPE_L2_SUBFLOW, 435b4916f67SLorenzo Bianconi }; 436b4916f67SLorenzo Bianconi 43700a76783SLorenzo Bianconi struct airoha_flow_table_entry { 438b4916f67SLorenzo Bianconi union { 439b4916f67SLorenzo Bianconi struct hlist_node list; /* PPE L3 flow entry */ 440cd53f622SLorenzo Bianconi struct { 441b4916f67SLorenzo Bianconi struct rhash_head l2_node; /* L2 flow entry */ 442cd53f622SLorenzo Bianconi struct hlist_head l2_flows; /* PPE L2 subflows list */ 443cd53f622SLorenzo Bianconi }; 444b4916f67SLorenzo Bianconi }; 44500a76783SLorenzo Bianconi 44600a76783SLorenzo Bianconi struct airoha_foe_entry data; 447cd53f622SLorenzo Bianconi struct hlist_node l2_subflow_node; /* PPE L2 subflow entry */ 44800a76783SLorenzo Bianconi u32 hash; 44900a76783SLorenzo Bianconi 450b4916f67SLorenzo Bianconi enum airoha_flow_entry_type type; 451b4916f67SLorenzo Bianconi 45200a76783SLorenzo Bianconi struct rhash_head node; 45300a76783SLorenzo Bianconi unsigned long cookie; 45400a76783SLorenzo Bianconi }; 45500a76783SLorenzo Bianconi 456*f252493eSLorenzo Bianconi /* RX queue to IRQ mapping: BIT(q) in IRQ(n) */ 457*f252493eSLorenzo Bianconi #define RX_IRQ0_BANK_PIN_MASK 0x839f 458*f252493eSLorenzo Bianconi #define RX_IRQ1_BANK_PIN_MASK 0x7fe00000 459*f252493eSLorenzo Bianconi #define RX_IRQ2_BANK_PIN_MASK 0x20 460*f252493eSLorenzo Bianconi #define RX_IRQ3_BANK_PIN_MASK 0x40 461*f252493eSLorenzo Bianconi #define RX_IRQ_BANK_PIN_MASK(_n) \ 462*f252493eSLorenzo Bianconi (((_n) == 3) ? RX_IRQ3_BANK_PIN_MASK : \ 463*f252493eSLorenzo Bianconi ((_n) == 2) ? RX_IRQ2_BANK_PIN_MASK : \ 464*f252493eSLorenzo Bianconi ((_n) == 1) ? RX_IRQ1_BANK_PIN_MASK : \ 465*f252493eSLorenzo Bianconi RX_IRQ0_BANK_PIN_MASK) 466*f252493eSLorenzo Bianconi 4679439db26SLorenzo Bianconi struct airoha_irq_bank { 4689439db26SLorenzo Bianconi struct airoha_qdma *qdma; 469b38f4ff0SLorenzo Bianconi 470b38f4ff0SLorenzo Bianconi /* protect concurrent irqmask accesses */ 471b38f4ff0SLorenzo Bianconi spinlock_t irq_lock; 472b38f4ff0SLorenzo Bianconi u32 irqmask[QDMA_INT_REG_MAX]; 473b38f4ff0SLorenzo Bianconi int irq; 4749439db26SLorenzo Bianconi }; 4759439db26SLorenzo Bianconi 4769439db26SLorenzo Bianconi struct airoha_qdma { 4779439db26SLorenzo Bianconi struct airoha_eth *eth; 4789439db26SLorenzo Bianconi void __iomem *regs; 479b38f4ff0SLorenzo Bianconi 48080369686SLorenzo Bianconi atomic_t users; 48180369686SLorenzo Bianconi 4829439db26SLorenzo Bianconi struct airoha_irq_bank irq_banks[AIROHA_MAX_NUM_IRQ_BANKS]; 4839439db26SLorenzo Bianconi 484b38f4ff0SLorenzo Bianconi struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ]; 485b38f4ff0SLorenzo Bianconi 486b38f4ff0SLorenzo Bianconi struct airoha_queue q_tx[AIROHA_NUM_TX_RING]; 487b38f4ff0SLorenzo Bianconi struct airoha_queue q_rx[AIROHA_NUM_RX_RING]; 488b38f4ff0SLorenzo Bianconi 489b38f4ff0SLorenzo Bianconi /* descriptor and packet buffers for qdma hw forward */ 490b38f4ff0SLorenzo Bianconi struct { 491b38f4ff0SLorenzo Bianconi void *desc; 492b38f4ff0SLorenzo Bianconi void *q; 493b38f4ff0SLorenzo Bianconi } hfwd; 494b38f4ff0SLorenzo Bianconi }; 495b38f4ff0SLorenzo Bianconi 496b38f4ff0SLorenzo Bianconi struct airoha_gdm_port { 497b38f4ff0SLorenzo Bianconi struct airoha_qdma *qdma; 498b38f4ff0SLorenzo Bianconi struct net_device *dev; 499b38f4ff0SLorenzo Bianconi int id; 500b38f4ff0SLorenzo Bianconi 501b38f4ff0SLorenzo Bianconi struct airoha_hw_stats stats; 502b38f4ff0SLorenzo Bianconi 503b38f4ff0SLorenzo Bianconi DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS); 504b38f4ff0SLorenzo Bianconi 505b38f4ff0SLorenzo Bianconi /* qos stats counters */ 506b38f4ff0SLorenzo Bianconi u64 cpu_tx_packets; 507b38f4ff0SLorenzo Bianconi u64 fwd_tx_packets; 508af3cf757SLorenzo Bianconi 509af3cf757SLorenzo Bianconi struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS]; 510b38f4ff0SLorenzo Bianconi }; 511b38f4ff0SLorenzo Bianconi 51200a76783SLorenzo Bianconi #define AIROHA_RXD4_PPE_CPU_REASON GENMASK(20, 16) 51300a76783SLorenzo Bianconi #define AIROHA_RXD4_FOE_ENTRY GENMASK(15, 0) 51400a76783SLorenzo Bianconi 51500a76783SLorenzo Bianconi struct airoha_ppe { 51600a76783SLorenzo Bianconi struct airoha_eth *eth; 51700a76783SLorenzo Bianconi 51800a76783SLorenzo Bianconi void *foe; 51900a76783SLorenzo Bianconi dma_addr_t foe_dma; 52000a76783SLorenzo Bianconi 521b4916f67SLorenzo Bianconi struct rhashtable l2_flows; 522b4916f67SLorenzo Bianconi 52300a76783SLorenzo Bianconi struct hlist_head *foe_flow; 52400a76783SLorenzo Bianconi u16 foe_check_time[PPE_NUM_ENTRIES]; 5253fe15c64SLorenzo Bianconi 5263fe15c64SLorenzo Bianconi struct dentry *debugfs_dir; 52700a76783SLorenzo Bianconi }; 52800a76783SLorenzo Bianconi 529b38f4ff0SLorenzo Bianconi struct airoha_eth { 530b38f4ff0SLorenzo Bianconi struct device *dev; 531b38f4ff0SLorenzo Bianconi 532b38f4ff0SLorenzo Bianconi unsigned long state; 533b38f4ff0SLorenzo Bianconi void __iomem *fe_regs; 534b38f4ff0SLorenzo Bianconi 53523290c7bSLorenzo Bianconi struct airoha_npu __rcu *npu; 53623290c7bSLorenzo Bianconi 53700a76783SLorenzo Bianconi struct airoha_ppe *ppe; 53800a76783SLorenzo Bianconi struct rhashtable flow_table; 53900a76783SLorenzo Bianconi 540b38f4ff0SLorenzo Bianconi struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS]; 541b38f4ff0SLorenzo Bianconi struct reset_control_bulk_data xsi_rsts[AIROHA_MAX_NUM_XSI_RSTS]; 542b38f4ff0SLorenzo Bianconi 543b38f4ff0SLorenzo Bianconi struct net_device *napi_dev; 544b38f4ff0SLorenzo Bianconi 545b38f4ff0SLorenzo Bianconi struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA]; 546b38f4ff0SLorenzo Bianconi struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS]; 547b38f4ff0SLorenzo Bianconi }; 548b38f4ff0SLorenzo Bianconi 549e0758a86SLorenzo Bianconi u32 airoha_rr(void __iomem *base, u32 offset); 550e0758a86SLorenzo Bianconi void airoha_wr(void __iomem *base, u32 offset, u32 val); 551e0758a86SLorenzo Bianconi u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val); 552e0758a86SLorenzo Bianconi 553e0758a86SLorenzo Bianconi #define airoha_fe_rr(eth, offset) \ 554e0758a86SLorenzo Bianconi airoha_rr((eth)->fe_regs, (offset)) 555e0758a86SLorenzo Bianconi #define airoha_fe_wr(eth, offset, val) \ 556e0758a86SLorenzo Bianconi airoha_wr((eth)->fe_regs, (offset), (val)) 557e0758a86SLorenzo Bianconi #define airoha_fe_rmw(eth, offset, mask, val) \ 558e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), (mask), (val)) 559e0758a86SLorenzo Bianconi #define airoha_fe_set(eth, offset, val) \ 560e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), 0, (val)) 561e0758a86SLorenzo Bianconi #define airoha_fe_clear(eth, offset, val) \ 562e0758a86SLorenzo Bianconi airoha_rmw((eth)->fe_regs, (offset), (val), 0) 563e0758a86SLorenzo Bianconi 564e0758a86SLorenzo Bianconi #define airoha_qdma_rr(qdma, offset) \ 565e0758a86SLorenzo Bianconi airoha_rr((qdma)->regs, (offset)) 566e0758a86SLorenzo Bianconi #define airoha_qdma_wr(qdma, offset, val) \ 567e0758a86SLorenzo Bianconi airoha_wr((qdma)->regs, (offset), (val)) 568e0758a86SLorenzo Bianconi #define airoha_qdma_rmw(qdma, offset, mask, val) \ 569e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), (mask), (val)) 570e0758a86SLorenzo Bianconi #define airoha_qdma_set(qdma, offset, val) \ 571e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), 0, (val)) 572e0758a86SLorenzo Bianconi #define airoha_qdma_clear(qdma, offset, val) \ 573e0758a86SLorenzo Bianconi airoha_rmw((qdma)->regs, (offset), (val), 0) 574e0758a86SLorenzo Bianconi 57509bccf56SLorenzo Bianconi bool airoha_is_valid_gdm_port(struct airoha_eth *eth, 57609bccf56SLorenzo Bianconi struct airoha_gdm_port *port); 57709bccf56SLorenzo Bianconi 578cd53f622SLorenzo Bianconi void airoha_ppe_check_skb(struct airoha_ppe *ppe, struct sk_buff *skb, 579cd53f622SLorenzo Bianconi u16 hash); 580df8398fbSLorenzo Bianconi int airoha_ppe_setup_tc_block_cb(struct net_device *dev, void *type_data); 58100a76783SLorenzo Bianconi int airoha_ppe_init(struct airoha_eth *eth); 58200a76783SLorenzo Bianconi void airoha_ppe_deinit(struct airoha_eth *eth); 5833fe15c64SLorenzo Bianconi struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe, 5843fe15c64SLorenzo Bianconi u32 hash); 5853fe15c64SLorenzo Bianconi 58608d0185eSArnd Bergmann #ifdef CONFIG_DEBUG_FS 5873fe15c64SLorenzo Bianconi int airoha_ppe_debugfs_init(struct airoha_ppe *ppe); 5883fe15c64SLorenzo Bianconi #else 5893fe15c64SLorenzo Bianconi static inline int airoha_ppe_debugfs_init(struct airoha_ppe *ppe) 5903fe15c64SLorenzo Bianconi { 5913fe15c64SLorenzo Bianconi return 0; 5923fe15c64SLorenzo Bianconi } 5933fe15c64SLorenzo Bianconi #endif 59400a76783SLorenzo Bianconi 595b38f4ff0SLorenzo Bianconi #endif /* AIROHA_ETH_H */ 596