xref: /freebsd/sys/dev/cxgbe/offload.h (revision 70e0bbedef95258a4dadc996d641a9bebd3f107d)
1 /*-
2  * Copyright (c) 2010 Chelsio Communications, Inc.
3  * All rights reserved.
4  * Written by: Navdeep Parhar <np@FreeBSD.org>
5  *
6  * Redistribution and use in source and binary forms, with or without
7  * modification, are permitted provided that the following conditions
8  * are met:
9  * 1. Redistributions of source code must retain the above copyright
10  *    notice, this list of conditions and the following disclaimer.
11  * 2. Redistributions in binary form must reproduce the above copyright
12  *    notice, this list of conditions and the following disclaimer in the
13  *    documentation and/or other materials provided with the distribution.
14  *
15  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16  * 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 AUTHOR OR CONTRIBUTORS BE LIABLE
19  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25  * SUCH DAMAGE.
26  *
27  * $FreeBSD$
28  *
29  */
30 
31 #ifndef __T4_OFFLOAD_H__
32 #define __T4_OFFLOAD_H__
33 
34 /* XXX: flagrant misuse of mbuf fields (during tx by TOM) */
35 #define MBUF_EQ(m)		(*((void **)(&(m)->m_pkthdr.rcvif)))
36 /* These have to work for !M_PKTHDR so we use a field from m_hdr. */
37 #define MBUF_TX_CREDITS(m)	((m)->m_hdr.pad[0])
38 #define MBUF_DMA_MAPPED(m)	((m)->m_hdr.pad[1])
39 
40 #define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \
41 	(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_ULPTX_WR) | V_FW_WR_ATOMIC(atomic)); \
42 	(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \
43 			       V_FW_WR_FLOWID(tid)); \
44 	(w)->wr.wr_lo = cpu_to_be64(0); \
45 } while (0)
46 
47 #define INIT_TP_WR(w, tid) do { \
48 	(w)->wr.wr_hi = htonl(V_FW_WR_OP(FW_TP_WR) | \
49                               V_FW_WR_IMMDLEN(sizeof(*w) - sizeof(w->wr))); \
50 	(w)->wr.wr_mid = htonl(V_FW_WR_LEN16(DIV_ROUND_UP(sizeof(*w), 16)) | \
51                                V_FW_WR_FLOWID(tid)); \
52 	(w)->wr.wr_lo = cpu_to_be64(0); \
53 } while (0)
54 
55 #define INIT_TP_WR_MIT_CPL(w, cpl, tid) do { \
56 	INIT_TP_WR(w, tid); \
57 	OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \
58 } while (0)
59 
60 /*
61  * Max # of ATIDs.  The absolute HW max is 16K but we keep it lower.
62  */
63 #define MAX_ATIDS 8192U
64 
65 union serv_entry {
66 	void *data;
67 	union serv_entry *next;
68 };
69 
70 union aopen_entry {
71 	void *data;
72 	union aopen_entry *next;
73 };
74 
75 /*
76  * Holds the size, base address, free list start, etc of the TID, server TID,
77  * and active-open TID tables.  The tables themselves are allocated dynamically.
78  */
79 struct tid_info {
80 	void **tid_tab;
81 	unsigned int ntids;
82 
83 	union serv_entry *stid_tab;
84 	unsigned int nstids;
85 	unsigned int stid_base;
86 
87 	union aopen_entry *atid_tab;
88 	unsigned int natids;
89 
90 	struct filter_entry *ftid_tab;
91 	unsigned int nftids;
92 	unsigned int ftid_base;
93 	unsigned int ftids_in_use;
94 
95 	struct mtx atid_lock;
96 	union aopen_entry *afree;
97 	unsigned int atids_in_use;
98 
99 	struct mtx stid_lock;
100 	union serv_entry *sfree;
101 	unsigned int stids_in_use;
102 
103 	unsigned int tids_in_use;
104 };
105 
106 struct t4_range {
107 	unsigned int start;
108 	unsigned int size;
109 };
110 
111 struct t4_virt_res {                      /* virtualized HW resources */
112 	struct t4_range ddp;
113 	struct t4_range iscsi;
114 	struct t4_range stag;
115 	struct t4_range rq;
116 	struct t4_range pbl;
117 	struct t4_range qp;
118 	struct t4_range cq;
119 	struct t4_range ocq;
120 };
121 
122 #ifndef TCP_OFFLOAD_DISABLE
123 enum {
124 	ULD_TOM = 1,
125 };
126 
127 struct adapter;
128 struct port_info;
129 struct uld_info {
130 	SLIST_ENTRY(uld_info) link;
131 	int refcount;
132 	int uld_id;
133 	int (*attach)(struct adapter *, void **);
134 	int (*detach)(void *);
135 };
136 
137 struct uld_softc {
138 	struct uld_info *uld;
139 	void *softc;
140 };
141 
142 struct tom_tunables {
143 	int sndbuf;
144 	int ddp;
145 	int indsz;
146 	int ddp_thres;
147 };
148 
149 int t4_register_uld(struct uld_info *);
150 int t4_unregister_uld(struct uld_info *);
151 #endif
152 
153 #endif
154