xref: /freebsd/sys/dev/cxgb/cxgb_offload.h (revision c5f0f485)
1d722cab4SKip Macy 
2d722cab4SKip Macy /**************************************************************************
3d722cab4SKip Macy 
4c5f0f485SKip Macy Copyright (c) 2007-2008, 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 
13ac3a6d9cSKip Macy  2. Neither the name of the Chelsio Corporation nor the names of its
14d722cab4SKip Macy     contributors may be used to endorse or promote products derived from
15d722cab4SKip Macy     this software without specific prior written permission.
16d722cab4SKip Macy 
17d722cab4SKip Macy THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
18d722cab4SKip Macy AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19d722cab4SKip Macy IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20d722cab4SKip Macy ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
21d722cab4SKip Macy LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
22d722cab4SKip Macy CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
23d722cab4SKip Macy SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24d722cab4SKip Macy INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
25d722cab4SKip Macy CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
26d722cab4SKip Macy ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
27d722cab4SKip Macy POSSIBILITY OF SUCH DAMAGE.
28d722cab4SKip Macy 
29d722cab4SKip Macy $FreeBSD$
30d722cab4SKip Macy 
31d722cab4SKip Macy ***************************************************************************/
32d722cab4SKip Macy 
33d722cab4SKip Macy #ifndef _CXGB_OFFLOAD_H
34d722cab4SKip Macy #define _CXGB_OFFLOAD_H
35d722cab4SKip Macy 
362de1fa86SKip Macy #ifdef CONFIG_DEFINED
372de1fa86SKip Macy #include <common/cxgb_version.h>
382de1fa86SKip Macy #include <cxgb_config.h>
3946b0a854SKip Macy #include <ulp/tom/cxgb_l2t.h>
402de1fa86SKip Macy #include <common/cxgb_tcb.h>
413e96c7e7SKip Macy #include <t3cdev.h>
422de1fa86SKip Macy #else
432de1fa86SKip Macy #include <dev/cxgb/common/cxgb_version.h>
442de1fa86SKip Macy #include <dev/cxgb/cxgb_config.h>
4546b0a854SKip Macy #include <dev/cxgb/ulp/tom/cxgb_l2t.h>
462de1fa86SKip Macy #include <dev/cxgb/common/cxgb_tcb.h>
473e96c7e7SKip Macy #include <dev/cxgb/t3cdev.h>
482de1fa86SKip Macy #endif
49d722cab4SKip Macy 
503e96c7e7SKip Macy MALLOC_DECLARE(M_CXGB);
513e96c7e7SKip Macy 
52d722cab4SKip Macy struct adapter;
53d722cab4SKip Macy struct cxgb_client;
54d722cab4SKip Macy 
55d722cab4SKip Macy void cxgb_offload_init(void);
56d722cab4SKip Macy void cxgb_offload_exit(void);
57d722cab4SKip Macy 
58d722cab4SKip Macy void cxgb_adapter_ofld(struct adapter *adapter);
59d722cab4SKip Macy void cxgb_adapter_unofld(struct adapter *adapter);
60d722cab4SKip Macy int cxgb_offload_activate(struct adapter *adapter);
61d722cab4SKip Macy void cxgb_offload_deactivate(struct adapter *adapter);
623e96c7e7SKip Macy int cxgb_ofld_recv(struct t3cdev *dev, struct mbuf **m, int n);
63d722cab4SKip Macy 
643e96c7e7SKip Macy void cxgb_set_dummy_ops(struct t3cdev *dev);
65d722cab4SKip Macy 
66d722cab4SKip Macy 
67d722cab4SKip Macy /*
68d722cab4SKip Macy  * Client registration.  Users of T3 driver must register themselves.
69d722cab4SKip Macy  * The T3 driver will call the add function of every client for each T3
703e96c7e7SKip Macy  * adapter activated, passing up the t3cdev ptr.  Each client fills out an
71d722cab4SKip Macy  * array of callback functions to process CPL messages.
72d722cab4SKip Macy  */
73d722cab4SKip Macy 
74d722cab4SKip Macy void cxgb_register_client(struct cxgb_client *client);
75d722cab4SKip Macy void cxgb_unregister_client(struct cxgb_client *client);
763e96c7e7SKip Macy void cxgb_add_clients(struct t3cdev *tdev);
773e96c7e7SKip Macy void cxgb_remove_clients(struct t3cdev *tdev);
78d722cab4SKip Macy 
793e96c7e7SKip Macy typedef int (*cxgb_cpl_handler_func)(struct t3cdev *dev,
80d722cab4SKip Macy 				      struct mbuf *m, void *ctx);
81d722cab4SKip Macy 
82d722cab4SKip Macy struct cxgb_client {
83d722cab4SKip Macy 	char 			*name;
843e96c7e7SKip Macy 	void 			(*add) (struct t3cdev *);
853e96c7e7SKip Macy 	void 			(*remove) (struct t3cdev *);
86d722cab4SKip Macy 	cxgb_cpl_handler_func 	*handlers;
87d722cab4SKip Macy 	int			(*redirect)(void *ctx, struct rtentry *old,
88d722cab4SKip Macy 					    struct rtentry *new,
89d722cab4SKip Macy 					    struct l2t_entry *l2t);
90d722cab4SKip Macy 	TAILQ_ENTRY(cxgb_client)         client_entry;
91d722cab4SKip Macy };
92d722cab4SKip Macy 
93d722cab4SKip Macy /*
94d722cab4SKip Macy  * TID allocation services.
95d722cab4SKip Macy  */
963e96c7e7SKip Macy int cxgb_alloc_atid(struct t3cdev *dev, struct cxgb_client *client,
97d722cab4SKip Macy 		     void *ctx);
983e96c7e7SKip Macy int cxgb_alloc_stid(struct t3cdev *dev, struct cxgb_client *client,
99d722cab4SKip Macy 		     void *ctx);
1003e96c7e7SKip Macy void *cxgb_free_atid(struct t3cdev *dev, int atid);
1013e96c7e7SKip Macy void cxgb_free_stid(struct t3cdev *dev, int stid);
1023e96c7e7SKip Macy void *cxgb_get_lctx(struct t3cdev *tdev, int stid);
1033e96c7e7SKip Macy void cxgb_insert_tid(struct t3cdev *dev, struct cxgb_client *client,
104d722cab4SKip Macy 		      void *ctx,
105d722cab4SKip Macy 	unsigned int tid);
1063e96c7e7SKip Macy void cxgb_queue_tid_release(struct t3cdev *dev, unsigned int tid);
1073e96c7e7SKip Macy void cxgb_remove_tid(struct t3cdev *dev, void *ctx, unsigned int tid);
108d722cab4SKip Macy 
109d722cab4SKip Macy struct toe_tid_entry {
110d722cab4SKip Macy 	struct cxgb_client 	*client;
111d722cab4SKip Macy 	void 			*ctx;
112d722cab4SKip Macy };
113d722cab4SKip Macy 
114d722cab4SKip Macy /* CPL message priority levels */
115d722cab4SKip Macy enum {
116d722cab4SKip Macy 	CPL_PRIORITY_DATA = 0,     /* data messages */
117d722cab4SKip Macy 	CPL_PRIORITY_SETUP = 1,	   /* connection setup messages */
118d722cab4SKip Macy 	CPL_PRIORITY_TEARDOWN = 0, /* connection teardown messages */
119d722cab4SKip Macy 	CPL_PRIORITY_LISTEN = 1,   /* listen start/stop messages */
120d722cab4SKip Macy 	CPL_PRIORITY_ACK = 1,      /* RX ACK messages */
121d722cab4SKip Macy 	CPL_PRIORITY_CONTROL = 1   /* offload control messages */
122d722cab4SKip Macy };
123d722cab4SKip Macy 
124d722cab4SKip Macy /* Flags for return value of CPL message handlers */
125d722cab4SKip Macy enum {
126d722cab4SKip Macy 	CPL_RET_BUF_DONE = 1,   // buffer processing done, buffer may be freed
127d722cab4SKip Macy 	CPL_RET_BAD_MSG = 2,    // bad CPL message (e.g., unknown opcode)
128d722cab4SKip Macy 	CPL_RET_UNKNOWN_TID = 4	// unexpected unknown TID
129d722cab4SKip Macy };
130d722cab4SKip Macy 
1313e96c7e7SKip Macy typedef int (*cpl_handler_func)(struct t3cdev *dev, struct mbuf *m);
132d722cab4SKip Macy 
133d722cab4SKip Macy /*
134d722cab4SKip Macy  * Returns a pointer to the first byte of the CPL header in an sk_buff that
135d722cab4SKip Macy  * contains a CPL message.
136d722cab4SKip Macy  */
137d722cab4SKip Macy static inline void *cplhdr(struct mbuf *m)
138d722cab4SKip Macy {
139ef72318fSKip Macy 	return mtod(m, uint8_t *);
140d722cab4SKip Macy }
141d722cab4SKip Macy 
142d722cab4SKip Macy void t3_register_cpl_handler(unsigned int opcode, cpl_handler_func h);
143d722cab4SKip Macy 
144d722cab4SKip Macy union listen_entry {
145d722cab4SKip Macy 	struct toe_tid_entry toe_tid;
146d722cab4SKip Macy 	union listen_entry *next;
147d722cab4SKip Macy };
148d722cab4SKip Macy 
149d722cab4SKip Macy union active_open_entry {
150d722cab4SKip Macy 	struct toe_tid_entry toe_tid;
151d722cab4SKip Macy 	union active_open_entry *next;
152d722cab4SKip Macy };
153d722cab4SKip Macy 
154d722cab4SKip Macy /*
155d722cab4SKip Macy  * Holds the size, base address, free list start, etc of the TID, server TID,
156d722cab4SKip Macy  * and active-open TID tables for a offload device.
157d722cab4SKip Macy  * The tables themselves are allocated dynamically.
158d722cab4SKip Macy  */
159d722cab4SKip Macy struct tid_info {
160d722cab4SKip Macy 	struct toe_tid_entry *tid_tab;
161d722cab4SKip Macy 	unsigned int ntids;
1627aff6d8eSKip Macy 	volatile unsigned int tids_in_use;
163d722cab4SKip Macy 
164d722cab4SKip Macy 	union listen_entry *stid_tab;
165d722cab4SKip Macy 	unsigned int nstids;
166d722cab4SKip Macy 	unsigned int stid_base;
167d722cab4SKip Macy 
168d722cab4SKip Macy 	union active_open_entry *atid_tab;
169d722cab4SKip Macy 	unsigned int natids;
170d722cab4SKip Macy 	unsigned int atid_base;
171d722cab4SKip Macy 
172d722cab4SKip Macy 	/*
173d722cab4SKip Macy 	 * The following members are accessed R/W so we put them in their own
174d722cab4SKip Macy 	 * cache lines.
175d722cab4SKip Macy 	 *
176d722cab4SKip Macy 	 * XXX We could combine the atid fields above with the lock here since
177d722cab4SKip Macy 	 * atids are use once (unlike other tids).  OTOH the above fields are
178d722cab4SKip Macy 	 * usually in cache due to tid_tab.
179d722cab4SKip Macy 	 */
180d722cab4SKip Macy 	struct mtx atid_lock /* ____cacheline_aligned_in_smp */;
181d722cab4SKip Macy 	union active_open_entry *afree;
182d722cab4SKip Macy 	unsigned int atids_in_use;
183d722cab4SKip Macy 
184d722cab4SKip Macy 	struct mtx stid_lock /*____cacheline_aligned */;
185d722cab4SKip Macy 	union listen_entry *sfree;
186d722cab4SKip Macy 	unsigned int stids_in_use;
187d722cab4SKip Macy };
188d722cab4SKip Macy 
1893e96c7e7SKip Macy struct t3c_data {
1903e96c7e7SKip Macy 	struct t3cdev *dev;
191d722cab4SKip Macy 	unsigned int tx_max_chunk;  /* max payload for TX_DATA */
192d722cab4SKip Macy 	unsigned int max_wrs;       /* max in-flight WRs per connection */
193d722cab4SKip Macy 	unsigned int nmtus;
194d722cab4SKip Macy 	const unsigned short *mtus;
195d722cab4SKip Macy 	struct tid_info tid_maps;
196d722cab4SKip Macy 
197d722cab4SKip Macy 	struct toe_tid_entry *tid_release_list;
198d722cab4SKip Macy 	struct mtx tid_release_lock;
199d722cab4SKip Macy 	struct task tid_release_task;
200d722cab4SKip Macy };
201d722cab4SKip Macy 
202d722cab4SKip Macy /*
2033e96c7e7SKip Macy  * t3cdev -> toe_data accessor
204d722cab4SKip Macy  */
2053e96c7e7SKip Macy #define T3C_DATA(dev) (*(struct t3c_data **)&(dev)->l4opt)
206d722cab4SKip Macy 
207d722cab4SKip Macy /*
208d722cab4SKip Macy  * Map an ATID or STID to their entries in the corresponding TID tables.
209d722cab4SKip Macy  */
210d722cab4SKip Macy static inline union active_open_entry *atid2entry(const struct tid_info *t,
211d722cab4SKip Macy                                                   unsigned int atid)
212d722cab4SKip Macy {
213d722cab4SKip Macy         return &t->atid_tab[atid - t->atid_base];
214d722cab4SKip Macy }
215d722cab4SKip Macy 
216d722cab4SKip Macy 
217d722cab4SKip Macy static inline union listen_entry *stid2entry(const struct tid_info *t,
218d722cab4SKip Macy                                              unsigned int stid)
219d722cab4SKip Macy {
220d722cab4SKip Macy         return &t->stid_tab[stid - t->stid_base];
221d722cab4SKip Macy }
222d722cab4SKip Macy 
223d722cab4SKip Macy /*
224d722cab4SKip Macy  * Find the connection corresponding to a TID.
225d722cab4SKip Macy  */
226d722cab4SKip Macy static inline struct toe_tid_entry *lookup_tid(const struct tid_info *t,
227d722cab4SKip Macy                                                unsigned int tid)
228d722cab4SKip Macy {
229d722cab4SKip Macy         return tid < t->ntids ? &(t->tid_tab[tid]) : NULL;
230d722cab4SKip Macy }
231d722cab4SKip Macy 
232d722cab4SKip Macy /*
233d722cab4SKip Macy  * Find the connection corresponding to a server TID.
234d722cab4SKip Macy  */
235d722cab4SKip Macy static inline struct toe_tid_entry *lookup_stid(const struct tid_info *t,
236d722cab4SKip Macy                                                 unsigned int tid)
237d722cab4SKip Macy {
238d722cab4SKip Macy         if (tid < t->stid_base || tid >= t->stid_base + t->nstids)
239d722cab4SKip Macy                 return NULL;
240d722cab4SKip Macy         return &(stid2entry(t, tid)->toe_tid);
241d722cab4SKip Macy }
242d722cab4SKip Macy 
243d722cab4SKip Macy /*
244d722cab4SKip Macy  * Find the connection corresponding to an active-open TID.
245d722cab4SKip Macy  */
246d722cab4SKip Macy static inline struct toe_tid_entry *lookup_atid(const struct tid_info *t,
247d722cab4SKip Macy                                                 unsigned int tid)
248d722cab4SKip Macy {
249d722cab4SKip Macy         if (tid < t->atid_base || tid >= t->atid_base + t->natids)
250d722cab4SKip Macy                 return NULL;
251d722cab4SKip Macy         return &(atid2entry(t, tid)->toe_tid);
252d722cab4SKip Macy }
253d722cab4SKip Macy 
254d722cab4SKip Macy void *cxgb_alloc_mem(unsigned long size);
255d722cab4SKip Macy void cxgb_free_mem(void *addr);
2568090c9f5SKip Macy void cxgb_neigh_update(struct rtentry *rt, uint8_t *enaddr, struct sockaddr *sa);
2573e96c7e7SKip Macy void cxgb_redirect(struct rtentry *old, struct rtentry *new, struct sockaddr *sa);
2583e96c7e7SKip Macy int process_rx(struct t3cdev *dev, struct mbuf **m, int n);
2593e96c7e7SKip Macy int attach_t3cdev(struct t3cdev *dev);
2603e96c7e7SKip Macy void detach_t3cdev(struct t3cdev *dev);
261d722cab4SKip Macy 
26288e8506eSKip Macy #define CXGB_UNIMPLEMENTED() panic("IMPLEMENT: %s:%s:%d", __FUNCTION__, __FILE__, __LINE__)
263d722cab4SKip Macy #endif
264