xref: /freebsd/sys/dev/cxgb/cxgb_offload.h (revision d722cab4)
1d722cab4SKip Macy 
2d722cab4SKip Macy /**************************************************************************
3d722cab4SKip Macy 
4d722cab4SKip Macy Copyright (c) 2007, Chelsio Inc.
5d722cab4SKip Macy All rights reserved.
6d722cab4SKip Macy 
7d722cab4SKip Macy Redistribution and use in source and binary forms, with or without
8d722cab4SKip Macy modification, are permitted provided that the following conditions are met:
9d722cab4SKip Macy 
10d722cab4SKip Macy  1. Redistributions of source code must retain the above copyright notice,
11d722cab4SKip Macy     this list of conditions and the following disclaimer.
12d722cab4SKip Macy 
13d722cab4SKip Macy  2. Redistributions in binary form must reproduce the above copyright
14d722cab4SKip Macy     notice, this list of conditions and the following disclaimer in the
15d722cab4SKip Macy     documentation and/or other materials provided with the distribution.
16d722cab4SKip Macy 
17d722cab4SKip Macy  3. Neither the name of the Chelsio Corporation nor the names of its
18d722cab4SKip Macy     contributors may be used to endorse or promote products derived from
19d722cab4SKip Macy     this software without specific prior written permission.
20d722cab4SKip Macy 
21d722cab4SKip Macy THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22d722cab4SKip Macy AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23d722cab4SKip Macy IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24d722cab4SKip Macy ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
25d722cab4SKip Macy LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26d722cab4SKip Macy CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27d722cab4SKip Macy SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28d722cab4SKip Macy INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29d722cab4SKip Macy CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30d722cab4SKip Macy ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31d722cab4SKip Macy POSSIBILITY OF SUCH DAMAGE.
32d722cab4SKip Macy 
33d722cab4SKip Macy $FreeBSD$
34d722cab4SKip Macy 
35d722cab4SKip Macy ***************************************************************************/
36d722cab4SKip Macy 
37d722cab4SKip Macy #ifndef _CXGB_OFFLOAD_H
38d722cab4SKip Macy #define _CXGB_OFFLOAD_H
39d722cab4SKip Macy 
40d722cab4SKip Macy 
41d722cab4SKip Macy #include <dev/cxgb/common/cxgb_tcb.h>
42d722cab4SKip Macy #include <dev/cxgb/cxgb_l2t.h>
43d722cab4SKip Macy 
44d722cab4SKip Macy #include <dev/cxgb/ulp/toecore/toedev.h>
45d722cab4SKip Macy #include <dev/cxgb/common/cxgb_t3_cpl.h>
46d722cab4SKip Macy 
47d722cab4SKip Macy struct adapter;
48d722cab4SKip Macy struct cxgb_client;
49d722cab4SKip Macy 
50d722cab4SKip Macy void cxgb_offload_init(void);
51d722cab4SKip Macy void cxgb_offload_exit(void);
52d722cab4SKip Macy 
53d722cab4SKip Macy void cxgb_adapter_ofld(struct adapter *adapter);
54d722cab4SKip Macy void cxgb_adapter_unofld(struct adapter *adapter);
55d722cab4SKip Macy int cxgb_offload_activate(struct adapter *adapter);
56d722cab4SKip Macy void cxgb_offload_deactivate(struct adapter *adapter);
57d722cab4SKip Macy int cxgb_ofld_recv(struct toedev *dev, struct mbuf **m, int n);
58d722cab4SKip Macy 
59d722cab4SKip Macy void cxgb_set_dummy_ops(struct toedev *dev);
60d722cab4SKip Macy 
61d722cab4SKip Macy 
62d722cab4SKip Macy /*
63d722cab4SKip Macy  * Client registration.  Users of T3 driver must register themselves.
64d722cab4SKip Macy  * The T3 driver will call the add function of every client for each T3
65d722cab4SKip Macy  * adapter activated, passing up the toedev ptr.  Each client fills out an
66d722cab4SKip Macy  * array of callback functions to process CPL messages.
67d722cab4SKip Macy  */
68d722cab4SKip Macy 
69d722cab4SKip Macy void cxgb_register_client(struct cxgb_client *client);
70d722cab4SKip Macy void cxgb_unregister_client(struct cxgb_client *client);
71d722cab4SKip Macy void cxgb_add_clients(struct toedev *tdev);
72d722cab4SKip Macy void cxgb_remove_clients(struct toedev *tdev);
73d722cab4SKip Macy 
74d722cab4SKip Macy typedef int (*cxgb_cpl_handler_func)(struct toedev *dev,
75d722cab4SKip Macy 				      struct mbuf *m, void *ctx);
76d722cab4SKip Macy 
77d722cab4SKip Macy struct cxgb_client {
78d722cab4SKip Macy 	char 			*name;
79d722cab4SKip Macy 	void 			(*add) (struct toedev *);
80d722cab4SKip Macy 	void 			(*remove) (struct toedev *);
81d722cab4SKip Macy 	cxgb_cpl_handler_func 	*handlers;
82d722cab4SKip Macy 	int			(*redirect)(void *ctx, struct rtentry *old,
83d722cab4SKip Macy 					    struct rtentry *new,
84d722cab4SKip Macy 					    struct l2t_entry *l2t);
85d722cab4SKip Macy 	TAILQ_ENTRY(cxgb_client)         client_entry;
86d722cab4SKip Macy };
87d722cab4SKip Macy 
88d722cab4SKip Macy /*
89d722cab4SKip Macy  * TID allocation services.
90d722cab4SKip Macy  */
91d722cab4SKip Macy int cxgb_alloc_atid(struct toedev *dev, struct cxgb_client *client,
92d722cab4SKip Macy 		     void *ctx);
93d722cab4SKip Macy int cxgb_alloc_stid(struct toedev *dev, struct cxgb_client *client,
94d722cab4SKip Macy 		     void *ctx);
95d722cab4SKip Macy void *cxgb_free_atid(struct toedev *dev, int atid);
96d722cab4SKip Macy void cxgb_free_stid(struct toedev *dev, int stid);
97d722cab4SKip Macy void cxgb_insert_tid(struct toedev *dev, struct cxgb_client *client,
98d722cab4SKip Macy 		      void *ctx,
99d722cab4SKip Macy 	unsigned int tid);
100d722cab4SKip Macy void cxgb_queue_tid_release(struct toedev *dev, unsigned int tid);
101d722cab4SKip Macy void cxgb_remove_tid(struct toedev *dev, void *ctx, unsigned int tid);
102d722cab4SKip Macy 
103d722cab4SKip Macy struct toe_tid_entry {
104d722cab4SKip Macy 	struct cxgb_client 	*client;
105d722cab4SKip Macy 	void 			*ctx;
106d722cab4SKip Macy };
107d722cab4SKip Macy 
108d722cab4SKip Macy /* CPL message priority levels */
109d722cab4SKip Macy enum {
110d722cab4SKip Macy 	CPL_PRIORITY_DATA = 0,     /* data messages */
111d722cab4SKip Macy 	CPL_PRIORITY_SETUP = 1,	   /* connection setup messages */
112d722cab4SKip Macy 	CPL_PRIORITY_TEARDOWN = 0, /* connection teardown messages */
113d722cab4SKip Macy 	CPL_PRIORITY_LISTEN = 1,   /* listen start/stop messages */
114d722cab4SKip Macy 	CPL_PRIORITY_ACK = 1,      /* RX ACK messages */
115d722cab4SKip Macy 	CPL_PRIORITY_CONTROL = 1   /* offload control messages */
116d722cab4SKip Macy };
117d722cab4SKip Macy 
118d722cab4SKip Macy /* Flags for return value of CPL message handlers */
119d722cab4SKip Macy enum {
120d722cab4SKip Macy 	CPL_RET_BUF_DONE = 1,   // buffer processing done, buffer may be freed
121d722cab4SKip Macy 	CPL_RET_BAD_MSG = 2,    // bad CPL message (e.g., unknown opcode)
122d722cab4SKip Macy 	CPL_RET_UNKNOWN_TID = 4	// unexpected unknown TID
123d722cab4SKip Macy };
124d722cab4SKip Macy 
125d722cab4SKip Macy typedef int (*cpl_handler_func)(struct toedev *dev, struct mbuf *m);
126d722cab4SKip Macy 
127d722cab4SKip Macy /*
128d722cab4SKip Macy  * Returns a pointer to the first byte of the CPL header in an sk_buff that
129d722cab4SKip Macy  * contains a CPL message.
130d722cab4SKip Macy  */
131d722cab4SKip Macy static inline void *cplhdr(struct mbuf *m)
132d722cab4SKip Macy {
133d722cab4SKip Macy 	return m->m_data;
134d722cab4SKip Macy }
135d722cab4SKip Macy 
136d722cab4SKip Macy void t3_register_cpl_handler(unsigned int opcode, cpl_handler_func h);
137d722cab4SKip Macy 
138d722cab4SKip Macy union listen_entry {
139d722cab4SKip Macy 	struct toe_tid_entry toe_tid;
140d722cab4SKip Macy 	union listen_entry *next;
141d722cab4SKip Macy };
142d722cab4SKip Macy 
143d722cab4SKip Macy union active_open_entry {
144d722cab4SKip Macy 	struct toe_tid_entry toe_tid;
145d722cab4SKip Macy 	union active_open_entry *next;
146d722cab4SKip Macy };
147d722cab4SKip Macy 
148d722cab4SKip Macy /*
149d722cab4SKip Macy  * Holds the size, base address, free list start, etc of the TID, server TID,
150d722cab4SKip Macy  * and active-open TID tables for a offload device.
151d722cab4SKip Macy  * The tables themselves are allocated dynamically.
152d722cab4SKip Macy  */
153d722cab4SKip Macy struct tid_info {
154d722cab4SKip Macy 	struct toe_tid_entry *tid_tab;
155d722cab4SKip Macy 	unsigned int ntids;
156d722cab4SKip Macy 	volatile int tids_in_use;
157d722cab4SKip Macy 
158d722cab4SKip Macy 	union listen_entry *stid_tab;
159d722cab4SKip Macy 	unsigned int nstids;
160d722cab4SKip Macy 	unsigned int stid_base;
161d722cab4SKip Macy 
162d722cab4SKip Macy 	union active_open_entry *atid_tab;
163d722cab4SKip Macy 	unsigned int natids;
164d722cab4SKip Macy 	unsigned int atid_base;
165d722cab4SKip Macy 
166d722cab4SKip Macy 	/*
167d722cab4SKip Macy 	 * The following members are accessed R/W so we put them in their own
168d722cab4SKip Macy 	 * cache lines.
169d722cab4SKip Macy 	 *
170d722cab4SKip Macy 	 * XXX We could combine the atid fields above with the lock here since
171d722cab4SKip Macy 	 * atids are use once (unlike other tids).  OTOH the above fields are
172d722cab4SKip Macy 	 * usually in cache due to tid_tab.
173d722cab4SKip Macy 	 */
174d722cab4SKip Macy 	struct mtx atid_lock /* ____cacheline_aligned_in_smp */;
175d722cab4SKip Macy 	union active_open_entry *afree;
176d722cab4SKip Macy 	unsigned int atids_in_use;
177d722cab4SKip Macy 
178d722cab4SKip Macy 	struct mtx stid_lock /*____cacheline_aligned */;
179d722cab4SKip Macy 	union listen_entry *sfree;
180d722cab4SKip Macy 	unsigned int stids_in_use;
181d722cab4SKip Macy };
182d722cab4SKip Macy 
183d722cab4SKip Macy struct toe_data {
184d722cab4SKip Macy #ifdef notyet
185d722cab4SKip Macy 	struct list_head list_node;
186d722cab4SKip Macy #endif
187d722cab4SKip Macy 	struct toedev *dev;
188d722cab4SKip Macy 	unsigned int tx_max_chunk;  /* max payload for TX_DATA */
189d722cab4SKip Macy 	unsigned int max_wrs;       /* max in-flight WRs per connection */
190d722cab4SKip Macy 	unsigned int nmtus;
191d722cab4SKip Macy 	const unsigned short *mtus;
192d722cab4SKip Macy 	struct tid_info tid_maps;
193d722cab4SKip Macy 
194d722cab4SKip Macy 	struct toe_tid_entry *tid_release_list;
195d722cab4SKip Macy 	struct mtx tid_release_lock;
196d722cab4SKip Macy 	struct task tid_release_task;
197d722cab4SKip Macy };
198d722cab4SKip Macy 
199d722cab4SKip Macy /*
200d722cab4SKip Macy  * toedev -> toe_data accessor
201d722cab4SKip Macy  */
202d722cab4SKip Macy #define TOE_DATA(dev) (*(struct toe_data **)&(dev)->l4opt)
203d722cab4SKip Macy 
204d722cab4SKip Macy /*
205d722cab4SKip Macy  * Map an ATID or STID to their entries in the corresponding TID tables.
206d722cab4SKip Macy  */
207d722cab4SKip Macy static inline union active_open_entry *atid2entry(const struct tid_info *t,
208d722cab4SKip Macy                                                   unsigned int atid)
209d722cab4SKip Macy {
210d722cab4SKip Macy         return &t->atid_tab[atid - t->atid_base];
211d722cab4SKip Macy }
212d722cab4SKip Macy 
213d722cab4SKip Macy 
214d722cab4SKip Macy static inline union listen_entry *stid2entry(const struct tid_info *t,
215d722cab4SKip Macy                                              unsigned int stid)
216d722cab4SKip Macy {
217d722cab4SKip Macy         return &t->stid_tab[stid - t->stid_base];
218d722cab4SKip Macy }
219d722cab4SKip Macy 
220d722cab4SKip Macy /*
221d722cab4SKip Macy  * Find the connection corresponding to a TID.
222d722cab4SKip Macy  */
223d722cab4SKip Macy static inline struct toe_tid_entry *lookup_tid(const struct tid_info *t,
224d722cab4SKip Macy                                                unsigned int tid)
225d722cab4SKip Macy {
226d722cab4SKip Macy         return tid < t->ntids ? &(t->tid_tab[tid]) : NULL;
227d722cab4SKip Macy }
228d722cab4SKip Macy 
229d722cab4SKip Macy /*
230d722cab4SKip Macy  * Find the connection corresponding to a server TID.
231d722cab4SKip Macy  */
232d722cab4SKip Macy static inline struct toe_tid_entry *lookup_stid(const struct tid_info *t,
233d722cab4SKip Macy                                                 unsigned int tid)
234d722cab4SKip Macy {
235d722cab4SKip Macy         if (tid < t->stid_base || tid >= t->stid_base + t->nstids)
236d722cab4SKip Macy                 return NULL;
237d722cab4SKip Macy         return &(stid2entry(t, tid)->toe_tid);
238d722cab4SKip Macy }
239d722cab4SKip Macy 
240d722cab4SKip Macy /*
241d722cab4SKip Macy  * Find the connection corresponding to an active-open TID.
242d722cab4SKip Macy  */
243d722cab4SKip Macy static inline struct toe_tid_entry *lookup_atid(const struct tid_info *t,
244d722cab4SKip Macy                                                 unsigned int tid)
245d722cab4SKip Macy {
246d722cab4SKip Macy         if (tid < t->atid_base || tid >= t->atid_base + t->natids)
247d722cab4SKip Macy                 return NULL;
248d722cab4SKip Macy         return &(atid2entry(t, tid)->toe_tid);
249d722cab4SKip Macy }
250d722cab4SKip Macy 
251d722cab4SKip Macy void *cxgb_alloc_mem(unsigned long size);
252d722cab4SKip Macy void cxgb_free_mem(void *addr);
253d722cab4SKip Macy void cxgb_neigh_update(struct rtentry *rt);
254d722cab4SKip Macy void cxgb_redirect(struct rtentry *old, struct rtentry *new);
255d722cab4SKip Macy int process_rx(struct toedev *dev, struct mbuf **m, int n);
256d722cab4SKip Macy int attach_toedev(struct toedev *dev);
257d722cab4SKip Macy void detach_toedev(struct toedev *dev);
258d722cab4SKip Macy 
259d722cab4SKip Macy 
260d722cab4SKip Macy #endif
261