1167514Skmacy/**************************************************************************
2167514Skmacy
3177340SkmacyCopyright (c) 2007-2008, Chelsio Inc.
4167514SkmacyAll rights reserved.
5167514Skmacy
6167514SkmacyRedistribution and use in source and binary forms, with or without
7167514Skmacymodification, are permitted provided that the following conditions are met:
8167514Skmacy
9167514Skmacy 1. Redistributions of source code must retain the above copyright notice,
10167514Skmacy    this list of conditions and the following disclaimer.
11167514Skmacy
12169978Skmacy 2. Neither the name of the Chelsio Corporation nor the names of its
13167514Skmacy    contributors may be used to endorse or promote products derived from
14167514Skmacy    this software without specific prior written permission.
15167514Skmacy
16167514SkmacyTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17167514SkmacyAND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18167514SkmacyIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19167514SkmacyARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
20167514SkmacyLIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21167514SkmacyCONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22167514SkmacySUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23167514SkmacyINTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24167514SkmacyCONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25167514SkmacyARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26167514SkmacyPOSSIBILITY OF SUCH DAMAGE.
27167514Skmacy
28167514Skmacy$FreeBSD$
29167514Skmacy
30167514Skmacy***************************************************************************/
31167514Skmacy#ifndef __CHIOCTL_H__
32167514Skmacy#define __CHIOCTL_H__
33167514Skmacy
34167514Skmacy/*
35167514Skmacy * Ioctl commands specific to this driver.
36167514Skmacy */
37167514Skmacyenum {
38167514Skmacy	CH_SETREG = 0x40,
39167514Skmacy	CH_GETREG,
40167514Skmacy	CH_GETMTUTAB,
41167514Skmacy	CH_SETMTUTAB,
42167514Skmacy	CH_SET_PM,
43167514Skmacy	CH_GET_PM,
44167514Skmacy	CH_READ_TCAM_WORD,
45167514Skmacy	CH_GET_MEM,
46167514Skmacy	CH_GET_SGE_CONTEXT,
47167514Skmacy	CH_GET_SGE_DESC,
48167514Skmacy	CH_LOAD_FW,
49167514Skmacy	CH_SET_TRACE_FILTER,
50167514Skmacy	CH_GET_QSET_PARAMS,
51167514Skmacy	CH_GET_QSET_NUM,
52167514Skmacy	CH_SET_PKTSCHED,
53167514Skmacy	CH_IFCONF_GETREGS,
54182679Skmacy	CH_GET_MIIREG,
55182679Skmacy	CH_SET_MIIREG,
56182679Skmacy	CH_GET_EEPROM,
57169978Skmacy	CH_SET_HW_SCHED,
58182679Skmacy	CH_LOAD_BOOT,
59182679Skmacy	CH_CLEAR_STATS,
60189643Sgnn	CH_GET_UP_LA,
61189643Sgnn	CH_GET_UP_IOQS,
62207643Snp	CH_SET_FILTER,
63207643Snp	CH_DEL_FILTER,
64207643Snp	CH_GET_FILTER,
65167514Skmacy};
66167514Skmacy
67182679Skmacy/* statistics categories */
68182679Skmacyenum {
69182679Skmacy	STATS_PORT  = 1 << 1,
70182679Skmacy	STATS_QUEUE = 1 << 2,
71182679Skmacy};
72182679Skmacy
73167514Skmacystruct ch_reg {
74167514Skmacy	uint32_t addr;
75167514Skmacy	uint32_t val;
76167514Skmacy};
77167514Skmacy
78167514Skmacystruct ch_cntxt {
79167514Skmacy	uint32_t cntxt_type;
80167514Skmacy	uint32_t cntxt_id;
81167514Skmacy	uint32_t data[4];
82167514Skmacy};
83167514Skmacy
84167514Skmacy/* context types */
85167514Skmacyenum { CNTXT_TYPE_EGRESS, CNTXT_TYPE_FL, CNTXT_TYPE_RSP, CNTXT_TYPE_CQ };
86167514Skmacy
87167514Skmacystruct ch_desc {
88167514Skmacy	uint32_t queue_num;
89167514Skmacy	uint32_t idx;
90167514Skmacy	uint32_t size;
91167514Skmacy	uint8_t  data[128];
92167514Skmacy};
93167514Skmacy
94167514Skmacystruct ch_mem_range {
95167514Skmacy	uint32_t mem_id;
96167514Skmacy	uint32_t addr;
97167514Skmacy	uint32_t len;
98167514Skmacy	uint32_t version;
99167514Skmacy	uint8_t  *buf;
100167514Skmacy};
101167514Skmacy
102182679Skmacyenum { MEM_CM, MEM_PMRX, MEM_PMTX };   /* ch_mem_range.mem_id values */
103182679Skmacy
104167514Skmacystruct ch_qset_params {
105182679Skmacy	uint32_t qset_idx;
106182679Skmacy	int32_t  txq_size[3];
107182679Skmacy	int32_t  rspq_size;
108182679Skmacy	int32_t  fl_size[2];
109182679Skmacy	int32_t  intr_lat;
110182679Skmacy	int32_t  polling;
111182679Skmacy	int32_t  lro;
112182679Skmacy	int32_t  cong_thres;
113182679Skmacy	int32_t  vector;
114182679Skmacy	int32_t  qnum;
115167514Skmacy};
116167514Skmacy
117167514Skmacystruct ch_pktsched_params {
118167514Skmacy	uint8_t  sched;
119167514Skmacy	uint8_t  idx;
120167514Skmacy	uint8_t  min;
121167514Skmacy	uint8_t  max;
122167514Skmacy	uint8_t  binding;
123167514Skmacy};
124167514Skmacy
125167746Skmacystruct ch_hw_sched {
126167746Skmacy	uint8_t  sched;
127167746Skmacy	int8_t   mode;
128167746Skmacy	int8_t   channel;
129167746Skmacy	int32_t  kbps;        /* rate in Kbps */
130167746Skmacy	int32_t  class_ipg;   /* tenths of nanoseconds */
131182679Skmacy	int32_t  flow_ipg;    /* usec */
132167746Skmacy};
133167746Skmacy
134167514Skmacystruct ch_mtus {
135167514Skmacy	uint32_t nmtus;
136167514Skmacy	uint16_t mtus[NMTUS];
137167514Skmacy};
138167514Skmacy
139167514Skmacystruct ch_pm {
140167514Skmacy	uint32_t tx_pg_sz;
141167514Skmacy	uint32_t tx_num_pg;
142167514Skmacy	uint32_t rx_pg_sz;
143167514Skmacy	uint32_t rx_num_pg;
144167514Skmacy	uint32_t pm_total;
145167514Skmacy};
146167514Skmacy
147167514Skmacystruct ch_tcam_word {
148167514Skmacy	uint32_t addr;
149167514Skmacy	uint32_t buf[3];
150167514Skmacy};
151167514Skmacy
152167514Skmacystruct ch_trace {
153167514Skmacy	uint32_t sip;
154167514Skmacy	uint32_t sip_mask;
155167514Skmacy	uint32_t dip;
156167514Skmacy	uint32_t dip_mask;
157167514Skmacy	uint16_t sport;
158167514Skmacy	uint16_t sport_mask;
159167514Skmacy	uint16_t dport;
160167514Skmacy	uint16_t dport_mask;
161182679Skmacy	uint32_t vlan:12;
162182679Skmacy	uint32_t vlan_mask:12;
163182679Skmacy	uint32_t intf:4;
164182679Skmacy	uint32_t intf_mask:4;
165167514Skmacy	uint8_t  proto;
166167514Skmacy	uint8_t  proto_mask;
167182679Skmacy	uint8_t  invert_match:1;
168182679Skmacy	uint8_t  config_tx:1;
169182679Skmacy	uint8_t  config_rx:1;
170182679Skmacy	uint8_t  trace_tx:1;
171182679Skmacy	uint8_t  trace_rx:1;
172167514Skmacy};
173167514Skmacy
174167514Skmacy#define REGDUMP_SIZE  (4 * 1024)
175167514Skmacy
176182679Skmacystruct ch_ifconf_regs {
177167514Skmacy	uint32_t  version;
178167514Skmacy	uint32_t  len; /* bytes */
179167514Skmacy	uint8_t   *data;
180167514Skmacy};
181167514Skmacy
182182679Skmacystruct ch_mii_data {
183167514Skmacy	uint32_t phy_id;
184167514Skmacy	uint32_t reg_num;
185167514Skmacy	uint32_t val_in;
186167514Skmacy	uint32_t val_out;
187167514Skmacy};
188167514Skmacy
189182679Skmacystruct ch_eeprom {
190182679Skmacy	uint32_t magic;
191182679Skmacy	uint32_t offset;
192182679Skmacy	uint32_t len;
193182679Skmacy	uint8_t  *data;
194182679Skmacy};
195167514Skmacy
196189643Sgnn#define LA_BUFSIZE	(2 * 1024)
197189643Sgnnstruct ch_up_la {
198189643Sgnn	uint32_t stopped;
199189643Sgnn	uint32_t idx;
200189643Sgnn	uint32_t bufsize;
201189643Sgnn	uint32_t *data;
202189643Sgnn};
203189643Sgnn
204189643Sgnnstruct t3_ioq_entry {
205189643Sgnn	uint32_t ioq_cp;
206189643Sgnn	uint32_t ioq_pp;
207189643Sgnn	uint32_t ioq_alen;
208189643Sgnn	uint32_t ioq_stats;
209189643Sgnn};
210189643Sgnn
211189643Sgnn#define IOQS_BUFSIZE	(1024)
212189643Sgnnstruct ch_up_ioqs {
213189643Sgnn	uint32_t ioq_rx_enable;
214189643Sgnn	uint32_t ioq_tx_enable;
215189643Sgnn	uint32_t ioq_rx_status;
216189643Sgnn	uint32_t ioq_tx_status;
217189643Sgnn	uint32_t bufsize;
218189643Sgnn	struct t3_ioq_entry *data;
219189643Sgnn};
220189643Sgnn
221207643Snpstruct ch_filter_tuple {
222207643Snp	uint32_t sip;
223207643Snp	uint32_t dip;
224207643Snp	uint16_t sport;
225207643Snp	uint16_t dport;
226207643Snp	uint16_t vlan:12;
227207643Snp	uint16_t vlan_prio:3;
228207643Snp};
229207643Snp
230207643Snpstruct ch_filter {
231207643Snp	uint32_t filter_id;
232207643Snp	struct ch_filter_tuple val;
233207643Snp	struct ch_filter_tuple mask;
234207643Snp	uint16_t mac_addr_idx;
235207643Snp	uint8_t mac_hit:1;
236207643Snp	uint8_t proto:2;
237207643Snp
238207643Snp	uint8_t want_filter_id:1;
239207643Snp	uint8_t pass:1;
240207643Snp	uint8_t rss:1;
241207643Snp	uint8_t qset;
242207643Snp};
243207643Snp
244182679Skmacy#define CHELSIO_SETREG		_IOW('f', CH_SETREG, struct ch_reg)
245182679Skmacy#define CHELSIO_GETREG		_IOWR('f', CH_GETREG, struct ch_reg)
246182679Skmacy#define CHELSIO_GETMTUTAB	_IOR('f', CH_GETMTUTAB, struct ch_mtus)
247182679Skmacy#define CHELSIO_SETMTUTAB	_IOW('f', CH_SETMTUTAB, struct ch_mtus)
248182679Skmacy#define CHELSIO_SET_PM		_IOW('f', CH_SET_PM, struct ch_pm)
249182679Skmacy#define CHELSIO_GET_PM		_IOR('f', CH_GET_PM, struct ch_pm)
250182679Skmacy#define CHELSIO_READ_TCAM_WORD	_IOWR('f', CH_READ_TCAM_WORD, struct ch_tcam_word)
251182679Skmacy#define CHELSIO_GET_MEM		_IOWR('f', CH_GET_MEM, struct ch_mem_range)
252182679Skmacy#define CHELSIO_GET_SGE_CONTEXT	_IOWR('f', CH_GET_SGE_CONTEXT, struct ch_cntxt)
253182679Skmacy#define CHELSIO_GET_SGE_DESC	_IOWR('f', CH_GET_SGE_DESC, struct ch_desc)
254182679Skmacy#define CHELSIO_LOAD_FW		_IOWR('f', CH_LOAD_FW, struct ch_mem_range)
255182679Skmacy#define CHELSIO_SET_TRACE_FILTER _IOW('f', CH_SET_TRACE_FILTER, struct ch_trace)
256182679Skmacy#define CHELSIO_GET_QSET_PARAMS	_IOWR('f', CH_GET_QSET_PARAMS, struct ch_qset_params)
257182679Skmacy#define CHELSIO_GET_QSET_NUM	_IOR('f', CH_GET_QSET_NUM, struct ch_reg)
258182679Skmacy#define CHELSIO_SET_PKTSCHED	_IOW('f', CH_SET_PKTSCHED, struct ch_pktsched_params)
259182679Skmacy#define CHELSIO_SET_HW_SCHED	_IOW('f', CH_SET_HW_SCHED, struct ch_hw_sched)
260182679Skmacy#define CHELSIO_LOAD_BOOT	_IOW('f', CH_LOAD_BOOT, struct ch_mem_range)
261182679Skmacy#define CHELSIO_CLEAR_STATS	_IO('f', CH_CLEAR_STATS)
262182679Skmacy#define CHELSIO_IFCONF_GETREGS	_IOWR('f', CH_IFCONF_GETREGS, struct ch_ifconf_regs)
263182679Skmacy#define CHELSIO_GET_MIIREG	_IOWR('f', CH_GET_MIIREG, struct ch_mii_data)
264182679Skmacy#define CHELSIO_SET_MIIREG	_IOW('f', CH_SET_MIIREG, struct ch_mii_data)
265182679Skmacy#define CHELSIO_GET_EEPROM	_IOWR('f', CH_GET_EEPROM, struct ch_eeprom)
266189643Sgnn#define CHELSIO_GET_UP_LA	_IOWR('f', CH_GET_UP_LA, struct ch_up_la)
267189643Sgnn#define CHELSIO_GET_UP_IOQS	_IOWR('f', CH_GET_UP_IOQS, struct ch_up_ioqs)
268207643Snp#define CHELSIO_SET_FILTER	_IOW('f', CH_SET_FILTER, struct ch_filter)
269207643Snp#define CHELSIO_DEL_FILTER	_IOW('f', CH_DEL_FILTER, struct ch_filter)
270207643Snp#define CHELSIO_GET_FILTER	_IOWR('f', CH_GET_FILTER, struct ch_filter)
271167514Skmacy#endif
272