162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci
362306a36Sopenharmony_ci#ifndef __LAN966X_MAIN_H__
462306a36Sopenharmony_ci#define __LAN966X_MAIN_H__
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#include <linux/debugfs.h>
762306a36Sopenharmony_ci#include <linux/etherdevice.h>
862306a36Sopenharmony_ci#include <linux/if_vlan.h>
962306a36Sopenharmony_ci#include <linux/jiffies.h>
1062306a36Sopenharmony_ci#include <linux/phy.h>
1162306a36Sopenharmony_ci#include <linux/phylink.h>
1262306a36Sopenharmony_ci#include <linux/ptp_clock_kernel.h>
1362306a36Sopenharmony_ci#include <net/page_pool/types.h>
1462306a36Sopenharmony_ci#include <net/pkt_cls.h>
1562306a36Sopenharmony_ci#include <net/pkt_sched.h>
1662306a36Sopenharmony_ci#include <net/switchdev.h>
1762306a36Sopenharmony_ci#include <net/xdp.h>
1862306a36Sopenharmony_ci
1962306a36Sopenharmony_ci#include <vcap_api.h>
2062306a36Sopenharmony_ci#include <vcap_api_client.h>
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_ci#include "lan966x_regs.h"
2362306a36Sopenharmony_ci#include "lan966x_ifh.h"
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci#define TABLE_UPDATE_SLEEP_US		10
2662306a36Sopenharmony_ci#define TABLE_UPDATE_TIMEOUT_US		100000
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci#define READL_SLEEP_US			10
2962306a36Sopenharmony_ci#define READL_TIMEOUT_US		100000000
3062306a36Sopenharmony_ci
3162306a36Sopenharmony_ci#define LAN966X_BUFFER_CELL_SZ		64
3262306a36Sopenharmony_ci#define LAN966X_BUFFER_MEMORY		(160 * 1024)
3362306a36Sopenharmony_ci#define LAN966X_BUFFER_MIN_SZ		60
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci#define LAN966X_HW_MTU(mtu)		((mtu) + ETH_HLEN + ETH_FCS_LEN)
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci#define PGID_AGGR			64
3862306a36Sopenharmony_ci#define PGID_SRC			80
3962306a36Sopenharmony_ci#define PGID_ENTRIES			89
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define UNAWARE_PVID			0
4262306a36Sopenharmony_ci#define HOST_PVID			4095
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_ci/* Reserved amount for (SRC, PRIO) at index 8*SRC + PRIO */
4562306a36Sopenharmony_ci#define QSYS_Q_RSRV			95
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_ci#define NUM_PHYS_PORTS			8
4862306a36Sopenharmony_ci#define CPU_PORT			8
4962306a36Sopenharmony_ci#define NUM_PRIO_QUEUES			8
5062306a36Sopenharmony_ci
5162306a36Sopenharmony_ci/* Reserved PGIDs */
5262306a36Sopenharmony_ci#define PGID_CPU			(PGID_AGGR - 6)
5362306a36Sopenharmony_ci#define PGID_UC				(PGID_AGGR - 5)
5462306a36Sopenharmony_ci#define PGID_BC				(PGID_AGGR - 4)
5562306a36Sopenharmony_ci#define PGID_MC				(PGID_AGGR - 3)
5662306a36Sopenharmony_ci#define PGID_MCIPV4			(PGID_AGGR - 2)
5762306a36Sopenharmony_ci#define PGID_MCIPV6			(PGID_AGGR - 1)
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci/* Non-reserved PGIDs, used for general purpose */
6062306a36Sopenharmony_ci#define PGID_GP_START			(CPU_PORT + 1)
6162306a36Sopenharmony_ci#define PGID_GP_END			PGID_CPU
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci#define LAN966X_SPEED_NONE		0
6462306a36Sopenharmony_ci#define LAN966X_SPEED_2500		1
6562306a36Sopenharmony_ci#define LAN966X_SPEED_1000		1
6662306a36Sopenharmony_ci#define LAN966X_SPEED_100		2
6762306a36Sopenharmony_ci#define LAN966X_SPEED_10		3
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci#define LAN966X_PHC_COUNT		3
7062306a36Sopenharmony_ci#define LAN966X_PHC_PORT		0
7162306a36Sopenharmony_ci#define LAN966X_PHC_PINS_NUM		7
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_ci#define IFH_REW_OP_NOOP			0x0
7462306a36Sopenharmony_ci#define IFH_REW_OP_ONE_STEP_PTP		0x3
7562306a36Sopenharmony_ci#define IFH_REW_OP_TWO_STEP_PTP		0x4
7662306a36Sopenharmony_ci
7762306a36Sopenharmony_ci#define FDMA_RX_DCB_MAX_DBS		1
7862306a36Sopenharmony_ci#define FDMA_TX_DCB_MAX_DBS		1
7962306a36Sopenharmony_ci#define FDMA_DCB_INFO_DATAL(x)		((x) & GENMASK(15, 0))
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci#define FDMA_DCB_STATUS_BLOCKL(x)	((x) & GENMASK(15, 0))
8262306a36Sopenharmony_ci#define FDMA_DCB_STATUS_SOF		BIT(16)
8362306a36Sopenharmony_ci#define FDMA_DCB_STATUS_EOF		BIT(17)
8462306a36Sopenharmony_ci#define FDMA_DCB_STATUS_INTR		BIT(18)
8562306a36Sopenharmony_ci#define FDMA_DCB_STATUS_DONE		BIT(19)
8662306a36Sopenharmony_ci#define FDMA_DCB_STATUS_BLOCKO(x)	(((x) << 20) & GENMASK(31, 20))
8762306a36Sopenharmony_ci#define FDMA_DCB_INVALID_DATA		0x1
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci#define FDMA_XTR_CHANNEL		6
9062306a36Sopenharmony_ci#define FDMA_INJ_CHANNEL		0
9162306a36Sopenharmony_ci#define FDMA_DCB_MAX			512
9262306a36Sopenharmony_ci
9362306a36Sopenharmony_ci#define SE_IDX_QUEUE			0  /* 0-79 : Queue scheduler elements */
9462306a36Sopenharmony_ci#define SE_IDX_PORT			80 /* 80-89 : Port schedular elements */
9562306a36Sopenharmony_ci
9662306a36Sopenharmony_ci#define LAN966X_VCAP_CID_IS1_L0 VCAP_CID_INGRESS_L0 /* IS1 lookup 0 */
9762306a36Sopenharmony_ci#define LAN966X_VCAP_CID_IS1_L1 VCAP_CID_INGRESS_L1 /* IS1 lookup 1 */
9862306a36Sopenharmony_ci#define LAN966X_VCAP_CID_IS1_L2 VCAP_CID_INGRESS_L2 /* IS1 lookup 2 */
9962306a36Sopenharmony_ci#define LAN966X_VCAP_CID_IS1_MAX (VCAP_CID_INGRESS_L3 - 1) /* IS1 Max */
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci#define LAN966X_VCAP_CID_IS2_L0 VCAP_CID_INGRESS_STAGE2_L0 /* IS2 lookup 0 */
10262306a36Sopenharmony_ci#define LAN966X_VCAP_CID_IS2_L1 VCAP_CID_INGRESS_STAGE2_L1 /* IS2 lookup 1 */
10362306a36Sopenharmony_ci#define LAN966X_VCAP_CID_IS2_MAX (VCAP_CID_INGRESS_STAGE2_L2 - 1) /* IS2 Max */
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_ci#define LAN966X_VCAP_CID_ES0_L0 VCAP_CID_EGRESS_L0 /* ES0 lookup 0 */
10662306a36Sopenharmony_ci#define LAN966X_VCAP_CID_ES0_MAX (VCAP_CID_EGRESS_L1 - 1) /* ES0 Max */
10762306a36Sopenharmony_ci
10862306a36Sopenharmony_ci#define LAN966X_PORT_QOS_PCP_COUNT	8
10962306a36Sopenharmony_ci#define LAN966X_PORT_QOS_DEI_COUNT	8
11062306a36Sopenharmony_ci#define LAN966X_PORT_QOS_PCP_DEI_COUNT \
11162306a36Sopenharmony_ci	(LAN966X_PORT_QOS_PCP_COUNT + LAN966X_PORT_QOS_DEI_COUNT)
11262306a36Sopenharmony_ci
11362306a36Sopenharmony_ci#define LAN966X_PORT_QOS_DSCP_COUNT	64
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci/* Port PCP rewrite mode */
11662306a36Sopenharmony_ci#define LAN966X_PORT_REW_TAG_CTRL_CLASSIFIED	0
11762306a36Sopenharmony_ci#define LAN966X_PORT_REW_TAG_CTRL_MAPPED	2
11862306a36Sopenharmony_ci
11962306a36Sopenharmony_ci/* Port DSCP rewrite mode */
12062306a36Sopenharmony_ci#define LAN966X_PORT_REW_DSCP_FRAME		0
12162306a36Sopenharmony_ci#define LAN966X_PORT_REW_DSCP_ANALIZER		1
12262306a36Sopenharmony_ci#define LAN966X_PORT_QOS_REWR_DSCP_ALL		3
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci/* MAC table entry types.
12562306a36Sopenharmony_ci * ENTRYTYPE_NORMAL is subject to aging.
12662306a36Sopenharmony_ci * ENTRYTYPE_LOCKED is not subject to aging.
12762306a36Sopenharmony_ci * ENTRYTYPE_MACv4 is not subject to aging. For IPv4 multicast.
12862306a36Sopenharmony_ci * ENTRYTYPE_MACv6 is not subject to aging. For IPv6 multicast.
12962306a36Sopenharmony_ci */
13062306a36Sopenharmony_cienum macaccess_entry_type {
13162306a36Sopenharmony_ci	ENTRYTYPE_NORMAL = 0,
13262306a36Sopenharmony_ci	ENTRYTYPE_LOCKED,
13362306a36Sopenharmony_ci	ENTRYTYPE_MACV4,
13462306a36Sopenharmony_ci	ENTRYTYPE_MACV6,
13562306a36Sopenharmony_ci};
13662306a36Sopenharmony_ci
13762306a36Sopenharmony_ci/* FDMA return action codes for checking if the frame is valid
13862306a36Sopenharmony_ci * FDMA_PASS, frame is valid and can be used
13962306a36Sopenharmony_ci * FDMA_ERROR, something went wrong, stop getting more frames
14062306a36Sopenharmony_ci * FDMA_DROP, frame is dropped, but continue to get more frames
14162306a36Sopenharmony_ci * FDMA_TX, frame is given to TX, but continue to get more frames
14262306a36Sopenharmony_ci * FDMA_REDIRECT, frame is given to TX, but continue to get more frames
14362306a36Sopenharmony_ci */
14462306a36Sopenharmony_cienum lan966x_fdma_action {
14562306a36Sopenharmony_ci	FDMA_PASS = 0,
14662306a36Sopenharmony_ci	FDMA_ERROR,
14762306a36Sopenharmony_ci	FDMA_DROP,
14862306a36Sopenharmony_ci	FDMA_TX,
14962306a36Sopenharmony_ci	FDMA_REDIRECT,
15062306a36Sopenharmony_ci};
15162306a36Sopenharmony_ci
15262306a36Sopenharmony_ci/* Controls how PORT_MASK is applied */
15362306a36Sopenharmony_cienum LAN966X_PORT_MASK_MODE {
15462306a36Sopenharmony_ci	LAN966X_PMM_NO_ACTION,
15562306a36Sopenharmony_ci	LAN966X_PMM_REPLACE,
15662306a36Sopenharmony_ci	LAN966X_PMM_FORWARDING,
15762306a36Sopenharmony_ci	LAN966X_PMM_REDIRECT,
15862306a36Sopenharmony_ci};
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cienum vcap_is2_port_sel_ipv6 {
16162306a36Sopenharmony_ci	VCAP_IS2_PS_IPV6_TCPUDP_OTHER,
16262306a36Sopenharmony_ci	VCAP_IS2_PS_IPV6_STD,
16362306a36Sopenharmony_ci	VCAP_IS2_PS_IPV6_IP4_TCPUDP_IP4_OTHER,
16462306a36Sopenharmony_ci	VCAP_IS2_PS_IPV6_MAC_ETYPE,
16562306a36Sopenharmony_ci};
16662306a36Sopenharmony_ci
16762306a36Sopenharmony_cienum vcap_is1_port_sel_other {
16862306a36Sopenharmony_ci	VCAP_IS1_PS_OTHER_NORMAL,
16962306a36Sopenharmony_ci	VCAP_IS1_PS_OTHER_7TUPLE,
17062306a36Sopenharmony_ci	VCAP_IS1_PS_OTHER_DBL_VID,
17162306a36Sopenharmony_ci	VCAP_IS1_PS_OTHER_DMAC_VID,
17262306a36Sopenharmony_ci};
17362306a36Sopenharmony_ci
17462306a36Sopenharmony_cienum vcap_is1_port_sel_ipv4 {
17562306a36Sopenharmony_ci	VCAP_IS1_PS_IPV4_NORMAL,
17662306a36Sopenharmony_ci	VCAP_IS1_PS_IPV4_7TUPLE,
17762306a36Sopenharmony_ci	VCAP_IS1_PS_IPV4_5TUPLE_IP4,
17862306a36Sopenharmony_ci	VCAP_IS1_PS_IPV4_DBL_VID,
17962306a36Sopenharmony_ci	VCAP_IS1_PS_IPV4_DMAC_VID,
18062306a36Sopenharmony_ci};
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_cienum vcap_is1_port_sel_ipv6 {
18362306a36Sopenharmony_ci	VCAP_IS1_PS_IPV6_NORMAL,
18462306a36Sopenharmony_ci	VCAP_IS1_PS_IPV6_7TUPLE,
18562306a36Sopenharmony_ci	VCAP_IS1_PS_IPV6_5TUPLE_IP4,
18662306a36Sopenharmony_ci	VCAP_IS1_PS_IPV6_NORMAL_IP6,
18762306a36Sopenharmony_ci	VCAP_IS1_PS_IPV6_5TUPLE_IP6,
18862306a36Sopenharmony_ci	VCAP_IS1_PS_IPV6_DBL_VID,
18962306a36Sopenharmony_ci	VCAP_IS1_PS_IPV6_DMAC_VID,
19062306a36Sopenharmony_ci};
19162306a36Sopenharmony_ci
19262306a36Sopenharmony_cienum vcap_is1_port_sel_rt {
19362306a36Sopenharmony_ci	VCAP_IS1_PS_RT_NORMAL,
19462306a36Sopenharmony_ci	VCAP_IS1_PS_RT_7TUPLE,
19562306a36Sopenharmony_ci	VCAP_IS1_PS_RT_DBL_VID,
19662306a36Sopenharmony_ci	VCAP_IS1_PS_RT_DMAC_VID,
19762306a36Sopenharmony_ci	VCAP_IS1_PS_RT_FOLLOW_OTHER = 7,
19862306a36Sopenharmony_ci};
19962306a36Sopenharmony_ci
20062306a36Sopenharmony_cistruct lan966x_port;
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cistruct lan966x_db {
20362306a36Sopenharmony_ci	u64 dataptr;
20462306a36Sopenharmony_ci	u64 status;
20562306a36Sopenharmony_ci};
20662306a36Sopenharmony_ci
20762306a36Sopenharmony_cistruct lan966x_rx_dcb {
20862306a36Sopenharmony_ci	u64 nextptr;
20962306a36Sopenharmony_ci	u64 info;
21062306a36Sopenharmony_ci	struct lan966x_db db[FDMA_RX_DCB_MAX_DBS];
21162306a36Sopenharmony_ci};
21262306a36Sopenharmony_ci
21362306a36Sopenharmony_cistruct lan966x_tx_dcb {
21462306a36Sopenharmony_ci	u64 nextptr;
21562306a36Sopenharmony_ci	u64 info;
21662306a36Sopenharmony_ci	struct lan966x_db db[FDMA_TX_DCB_MAX_DBS];
21762306a36Sopenharmony_ci};
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cistruct lan966x_rx {
22062306a36Sopenharmony_ci	struct lan966x *lan966x;
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_ci	/* Pointer to the array of hardware dcbs. */
22362306a36Sopenharmony_ci	struct lan966x_rx_dcb *dcbs;
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_ci	/* Pointer to the last address in the dcbs. */
22662306a36Sopenharmony_ci	struct lan966x_rx_dcb *last_entry;
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci	/* For each DB, there is a page */
22962306a36Sopenharmony_ci	struct page *page[FDMA_DCB_MAX][FDMA_RX_DCB_MAX_DBS];
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_ci	/* Represents the db_index, it can have a value between 0 and
23262306a36Sopenharmony_ci	 * FDMA_RX_DCB_MAX_DBS, once it reaches the value of FDMA_RX_DCB_MAX_DBS
23362306a36Sopenharmony_ci	 * it means that the DCB can be reused.
23462306a36Sopenharmony_ci	 */
23562306a36Sopenharmony_ci	int db_index;
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_ci	/* Represents the index in the dcbs. It has a value between 0 and
23862306a36Sopenharmony_ci	 * FDMA_DCB_MAX
23962306a36Sopenharmony_ci	 */
24062306a36Sopenharmony_ci	int dcb_index;
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci	/* Represents the dma address to the dcbs array */
24362306a36Sopenharmony_ci	dma_addr_t dma;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	/* Represents the page order that is used to allocate the pages for the
24662306a36Sopenharmony_ci	 * RX buffers. This value is calculated based on max MTU of the devices.
24762306a36Sopenharmony_ci	 */
24862306a36Sopenharmony_ci	u8 page_order;
24962306a36Sopenharmony_ci
25062306a36Sopenharmony_ci	/* Represents the max size frame that it can receive to the CPU. This
25162306a36Sopenharmony_ci	 * includes the IFH + VLAN tags + frame + skb_shared_info
25262306a36Sopenharmony_ci	 */
25362306a36Sopenharmony_ci	u32 max_mtu;
25462306a36Sopenharmony_ci
25562306a36Sopenharmony_ci	u8 channel_id;
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	struct page_pool *page_pool;
25862306a36Sopenharmony_ci};
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_cistruct lan966x_tx_dcb_buf {
26162306a36Sopenharmony_ci	dma_addr_t dma_addr;
26262306a36Sopenharmony_ci	struct net_device *dev;
26362306a36Sopenharmony_ci	union {
26462306a36Sopenharmony_ci		struct sk_buff *skb;
26562306a36Sopenharmony_ci		struct xdp_frame *xdpf;
26662306a36Sopenharmony_ci		struct page *page;
26762306a36Sopenharmony_ci	} data;
26862306a36Sopenharmony_ci	u32 len;
26962306a36Sopenharmony_ci	u32 used : 1;
27062306a36Sopenharmony_ci	u32 ptp : 1;
27162306a36Sopenharmony_ci	u32 use_skb : 1;
27262306a36Sopenharmony_ci	u32 xdp_ndo : 1;
27362306a36Sopenharmony_ci};
27462306a36Sopenharmony_ci
27562306a36Sopenharmony_cistruct lan966x_tx {
27662306a36Sopenharmony_ci	struct lan966x *lan966x;
27762306a36Sopenharmony_ci
27862306a36Sopenharmony_ci	/* Pointer to the dcb list */
27962306a36Sopenharmony_ci	struct lan966x_tx_dcb *dcbs;
28062306a36Sopenharmony_ci	u16 last_in_use;
28162306a36Sopenharmony_ci
28262306a36Sopenharmony_ci	/* Represents the DMA address to the first entry of the dcb entries. */
28362306a36Sopenharmony_ci	dma_addr_t dma;
28462306a36Sopenharmony_ci
28562306a36Sopenharmony_ci	/* Array of dcbs that are given to the HW */
28662306a36Sopenharmony_ci	struct lan966x_tx_dcb_buf *dcbs_buf;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	u8 channel_id;
28962306a36Sopenharmony_ci
29062306a36Sopenharmony_ci	bool activated;
29162306a36Sopenharmony_ci};
29262306a36Sopenharmony_ci
29362306a36Sopenharmony_cistruct lan966x_stat_layout {
29462306a36Sopenharmony_ci	u32 offset;
29562306a36Sopenharmony_ci	char name[ETH_GSTRING_LEN];
29662306a36Sopenharmony_ci};
29762306a36Sopenharmony_ci
29862306a36Sopenharmony_cistruct lan966x_phc {
29962306a36Sopenharmony_ci	struct ptp_clock *clock;
30062306a36Sopenharmony_ci	struct ptp_clock_info info;
30162306a36Sopenharmony_ci	struct ptp_pin_desc pins[LAN966X_PHC_PINS_NUM];
30262306a36Sopenharmony_ci	struct kernel_hwtstamp_config hwtstamp_config;
30362306a36Sopenharmony_ci	struct lan966x *lan966x;
30462306a36Sopenharmony_ci	u8 index;
30562306a36Sopenharmony_ci};
30662306a36Sopenharmony_ci
30762306a36Sopenharmony_cistruct lan966x_skb_cb {
30862306a36Sopenharmony_ci	u8 rew_op;
30962306a36Sopenharmony_ci	u16 ts_id;
31062306a36Sopenharmony_ci	unsigned long jiffies;
31162306a36Sopenharmony_ci};
31262306a36Sopenharmony_ci
31362306a36Sopenharmony_ci#define LAN966X_PTP_TIMEOUT		msecs_to_jiffies(10)
31462306a36Sopenharmony_ci#define LAN966X_SKB_CB(skb) \
31562306a36Sopenharmony_ci	((struct lan966x_skb_cb *)((skb)->cb))
31662306a36Sopenharmony_ci
31762306a36Sopenharmony_cistruct lan966x {
31862306a36Sopenharmony_ci	struct device *dev;
31962306a36Sopenharmony_ci
32062306a36Sopenharmony_ci	u8 num_phys_ports;
32162306a36Sopenharmony_ci	struct lan966x_port **ports;
32262306a36Sopenharmony_ci
32362306a36Sopenharmony_ci	void __iomem *regs[NUM_TARGETS];
32462306a36Sopenharmony_ci
32562306a36Sopenharmony_ci	int shared_queue_sz;
32662306a36Sopenharmony_ci
32762306a36Sopenharmony_ci	u8 base_mac[ETH_ALEN];
32862306a36Sopenharmony_ci
32962306a36Sopenharmony_ci	spinlock_t tx_lock; /* lock for frame transmition */
33062306a36Sopenharmony_ci
33162306a36Sopenharmony_ci	struct net_device *bridge;
33262306a36Sopenharmony_ci	u16 bridge_mask;
33362306a36Sopenharmony_ci	u16 bridge_fwd_mask;
33462306a36Sopenharmony_ci
33562306a36Sopenharmony_ci	struct list_head mac_entries;
33662306a36Sopenharmony_ci	spinlock_t mac_lock; /* lock for mac_entries list */
33762306a36Sopenharmony_ci
33862306a36Sopenharmony_ci	u16 vlan_mask[VLAN_N_VID];
33962306a36Sopenharmony_ci	DECLARE_BITMAP(cpu_vlan_mask, VLAN_N_VID);
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci	/* stats */
34262306a36Sopenharmony_ci	const struct lan966x_stat_layout *stats_layout;
34362306a36Sopenharmony_ci	u32 num_stats;
34462306a36Sopenharmony_ci
34562306a36Sopenharmony_ci	/* workqueue for reading stats */
34662306a36Sopenharmony_ci	struct mutex stats_lock;
34762306a36Sopenharmony_ci	u64 *stats;
34862306a36Sopenharmony_ci	struct delayed_work stats_work;
34962306a36Sopenharmony_ci	struct workqueue_struct *stats_queue;
35062306a36Sopenharmony_ci
35162306a36Sopenharmony_ci	/* interrupts */
35262306a36Sopenharmony_ci	int xtr_irq;
35362306a36Sopenharmony_ci	int ana_irq;
35462306a36Sopenharmony_ci	int ptp_irq;
35562306a36Sopenharmony_ci	int fdma_irq;
35662306a36Sopenharmony_ci	int ptp_ext_irq;
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci	/* worqueue for fdb */
35962306a36Sopenharmony_ci	struct workqueue_struct *fdb_work;
36062306a36Sopenharmony_ci	struct list_head fdb_entries;
36162306a36Sopenharmony_ci
36262306a36Sopenharmony_ci	/* mdb */
36362306a36Sopenharmony_ci	struct list_head mdb_entries;
36462306a36Sopenharmony_ci	struct list_head pgid_entries;
36562306a36Sopenharmony_ci
36662306a36Sopenharmony_ci	/* ptp */
36762306a36Sopenharmony_ci	bool ptp;
36862306a36Sopenharmony_ci	struct lan966x_phc phc[LAN966X_PHC_COUNT];
36962306a36Sopenharmony_ci	spinlock_t ptp_clock_lock; /* lock for phc */
37062306a36Sopenharmony_ci	spinlock_t ptp_ts_id_lock; /* lock for ts_id */
37162306a36Sopenharmony_ci	struct mutex ptp_lock; /* lock for ptp interface state */
37262306a36Sopenharmony_ci	u16 ptp_skbs;
37362306a36Sopenharmony_ci
37462306a36Sopenharmony_ci	/* fdma */
37562306a36Sopenharmony_ci	bool fdma;
37662306a36Sopenharmony_ci	struct net_device *fdma_ndev;
37762306a36Sopenharmony_ci	struct lan966x_rx rx;
37862306a36Sopenharmony_ci	struct lan966x_tx tx;
37962306a36Sopenharmony_ci	struct napi_struct napi;
38062306a36Sopenharmony_ci
38162306a36Sopenharmony_ci	/* Mirror */
38262306a36Sopenharmony_ci	struct lan966x_port *mirror_monitor;
38362306a36Sopenharmony_ci	u32 mirror_mask[2];
38462306a36Sopenharmony_ci	u32 mirror_count;
38562306a36Sopenharmony_ci
38662306a36Sopenharmony_ci	/* vcap */
38762306a36Sopenharmony_ci	struct vcap_control *vcap_ctrl;
38862306a36Sopenharmony_ci
38962306a36Sopenharmony_ci	/* debugfs */
39062306a36Sopenharmony_ci	struct dentry *debugfs_root;
39162306a36Sopenharmony_ci};
39262306a36Sopenharmony_ci
39362306a36Sopenharmony_cistruct lan966x_port_config {
39462306a36Sopenharmony_ci	phy_interface_t portmode;
39562306a36Sopenharmony_ci	const unsigned long *advertising;
39662306a36Sopenharmony_ci	int speed;
39762306a36Sopenharmony_ci	int duplex;
39862306a36Sopenharmony_ci	u32 pause;
39962306a36Sopenharmony_ci	bool inband;
40062306a36Sopenharmony_ci	bool autoneg;
40162306a36Sopenharmony_ci};
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_cistruct lan966x_port_tc {
40462306a36Sopenharmony_ci	bool ingress_shared_block;
40562306a36Sopenharmony_ci	unsigned long police_id;
40662306a36Sopenharmony_ci	unsigned long ingress_mirror_id;
40762306a36Sopenharmony_ci	unsigned long egress_mirror_id;
40862306a36Sopenharmony_ci	struct flow_stats police_stat;
40962306a36Sopenharmony_ci	struct flow_stats mirror_stat;
41062306a36Sopenharmony_ci};
41162306a36Sopenharmony_ci
41262306a36Sopenharmony_cistruct lan966x_port_qos_pcp {
41362306a36Sopenharmony_ci	u8 map[LAN966X_PORT_QOS_PCP_DEI_COUNT];
41462306a36Sopenharmony_ci	bool enable;
41562306a36Sopenharmony_ci};
41662306a36Sopenharmony_ci
41762306a36Sopenharmony_cistruct lan966x_port_qos_dscp {
41862306a36Sopenharmony_ci	u8 map[LAN966X_PORT_QOS_DSCP_COUNT];
41962306a36Sopenharmony_ci	bool enable;
42062306a36Sopenharmony_ci};
42162306a36Sopenharmony_ci
42262306a36Sopenharmony_cistruct lan966x_port_qos_pcp_rewr {
42362306a36Sopenharmony_ci	u16 map[NUM_PRIO_QUEUES];
42462306a36Sopenharmony_ci	bool enable;
42562306a36Sopenharmony_ci};
42662306a36Sopenharmony_ci
42762306a36Sopenharmony_cistruct lan966x_port_qos_dscp_rewr {
42862306a36Sopenharmony_ci	u16 map[LAN966X_PORT_QOS_DSCP_COUNT];
42962306a36Sopenharmony_ci	bool enable;
43062306a36Sopenharmony_ci};
43162306a36Sopenharmony_ci
43262306a36Sopenharmony_cistruct lan966x_port_qos {
43362306a36Sopenharmony_ci	struct lan966x_port_qos_pcp pcp;
43462306a36Sopenharmony_ci	struct lan966x_port_qos_dscp dscp;
43562306a36Sopenharmony_ci	struct lan966x_port_qos_pcp_rewr pcp_rewr;
43662306a36Sopenharmony_ci	struct lan966x_port_qos_dscp_rewr dscp_rewr;
43762306a36Sopenharmony_ci	u8 default_prio;
43862306a36Sopenharmony_ci};
43962306a36Sopenharmony_ci
44062306a36Sopenharmony_cistruct lan966x_port {
44162306a36Sopenharmony_ci	struct net_device *dev;
44262306a36Sopenharmony_ci	struct lan966x *lan966x;
44362306a36Sopenharmony_ci
44462306a36Sopenharmony_ci	u8 chip_port;
44562306a36Sopenharmony_ci	u16 pvid;
44662306a36Sopenharmony_ci	u16 vid;
44762306a36Sopenharmony_ci	bool vlan_aware;
44862306a36Sopenharmony_ci
44962306a36Sopenharmony_ci	bool learn_ena;
45062306a36Sopenharmony_ci	bool mcast_ena;
45162306a36Sopenharmony_ci
45262306a36Sopenharmony_ci	struct phylink_config phylink_config;
45362306a36Sopenharmony_ci	struct phylink_pcs phylink_pcs;
45462306a36Sopenharmony_ci	struct lan966x_port_config config;
45562306a36Sopenharmony_ci	struct phylink *phylink;
45662306a36Sopenharmony_ci	struct phy *serdes;
45762306a36Sopenharmony_ci	struct fwnode_handle *fwnode;
45862306a36Sopenharmony_ci
45962306a36Sopenharmony_ci	u8 ptp_tx_cmd;
46062306a36Sopenharmony_ci	bool ptp_rx_cmd;
46162306a36Sopenharmony_ci	u16 ts_id;
46262306a36Sopenharmony_ci	struct sk_buff_head tx_skbs;
46362306a36Sopenharmony_ci
46462306a36Sopenharmony_ci	struct net_device *bond;
46562306a36Sopenharmony_ci	bool lag_tx_active;
46662306a36Sopenharmony_ci	enum netdev_lag_hash hash_type;
46762306a36Sopenharmony_ci
46862306a36Sopenharmony_ci	struct lan966x_port_tc tc;
46962306a36Sopenharmony_ci
47062306a36Sopenharmony_ci	struct bpf_prog *xdp_prog;
47162306a36Sopenharmony_ci	struct xdp_rxq_info xdp_rxq;
47262306a36Sopenharmony_ci};
47362306a36Sopenharmony_ci
47462306a36Sopenharmony_ciextern const struct phylink_mac_ops lan966x_phylink_mac_ops;
47562306a36Sopenharmony_ciextern const struct phylink_pcs_ops lan966x_phylink_pcs_ops;
47662306a36Sopenharmony_ciextern const struct ethtool_ops lan966x_ethtool_ops;
47762306a36Sopenharmony_ciextern struct notifier_block lan966x_switchdev_nb __read_mostly;
47862306a36Sopenharmony_ciextern struct notifier_block lan966x_switchdev_blocking_nb __read_mostly;
47962306a36Sopenharmony_ci
48062306a36Sopenharmony_cibool lan966x_netdevice_check(const struct net_device *dev);
48162306a36Sopenharmony_ci
48262306a36Sopenharmony_civoid lan966x_register_notifier_blocks(void);
48362306a36Sopenharmony_civoid lan966x_unregister_notifier_blocks(void);
48462306a36Sopenharmony_ci
48562306a36Sopenharmony_cibool lan966x_hw_offload(struct lan966x *lan966x, u32 port, struct sk_buff *skb);
48662306a36Sopenharmony_ci
48762306a36Sopenharmony_civoid lan966x_ifh_get_src_port(void *ifh, u64 *src_port);
48862306a36Sopenharmony_civoid lan966x_ifh_get_timestamp(void *ifh, u64 *timestamp);
48962306a36Sopenharmony_civoid lan966x_ifh_set_bypass(void *ifh, u64 bypass);
49062306a36Sopenharmony_civoid lan966x_ifh_set_port(void *ifh, u64 bypass);
49162306a36Sopenharmony_ci
49262306a36Sopenharmony_civoid lan966x_stats_get(struct net_device *dev,
49362306a36Sopenharmony_ci		       struct rtnl_link_stats64 *stats);
49462306a36Sopenharmony_ciint lan966x_stats_init(struct lan966x *lan966x);
49562306a36Sopenharmony_ci
49662306a36Sopenharmony_civoid lan966x_port_config_down(struct lan966x_port *port);
49762306a36Sopenharmony_civoid lan966x_port_config_up(struct lan966x_port *port);
49862306a36Sopenharmony_civoid lan966x_port_status_get(struct lan966x_port *port,
49962306a36Sopenharmony_ci			     struct phylink_link_state *state);
50062306a36Sopenharmony_ciint lan966x_port_pcs_set(struct lan966x_port *port,
50162306a36Sopenharmony_ci			 struct lan966x_port_config *config);
50262306a36Sopenharmony_civoid lan966x_port_init(struct lan966x_port *port);
50362306a36Sopenharmony_ci
50462306a36Sopenharmony_civoid lan966x_port_qos_set(struct lan966x_port *port,
50562306a36Sopenharmony_ci			  struct lan966x_port_qos *qos);
50662306a36Sopenharmony_civoid lan966x_port_qos_dscp_rewr_mode_set(struct lan966x_port *port,
50762306a36Sopenharmony_ci					 int mode);
50862306a36Sopenharmony_ci
50962306a36Sopenharmony_ciint lan966x_mac_ip_learn(struct lan966x *lan966x,
51062306a36Sopenharmony_ci			 bool cpu_copy,
51162306a36Sopenharmony_ci			 const unsigned char mac[ETH_ALEN],
51262306a36Sopenharmony_ci			 unsigned int vid,
51362306a36Sopenharmony_ci			 enum macaccess_entry_type type);
51462306a36Sopenharmony_ciint lan966x_mac_learn(struct lan966x *lan966x, int port,
51562306a36Sopenharmony_ci		      const unsigned char mac[ETH_ALEN],
51662306a36Sopenharmony_ci		      unsigned int vid,
51762306a36Sopenharmony_ci		      enum macaccess_entry_type type);
51862306a36Sopenharmony_ciint lan966x_mac_forget(struct lan966x *lan966x,
51962306a36Sopenharmony_ci		       const unsigned char mac[ETH_ALEN],
52062306a36Sopenharmony_ci		       unsigned int vid,
52162306a36Sopenharmony_ci		       enum macaccess_entry_type type);
52262306a36Sopenharmony_ciint lan966x_mac_cpu_learn(struct lan966x *lan966x, const char *addr, u16 vid);
52362306a36Sopenharmony_ciint lan966x_mac_cpu_forget(struct lan966x *lan966x, const char *addr, u16 vid);
52462306a36Sopenharmony_civoid lan966x_mac_init(struct lan966x *lan966x);
52562306a36Sopenharmony_civoid lan966x_mac_set_ageing(struct lan966x *lan966x,
52662306a36Sopenharmony_ci			    u32 ageing);
52762306a36Sopenharmony_ciint lan966x_mac_del_entry(struct lan966x *lan966x,
52862306a36Sopenharmony_ci			  const unsigned char *addr,
52962306a36Sopenharmony_ci			  u16 vid);
53062306a36Sopenharmony_ciint lan966x_mac_add_entry(struct lan966x *lan966x,
53162306a36Sopenharmony_ci			  struct lan966x_port *port,
53262306a36Sopenharmony_ci			  const unsigned char *addr,
53362306a36Sopenharmony_ci			  u16 vid);
53462306a36Sopenharmony_civoid lan966x_mac_lag_replace_port_entry(struct lan966x *lan966x,
53562306a36Sopenharmony_ci					struct lan966x_port *src,
53662306a36Sopenharmony_ci					struct lan966x_port *dst);
53762306a36Sopenharmony_civoid lan966x_mac_lag_remove_port_entry(struct lan966x *lan966x,
53862306a36Sopenharmony_ci				       struct lan966x_port *src);
53962306a36Sopenharmony_civoid lan966x_mac_purge_entries(struct lan966x *lan966x);
54062306a36Sopenharmony_ciirqreturn_t lan966x_mac_irq_handler(struct lan966x *lan966x);
54162306a36Sopenharmony_ci
54262306a36Sopenharmony_civoid lan966x_vlan_init(struct lan966x *lan966x);
54362306a36Sopenharmony_civoid lan966x_vlan_port_apply(struct lan966x_port *port);
54462306a36Sopenharmony_cibool lan966x_vlan_cpu_member_cpu_vlan_mask(struct lan966x *lan966x, u16 vid);
54562306a36Sopenharmony_civoid lan966x_vlan_port_set_vlan_aware(struct lan966x_port *port,
54662306a36Sopenharmony_ci				      bool vlan_aware);
54762306a36Sopenharmony_ciint lan966x_vlan_port_set_vid(struct lan966x_port *port,
54862306a36Sopenharmony_ci			      u16 vid,
54962306a36Sopenharmony_ci			      bool pvid,
55062306a36Sopenharmony_ci			      bool untagged);
55162306a36Sopenharmony_civoid lan966x_vlan_port_add_vlan(struct lan966x_port *port,
55262306a36Sopenharmony_ci				u16 vid,
55362306a36Sopenharmony_ci				bool pvid,
55462306a36Sopenharmony_ci				bool untagged);
55562306a36Sopenharmony_civoid lan966x_vlan_port_del_vlan(struct lan966x_port *port, u16 vid);
55662306a36Sopenharmony_civoid lan966x_vlan_cpu_add_vlan(struct lan966x *lan966x, u16 vid);
55762306a36Sopenharmony_civoid lan966x_vlan_cpu_del_vlan(struct lan966x *lan966x, u16 vid);
55862306a36Sopenharmony_ci
55962306a36Sopenharmony_civoid lan966x_fdb_write_entries(struct lan966x *lan966x, u16 vid);
56062306a36Sopenharmony_civoid lan966x_fdb_erase_entries(struct lan966x *lan966x, u16 vid);
56162306a36Sopenharmony_ciint lan966x_fdb_init(struct lan966x *lan966x);
56262306a36Sopenharmony_civoid lan966x_fdb_deinit(struct lan966x *lan966x);
56362306a36Sopenharmony_civoid lan966x_fdb_flush_workqueue(struct lan966x *lan966x);
56462306a36Sopenharmony_ciint lan966x_handle_fdb(struct net_device *dev,
56562306a36Sopenharmony_ci		       struct net_device *orig_dev,
56662306a36Sopenharmony_ci		       unsigned long event, const void *ctx,
56762306a36Sopenharmony_ci		       const struct switchdev_notifier_fdb_info *fdb_info);
56862306a36Sopenharmony_ci
56962306a36Sopenharmony_civoid lan966x_mdb_init(struct lan966x *lan966x);
57062306a36Sopenharmony_civoid lan966x_mdb_deinit(struct lan966x *lan966x);
57162306a36Sopenharmony_ciint lan966x_handle_port_mdb_add(struct lan966x_port *port,
57262306a36Sopenharmony_ci				const struct switchdev_obj *obj);
57362306a36Sopenharmony_ciint lan966x_handle_port_mdb_del(struct lan966x_port *port,
57462306a36Sopenharmony_ci				const struct switchdev_obj *obj);
57562306a36Sopenharmony_civoid lan966x_mdb_erase_entries(struct lan966x *lan966x, u16 vid);
57662306a36Sopenharmony_civoid lan966x_mdb_write_entries(struct lan966x *lan966x, u16 vid);
57762306a36Sopenharmony_civoid lan966x_mdb_clear_entries(struct lan966x *lan966x);
57862306a36Sopenharmony_civoid lan966x_mdb_restore_entries(struct lan966x *lan966x);
57962306a36Sopenharmony_ci
58062306a36Sopenharmony_ciint lan966x_ptp_init(struct lan966x *lan966x);
58162306a36Sopenharmony_civoid lan966x_ptp_deinit(struct lan966x *lan966x);
58262306a36Sopenharmony_ciint lan966x_ptp_hwtstamp_set(struct lan966x_port *port,
58362306a36Sopenharmony_ci			     struct kernel_hwtstamp_config *cfg,
58462306a36Sopenharmony_ci			     struct netlink_ext_ack *extack);
58562306a36Sopenharmony_civoid lan966x_ptp_hwtstamp_get(struct lan966x_port *port,
58662306a36Sopenharmony_ci			      struct kernel_hwtstamp_config *cfg);
58762306a36Sopenharmony_civoid lan966x_ptp_rxtstamp(struct lan966x *lan966x, struct sk_buff *skb,
58862306a36Sopenharmony_ci			  u64 src_port, u64 timestamp);
58962306a36Sopenharmony_ciint lan966x_ptp_txtstamp_request(struct lan966x_port *port,
59062306a36Sopenharmony_ci				 struct sk_buff *skb);
59162306a36Sopenharmony_civoid lan966x_ptp_txtstamp_release(struct lan966x_port *port,
59262306a36Sopenharmony_ci				  struct sk_buff *skb);
59362306a36Sopenharmony_ciirqreturn_t lan966x_ptp_irq_handler(int irq, void *args);
59462306a36Sopenharmony_ciirqreturn_t lan966x_ptp_ext_irq_handler(int irq, void *args);
59562306a36Sopenharmony_ciu32 lan966x_ptp_get_period_ps(void);
59662306a36Sopenharmony_ciint lan966x_ptp_gettime64(struct ptp_clock_info *ptp, struct timespec64 *ts);
59762306a36Sopenharmony_ciint lan966x_ptp_setup_traps(struct lan966x_port *port,
59862306a36Sopenharmony_ci			    struct kernel_hwtstamp_config *cfg);
59962306a36Sopenharmony_ciint lan966x_ptp_del_traps(struct lan966x_port *port);
60062306a36Sopenharmony_ci
60162306a36Sopenharmony_ciint lan966x_fdma_xmit(struct sk_buff *skb, __be32 *ifh, struct net_device *dev);
60262306a36Sopenharmony_ciint lan966x_fdma_xmit_xdpf(struct lan966x_port *port, void *ptr, u32 len);
60362306a36Sopenharmony_ciint lan966x_fdma_change_mtu(struct lan966x *lan966x);
60462306a36Sopenharmony_civoid lan966x_fdma_netdev_init(struct lan966x *lan966x, struct net_device *dev);
60562306a36Sopenharmony_civoid lan966x_fdma_netdev_deinit(struct lan966x *lan966x, struct net_device *dev);
60662306a36Sopenharmony_ciint lan966x_fdma_init(struct lan966x *lan966x);
60762306a36Sopenharmony_civoid lan966x_fdma_deinit(struct lan966x *lan966x);
60862306a36Sopenharmony_ciirqreturn_t lan966x_fdma_irq_handler(int irq, void *args);
60962306a36Sopenharmony_ciint lan966x_fdma_reload_page_pool(struct lan966x *lan966x);
61062306a36Sopenharmony_ci
61162306a36Sopenharmony_ciint lan966x_lag_port_join(struct lan966x_port *port,
61262306a36Sopenharmony_ci			  struct net_device *brport_dev,
61362306a36Sopenharmony_ci			  struct net_device *bond,
61462306a36Sopenharmony_ci			  struct netlink_ext_ack *extack);
61562306a36Sopenharmony_civoid lan966x_lag_port_leave(struct lan966x_port *port, struct net_device *bond);
61662306a36Sopenharmony_ciint lan966x_lag_port_prechangeupper(struct net_device *dev,
61762306a36Sopenharmony_ci				    struct netdev_notifier_changeupper_info *info);
61862306a36Sopenharmony_ciint lan966x_lag_port_changelowerstate(struct net_device *dev,
61962306a36Sopenharmony_ci				      struct netdev_notifier_changelowerstate_info *info);
62062306a36Sopenharmony_ciint lan966x_lag_netdev_prechangeupper(struct net_device *dev,
62162306a36Sopenharmony_ci				      struct netdev_notifier_changeupper_info *info);
62262306a36Sopenharmony_ciint lan966x_lag_netdev_changeupper(struct net_device *dev,
62362306a36Sopenharmony_ci				   struct netdev_notifier_changeupper_info *info);
62462306a36Sopenharmony_cibool lan966x_lag_first_port(struct net_device *lag, struct net_device *dev);
62562306a36Sopenharmony_ciu32 lan966x_lag_get_mask(struct lan966x *lan966x, struct net_device *bond);
62662306a36Sopenharmony_ci
62762306a36Sopenharmony_ciint lan966x_port_changeupper(struct net_device *dev,
62862306a36Sopenharmony_ci			     struct net_device *brport_dev,
62962306a36Sopenharmony_ci			     struct netdev_notifier_changeupper_info *info);
63062306a36Sopenharmony_ciint lan966x_port_prechangeupper(struct net_device *dev,
63162306a36Sopenharmony_ci				struct net_device *brport_dev,
63262306a36Sopenharmony_ci				struct netdev_notifier_changeupper_info *info);
63362306a36Sopenharmony_civoid lan966x_port_stp_state_set(struct lan966x_port *port, u8 state);
63462306a36Sopenharmony_civoid lan966x_port_ageing_set(struct lan966x_port *port,
63562306a36Sopenharmony_ci			     unsigned long ageing_clock_t);
63662306a36Sopenharmony_civoid lan966x_update_fwd_mask(struct lan966x *lan966x);
63762306a36Sopenharmony_ci
63862306a36Sopenharmony_ciint lan966x_tc_setup(struct net_device *dev, enum tc_setup_type type,
63962306a36Sopenharmony_ci		     void *type_data);
64062306a36Sopenharmony_ci
64162306a36Sopenharmony_ciint lan966x_mqprio_add(struct lan966x_port *port, u8 num_tc);
64262306a36Sopenharmony_ciint lan966x_mqprio_del(struct lan966x_port *port);
64362306a36Sopenharmony_ci
64462306a36Sopenharmony_civoid lan966x_taprio_init(struct lan966x *lan966x);
64562306a36Sopenharmony_civoid lan966x_taprio_deinit(struct lan966x *lan966x);
64662306a36Sopenharmony_ciint lan966x_taprio_add(struct lan966x_port *port,
64762306a36Sopenharmony_ci		       struct tc_taprio_qopt_offload *qopt);
64862306a36Sopenharmony_ciint lan966x_taprio_del(struct lan966x_port *port);
64962306a36Sopenharmony_ciint lan966x_taprio_speed_set(struct lan966x_port *port, int speed);
65062306a36Sopenharmony_ci
65162306a36Sopenharmony_ciint lan966x_tbf_add(struct lan966x_port *port,
65262306a36Sopenharmony_ci		    struct tc_tbf_qopt_offload *qopt);
65362306a36Sopenharmony_ciint lan966x_tbf_del(struct lan966x_port *port,
65462306a36Sopenharmony_ci		    struct tc_tbf_qopt_offload *qopt);
65562306a36Sopenharmony_ci
65662306a36Sopenharmony_ciint lan966x_cbs_add(struct lan966x_port *port,
65762306a36Sopenharmony_ci		    struct tc_cbs_qopt_offload *qopt);
65862306a36Sopenharmony_ciint lan966x_cbs_del(struct lan966x_port *port,
65962306a36Sopenharmony_ci		    struct tc_cbs_qopt_offload *qopt);
66062306a36Sopenharmony_ci
66162306a36Sopenharmony_ciint lan966x_ets_add(struct lan966x_port *port,
66262306a36Sopenharmony_ci		    struct tc_ets_qopt_offload *qopt);
66362306a36Sopenharmony_ciint lan966x_ets_del(struct lan966x_port *port,
66462306a36Sopenharmony_ci		    struct tc_ets_qopt_offload *qopt);
66562306a36Sopenharmony_ci
66662306a36Sopenharmony_ciint lan966x_tc_matchall(struct lan966x_port *port,
66762306a36Sopenharmony_ci			struct tc_cls_matchall_offload *f,
66862306a36Sopenharmony_ci			bool ingress);
66962306a36Sopenharmony_ci
67062306a36Sopenharmony_ciint lan966x_police_port_add(struct lan966x_port *port,
67162306a36Sopenharmony_ci			    struct flow_action *action,
67262306a36Sopenharmony_ci			    struct flow_action_entry *act,
67362306a36Sopenharmony_ci			    unsigned long police_id,
67462306a36Sopenharmony_ci			    bool ingress,
67562306a36Sopenharmony_ci			    struct netlink_ext_ack *extack);
67662306a36Sopenharmony_ciint lan966x_police_port_del(struct lan966x_port *port,
67762306a36Sopenharmony_ci			    unsigned long police_id,
67862306a36Sopenharmony_ci			    struct netlink_ext_ack *extack);
67962306a36Sopenharmony_civoid lan966x_police_port_stats(struct lan966x_port *port,
68062306a36Sopenharmony_ci			       struct flow_stats *stats);
68162306a36Sopenharmony_ci
68262306a36Sopenharmony_ciint lan966x_mirror_port_add(struct lan966x_port *port,
68362306a36Sopenharmony_ci			    struct flow_action_entry *action,
68462306a36Sopenharmony_ci			    unsigned long mirror_id,
68562306a36Sopenharmony_ci			    bool ingress,
68662306a36Sopenharmony_ci			    struct netlink_ext_ack *extack);
68762306a36Sopenharmony_ciint lan966x_mirror_port_del(struct lan966x_port *port,
68862306a36Sopenharmony_ci			    bool ingress,
68962306a36Sopenharmony_ci			    struct netlink_ext_ack *extack);
69062306a36Sopenharmony_civoid lan966x_mirror_port_stats(struct lan966x_port *port,
69162306a36Sopenharmony_ci			       struct flow_stats *stats,
69262306a36Sopenharmony_ci			       bool ingress);
69362306a36Sopenharmony_ci
69462306a36Sopenharmony_ciint lan966x_xdp_port_init(struct lan966x_port *port);
69562306a36Sopenharmony_civoid lan966x_xdp_port_deinit(struct lan966x_port *port);
69662306a36Sopenharmony_ciint lan966x_xdp(struct net_device *dev, struct netdev_bpf *xdp);
69762306a36Sopenharmony_ciint lan966x_xdp_run(struct lan966x_port *port,
69862306a36Sopenharmony_ci		    struct page *page,
69962306a36Sopenharmony_ci		    u32 data_len);
70062306a36Sopenharmony_ciint lan966x_xdp_xmit(struct net_device *dev,
70162306a36Sopenharmony_ci		     int n,
70262306a36Sopenharmony_ci		     struct xdp_frame **frames,
70362306a36Sopenharmony_ci		     u32 flags);
70462306a36Sopenharmony_cibool lan966x_xdp_present(struct lan966x *lan966x);
70562306a36Sopenharmony_cistatic inline bool lan966x_xdp_port_present(struct lan966x_port *port)
70662306a36Sopenharmony_ci{
70762306a36Sopenharmony_ci	return !!port->xdp_prog;
70862306a36Sopenharmony_ci}
70962306a36Sopenharmony_ci
71062306a36Sopenharmony_ciint lan966x_vcap_init(struct lan966x *lan966x);
71162306a36Sopenharmony_civoid lan966x_vcap_deinit(struct lan966x *lan966x);
71262306a36Sopenharmony_ci#if defined(CONFIG_DEBUG_FS)
71362306a36Sopenharmony_ciint lan966x_vcap_port_info(struct net_device *dev,
71462306a36Sopenharmony_ci			   struct vcap_admin *admin,
71562306a36Sopenharmony_ci			   struct vcap_output_print *out);
71662306a36Sopenharmony_ci#else
71762306a36Sopenharmony_cistatic inline int lan966x_vcap_port_info(struct net_device *dev,
71862306a36Sopenharmony_ci					 struct vcap_admin *admin,
71962306a36Sopenharmony_ci					 struct vcap_output_print *out)
72062306a36Sopenharmony_ci{
72162306a36Sopenharmony_ci	return 0;
72262306a36Sopenharmony_ci}
72362306a36Sopenharmony_ci#endif
72462306a36Sopenharmony_ci
72562306a36Sopenharmony_ciint lan966x_tc_flower(struct lan966x_port *port,
72662306a36Sopenharmony_ci		      struct flow_cls_offload *f,
72762306a36Sopenharmony_ci		      bool ingress);
72862306a36Sopenharmony_ci
72962306a36Sopenharmony_ciint lan966x_goto_port_add(struct lan966x_port *port,
73062306a36Sopenharmony_ci			  int from_cid, int to_cid,
73162306a36Sopenharmony_ci			  unsigned long goto_id,
73262306a36Sopenharmony_ci			  struct netlink_ext_ack *extack);
73362306a36Sopenharmony_ciint lan966x_goto_port_del(struct lan966x_port *port,
73462306a36Sopenharmony_ci			  unsigned long goto_id,
73562306a36Sopenharmony_ci			  struct netlink_ext_ack *extack);
73662306a36Sopenharmony_ci
73762306a36Sopenharmony_ci#ifdef CONFIG_LAN966X_DCB
73862306a36Sopenharmony_civoid lan966x_dcb_init(struct lan966x *lan966x);
73962306a36Sopenharmony_ci#else
74062306a36Sopenharmony_cistatic inline void lan966x_dcb_init(struct lan966x *lan966x)
74162306a36Sopenharmony_ci{
74262306a36Sopenharmony_ci}
74362306a36Sopenharmony_ci#endif
74462306a36Sopenharmony_ci
74562306a36Sopenharmony_cistatic inline void __iomem *lan_addr(void __iomem *base[],
74662306a36Sopenharmony_ci				     int id, int tinst, int tcnt,
74762306a36Sopenharmony_ci				     int gbase, int ginst,
74862306a36Sopenharmony_ci				     int gcnt, int gwidth,
74962306a36Sopenharmony_ci				     int raddr, int rinst,
75062306a36Sopenharmony_ci				     int rcnt, int rwidth)
75162306a36Sopenharmony_ci{
75262306a36Sopenharmony_ci	WARN_ON((tinst) >= tcnt);
75362306a36Sopenharmony_ci	WARN_ON((ginst) >= gcnt);
75462306a36Sopenharmony_ci	WARN_ON((rinst) >= rcnt);
75562306a36Sopenharmony_ci	return base[id + (tinst)] +
75662306a36Sopenharmony_ci		gbase + ((ginst) * gwidth) +
75762306a36Sopenharmony_ci		raddr + ((rinst) * rwidth);
75862306a36Sopenharmony_ci}
75962306a36Sopenharmony_ci
76062306a36Sopenharmony_cistatic inline u32 lan_rd(struct lan966x *lan966x, int id, int tinst, int tcnt,
76162306a36Sopenharmony_ci			 int gbase, int ginst, int gcnt, int gwidth,
76262306a36Sopenharmony_ci			 int raddr, int rinst, int rcnt, int rwidth)
76362306a36Sopenharmony_ci{
76462306a36Sopenharmony_ci	return readl(lan_addr(lan966x->regs, id, tinst, tcnt, gbase, ginst,
76562306a36Sopenharmony_ci			      gcnt, gwidth, raddr, rinst, rcnt, rwidth));
76662306a36Sopenharmony_ci}
76762306a36Sopenharmony_ci
76862306a36Sopenharmony_cistatic inline void lan_wr(u32 val, struct lan966x *lan966x,
76962306a36Sopenharmony_ci			  int id, int tinst, int tcnt,
77062306a36Sopenharmony_ci			  int gbase, int ginst, int gcnt, int gwidth,
77162306a36Sopenharmony_ci			  int raddr, int rinst, int rcnt, int rwidth)
77262306a36Sopenharmony_ci{
77362306a36Sopenharmony_ci	writel(val, lan_addr(lan966x->regs, id, tinst, tcnt,
77462306a36Sopenharmony_ci			     gbase, ginst, gcnt, gwidth,
77562306a36Sopenharmony_ci			     raddr, rinst, rcnt, rwidth));
77662306a36Sopenharmony_ci}
77762306a36Sopenharmony_ci
77862306a36Sopenharmony_cistatic inline void lan_rmw(u32 val, u32 mask, struct lan966x *lan966x,
77962306a36Sopenharmony_ci			   int id, int tinst, int tcnt,
78062306a36Sopenharmony_ci			   int gbase, int ginst, int gcnt, int gwidth,
78162306a36Sopenharmony_ci			   int raddr, int rinst, int rcnt, int rwidth)
78262306a36Sopenharmony_ci{
78362306a36Sopenharmony_ci	u32 nval;
78462306a36Sopenharmony_ci
78562306a36Sopenharmony_ci	nval = readl(lan_addr(lan966x->regs, id, tinst, tcnt, gbase, ginst,
78662306a36Sopenharmony_ci			      gcnt, gwidth, raddr, rinst, rcnt, rwidth));
78762306a36Sopenharmony_ci	nval = (nval & ~mask) | (val & mask);
78862306a36Sopenharmony_ci	writel(nval, lan_addr(lan966x->regs, id, tinst, tcnt, gbase, ginst,
78962306a36Sopenharmony_ci			      gcnt, gwidth, raddr, rinst, rcnt, rwidth));
79062306a36Sopenharmony_ci}
79162306a36Sopenharmony_ci
79262306a36Sopenharmony_ci#endif /* __LAN966X_MAIN_H__ */
793