xref: /openbmc/linux/drivers/net/ethernet/fungible/funeth/funeth.h (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
1*ee6373ddSDimitris Michailidis /* SPDX-License-Identifier: (GPL-2.0-only OR BSD-3-Clause) */
2*ee6373ddSDimitris Michailidis 
3*ee6373ddSDimitris Michailidis #ifndef _FUNETH_H
4*ee6373ddSDimitris Michailidis #define _FUNETH_H
5*ee6373ddSDimitris Michailidis 
6*ee6373ddSDimitris Michailidis #include <uapi/linux/if_ether.h>
7*ee6373ddSDimitris Michailidis #include <uapi/linux/net_tstamp.h>
8*ee6373ddSDimitris Michailidis #include <linux/mutex.h>
9*ee6373ddSDimitris Michailidis #include <linux/seqlock.h>
10*ee6373ddSDimitris Michailidis #include <linux/xarray.h>
11*ee6373ddSDimitris Michailidis #include <net/devlink.h>
12*ee6373ddSDimitris Michailidis #include "fun_dev.h"
13*ee6373ddSDimitris Michailidis 
14*ee6373ddSDimitris Michailidis #define ADMIN_SQE_SIZE SZ_128
15*ee6373ddSDimitris Michailidis #define ADMIN_CQE_SIZE SZ_64
16*ee6373ddSDimitris Michailidis #define ADMIN_RSP_MAX_LEN (ADMIN_CQE_SIZE - sizeof(struct fun_cqe_info))
17*ee6373ddSDimitris Michailidis 
18*ee6373ddSDimitris Michailidis #define FUN_MAX_MTU 9024
19*ee6373ddSDimitris Michailidis 
20*ee6373ddSDimitris Michailidis #define SQ_DEPTH 512U
21*ee6373ddSDimitris Michailidis #define CQ_DEPTH 1024U
22*ee6373ddSDimitris Michailidis #define RQ_DEPTH (512U / (PAGE_SIZE / 4096))
23*ee6373ddSDimitris Michailidis 
24*ee6373ddSDimitris Michailidis #define CQ_INTCOAL_USEC 10
25*ee6373ddSDimitris Michailidis #define CQ_INTCOAL_NPKT 16
26*ee6373ddSDimitris Michailidis #define SQ_INTCOAL_USEC 10
27*ee6373ddSDimitris Michailidis #define SQ_INTCOAL_NPKT 16
28*ee6373ddSDimitris Michailidis 
29*ee6373ddSDimitris Michailidis #define INVALID_LPORT 0xffff
30*ee6373ddSDimitris Michailidis 
31*ee6373ddSDimitris Michailidis #define FUN_PORT_CAP_PAUSE_MASK (FUN_PORT_CAP_TX_PAUSE | FUN_PORT_CAP_RX_PAUSE)
32*ee6373ddSDimitris Michailidis 
33*ee6373ddSDimitris Michailidis struct fun_vport_info {
34*ee6373ddSDimitris Michailidis 	u8 mac[ETH_ALEN];
35*ee6373ddSDimitris Michailidis 	u16 vlan;
36*ee6373ddSDimitris Michailidis 	__be16 vlan_proto;
37*ee6373ddSDimitris Michailidis 	u8 qos;
38*ee6373ddSDimitris Michailidis 	u8 spoofchk:1;
39*ee6373ddSDimitris Michailidis 	u8 trusted:1;
40*ee6373ddSDimitris Michailidis 	unsigned int max_rate;
41*ee6373ddSDimitris Michailidis };
42*ee6373ddSDimitris Michailidis 
43*ee6373ddSDimitris Michailidis /* "subclass" of fun_dev for Ethernet functions */
44*ee6373ddSDimitris Michailidis struct fun_ethdev {
45*ee6373ddSDimitris Michailidis 	struct fun_dev fdev;
46*ee6373ddSDimitris Michailidis 
47*ee6373ddSDimitris Michailidis 	/* the function's network ports */
48*ee6373ddSDimitris Michailidis 	struct net_device **netdevs;
49*ee6373ddSDimitris Michailidis 	unsigned int num_ports;
50*ee6373ddSDimitris Michailidis 
51*ee6373ddSDimitris Michailidis 	/* configuration for the function's virtual ports */
52*ee6373ddSDimitris Michailidis 	unsigned int num_vports;
53*ee6373ddSDimitris Michailidis 	struct fun_vport_info *vport_info;
54*ee6373ddSDimitris Michailidis 
55*ee6373ddSDimitris Michailidis 	struct mutex state_mutex; /* nests inside RTNL if both taken */
56*ee6373ddSDimitris Michailidis 
57*ee6373ddSDimitris Michailidis 	unsigned int nsqs_per_port;
58*ee6373ddSDimitris Michailidis };
59*ee6373ddSDimitris Michailidis 
to_fun_ethdev(struct fun_dev * p)60*ee6373ddSDimitris Michailidis static inline struct fun_ethdev *to_fun_ethdev(struct fun_dev *p)
61*ee6373ddSDimitris Michailidis {
62*ee6373ddSDimitris Michailidis 	return container_of(p, struct fun_ethdev, fdev);
63*ee6373ddSDimitris Michailidis }
64*ee6373ddSDimitris Michailidis 
65*ee6373ddSDimitris Michailidis struct fun_qset {
66*ee6373ddSDimitris Michailidis 	struct funeth_rxq **rxqs;
67*ee6373ddSDimitris Michailidis 	struct funeth_txq **txqs;
68*ee6373ddSDimitris Michailidis 	struct funeth_txq **xdpqs;
69*ee6373ddSDimitris Michailidis 	unsigned int nrxqs;
70*ee6373ddSDimitris Michailidis 	unsigned int ntxqs;
71*ee6373ddSDimitris Michailidis 	unsigned int nxdpqs;
72*ee6373ddSDimitris Michailidis 	unsigned int rxq_start;
73*ee6373ddSDimitris Michailidis 	unsigned int txq_start;
74*ee6373ddSDimitris Michailidis 	unsigned int xdpq_start;
75*ee6373ddSDimitris Michailidis 	unsigned int cq_depth;
76*ee6373ddSDimitris Michailidis 	unsigned int rq_depth;
77*ee6373ddSDimitris Michailidis 	unsigned int sq_depth;
78*ee6373ddSDimitris Michailidis 	int state;
79*ee6373ddSDimitris Michailidis };
80*ee6373ddSDimitris Michailidis 
81*ee6373ddSDimitris Michailidis /* Per netdevice driver state, i.e., netdev_priv. */
82*ee6373ddSDimitris Michailidis struct funeth_priv {
83*ee6373ddSDimitris Michailidis 	struct fun_dev *fdev;
84*ee6373ddSDimitris Michailidis 	struct pci_dev *pdev;
85*ee6373ddSDimitris Michailidis 	struct net_device *netdev;
86*ee6373ddSDimitris Michailidis 
87*ee6373ddSDimitris Michailidis 	struct funeth_rxq * __rcu *rxqs;
88*ee6373ddSDimitris Michailidis 	struct funeth_txq **txqs;
89*ee6373ddSDimitris Michailidis 	struct funeth_txq * __rcu *xdpqs;
90*ee6373ddSDimitris Michailidis 
91*ee6373ddSDimitris Michailidis 	struct xarray irqs;
92*ee6373ddSDimitris Michailidis 	unsigned int num_tx_irqs;
93*ee6373ddSDimitris Michailidis 	unsigned int num_rx_irqs;
94*ee6373ddSDimitris Michailidis 	unsigned int rx_irq_ofst;
95*ee6373ddSDimitris Michailidis 
96*ee6373ddSDimitris Michailidis 	unsigned int lane_attrs;
97*ee6373ddSDimitris Michailidis 	u16 lport;
98*ee6373ddSDimitris Michailidis 
99*ee6373ddSDimitris Michailidis 	/* link settings */
100*ee6373ddSDimitris Michailidis 	u64 port_caps;
101*ee6373ddSDimitris Michailidis 	u64 advertising;
102*ee6373ddSDimitris Michailidis 	u64 lp_advertising;
103*ee6373ddSDimitris Michailidis 	unsigned int link_speed;
104*ee6373ddSDimitris Michailidis 	u8 xcvr_type;
105*ee6373ddSDimitris Michailidis 	u8 active_fc;
106*ee6373ddSDimitris Michailidis 	u8 active_fec;
107*ee6373ddSDimitris Michailidis 	u8 link_down_reason;
108*ee6373ddSDimitris Michailidis 	seqcount_t link_seq;
109*ee6373ddSDimitris Michailidis 
110*ee6373ddSDimitris Michailidis 	u32 msg_enable;
111*ee6373ddSDimitris Michailidis 
112*ee6373ddSDimitris Michailidis 	unsigned int num_xdpqs;
113*ee6373ddSDimitris Michailidis 
114*ee6373ddSDimitris Michailidis 	/* ethtool, etc. config parameters */
115*ee6373ddSDimitris Michailidis 	unsigned int sq_depth;
116*ee6373ddSDimitris Michailidis 	unsigned int rq_depth;
117*ee6373ddSDimitris Michailidis 	unsigned int cq_depth;
118*ee6373ddSDimitris Michailidis 	unsigned int cq_irq_db;
119*ee6373ddSDimitris Michailidis 	u8 tx_coal_usec;
120*ee6373ddSDimitris Michailidis 	u8 tx_coal_count;
121*ee6373ddSDimitris Michailidis 	u8 rx_coal_usec;
122*ee6373ddSDimitris Michailidis 	u8 rx_coal_count;
123*ee6373ddSDimitris Michailidis 
124*ee6373ddSDimitris Michailidis 	struct hwtstamp_config hwtstamp_cfg;
125*ee6373ddSDimitris Michailidis 
126*ee6373ddSDimitris Michailidis 	/* cumulative queue stats from earlier queue instances */
127*ee6373ddSDimitris Michailidis 	u64 tx_packets;
128*ee6373ddSDimitris Michailidis 	u64 tx_bytes;
129*ee6373ddSDimitris Michailidis 	u64 tx_dropped;
130*ee6373ddSDimitris Michailidis 	u64 rx_packets;
131*ee6373ddSDimitris Michailidis 	u64 rx_bytes;
132*ee6373ddSDimitris Michailidis 	u64 rx_dropped;
133*ee6373ddSDimitris Michailidis 
134*ee6373ddSDimitris Michailidis 	/* RSS */
135*ee6373ddSDimitris Michailidis 	unsigned int rss_hw_id;
136*ee6373ddSDimitris Michailidis 	enum fun_eth_hash_alg hash_algo;
137*ee6373ddSDimitris Michailidis 	u8 rss_key[FUN_ETH_RSS_MAX_KEY_SIZE];
138*ee6373ddSDimitris Michailidis 	unsigned int indir_table_nentries;
139*ee6373ddSDimitris Michailidis 	u32 indir_table[FUN_ETH_RSS_MAX_INDIR_ENT];
140*ee6373ddSDimitris Michailidis 	dma_addr_t rss_dma_addr;
141*ee6373ddSDimitris Michailidis 	void *rss_cfg;
142*ee6373ddSDimitris Michailidis 
143*ee6373ddSDimitris Michailidis 	/* DMA area for port stats */
144*ee6373ddSDimitris Michailidis 	dma_addr_t stats_dma_addr;
145*ee6373ddSDimitris Michailidis 	__be64 *stats;
146*ee6373ddSDimitris Michailidis 
147*ee6373ddSDimitris Michailidis 	struct bpf_prog *xdp_prog;
148*ee6373ddSDimitris Michailidis 
149*ee6373ddSDimitris Michailidis 	struct devlink_port dl_port;
150*ee6373ddSDimitris Michailidis 
151*ee6373ddSDimitris Michailidis 	/* kTLS state */
152*ee6373ddSDimitris Michailidis 	unsigned int ktls_id;
153*ee6373ddSDimitris Michailidis 	atomic64_t tx_tls_add;
154*ee6373ddSDimitris Michailidis 	atomic64_t tx_tls_del;
155*ee6373ddSDimitris Michailidis 	atomic64_t tx_tls_resync;
156*ee6373ddSDimitris Michailidis };
157*ee6373ddSDimitris Michailidis 
158*ee6373ddSDimitris Michailidis void fun_set_ethtool_ops(struct net_device *netdev);
159*ee6373ddSDimitris Michailidis int fun_port_write_cmd(struct funeth_priv *fp, int key, u64 data);
160*ee6373ddSDimitris Michailidis int fun_port_read_cmd(struct funeth_priv *fp, int key, u64 *data);
161*ee6373ddSDimitris Michailidis int fun_create_and_bind_tx(struct funeth_priv *fp, u32 sqid);
162*ee6373ddSDimitris Michailidis int fun_replace_queues(struct net_device *dev, struct fun_qset *newqs,
163*ee6373ddSDimitris Michailidis 		       struct netlink_ext_ack *extack);
164*ee6373ddSDimitris Michailidis int fun_change_num_queues(struct net_device *dev, unsigned int ntx,
165*ee6373ddSDimitris Michailidis 			  unsigned int nrx);
166*ee6373ddSDimitris Michailidis void fun_set_ring_count(struct net_device *netdev, unsigned int ntx,
167*ee6373ddSDimitris Michailidis 			unsigned int nrx);
168*ee6373ddSDimitris Michailidis int fun_config_rss(struct net_device *dev, int algo, const u8 *key,
169*ee6373ddSDimitris Michailidis 		   const u32 *qtable, u8 op);
170*ee6373ddSDimitris Michailidis 
171*ee6373ddSDimitris Michailidis #endif /* _FUNETH_H */
172