summaryrefslogtreecommitdiff
path: root/usr/src/uts/common/sys/ib/adapters/hermon/hermon_ioctl.h
blob: 1660bdb36adcc9c5d8936349c19679b72d6101e6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */

/*
 * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
 * Use is subject to license terms.
 */

#ifndef	_SYS_IB_ADAPTERS_HERMON_IOCTL_H
#define	_SYS_IB_ADAPTERS_HERMON_IOCTL_H

#include <sys/cred.h>

/*
 * hermon_ioctl.h
 *    Contains all of the prototypes, #defines, and structures necessary
 *    for all ioctl access into the driver.  This includes everything
 *    necessary for updating firmware, accessing the hermon flash device,
 *    providing interfaces for VTS.
 */

#ifdef __cplusplus
extern "C" {
#endif

int hermon_ioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp,
    int *rvalp);

/*
 * Enumerated type for the Hermon ioctl() interface types
 */
/*
 * originally, to make a unique set of IOCTLs but now share the actual
 * value w/ tavor & arbel (memfree) to make VTS consistent & simpler
 *
 *	#define	HERMON_IOCTL		('h' << 8)
 */
#define	HERMON_IOCTL		('t' << 8)

#ifdef	DEBUG
typedef enum {
	HERMON_IOCTL_FLASH_READ		= HERMON_IOCTL | 0x00,
	HERMON_IOCTL_FLASH_WRITE		= HERMON_IOCTL | 0x01,
	HERMON_IOCTL_FLASH_ERASE		= HERMON_IOCTL | 0x02,
	HERMON_IOCTL_FLASH_INIT		= HERMON_IOCTL | 0x03,
	HERMON_IOCTL_FLASH_FINI		= HERMON_IOCTL | 0x04,
	HERMON_IOCTL_REG_WRITE		= HERMON_IOCTL | 0x10,
	HERMON_IOCTL_REG_READ		= HERMON_IOCTL | 0x11,
	HERMON_IOCTL_LOOPBACK		= HERMON_IOCTL | 0x20,
	HERMON_IOCTL_INFO			= HERMON_IOCTL | 0x21,
	HERMON_IOCTL_PORTS			= HERMON_IOCTL | 0x22,
	HERMON_IOCTL_DDR_READ		= HERMON_IOCTL | 0x23,
	HERMON_IOCTL_WRITE_BOOT_ADDR	= HERMON_IOCTL | 0x24
} hermon_ioctl_enum_t;
#else
typedef enum {
	HERMON_IOCTL_FLASH_READ		= HERMON_IOCTL | 0x00,
	HERMON_IOCTL_FLASH_WRITE		= HERMON_IOCTL | 0x01,
	HERMON_IOCTL_FLASH_ERASE		= HERMON_IOCTL | 0x02,
	HERMON_IOCTL_FLASH_INIT		= HERMON_IOCTL | 0x03,
	HERMON_IOCTL_FLASH_FINI		= HERMON_IOCTL | 0x04,
	HERMON_IOCTL_LOOPBACK		= HERMON_IOCTL | 0x20,
	HERMON_IOCTL_INFO		= HERMON_IOCTL | 0x21,
	HERMON_IOCTL_PORTS		= HERMON_IOCTL | 0x22,
	HERMON_IOCTL_DDR_READ		= HERMON_IOCTL | 0x23,
	HERMON_IOCTL_WRITE_BOOT_ADDR	= HERMON_IOCTL | 0x24
} hermon_ioctl_enum_t;
#endif	/* DEBUG */

/*
 * Specific operations for each of the flash ioctl interfaces
 */
#define	HERMON_FLASH_READ_SECTOR			0x01
#define	HERMON_FLASH_READ_QUADLET		0x02
#define	HERMON_FLASH_WRITE_SECTOR		0x01
#define	HERMON_FLASH_WRITE_BYTE			0x02
#define	HERMON_FLASH_ERASE_SECTOR		0x01
#define	HERMON_FLASH_ERASE_CHIP			0x02

/*
 * Default values for the flash (overridden by CFI info, if available)
 */
#define	HERMON_FLASH_SECTOR_SZ_DEFAULT		0x10000
#define	HERMON_FLASH_DEVICE_SZ_DEFAULT		0x400000
#define	HERMON_FLASH_SPI_LOG_SECTOR_SIZE		0x10
#define	HERMON_FLASH_SPI_SECTOR_SIZE		0x10000
#define	HERMON_FLASH_SPI_DEVICE_SIZE		0x200000

/*
 * CFI (Common Flash Interface) initialization
 */
#define	HERMON_FLASH_CFI_INIT			0x98

/* For compatability */
#define	HERMON_FLASH_CFI_SIZE			0x4C
#define	HERMON_FLASH_CFI_SIZE_QUADLET		HERMON_FLASH_CFI_SIZE >> 2

/*
 * Expand CFI data size to support the Intel Expanded Command Set.
 */
#define	HERMON_CFI_INFO_SIZE 			0x100
#define	HERMON_CFI_INFO_QSIZE			HERMON_CFI_INFO_SIZE >> 2

/*
 * Mellanox uses two different parallel Flash devices for Hermon
 * HCAs: the AMD AM29LV033C and the Intel 28F320J3C. The AM29LV033C
 * utilizes the AMD Standard CFI command set while the 28F320J3C
 * utliizes the Intel Extended CFI command set. Additionally, serial
 * SPI flash is supported, such as the STMicroelectronics M25Pxx family
 * of SPI Flash parts.
 */
#define	HERMON_FLASH_INTEL_CMDSET		0x0001
#define	HERMON_FLASH_AMD_CMDSET			0x0002
#define	HERMON_FLASH_SPI_CMDSET			0x0003
#define	HERMON_FLASH_UNKNOWN_CMDSET		0XFFFF

/*
 * The firmware version structure used in HERMON_IOCTL_INFO and
 * HERMON_IOCTL_FLASH_INIT interfaces.  The structure consists of major,
 * minor and subminor portions for firmware revision number.
 */
typedef struct hermon_fw_info_ioctl_s {
	uint32_t	afi_maj;
	uint32_t	afi_min;
	uint32_t	afi_sub;
} hermon_fw_info_ioctl_t;

/*
 * structure used for read, write, and erase flash routines
 * Supported fields for each type:
 * read_sector:  af_type, af_sector, af_sector_num
 * read_quadlet: af_type, af_addr, af_quadlet
 * write_sector: af_type, af_sector, af_sector_num
 * write_byte:   af_type, af_addr, af_byte
 * erase_sector: af_type, af_sector_num
 * erase_chip:   af_type
 *
 * The 'tf_sector' field must point to a sector sized portion of memory, as
 * all sector read/write ioctl calls are done as one complete sector only.
 */
typedef struct hermon_flash_ioctl_s {
	uint32_t	af_type;
	caddr_t		af_sector;
	uint32_t	af_sector_num;
	uint32_t	af_addr;
	uint32_t	af_quadlet;
	uint8_t		af_byte;
} hermon_flash_ioctl_t;

/* Structure used for flash init interface */
typedef struct hermon_flash_init_ioctl_s {
	uint32_t		af_hwrev;
	hermon_fw_info_ioctl_t	af_fwrev;
	uint32_t		af_cfi_info[HERMON_FLASH_CFI_SIZE_QUADLET];
	char			af_hwpn[64];
	int			af_pn_len;
} hermon_flash_init_ioctl_t;

/*
 * The structure used for Hermon register read/write interface.
 * The "trg_reg_set" field indicates the register set (the BAR) from which
 * the access is desired (HERMON_CMD_BAR, HERMON_UAR_BAR, or HERMON_DDR_BAR).
 * The "trg_offset" and "trg_data" fields indicate the register and either
 * the destination or source of the data to be read/written.
 */
typedef struct hermon_reg_ioctl_s {
	uint_t		arg_reg_set;
	uint_t		arg_offset;
	uint32_t	arg_data;
} hermon_reg_ioctl_t;


/*
 * Hermon VTS IOCTL revision number.  This revision number is currently
 * expected to be passed in all Hermon VTS ioctl interfaces.
 */
#define	HERMON_VTS_IOCTL_REVISION	1

/*
 * The port structure used in HERMON_IOCTL_PORTS interface.
 * Each port has an associated guid, port number, and IBA-defined
 * logical port state.
 */
typedef struct hermon_stat_port_ioctl_s {
	uint64_t	asp_guid;
	uint32_t	asp_port_num;
	uint32_t	asp_state;
} hermon_stat_port_ioctl_t;

/*
 * The structure used for the HERMON_IOCTL_PORTS interface.
 * The number of ports and a buffer large enough for 256
 * port structures will be supplied by the caller.  The
 * revision should be set to HERMON_VTS_IOCTL_REVISION.  The
 * number of ports ("tp_num_ports") is always returned,
 * regardless of success or failure otherwise.
 */
typedef struct hermon_ports_ioctl_s {
	uint_t			ap_revision;
	hermon_stat_port_ioctl_t	*ap_ports;
	uint8_t			ap_num_ports;
} hermon_ports_ioctl_t;

/*
 * These are the status codes that can be returned by the
 * HERMON_IOCTL_LOOPBACK test.  They are returned as part of
 * the hermon_loopback_ioctl_t struct (below).
 */
typedef enum {
	HERMON_LOOPBACK_SUCCESS,
	HERMON_LOOPBACK_INVALID_REVISION,
	HERMON_LOOPBACK_INVALID_PORT,
	HERMON_LOOPBACK_PROT_DOMAIN_ALLOC_FAIL,
	HERMON_LOOPBACK_SEND_BUF_INVALID,
	HERMON_LOOPBACK_SEND_BUF_MEM_REGION_ALLOC_FAIL,
	HERMON_LOOPBACK_SEND_BUF_COPY_FAIL,
	HERMON_LOOPBACK_RECV_BUF_MEM_REGION_ALLOC_FAIL,
	HERMON_LOOPBACK_XMIT_SEND_CQ_ALLOC_FAIL,
	HERMON_LOOPBACK_XMIT_RECV_CQ_ALLOC_FAIL,
	HERMON_LOOPBACK_XMIT_QP_ALLOC_FAIL,
	HERMON_LOOPBACK_RECV_SEND_CQ_ALLOC_FAIL,
	HERMON_LOOPBACK_RECV_RECV_CQ_ALLOC_FAIL,
	HERMON_LOOPBACK_RECV_QP_ALLOC_FAIL,
	HERMON_LOOPBACK_XMIT_QP_INIT_FAIL,
	HERMON_LOOPBACK_XMIT_QP_RTR_FAIL,
	HERMON_LOOPBACK_XMIT_QP_RTS_FAIL,
	HERMON_LOOPBACK_RECV_QP_INIT_FAIL,
	HERMON_LOOPBACK_RECV_QP_RTR_FAIL,
	HERMON_LOOPBACK_RECV_QP_RTS_FAIL,
	HERMON_LOOPBACK_WQE_POST_FAIL,
	HERMON_LOOPBACK_CQ_POLL_FAIL,
	HERMON_LOOPBACK_SEND_RECV_COMPARE_FAIL
} hermon_loopback_error_t;

/*
 * The structure used for HERMON_IOCTL_LOOPBACK interface.
 * It defines the port number, number of iterations, wait duration,
 * number of retries and the data pattern to be sent.  Upon return,
 * the driver will supply the number of iterations succesfully
 * completed, and the kind of failure (if any, along with the failing
 * data pattern).
 */
typedef struct hermon_loopback_ioctl_s {
	uint_t			alb_revision;
	caddr_t			alb_send_buf;
	caddr_t			alb_fail_buf;
	uint_t			alb_buf_sz;
	uint_t			alb_num_iter;
	uint_t			alb_pass_done;
	uint_t			alb_timeout;
	hermon_loopback_error_t	alb_error_type;
	uint8_t			alb_port_num;
	uint8_t			alb_num_retry;
} hermon_loopback_ioctl_t;

/*
 * The structure used for the HERMON_IOCTL_INFO interface.  It
 * includes firmware version, hardware version, accessable
 * range of adapter DDR memory, and adapter flash memory size.
 */
typedef struct hermon_info_ioctl_s {
	uint_t			ai_revision;
	hermon_fw_info_ioctl_t	ai_fw_rev;
	uint32_t		ai_hw_rev;
	uint_t			ai_flash_sz;
	uint_t			rsvd1; /* DDR start */
	uint_t			rsvd2; /* DDR end   */
} hermon_info_ioctl_t;


#ifdef __cplusplus
}
#endif

#endif	/* _SYS_IB_ADAPTERS_HERMON_IOCTL_H */