1 /*
2  * CDDL HEADER START
3  *
4  * The contents of this file are subject to the terms of the
5  * Common Development and Distribution License (the "License").
6  * You may not use this file except in compliance with the License.
7  *
8  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9  * or http://www.opensolaris.org/os/licensing.
10  * See the License for the specific language governing permissions
11  * and limitations under the License.
12  *
13  * When distributing Covered Code, include this CDDL HEADER in each
14  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15  * If applicable, add the following below this CDDL HEADER, with the
16  * fields enclosed by brackets "[]" replaced with your own identifying
17  * information: Portions Copyright [yyyy] [name of copyright owner]
18  *
19  * CDDL HEADER END
20  */
21 
22 /*
23  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 #ifndef	_SYS_IB_ADAPTERS_HERMON_IOCTL_H
28 #define	_SYS_IB_ADAPTERS_HERMON_IOCTL_H
29 
30 #include <sys/cred.h>
31 
32 /*
33  * hermon_ioctl.h
34  *    Contains all of the prototypes, #defines, and structures necessary
35  *    for all ioctl access into the driver.  This includes everything
36  *    necessary for updating firmware, accessing the hermon flash device,
37  *    providing interfaces for VTS.
38  */
39 
40 #ifdef __cplusplus
41 extern "C" {
42 #endif
43 
44 int hermon_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
45     int *rvalp);
46 
47 /*
48  * Enumerated type for the Hermon ioctl() interface types
49  */
50 /*
51  * originally, to make a unique set of IOCTLs but now share the actual
52  * value w/ tavor & arbel (memfree) to make VTS consistent & simpler
53  *
54  *	#define	HERMON_IOCTL		('h' << 8)
55  */
56 #define	HERMON_IOCTL		('t' << 8)
57 
58 #ifdef	DEBUG
59 typedef enum {
60 	HERMON_IOCTL_FLASH_READ		= HERMON_IOCTL | 0x00,
61 	HERMON_IOCTL_FLASH_WRITE		= HERMON_IOCTL | 0x01,
62 	HERMON_IOCTL_FLASH_ERASE		= HERMON_IOCTL | 0x02,
63 	HERMON_IOCTL_FLASH_INIT		= HERMON_IOCTL | 0x03,
64 	HERMON_IOCTL_FLASH_FINI		= HERMON_IOCTL | 0x04,
65 	HERMON_IOCTL_REG_WRITE		= HERMON_IOCTL | 0x10,
66 	HERMON_IOCTL_REG_READ		= HERMON_IOCTL | 0x11,
67 	HERMON_IOCTL_LOOPBACK		= HERMON_IOCTL | 0x20,
68 	HERMON_IOCTL_INFO			= HERMON_IOCTL | 0x21,
69 	HERMON_IOCTL_PORTS			= HERMON_IOCTL | 0x22,
70 	HERMON_IOCTL_DDR_READ		= HERMON_IOCTL | 0x23,
71 	HERMON_IOCTL_WRITE_BOOT_ADDR	= HERMON_IOCTL | 0x24
72 } hermon_ioctl_enum_t;
73 #else
74 typedef enum {
75 	HERMON_IOCTL_FLASH_READ		= HERMON_IOCTL | 0x00,
76 	HERMON_IOCTL_FLASH_WRITE		= HERMON_IOCTL | 0x01,
77 	HERMON_IOCTL_FLASH_ERASE		= HERMON_IOCTL | 0x02,
78 	HERMON_IOCTL_FLASH_INIT		= HERMON_IOCTL | 0x03,
79 	HERMON_IOCTL_FLASH_FINI		= HERMON_IOCTL | 0x04,
80 	HERMON_IOCTL_LOOPBACK		= HERMON_IOCTL | 0x20,
81 	HERMON_IOCTL_INFO		= HERMON_IOCTL | 0x21,
82 	HERMON_IOCTL_PORTS		= HERMON_IOCTL | 0x22,
83 	HERMON_IOCTL_DDR_READ		= HERMON_IOCTL | 0x23,
84 	HERMON_IOCTL_WRITE_BOOT_ADDR	= HERMON_IOCTL | 0x24
85 } hermon_ioctl_enum_t;
86 #endif	/* DEBUG */
87 
88 /*
89  * Specific operations for each of the flash ioctl interfaces
90  */
91 #define	HERMON_FLASH_READ_SECTOR			0x01
92 #define	HERMON_FLASH_READ_QUADLET		0x02
93 #define	HERMON_FLASH_WRITE_SECTOR		0x01
94 #define	HERMON_FLASH_WRITE_BYTE			0x02
95 #define	HERMON_FLASH_ERASE_SECTOR		0x01
96 #define	HERMON_FLASH_ERASE_CHIP			0x02
97 
98 /*
99  * Default values for the flash (overridden by CFI info, if available)
100  */
101 #define	HERMON_FLASH_SECTOR_SZ_DEFAULT		0x10000
102 #define	HERMON_FLASH_DEVICE_SZ_DEFAULT		0x400000
103 #define	HERMON_FLASH_SPI_LOG_SECTOR_SIZE		0x10
104 #define	HERMON_FLASH_SPI_SECTOR_SIZE		0x10000
105 #define	HERMON_FLASH_SPI_DEVICE_SIZE		0x200000
106 
107 /*
108  * CFI (Common Flash Interface) initialization
109  */
110 #define	HERMON_FLASH_CFI_INIT			0x98
111 
112 /* For compatability */
113 #define	HERMON_FLASH_CFI_SIZE			0x4C
114 #define	HERMON_FLASH_CFI_SIZE_QUADLET		HERMON_FLASH_CFI_SIZE >> 2
115 
116 /*
117  * Expand CFI data size to support the Intel Expanded Command Set.
118  */
119 #define	HERMON_CFI_INFO_SIZE 			0x100
120 #define	HERMON_CFI_INFO_QSIZE			HERMON_CFI_INFO_SIZE >> 2
121 
122 /*
123  * Mellanox uses two different parallel Flash devices for Hermon
124  * HCAs: the AMD AM29LV033C and the Intel 28F320J3C. The AM29LV033C
125  * utilizes the AMD Standard CFI command set while the 28F320J3C
126  * utliizes the Intel Extended CFI command set. Additionally, serial
127  * SPI flash is supported, such as the STMicroelectronics M25Pxx family
128  * of SPI Flash parts.
129  */
130 #define	HERMON_FLASH_INTEL_CMDSET		0x0001
131 #define	HERMON_FLASH_AMD_CMDSET			0x0002
132 #define	HERMON_FLASH_SPI_CMDSET			0x0003
133 #define	HERMON_FLASH_UNKNOWN_CMDSET		0XFFFF
134 
135 /*
136  * The firmware version structure used in HERMON_IOCTL_INFO and
137  * HERMON_IOCTL_FLASH_INIT interfaces.  The structure consists of major,
138  * minor and subminor portions for firmware revision number.
139  */
140 typedef struct hermon_fw_info_ioctl_s {
141 	uint32_t	afi_maj;
142 	uint32_t	afi_min;
143 	uint32_t	afi_sub;
144 } hermon_fw_info_ioctl_t;
145 
146 /*
147  * structure used for read, write, and erase flash routines
148  * Supported fields for each type:
149  * read_sector:  af_type, af_sector, af_sector_num
150  * read_quadlet: af_type, af_addr, af_quadlet
151  * write_sector: af_type, af_sector, af_sector_num
152  * write_byte:   af_type, af_addr, af_byte
153  * erase_sector: af_type, af_sector_num
154  * erase_chip:   af_type
155  *
156  * The 'tf_sector' field must point to a sector sized portion of memory, as
157  * all sector read/write ioctl calls are done as one complete sector only.
158  */
159 typedef struct hermon_flash_ioctl_s {
160 	uint32_t	af_type;
161 	caddr_t		af_sector;
162 	uint32_t	af_sector_num;
163 	uint32_t	af_addr;
164 	uint32_t	af_quadlet;
165 	uint8_t		af_byte;
166 } hermon_flash_ioctl_t;
167 
168 /* Structure used for flash init interface */
169 typedef struct hermon_flash_init_ioctl_s {
170 	uint32_t		af_hwrev;
171 	hermon_fw_info_ioctl_t	af_fwrev;
172 	uint32_t		af_cfi_info[HERMON_FLASH_CFI_SIZE_QUADLET];
173 	char			af_hwpn[64];
174 	int			af_pn_len;
175 } hermon_flash_init_ioctl_t;
176 
177 /*
178  * The structure used for Hermon register read/write interface.
179  * The "trg_reg_set" field indicates the register set (the BAR) from which
180  * the access is desired (HERMON_CMD_BAR, HERMON_UAR_BAR, or HERMON_DDR_BAR).
181  * The "trg_offset" and "trg_data" fields indicate the register and either
182  * the destination or source of the data to be read/written.
183  */
184 typedef struct hermon_reg_ioctl_s {
185 	uint_t		arg_reg_set;
186 	uint_t		arg_offset;
187 	uint32_t	arg_data;
188 } hermon_reg_ioctl_t;
189 
190 
191 /*
192  * Hermon VTS IOCTL revision number.  This revision number is currently
193  * expected to be passed in all Hermon VTS ioctl interfaces.
194  */
195 #define	HERMON_VTS_IOCTL_REVISION	1
196 
197 /*
198  * The port structure used in HERMON_IOCTL_PORTS interface.
199  * Each port has an associated guid, port number, and IBA-defined
200  * logical port state.
201  */
202 typedef struct hermon_stat_port_ioctl_s {
203 	uint64_t	asp_guid;
204 	uint32_t	asp_port_num;
205 	uint32_t	asp_state;
206 } hermon_stat_port_ioctl_t;
207 
208 /*
209  * The structure used for the HERMON_IOCTL_PORTS interface.
210  * The number of ports and a buffer large enough for 256
211  * port structures will be supplied by the caller.  The
212  * revision should be set to HERMON_VTS_IOCTL_REVISION.  The
213  * number of ports ("tp_num_ports") is always returned,
214  * regardless of success or failure otherwise.
215  */
216 typedef struct hermon_ports_ioctl_s {
217 	uint_t			ap_revision;
218 	hermon_stat_port_ioctl_t	*ap_ports;
219 	uint8_t			ap_num_ports;
220 } hermon_ports_ioctl_t;
221 
222 /*
223  * These are the status codes that can be returned by the
224  * HERMON_IOCTL_LOOPBACK test.  They are returned as part of
225  * the hermon_loopback_ioctl_t struct (below).
226  */
227 typedef enum {
228 	HERMON_LOOPBACK_SUCCESS,
229 	HERMON_LOOPBACK_INVALID_REVISION,
230 	HERMON_LOOPBACK_INVALID_PORT,
231 	HERMON_LOOPBACK_PROT_DOMAIN_ALLOC_FAIL,
232 	HERMON_LOOPBACK_SEND_BUF_INVALID,
233 	HERMON_LOOPBACK_SEND_BUF_MEM_REGION_ALLOC_FAIL,
234 	HERMON_LOOPBACK_SEND_BUF_COPY_FAIL,
235 	HERMON_LOOPBACK_RECV_BUF_MEM_REGION_ALLOC_FAIL,
236 	HERMON_LOOPBACK_XMIT_SEND_CQ_ALLOC_FAIL,
237 	HERMON_LOOPBACK_XMIT_RECV_CQ_ALLOC_FAIL,
238 	HERMON_LOOPBACK_XMIT_QP_ALLOC_FAIL,
239 	HERMON_LOOPBACK_RECV_SEND_CQ_ALLOC_FAIL,
240 	HERMON_LOOPBACK_RECV_RECV_CQ_ALLOC_FAIL,
241 	HERMON_LOOPBACK_RECV_QP_ALLOC_FAIL,
242 	HERMON_LOOPBACK_XMIT_QP_INIT_FAIL,
243 	HERMON_LOOPBACK_XMIT_QP_RTR_FAIL,
244 	HERMON_LOOPBACK_XMIT_QP_RTS_FAIL,
245 	HERMON_LOOPBACK_RECV_QP_INIT_FAIL,
246 	HERMON_LOOPBACK_RECV_QP_RTR_FAIL,
247 	HERMON_LOOPBACK_RECV_QP_RTS_FAIL,
248 	HERMON_LOOPBACK_WQE_POST_FAIL,
249 	HERMON_LOOPBACK_CQ_POLL_FAIL,
250 	HERMON_LOOPBACK_SEND_RECV_COMPARE_FAIL
251 } hermon_loopback_error_t;
252 
253 /*
254  * The structure used for HERMON_IOCTL_LOOPBACK interface.
255  * It defines the port number, number of iterations, wait duration,
256  * number of retries and the data pattern to be sent.  Upon return,
257  * the driver will supply the number of iterations succesfully
258  * completed, and the kind of failure (if any, along with the failing
259  * data pattern).
260  */
261 typedef struct hermon_loopback_ioctl_s {
262 	uint_t			alb_revision;
263 	caddr_t			alb_send_buf;
264 	caddr_t			alb_fail_buf;
265 	uint_t			alb_buf_sz;
266 	uint_t			alb_num_iter;
267 	uint_t			alb_pass_done;
268 	uint_t			alb_timeout;
269 	hermon_loopback_error_t	alb_error_type;
270 	uint8_t			alb_port_num;
271 	uint8_t			alb_num_retry;
272 } hermon_loopback_ioctl_t;
273 
274 /*
275  * The structure used for the HERMON_IOCTL_INFO interface.  It
276  * includes firmware version, hardware version, accessable
277  * range of adapter DDR memory, and adapter flash memory size.
278  */
279 typedef struct hermon_info_ioctl_s {
280 	uint_t			ai_revision;
281 	hermon_fw_info_ioctl_t	ai_fw_rev;
282 	uint32_t		ai_hw_rev;
283 	uint_t			ai_flash_sz;
284 	uint_t			rsvd1; /* DDR start */
285 	uint_t			rsvd2; /* DDR end   */
286 } hermon_info_ioctl_t;
287 
288 
289 #ifdef __cplusplus
290 }
291 #endif
292 
293 #endif	/* _SYS_IB_ADAPTERS_HERMON_IOCTL_H */
294