xref: /freebsd/sys/dev/qlnx/qlnxe/qlnx_ioctl.h (revision 7fdf597e96a02165cfe22ff357b857d5fa15ed8a)
1 /*
2  * Copyright (c) 2017-2018 Cavium, Inc.
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
7  *  are met:
8  *
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 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  */
28 
29 #ifndef _QLNX_IOCTL_H_
30 #define _QLNX_IOCTL_H_
31 
32 #include <sys/ioccom.h>
33 
34 #define QLNX_MAX_HW_FUNCS	2
35 
36 /*
37  * Read grcdump and grcdump size
38  */
39 
40 struct qlnx_grcdump {
41 	uint16_t	pci_func;
42 	uint32_t	grcdump_size[QLNX_MAX_HW_FUNCS];
43 	void		*grcdump[QLNX_MAX_HW_FUNCS];
44 	uint32_t	grcdump_dwords[QLNX_MAX_HW_FUNCS];
45 };
46 typedef struct qlnx_grcdump qlnx_grcdump_t;
47 
48 /*
49  * Read idle_chk and idle_chk size
50  */
51 struct qlnx_idle_chk {
52 	uint16_t	pci_func;
53 	uint32_t	idle_chk_size[QLNX_MAX_HW_FUNCS];
54 	void		*idle_chk[QLNX_MAX_HW_FUNCS];
55 	uint32_t	idle_chk_dwords[QLNX_MAX_HW_FUNCS];
56 };
57 typedef struct qlnx_idle_chk qlnx_idle_chk_t;
58 
59 /*
60  * Retrive traces
61  */
62 struct qlnx_trace {
63 	uint16_t	pci_func;
64 
65 	uint16_t	cmd;
66 #define QLNX_MCP_TRACE			0x01
67 #define QLNX_REG_FIFO			0x02
68 #define QLNX_IGU_FIFO			0x03
69 #define QLNX_PROTECTION_OVERRIDE	0x04
70 #define QLNX_FW_ASSERTS			0x05
71 
72 	uint32_t	size[QLNX_MAX_HW_FUNCS];
73 	void		*buffer[QLNX_MAX_HW_FUNCS];
74 	uint32_t	dwords[QLNX_MAX_HW_FUNCS];
75 };
76 typedef struct qlnx_trace qlnx_trace_t;
77 
78 /*
79  * Read driver info
80  */
81 #define QLNX_DRV_INFO_NAME_LENGTH		32
82 #define QLNX_DRV_INFO_VERSION_LENGTH		32
83 #define QLNX_DRV_INFO_MFW_VERSION_LENGTH	32
84 #define QLNX_DRV_INFO_STORMFW_VERSION_LENGTH	32
85 #define QLNX_DRV_INFO_BUS_INFO_LENGTH		32
86 
87 struct qlnx_drvinfo {
88 	char		drv_name[QLNX_DRV_INFO_NAME_LENGTH];
89 	char		drv_version[QLNX_DRV_INFO_VERSION_LENGTH];
90 	char		mfw_version[QLNX_DRV_INFO_MFW_VERSION_LENGTH];
91 	char		stormfw_version[QLNX_DRV_INFO_STORMFW_VERSION_LENGTH];
92 	uint32_t	eeprom_dump_len; /* in bytes */
93 	uint32_t	reg_dump_len; /* in bytes */
94 	char		bus_info[QLNX_DRV_INFO_BUS_INFO_LENGTH];
95 };
96 typedef struct qlnx_drvinfo qlnx_drvinfo_t;
97 
98 /*
99  * Read Device Setting
100  */
101 struct qlnx_dev_setting {
102 	uint32_t	supported; /* Features this interface supports */
103 	uint32_t	advertising; /* Features this interface advertises */
104 	uint32_t	speed; /* The forced speed, 10Mb, 100Mb, gigabit */
105 	uint32_t	duplex; /* Duplex, half or full */
106 	uint32_t	port; /* Which connector port */
107 	uint32_t	phy_address; /* port number*/
108 	uint32_t	autoneg; /* Enable or disable autonegotiation */
109 };
110 typedef struct qlnx_dev_setting qlnx_dev_setting_t;
111 
112 /*
113  * Get Registers
114  */
115 struct qlnx_get_regs {
116 	void		*reg_buf;
117 	uint32_t	reg_buf_len;
118 };
119 typedef struct qlnx_get_regs qlnx_get_regs_t;
120 
121 /*
122  * Get/Set NVRAM
123  */
124 struct qlnx_nvram {
125 	uint32_t	cmd;
126 #define QLNX_NVRAM_CMD_WRITE_NVRAM	0x01
127 #define QLNX_NVRAM_CMD_READ_NVRAM	0x02
128 #define QLNX_NVRAM_CMD_SET_SECURE_MODE	0x03
129 #define QLNX_NVRAM_CMD_DEL_FILE		0x04
130 #define QLNX_NVRAM_CMD_PUT_FILE_BEGIN	0x05
131 #define QLNX_NVRAM_CMD_GET_NVRAM_RESP	0x06
132 #define QLNX_NVRAM_CMD_PUT_FILE_DATA	0x07
133 
134 	void		*data;
135 	uint32_t	offset;
136 	uint32_t	data_len;
137 	uint32_t	magic;
138 };
139 typedef struct qlnx_nvram qlnx_nvram_t;
140 
141 /*
142  * Get/Set Device registers
143  */
144 struct qlnx_reg_rd_wr {
145 	uint32_t	cmd;
146 #define QLNX_REG_READ_CMD	0x01
147 #define QLNX_REG_WRITE_CMD	0x02
148 
149 	uint32_t	addr;
150 	uint32_t	val;
151 
152 	uint32_t	access_type;
153 #define QLNX_REG_ACCESS_DIRECT		0x01
154 #define QLNX_REG_ACCESS_INDIRECT	0x02
155 
156 	uint32_t	hwfn_index;
157 };
158 typedef struct qlnx_reg_rd_wr qlnx_reg_rd_wr_t;
159 
160 /*
161  * Read/Write PCI Configuration
162  */
163 struct qlnx_pcicfg_rd_wr {
164 	uint32_t	cmd;
165 #define QLNX_PCICFG_READ		0x01
166 #define QLNX_PCICFG_WRITE		0x02
167 	uint32_t	reg;
168 	uint32_t	val;
169 	uint32_t	width;
170 };
171 typedef struct qlnx_pcicfg_rd_wr qlnx_pcicfg_rd_wr_t;
172 
173 /*
174  * Read MAC address
175  */
176 struct qlnx_perm_mac_addr {
177 	char	addr[32];
178 };
179 typedef struct qlnx_perm_mac_addr qlnx_perm_mac_addr_t;
180 
181 /*
182  * Read STORM statistics registers
183  */
184 struct qlnx_storm_stats {
185 	/* xstorm */
186 	uint32_t xstorm_active_cycles;
187 	uint32_t xstorm_stall_cycles;
188 	uint32_t xstorm_sleeping_cycles;
189 	uint32_t xstorm_inactive_cycles;
190 
191 	/* ystorm */
192 	uint32_t ystorm_active_cycles;
193 	uint32_t ystorm_stall_cycles;
194 	uint32_t ystorm_sleeping_cycles;
195 	uint32_t ystorm_inactive_cycles;
196 
197 	/* pstorm */
198 	uint32_t pstorm_active_cycles;
199 	uint32_t pstorm_stall_cycles;
200 	uint32_t pstorm_sleeping_cycles;
201 	uint32_t pstorm_inactive_cycles;
202 
203 	/* tstorm */
204 	uint32_t tstorm_active_cycles;
205 	uint32_t tstorm_stall_cycles;
206 	uint32_t tstorm_sleeping_cycles;
207 	uint32_t tstorm_inactive_cycles;
208 
209 	/* mstorm */
210 	uint32_t mstorm_active_cycles;
211 	uint32_t mstorm_stall_cycles;
212 	uint32_t mstorm_sleeping_cycles;
213 	uint32_t mstorm_inactive_cycles;
214 
215 	/* ustorm */
216 	uint32_t ustorm_active_cycles;
217 	uint32_t ustorm_stall_cycles;
218 	uint32_t ustorm_sleeping_cycles;
219 	uint32_t ustorm_inactive_cycles;
220 };
221 
222 typedef struct qlnx_storm_stats qlnx_storm_stats_t;
223 
224 #define QLNX_STORM_STATS_SAMPLES_PER_HWFN	(10000)
225 
226 #define QLNX_STORM_STATS_BYTES_PER_HWFN (sizeof(qlnx_storm_stats_t) * \
227 		QLNX_STORM_STATS_SAMPLES_PER_HWFN)
228 
229 struct qlnx_storm_stats_dump {
230 	int num_hwfns;
231 	int num_samples;
232 	void *buffer[QLNX_MAX_HW_FUNCS];
233 };
234 
235 typedef struct qlnx_storm_stats_dump qlnx_storm_stats_dump_t;
236 
237 #define QLNX_LLDP_TYPE_END_OF_LLDPDU		0
238 #define QLNX_LLDP_TYPE_CHASSIS_ID		1
239 #define QLNX_LLDP_TYPE_PORT_ID			2
240 #define QLNX_LLDP_TYPE_TTL			3
241 #define QLNX_LLDP_TYPE_PORT_DESC		4
242 #define QLNX_LLDP_TYPE_SYS_NAME			5
243 #define QLNX_LLDP_TYPE_SYS_DESC			6
244 #define QLNX_LLDP_TYPE_SYS_CAPS			7
245 #define QLNX_LLDP_TYPE_MGMT_ADDR		8
246 #define QLNX_LLDP_TYPE_ORG_SPECIFIC		127
247 
248 #define QLNX_LLDP_CHASSIS_ID_SUBTYPE_OCTETS	1 //Subtype is 1 byte
249 #define QLNX_LLDP_CHASSIS_ID_SUBTYPE_MAC	0x04 //Mac Address
250 #define QLNX_LLDP_CHASSIS_ID_MAC_ADDR_LEN	6 // Mac address is 6 bytes
251 #define QLNX_LLDP_CHASSIS_ID_SUBTYPE_IF_NAME	0x06 //Interface Name
252 
253 #define QLNX_LLDP_PORT_ID_SUBTYPE_OCTETS	1 //Subtype is 1 byte
254 #define QLNX_LLDP_PORT_ID_SUBTYPE_MAC		0x03 //Mac Address
255 #define QLNX_LLDP_PORT_ID_MAC_ADDR_LEN		6 // Mac address is 6 bytes
256 #define QLNX_LLDP_PORT_ID_SUBTYPE_IF_NAME	0x05 //Interface Name
257 
258 #define QLNX_LLDP_SYS_TLV_SIZE 256
259 struct qlnx_lldp_sys_tlvs {
260 	int		discard_mandatory_tlv;
261 	uint8_t		buf[QLNX_LLDP_SYS_TLV_SIZE];
262 	uint16_t	buf_size;
263 };
264 typedef struct qlnx_lldp_sys_tlvs qlnx_lldp_sys_tlvs_t;
265 
266 /*
267  * Read grcdump size
268  */
269 #define QLNX_GRC_DUMP_SIZE	_IOWR('q', 1, qlnx_grcdump_t)
270 
271 /*
272  * Read grcdump
273  */
274 #define QLNX_GRC_DUMP		_IOWR('q', 2, qlnx_grcdump_t)
275 
276 /*
277  * Read idle_chk size
278  */
279 #define QLNX_IDLE_CHK_SIZE	_IOWR('q', 3, qlnx_idle_chk_t)
280 
281 /*
282  * Read idle_chk
283  */
284 #define QLNX_IDLE_CHK		_IOWR('q', 4, qlnx_idle_chk_t)
285 
286 /*
287  * Read driver info
288  */
289 #define QLNX_DRV_INFO		_IOWR('q', 5, qlnx_drvinfo_t)
290 
291 /*
292  * Read Device Setting
293  */
294 #define QLNX_DEV_SETTING	_IOR('q', 6, qlnx_dev_setting_t)
295 
296 /*
297  * Get Registers
298  */
299 #define QLNX_GET_REGS		_IOR('q', 7, qlnx_get_regs_t)
300 
301 /*
302  * Get/Set NVRAM
303  */
304 #define QLNX_NVRAM		_IOWR('q', 8, qlnx_nvram_t)
305 
306 /*
307  * Get/Set Device registers
308  */
309 #define QLNX_RD_WR_REG		_IOWR('q', 9, qlnx_reg_rd_wr_t)
310 
311 /*
312  * Read/Write PCI Configuration
313  */
314 #define QLNX_RD_WR_PCICFG	_IOWR('q', 10, qlnx_pcicfg_rd_wr_t)
315 
316 /*
317  * Read MAC address
318  */
319 #define QLNX_MAC_ADDR		_IOWR('q', 11, qlnx_perm_mac_addr_t)
320 
321 /*
322  * Read STORM statistics
323  */
324 #define QLNX_STORM_STATS	_IOWR('q', 12, qlnx_storm_stats_dump_t)
325 
326 /*
327  * Read trace size
328  */
329 #define QLNX_TRACE_SIZE		_IOWR('q', 13, qlnx_trace_t)
330 
331 /*
332  * Read trace
333  */
334 #define QLNX_TRACE		_IOWR('q', 14, qlnx_trace_t)
335 
336 /*
337  * Set LLDP TLVS
338  */
339 #define QLNX_SET_LLDP_TLVS	_IOWR('q', 15, qlnx_lldp_sys_tlvs_t)
340 
341 #endif /* #ifndef _QLNX_IOCTL_H_ */
342