File Index
Files and directories
Sign in
FILE

airoha_eth.h

File preview with syntax highlighting.

linux-6.19.14/drivers/net/ethernet/airoha/airoha_eth.h C
  1/* SPDX-License-Identifier: GPL-2.0-only */
  2/*
  3 * Copyright (c) 2024 AIROHA Inc
  4 * Author: Lorenzo Bianconi <lorenzo@kernel.org>
  5 */
  6
  7#ifndef AIROHA_ETH_H
  8#define AIROHA_ETH_H
  9
 10#include <linux/debugfs.h>
 11#include <linux/etherdevice.h>
 12#include <linux/iopoll.h>
 13#include <linux/kernel.h>
 14#include <linux/netdevice.h>
 15#include <linux/reset.h>
 16#include <linux/soc/airoha/airoha_offload.h>
 17#include <net/dsa.h>
 18
 19#define AIROHA_MAX_NUM_GDM_PORTS	4
 20#define AIROHA_MAX_NUM_QDMA		2
 21#define AIROHA_MAX_NUM_IRQ_BANKS	4
 22#define AIROHA_MAX_DSA_PORTS		7
 23#define AIROHA_MAX_NUM_RSTS		3
 24#define AIROHA_MAX_MTU			9216
 25#define AIROHA_MAX_PACKET_SIZE		2048
 26#define AIROHA_NUM_QOS_CHANNELS		4
 27#define AIROHA_NUM_QOS_QUEUES		8
 28#define AIROHA_NUM_TX_RING		32
 29#define AIROHA_NUM_RX_RING		32
 30#define AIROHA_NUM_NETDEV_TX_RINGS	(AIROHA_NUM_TX_RING + \
 31					 AIROHA_NUM_QOS_CHANNELS)
 32#define AIROHA_FE_MC_MAX_VLAN_TABLE	64
 33#define AIROHA_FE_MC_MAX_VLAN_PORT	16
 34#define AIROHA_NUM_TX_IRQ		2
 35#define HW_DSCP_NUM			2048
 36#define IRQ_QUEUE_LEN(_n)		((_n) ? 1024 : 2048)
 37#define TX_DSCP_NUM			1024
 38#define RX_DSCP_NUM(_n)			\
 39	((_n) ==  2 ? 128 :		\
 40	 (_n) == 11 ? 128 :		\
 41	 (_n) == 15 ? 128 :		\
 42	 (_n) ==  0 ? 1024 : 16)
 43
 44#define PSE_RSV_PAGES			128
 45#define PSE_QUEUE_RSV_PAGES		64
 46
 47#define QDMA_METER_IDX(_n)		((_n) & 0xff)
 48#define QDMA_METER_GROUP(_n)		(((_n) >> 8) & 0x3)
 49
 50#define PPE_SRAM_NUM_ENTRIES		(8 * 1024)
 51#define PPE_STATS_NUM_ENTRIES		(4 * 1024)
 52#define PPE_DRAM_NUM_ENTRIES		(16 * 1024)
 53#define PPE_ENTRY_SIZE			80
 54#define PPE_RAM_NUM_ENTRIES_SHIFT(_n)	(__ffs((_n) >> 10))
 55
 56#define MTK_HDR_LEN			4
 57#define MTK_HDR_XMIT_TAGGED_TPID_8100	1
 58#define MTK_HDR_XMIT_TAGGED_TPID_88A8	2
 59
 60enum {
 61	QDMA_INT_REG_IDX0,
 62	QDMA_INT_REG_IDX1,
 63	QDMA_INT_REG_IDX2,
 64	QDMA_INT_REG_IDX3,
 65	QDMA_INT_REG_IDX4,
 66	QDMA_INT_REG_MAX
 67};
 68
 69enum {
 70	HSGMII_LAN_7581_PCIE0_SRCPORT	= 0x16,
 71	HSGMII_LAN_7581_PCIE1_SRCPORT,
 72	HSGMII_LAN_7581_ETH_SRCPORT,
 73	HSGMII_LAN_7581_USB_SRCPORT,
 74};
 75
 76enum {
 77	HSGMII_LAN_7583_ETH_SRCPORT	= 0x16,
 78	HSGMII_LAN_7583_PCIE_SRCPORT	= 0x18,
 79	HSGMII_LAN_7583_USB_SRCPORT,
 80};
 81
 82enum {
 83	XSI_PCIE0_VIP_PORT_MASK	= BIT(22),
 84	XSI_PCIE1_VIP_PORT_MASK	= BIT(23),
 85	XSI_USB_VIP_PORT_MASK	= BIT(25),
 86	XSI_ETH_VIP_PORT_MASK	= BIT(24),
 87};
 88
 89enum {
 90	DEV_STATE_INITIALIZED,
 91};
 92
 93enum {
 94	CDM_CRSN_QSEL_Q1 = 1,
 95	CDM_CRSN_QSEL_Q5 = 5,
 96	CDM_CRSN_QSEL_Q6 = 6,
 97	CDM_CRSN_QSEL_Q15 = 15,
 98};
 99
100enum {
101	CRSN_08 = 0x8,
102	CRSN_21 = 0x15, /* KA */
103	CRSN_22 = 0x16, /* hit bind and force route to CPU */
104	CRSN_24 = 0x18,
105	CRSN_25 = 0x19,
106};
107
108enum airoha_gdm_index {
109	AIROHA_GDM1_IDX = 1,
110	AIROHA_GDM2_IDX = 2,
111	AIROHA_GDM3_IDX = 3,
112	AIROHA_GDM4_IDX = 4,
113};
114
115enum {
116	FE_PSE_PORT_CDM1,
117	FE_PSE_PORT_GDM1,
118	FE_PSE_PORT_GDM2,
119	FE_PSE_PORT_GDM3,
120	FE_PSE_PORT_PPE1,
121	FE_PSE_PORT_CDM2,
122	FE_PSE_PORT_CDM3,
123	FE_PSE_PORT_CDM4,
124	FE_PSE_PORT_PPE2,
125	FE_PSE_PORT_GDM4,
126	FE_PSE_PORT_CDM5,
127	FE_PSE_PORT_DROP = 0xf,
128};
129
130enum tx_sched_mode {
131	TC_SCH_WRR8,
132	TC_SCH_SP,
133	TC_SCH_WRR7,
134	TC_SCH_WRR6,
135	TC_SCH_WRR5,
136	TC_SCH_WRR4,
137	TC_SCH_WRR3,
138	TC_SCH_WRR2,
139};
140
141enum trtcm_unit_type {
142	TRTCM_BYTE_UNIT,
143	TRTCM_PACKET_UNIT,
144};
145
146enum trtcm_param_type {
147	TRTCM_MISC_MODE, /* meter_en, pps_mode, tick_sel */
148	TRTCM_TOKEN_RATE_MODE,
149	TRTCM_BUCKETSIZE_SHIFT_MODE,
150	TRTCM_BUCKET_COUNTER_MODE,
151};
152
153enum trtcm_mode_type {
154	TRTCM_COMMIT_MODE,
155	TRTCM_PEAK_MODE,
156};
157
158enum trtcm_param {
159	TRTCM_TICK_SEL = BIT(0),
160	TRTCM_PKT_MODE = BIT(1),
161	TRTCM_METER_MODE = BIT(2),
162};
163
164#define MIN_TOKEN_SIZE				4096
165#define MAX_TOKEN_SIZE_OFFSET			17
166#define TRTCM_TOKEN_RATE_MASK			GENMASK(23, 6)
167#define TRTCM_TOKEN_RATE_FRACTION_MASK		GENMASK(5, 0)
168
169struct airoha_queue_entry {
170	union {
171		void *buf;
172		struct {
173			struct list_head list;
174			struct sk_buff *skb;
175		};
176	};
177	dma_addr_t dma_addr;
178	u16 dma_len;
179};
180
181struct airoha_queue {
182	struct airoha_qdma *qdma;
183
184	/* protect concurrent queue accesses */
185	spinlock_t lock;
186	struct airoha_queue_entry *entry;
187	struct airoha_qdma_desc *desc;
188	u16 head;
189	u16 tail;
190
191	int queued;
192	int ndesc;
193	int free_thr;
194	int buf_size;
195
196	struct napi_struct napi;
197	struct page_pool *page_pool;
198	struct sk_buff *skb;
199
200	struct list_head tx_list;
201};
202
203struct airoha_tx_irq_queue {
204	struct airoha_qdma *qdma;
205
206	struct napi_struct napi;
207
208	int size;
209	u32 *q;
210};
211
212struct airoha_hw_stats {
213	/* protect concurrent hw_stats accesses */
214	spinlock_t lock;
215	struct u64_stats_sync syncp;
216
217	/* get_stats64 */
218	u64 rx_ok_pkts;
219	u64 tx_ok_pkts;
220	u64 rx_ok_bytes;
221	u64 tx_ok_bytes;
222	u64 rx_multicast;
223	u64 rx_errors;
224	u64 rx_drops;
225	u64 tx_drops;
226	u64 rx_crc_error;
227	u64 rx_over_errors;
228	/* ethtool stats */
229	u64 tx_broadcast;
230	u64 tx_multicast;
231	u64 tx_len[7];
232	u64 rx_broadcast;
233	u64 rx_fragment;
234	u64 rx_jabber;
235	u64 rx_len[7];
236};
237
238enum {
239	AIROHA_FOE_STATE_INVALID,
240	AIROHA_FOE_STATE_UNBIND,
241	AIROHA_FOE_STATE_BIND,
242	AIROHA_FOE_STATE_FIN
243};
244
245enum {
246	PPE_PKT_TYPE_IPV4_HNAPT = 0,
247	PPE_PKT_TYPE_IPV4_ROUTE = 1,
248	PPE_PKT_TYPE_BRIDGE = 2,
249	PPE_PKT_TYPE_IPV4_DSLITE = 3,
250	PPE_PKT_TYPE_IPV6_ROUTE_3T = 4,
251	PPE_PKT_TYPE_IPV6_ROUTE_5T = 5,
252	PPE_PKT_TYPE_IPV6_6RD = 7,
253};
254
255#define AIROHA_FOE_MAC_SMAC_ID		GENMASK(20, 16)
256#define AIROHA_FOE_MAC_PPPOE_ID		GENMASK(15, 0)
257
258#define AIROHA_FOE_MAC_WDMA_QOS		GENMASK(15, 12)
259#define AIROHA_FOE_MAC_WDMA_BAND	BIT(11)
260#define AIROHA_FOE_MAC_WDMA_WCID	GENMASK(10, 0)
261
262struct airoha_foe_mac_info_common {
263	u16 vlan1;
264	u16 etype;
265
266	u32 dest_mac_hi;
267
268	u16 vlan2;
269	u16 dest_mac_lo;
270
271	u32 src_mac_hi;
272};
273
274struct airoha_foe_mac_info {
275	struct airoha_foe_mac_info_common common;
276
277	u16 pppoe_id;
278	u16 src_mac_lo;
279
280	u32 meter;
281};
282
283#define AIROHA_FOE_IB1_UNBIND_PREBIND		BIT(24)
284#define AIROHA_FOE_IB1_UNBIND_PACKETS		GENMASK(23, 8)
285#define AIROHA_FOE_IB1_UNBIND_TIMESTAMP		GENMASK(7, 0)
286
287#define AIROHA_FOE_IB1_BIND_STATIC		BIT(31)
288#define AIROHA_FOE_IB1_BIND_UDP			BIT(30)
289#define AIROHA_FOE_IB1_BIND_STATE		GENMASK(29, 28)
290#define AIROHA_FOE_IB1_BIND_PACKET_TYPE		GENMASK(27, 25)
291#define AIROHA_FOE_IB1_BIND_TTL			BIT(24)
292#define AIROHA_FOE_IB1_BIND_TUNNEL_DECAP	BIT(23)
293#define AIROHA_FOE_IB1_BIND_PPPOE		BIT(22)
294#define AIROHA_FOE_IB1_BIND_VPM			GENMASK(21, 20)
295#define AIROHA_FOE_IB1_BIND_VLAN_LAYER		GENMASK(19, 16)
296#define AIROHA_FOE_IB1_BIND_KEEPALIVE		BIT(15)
297#define AIROHA_FOE_IB1_BIND_TIMESTAMP		GENMASK(14, 0)
298
299#define AIROHA_FOE_IB2_DSCP			GENMASK(31, 24)
300#define AIROHA_FOE_IB2_PORT_AG			GENMASK(23, 13)
301#define AIROHA_FOE_IB2_PCP			BIT(12)
302#define AIROHA_FOE_IB2_MULTICAST		BIT(11)
303#define AIROHA_FOE_IB2_FAST_PATH		BIT(10)
304#define AIROHA_FOE_IB2_PSE_QOS			BIT(9)
305#define AIROHA_FOE_IB2_PSE_PORT			GENMASK(8, 5)
306#define AIROHA_FOE_IB2_NBQ			GENMASK(4, 0)
307
308#define AIROHA_FOE_ACTDP			GENMASK(31, 24)
309#define AIROHA_FOE_SHAPER_ID			GENMASK(23, 16)
310#define AIROHA_FOE_CHANNEL			GENMASK(15, 11)
311#define AIROHA_FOE_QID				GENMASK(10, 8)
312#define AIROHA_FOE_DPI				BIT(7)
313#define AIROHA_FOE_TUNNEL			BIT(6)
314#define AIROHA_FOE_TUNNEL_ID			GENMASK(5, 0)
315
316#define AIROHA_FOE_TUNNEL_MTU			GENMASK(31, 16)
317#define AIROHA_FOE_ACNT_GRP3			GENMASK(15, 9)
318#define AIROHA_FOE_METER_GRP3			GENMASK(8, 5)
319#define AIROHA_FOE_METER_GRP2			GENMASK(4, 0)
320
321struct airoha_foe_bridge {
322	u32 dest_mac_hi;
323
324	u16 src_mac_hi;
325	u16 dest_mac_lo;
326
327	u32 src_mac_lo;
328
329	u32 ib2;
330
331	u32 rsv[5];
332
333	u32 data;
334
335	struct airoha_foe_mac_info l2;
336};
337
338struct airoha_foe_ipv4_tuple {
339	u32 src_ip;
340	u32 dest_ip;
341	union {
342		struct {
343			u16 dest_port;
344			u16 src_port;
345		};
346		struct {
347			u8 protocol;
348			u8 _pad[3]; /* fill with 0xa5a5a5 */
349		};
350		u32 ports;
351	};
352};
353
354struct airoha_foe_ipv4 {
355	struct airoha_foe_ipv4_tuple orig_tuple;
356
357	u32 ib2;
358
359	struct airoha_foe_ipv4_tuple new_tuple;
360
361	u32 rsv[2];
362
363	u32 data;
364
365	struct airoha_foe_mac_info l2;
366};
367
368struct airoha_foe_ipv4_dslite {
369	struct airoha_foe_ipv4_tuple ip4;
370
371	u32 ib2;
372
373	u8 flow_label[3];
374	u8 priority;
375
376	u32 rsv[4];
377
378	u32 data;
379
380	struct airoha_foe_mac_info l2;
381};
382
383struct airoha_foe_ipv6 {
384	u32 src_ip[4];
385	u32 dest_ip[4];
386
387	union {
388		struct {
389			u16 dest_port;
390			u16 src_port;
391		};
392		struct {
393			u8 protocol;
394			u8 pad[3];
395		};
396		u32 ports;
397	};
398
399	u32 data;
400
401	u32 ib2;
402
403	struct airoha_foe_mac_info_common l2;
404
405	u32 meter;
406};
407
408struct airoha_foe_entry {
409	union {
410		struct {
411			u32 ib1;
412			union {
413				struct airoha_foe_bridge bridge;
414				struct airoha_foe_ipv4 ipv4;
415				struct airoha_foe_ipv4_dslite dslite;
416				struct airoha_foe_ipv6 ipv6;
417				DECLARE_FLEX_ARRAY(u32, d);
418			};
419		};
420		u8 data[PPE_ENTRY_SIZE];
421	};
422};
423
424struct airoha_foe_stats {
425	u32 bytes;
426	u32 packets;
427};
428
429struct airoha_foe_stats64 {
430	u64 bytes;
431	u64 packets;
432};
433
434struct airoha_flow_data {
435	struct ethhdr eth;
436
437	union {
438		struct {
439			__be32 src_addr;
440			__be32 dst_addr;
441		} v4;
442
443		struct {
444			struct in6_addr src_addr;
445			struct in6_addr dst_addr;
446		} v6;
447	};
448
449	__be16 src_port;
450	__be16 dst_port;
451
452	struct {
453		struct {
454			u16 id;
455			__be16 proto;
456		} hdr[2];
457		u8 num;
458	} vlan;
459	struct {
460		u16 sid;
461		u8 num;
462	} pppoe;
463};
464
465enum airoha_flow_entry_type {
466	FLOW_TYPE_L4,
467	FLOW_TYPE_L2,
468	FLOW_TYPE_L2_SUBFLOW,
469};
470
471struct airoha_flow_table_entry {
472	union {
473		struct hlist_node list; /* PPE L3 flow entry */
474		struct {
475			struct rhash_head l2_node;  /* L2 flow entry */
476			struct hlist_head l2_flows; /* PPE L2 subflows list */
477		};
478	};
479
480	struct hlist_node l2_subflow_node; /* PPE L2 subflow entry */
481	u32 hash;
482
483	struct airoha_foe_stats64 stats;
484	enum airoha_flow_entry_type type;
485
486	struct rhash_head node;
487	unsigned long cookie;
488
489	/* Must be last --ends in a flexible-array member. */
490	struct airoha_foe_entry data;
491};
492
493struct airoha_wdma_info {
494	u8 idx;
495	u8 queue;
496	u16 wcid;
497	u8 bss;
498};
499
500/* RX queue to IRQ mapping: BIT(q) in IRQ(n) */
501#define RX_IRQ0_BANK_PIN_MASK			0x839f
502#define RX_IRQ1_BANK_PIN_MASK			0x7fe00000
503#define RX_IRQ2_BANK_PIN_MASK			0x20
504#define RX_IRQ3_BANK_PIN_MASK			0x40
505#define RX_IRQ_BANK_PIN_MASK(_n)		\
506	(((_n) == 3) ? RX_IRQ3_BANK_PIN_MASK :	\
507	 ((_n) == 2) ? RX_IRQ2_BANK_PIN_MASK :	\
508	 ((_n) == 1) ? RX_IRQ1_BANK_PIN_MASK :	\
509	 RX_IRQ0_BANK_PIN_MASK)
510
511struct airoha_irq_bank {
512	struct airoha_qdma *qdma;
513
514	/* protect concurrent irqmask accesses */
515	spinlock_t irq_lock;
516	u32 irqmask[QDMA_INT_REG_MAX];
517	int irq;
518};
519
520struct airoha_qdma {
521	struct airoha_eth *eth;
522	void __iomem *regs;
523
524	atomic_t users;
525
526	struct airoha_irq_bank irq_banks[AIROHA_MAX_NUM_IRQ_BANKS];
527
528	struct airoha_tx_irq_queue q_tx_irq[AIROHA_NUM_TX_IRQ];
529
530	struct airoha_queue q_tx[AIROHA_NUM_TX_RING];
531	struct airoha_queue q_rx[AIROHA_NUM_RX_RING];
532};
533
534struct airoha_gdm_port {
535	struct airoha_qdma *qdma;
536	struct net_device *dev;
537	int id;
538
539	struct airoha_hw_stats stats;
540
541	DECLARE_BITMAP(qos_sq_bmap, AIROHA_NUM_QOS_CHANNELS);
542
543	/* qos stats counters */
544	u64 cpu_tx_packets;
545	u64 fwd_tx_packets;
546
547	struct metadata_dst *dsa_meta[AIROHA_MAX_DSA_PORTS];
548};
549
550#define AIROHA_RXD4_PPE_CPU_REASON	GENMASK(20, 16)
551#define AIROHA_RXD4_FOE_ENTRY		GENMASK(15, 0)
552
553struct airoha_ppe {
554	struct airoha_ppe_dev dev;
555	struct airoha_eth *eth;
556
557	void *foe;
558	dma_addr_t foe_dma;
559
560	struct rhashtable l2_flows;
561
562	struct hlist_head *foe_flow;
563	u16 *foe_check_time;
564
565	struct airoha_foe_stats *foe_stats;
566	dma_addr_t foe_stats_dma;
567
568	struct dentry *debugfs_dir;
569};
570
571struct airoha_eth_soc_data {
572	u16 version;
573	const char * const *xsi_rsts_names;
574	int num_xsi_rsts;
575	int num_ppe;
576	struct {
577		int (*get_src_port_id)(struct airoha_gdm_port *port, int nbq);
578	} ops;
579};
580
581struct airoha_eth {
582	struct device *dev;
583
584	const struct airoha_eth_soc_data *soc;
585
586	unsigned long state;
587	void __iomem *fe_regs;
588
589	struct airoha_npu __rcu *npu;
590
591	struct airoha_ppe *ppe;
592	struct rhashtable flow_table;
593
594	struct reset_control_bulk_data rsts[AIROHA_MAX_NUM_RSTS];
595	struct reset_control_bulk_data *xsi_rsts;
596
597	struct net_device *napi_dev;
598
599	struct airoha_qdma qdma[AIROHA_MAX_NUM_QDMA];
600	struct airoha_gdm_port *ports[AIROHA_MAX_NUM_GDM_PORTS];
601};
602
603u32 airoha_rr(void __iomem *base, u32 offset);
604void airoha_wr(void __iomem *base, u32 offset, u32 val);
605u32 airoha_rmw(void __iomem *base, u32 offset, u32 mask, u32 val);
606
607#define airoha_fe_rr(eth, offset)				\
608	airoha_rr((eth)->fe_regs, (offset))
609#define airoha_fe_wr(eth, offset, val)				\
610	airoha_wr((eth)->fe_regs, (offset), (val))
611#define airoha_fe_rmw(eth, offset, mask, val)			\
612	airoha_rmw((eth)->fe_regs, (offset), (mask), (val))
613#define airoha_fe_set(eth, offset, val)				\
614	airoha_rmw((eth)->fe_regs, (offset), 0, (val))
615#define airoha_fe_clear(eth, offset, val)			\
616	airoha_rmw((eth)->fe_regs, (offset), (val), 0)
617
618#define airoha_qdma_rr(qdma, offset)				\
619	airoha_rr((qdma)->regs, (offset))
620#define airoha_qdma_wr(qdma, offset, val)			\
621	airoha_wr((qdma)->regs, (offset), (val))
622#define airoha_qdma_rmw(qdma, offset, mask, val)		\
623	airoha_rmw((qdma)->regs, (offset), (mask), (val))
624#define airoha_qdma_set(qdma, offset, val)			\
625	airoha_rmw((qdma)->regs, (offset), 0, (val))
626#define airoha_qdma_clear(qdma, offset, val)			\
627	airoha_rmw((qdma)->regs, (offset), (val), 0)
628
629static inline bool airhoa_is_lan_gdm_port(struct airoha_gdm_port *port)
630{
631	/* GDM1 port on EN7581 SoC is connected to the lan dsa switch.
632	 * GDM{2,3,4} can be used as wan port connected to an external
633	 * phy module.
634	 */
635	return port->id == 1;
636}
637
638static inline bool airoha_is_7581(struct airoha_eth *eth)
639{
640	return eth->soc->version == 0x7581;
641}
642
643static inline bool airoha_is_7583(struct airoha_eth *eth)
644{
645	return eth->soc->version == 0x7583;
646}
647
648bool airoha_is_valid_gdm_port(struct airoha_eth *eth,
649			      struct airoha_gdm_port *port);
650
651bool airoha_ppe_is_enabled(struct airoha_eth *eth, int index);
652void airoha_ppe_check_skb(struct airoha_ppe_dev *dev, struct sk_buff *skb,
653			  u16 hash, bool rx_wlan);
654int airoha_ppe_setup_tc_block_cb(struct airoha_ppe_dev *dev, void *type_data);
655int airoha_ppe_init(struct airoha_eth *eth);
656void airoha_ppe_deinit(struct airoha_eth *eth);
657void airoha_ppe_init_upd_mem(struct airoha_gdm_port *port);
658u32 airoha_ppe_get_total_num_entries(struct airoha_ppe *ppe);
659struct airoha_foe_entry *airoha_ppe_foe_get_entry(struct airoha_ppe *ppe,
660						  u32 hash);
661void airoha_ppe_foe_entry_get_stats(struct airoha_ppe *ppe, u32 hash,
662				    struct airoha_foe_stats64 *stats);
663
664#ifdef CONFIG_DEBUG_FS
665int airoha_ppe_debugfs_init(struct airoha_ppe *ppe);
666#else
667static inline int airoha_ppe_debugfs_init(struct airoha_ppe *ppe)
668{
669	return 0;
670}
671#endif
672
673#endif /* AIROHA_ETH_H */
~/ Read-only file preview.