1/*-
2 * Copyright (c) 2014-2017, Matthew Macy (mmacy@mattmacy.io)
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are met:
7 *
8 *  1. Redistributions of source code must retain the above copyright notice,
9 *     this list of conditions and the following disclaimer.
10 *
11 *  2. Neither the name of Matthew Macy nor the names of its
12 *     contributors may be used to endorse or promote products derived from
13 *     this software without specific prior written permission.
14 *
15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
16 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
19 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
20 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
21 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
22 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
23 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
24 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
25 * POSSIBILITY OF SUCH DAMAGE.
26 *
27 * $FreeBSD$
28 */
29#ifndef __IFLIB_H_
30#define __IFLIB_H_
31
32#include <sys/kobj.h>
33#include <sys/bus.h>
34#include <sys/cpuset.h>
35#include <machine/bus.h>
36#include <sys/nv.h>
37#include <sys/gtaskqueue.h>
38
39struct if_clone;
40
41/*
42 * The value type for indexing, limits max descriptors
43 * to 65535 can be conditionally redefined to uint32_t
44 * in the future if the need arises.
45 */
46typedef uint16_t qidx_t;
47#define QIDX_INVALID 0xFFFF
48
49struct iflib_ctx;
50typedef struct iflib_ctx *if_ctx_t;
51struct if_shared_ctx;
52typedef struct if_shared_ctx *if_shared_ctx_t;
53struct if_int_delay_info;
54typedef struct if_int_delay_info  *if_int_delay_info_t;
55struct if_pseudo;
56typedef struct if_pseudo *if_pseudo_t;
57
58/*
59 * File organization:
60 *  - public structures
61 *  - iflib accessors
62 *  - iflib utility functions
63 *  - iflib core functions
64 */
65
66typedef struct if_rxd_frag {
67	uint8_t irf_flid;
68	qidx_t irf_idx;
69	uint16_t irf_len;
70} *if_rxd_frag_t;
71
72/* bnxt supports 64 with hardware LRO enabled */
73#define IFLIB_MAX_RX_SEGS		64
74
75typedef struct if_rxd_info {
76	/* set by iflib */
77	uint16_t iri_qsidx;		/* qset index */
78	uint16_t iri_vtag;		/* vlan tag - if flag set */
79	/* XXX redundant with the new irf_len field */
80	uint16_t iri_len;		/* packet length */
81	qidx_t iri_cidx;		/* consumer index of cq */
82	if_t iri_ifp;			/* driver may have >1 iface per softc */
83
84	/* updated by driver */
85	if_rxd_frag_t iri_frags;
86	uint32_t iri_flowid;		/* RSS hash for packet */
87	uint32_t iri_csum_flags;	/* m_pkthdr csum flags */
88
89	uint32_t iri_csum_data;		/* m_pkthdr csum data */
90	uint8_t iri_flags;		/* mbuf flags for packet */
91	uint8_t	 iri_nfrags;		/* number of fragments in packet */
92	uint8_t	 iri_rsstype;		/* RSS hash type */
93	uint8_t	 iri_pad;		/* any padding in the received data */
94} *if_rxd_info_t;
95
96typedef struct if_rxd_update {
97	uint64_t	*iru_paddrs;
98	qidx_t		*iru_idxs;
99	qidx_t		iru_pidx;
100	uint16_t	iru_qsidx;
101	uint16_t	iru_count;
102	uint16_t	iru_buf_size;
103	uint8_t		iru_flidx;
104} *if_rxd_update_t;
105
106#define IPI_TX_INTR	0x1		/* send an interrupt when this packet is sent */
107#define IPI_TX_IPV4	0x2		/* ethertype IPv4 */
108#define IPI_TX_IPV6	0x4		/* ethertype IPv6 */
109
110typedef struct if_pkt_info {
111	bus_dma_segment_t	*ipi_segs;	/* physical addresses */
112	uint32_t		ipi_len;	/* packet length */
113	uint16_t		ipi_qsidx;	/* queue set index */
114	qidx_t			ipi_nsegs;	/* number of segments */
115
116	qidx_t			ipi_ndescs;	/* number of descriptors used by encap */
117	uint16_t		ipi_flags;	/* iflib per-packet flags */
118	qidx_t			ipi_pidx;	/* start pidx for encap */
119	qidx_t			ipi_new_pidx;	/* next available pidx post-encap */
120	/* offload handling */
121	uint8_t			ipi_ehdrlen;	/* ether header length */
122	uint8_t			ipi_ip_hlen;	/* ip header length */
123	uint8_t			ipi_tcp_hlen;	/* tcp header length */
124	uint8_t			ipi_ipproto;	/* ip protocol */
125
126	uint32_t		ipi_csum_flags;	/* packet checksum flags */
127	uint16_t		ipi_tso_segsz;	/* tso segment size */
128	uint16_t		ipi_vtag;	/* VLAN tag */
129	uint16_t		ipi_etype;	/* ether header type */
130	uint8_t			ipi_tcp_hflags;	/* tcp header flags */
131	uint8_t			ipi_mflags;	/* packet mbuf flags */
132
133	uint32_t		ipi_tcp_seq;	/* tcp seqno */
134	uint32_t		ipi_tcp_sum;	/* tcp csum */
135} *if_pkt_info_t;
136
137typedef struct if_irq {
138	struct resource  *ii_res;
139	int               ii_rid;
140	void             *ii_tag;
141} *if_irq_t;
142
143struct if_int_delay_info {
144	if_ctx_t iidi_ctx;	/* Back-pointer to the iflib ctx (softc) */
145	int iidi_offset;			/* Register offset to read/write */
146	int iidi_value;			/* Current value in usecs */
147	struct sysctl_oid *iidi_oidp;
148	struct sysctl_req *iidi_req;
149};
150
151typedef enum {
152	IFLIB_INTR_LEGACY,
153	IFLIB_INTR_MSI,
154	IFLIB_INTR_MSIX
155} iflib_intr_mode_t;
156
157/*
158 * This really belongs in pciio.h or some place more general
159 * but this is the only consumer for now.
160 */
161typedef struct pci_vendor_info {
162	uint32_t	pvi_vendor_id;
163	uint32_t	pvi_device_id;
164	uint32_t	pvi_subvendor_id;
165	uint32_t	pvi_subdevice_id;
166	uint32_t	pvi_rev_id;
167	uint32_t	pvi_class_mask;
168	caddr_t		pvi_name;
169} pci_vendor_info_t;
170
171#define PVID(vendor, devid, name) {vendor, devid, 0, 0, 0, 0, name}
172#define PVID_OEM(vendor, devid, svid, sdevid, revid, name) {vendor, devid, svid, sdevid, revid, 0, name}
173#define PVID_END {0, 0, 0, 0, 0, 0, NULL}
174
175#define IFLIB_PNP_DESCR "U32:vendor;U32:device;U32:subvendor;U32:subdevice;" \
176    "U32:revision;U32:class;D:#"
177#define IFLIB_PNP_INFO(b, u, t) \
178    MODULE_PNP_INFO(IFLIB_PNP_DESCR, b, u, t, nitems(t) - 1)
179
180typedef struct if_txrx {
181	int (*ift_txd_encap) (void *, if_pkt_info_t);
182	void (*ift_txd_flush) (void *, uint16_t, qidx_t pidx);
183	int (*ift_txd_credits_update) (void *, uint16_t qsidx, bool clear);
184
185	int (*ift_rxd_available) (void *, uint16_t qsidx, qidx_t pidx, qidx_t budget);
186	int (*ift_rxd_pkt_get) (void *, if_rxd_info_t ri);
187	void (*ift_rxd_refill) (void * , if_rxd_update_t iru);
188	void (*ift_rxd_flush) (void *, uint16_t qsidx, uint8_t flidx, qidx_t pidx);
189	int (*ift_legacy_intr) (void *);
190} *if_txrx_t;
191
192typedef struct if_softc_ctx {
193	int isc_vectors;
194	int isc_nrxqsets;
195	int isc_ntxqsets;
196	uint8_t isc_min_tx_latency; /* disable doorbell update batching */
197	uint8_t isc_rx_mvec_enable; /* generate mvecs on rx */
198	uint32_t isc_txrx_budget_bytes_max;
199	int isc_msix_bar;		/* can be model specific - initialize in attach_pre */
200	int isc_tx_nsegments;		/* can be model specific - initialize in attach_pre */
201	int isc_ntxd[8];
202	int isc_nrxd[8];
203
204	uint32_t isc_txqsizes[8];
205	uint32_t isc_rxqsizes[8];
206	/* is there such thing as a descriptor that is more than 248 bytes ? */
207	uint8_t isc_txd_size[8];
208	uint8_t isc_rxd_size[8];
209
210	int isc_tx_tso_segments_max;
211	int isc_tx_tso_size_max;
212	int isc_tx_tso_segsize_max;
213	int isc_tx_csum_flags;
214	int isc_capabilities;
215	int isc_capenable;
216	int isc_rss_table_size;
217	int isc_rss_table_mask;
218	int isc_nrxqsets_max;
219	int isc_ntxqsets_max;
220	uint32_t isc_tx_qdepth;
221
222	iflib_intr_mode_t isc_intr;
223	uint16_t isc_rxd_buf_size[8]; /* set at init time by driver, 0
224				         means use iflib-calculated size
225				         based on isc_max_frame_size */
226	uint16_t isc_max_frame_size; /* set at init time by driver */
227	uint16_t isc_min_frame_size; /* set at init time by driver, only used if
228					IFLIB_NEED_ETHER_PAD is set. */
229	uint32_t isc_pause_frames;   /* set by driver for iflib_timer to detect */
230	pci_vendor_info_t isc_vendor_info;	/* set by iflib prior to attach_pre */
231	int isc_disable_msix;
232	if_txrx_t isc_txrx;
233} *if_softc_ctx_t;
234
235/*
236 * Initialization values for device
237 */
238struct if_shared_ctx {
239	unsigned isc_magic;
240	driver_t *isc_driver;
241	bus_size_t isc_q_align;
242	bus_size_t isc_tx_maxsize;
243	bus_size_t isc_tx_maxsegsize;
244	bus_size_t isc_tso_maxsize;
245	bus_size_t isc_tso_maxsegsize;
246	bus_size_t isc_rx_maxsize;
247	bus_size_t isc_rx_maxsegsize;
248	int isc_rx_nsegments;
249	int isc_admin_intrcnt;		/* # of admin/link interrupts */
250
251	/* fields necessary for probe */
252	pci_vendor_info_t *isc_vendor_info;
253	const char *isc_driver_version;
254	/* optional function to transform the read values to match the table*/
255	void (*isc_parse_devinfo) (uint16_t *device_id, uint16_t *subvendor_id,
256				   uint16_t *subdevice_id, uint16_t *rev_id);
257	int isc_nrxd_min[8];
258	int isc_nrxd_default[8];
259	int isc_nrxd_max[8];
260	int isc_ntxd_min[8];
261	int isc_ntxd_default[8];
262	int isc_ntxd_max[8];
263
264	/* actively used during operation */
265	int isc_nfl __aligned(CACHE_LINE_SIZE);
266	int isc_ntxqs;			/* # of tx queues per tx qset - usually 1 */
267	int isc_nrxqs;			/* # of rx queues per rx qset - intel 1, chelsio 2, broadcom 3 */
268	int isc_rx_process_limit;
269	int isc_tx_reclaim_thresh;
270	int isc_flags;
271	const char *isc_name;
272};
273
274typedef struct iflib_dma_info {
275	bus_addr_t		idi_paddr;
276	caddr_t			idi_vaddr;
277	bus_dma_tag_t		idi_tag;
278	bus_dmamap_t		idi_map;
279	uint32_t		idi_size;
280} *iflib_dma_info_t;
281
282#define IFLIB_MAGIC 0xCAFEF00D
283
284typedef enum {
285	IFLIB_INTR_RX,
286	IFLIB_INTR_TX,
287	IFLIB_INTR_RXTX,
288	IFLIB_INTR_ADMIN,
289	IFLIB_INTR_IOV,
290} iflib_intr_type_t;
291
292#ifndef ETH_ADDR_LEN
293#define ETH_ADDR_LEN 6
294#endif
295
296
297/*
298 * Interface has a separate completion queue for RX
299 */
300#define IFLIB_HAS_RXCQ		0x01
301/*
302 * Driver has already allocated vectors
303 */
304#define IFLIB_SKIP_MSIX		0x02
305/*
306 * Interface is a virtual function
307 */
308#define IFLIB_IS_VF		0x04
309/*
310 * Interface has a separate completion queue for TX
311 */
312#define IFLIB_HAS_TXCQ		0x08
313/*
314 * Interface does checksum in place
315 */
316#define IFLIB_NEED_SCRATCH	0x10
317/*
318 * Interface doesn't expect in_pseudo for th_sum
319 */
320#define IFLIB_TSO_INIT_IP	0x20
321/*
322 * Interface doesn't align IP header
323 */
324#define IFLIB_DO_RX_FIXUP	0x40
325/*
326 * Driver needs csum zeroed for offloading
327 */
328#define IFLIB_NEED_ZERO_CSUM	0x80
329/*
330 * Driver needs frames padded to some minimum length
331 */
332#define IFLIB_NEED_ETHER_PAD	0x100
333/*
334 * Packets can be freed immediately after encap
335 */
336#define IFLIB_TXD_ENCAP_PIO	0x00200
337/*
338 * Use RX completion handler
339 */
340#define IFLIB_RX_COMPLETION	0x00400
341/*
342 * Skip refilling cluster free lists
343 */
344#define IFLIB_SKIP_CLREFILL	0x00800
345/*
346 * Don't reset on hang
347 */
348#define IFLIB_NO_HANG_RESET	0x01000
349/*
350 * Don't need/want most of the niceties of
351 * queue management
352 */
353#define IFLIB_PSEUDO	0x02000
354/*
355 * No DMA support needed / wanted
356 */
357#define IFLIB_VIRTUAL	0x04000
358/*
359 * autogenerate a MAC address
360 */
361#define IFLIB_GEN_MAC	0x08000
362/*
363 * Interface needs admin task to ignore interface up/down status
364 */
365#define IFLIB_ADMIN_ALWAYS_RUN	0x10000
366/*
367 * When using a single hardware interrupt for the interface, only process RX
368 * interrupts instead of doing combined RX/TX processing.
369 */
370#define	IFLIB_SINGLE_IRQ_RX_ONLY	0x40000
371/*
372 * Don't need/want most of the niceties of
373 * emulating ethernet
374 */
375#define IFLIB_PSEUDO_ETHER	0x80000
376
377
378/*
379 * These enum values are used in iflib_needs_restart to indicate to iflib
380 * functions whether or not the interface needs restarting when certain events
381 * happen.
382 */
383enum iflib_restart_event {
384	IFLIB_RESTART_VLAN_CONFIG,
385};
386
387/*
388 * field accessors
389 */
390void *iflib_get_softc(if_ctx_t ctx);
391
392device_t iflib_get_dev(if_ctx_t ctx);
393
394if_t iflib_get_ifp(if_ctx_t ctx);
395
396struct ifmedia *iflib_get_media(if_ctx_t ctx);
397
398if_softc_ctx_t iflib_get_softc_ctx(if_ctx_t ctx);
399if_shared_ctx_t iflib_get_sctx(if_ctx_t ctx);
400
401void iflib_set_mac(if_ctx_t ctx, uint8_t mac[ETHER_ADDR_LEN]);
402void iflib_request_reset(if_ctx_t ctx);
403uint8_t iflib_in_detach(if_ctx_t ctx);
404
405uint32_t iflib_get_rx_mbuf_sz(if_ctx_t ctx);
406
407/*
408 * If the driver can plug cleanly in to newbus use these
409 */
410int iflib_device_probe(device_t);
411int iflib_device_attach(device_t);
412int iflib_device_detach(device_t);
413int iflib_device_suspend(device_t);
414int iflib_device_resume(device_t);
415int iflib_device_shutdown(device_t);
416
417/*
418 * Use this instead of iflib_device_probe if the driver should report
419 * BUS_PROBE_VENDOR instead of BUS_PROBE_DEFAULT. (For example, an out-of-tree
420 * driver based on iflib).
421 */
422int iflib_device_probe_vendor(device_t);
423
424
425int iflib_device_iov_init(device_t, uint16_t, const nvlist_t *);
426void iflib_device_iov_uninit(device_t);
427int iflib_device_iov_add_vf(device_t, uint16_t, const nvlist_t *);
428
429/*
430 * If the driver can't plug cleanly in to newbus
431 * use these
432 */
433int iflib_device_register(device_t dev, void *softc, if_shared_ctx_t sctx, if_ctx_t *ctxp);
434int iflib_device_deregister(if_ctx_t);
435
436
437
438int iflib_irq_alloc(if_ctx_t, if_irq_t, int, driver_filter_t, void *filter_arg, driver_intr_t, void *arg, const char *name);
439int iflib_irq_alloc_generic(if_ctx_t ctx, if_irq_t irq, int rid,
440			    iflib_intr_type_t type, driver_filter_t *filter,
441			    void *filter_arg, int qid, const char *name);
442void iflib_softirq_alloc_generic(if_ctx_t ctx, if_irq_t irq, iflib_intr_type_t type,  void *arg, int qid, const char *name);
443
444void iflib_irq_free(if_ctx_t ctx, if_irq_t irq);
445
446void iflib_io_tqg_attach(struct grouptask *gt, void *uniq, int cpu, char *name);
447
448void iflib_config_gtask_init(void *ctx, struct grouptask *gtask,
449			     gtask_fn_t *fn, const char *name);
450
451void iflib_config_gtask_deinit(struct grouptask *gtask);
452
453
454
455void iflib_tx_intr_deferred(if_ctx_t ctx, int txqid);
456void iflib_rx_intr_deferred(if_ctx_t ctx, int rxqid);
457void iflib_admin_intr_deferred(if_ctx_t ctx);
458void iflib_iov_intr_deferred(if_ctx_t ctx);
459
460
461void iflib_link_state_change(if_ctx_t ctx, int linkstate, uint64_t baudrate);
462
463int iflib_dma_alloc(if_ctx_t ctx, int size, iflib_dma_info_t dma, int mapflags);
464int iflib_dma_alloc_align(if_ctx_t ctx, int size, int align, iflib_dma_info_t dma, int mapflags);
465void iflib_dma_free(iflib_dma_info_t dma);
466
467int iflib_dma_alloc_multi(if_ctx_t ctx, int *sizes, iflib_dma_info_t *dmalist, int mapflags, int count);
468
469void iflib_dma_free_multi(iflib_dma_info_t *dmalist, int count);
470
471
472struct sx *iflib_ctx_lock_get(if_ctx_t);
473struct mtx *iflib_qset_lock_get(if_ctx_t, uint16_t);
474
475void iflib_led_create(if_ctx_t ctx);
476
477void iflib_add_int_delay_sysctl(if_ctx_t, const char *, const char *,
478								if_int_delay_info_t, int, int);
479
480/*
481 * Pseudo device support
482 */
483if_pseudo_t iflib_clone_register(if_shared_ctx_t);
484void iflib_clone_deregister(if_pseudo_t);
485#endif /*  __IFLIB_H_ */
486