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