xref: /illumos-gate/usr/src/uts/common/io/comstar/port/qlt/qlt.h (revision 0d166b18feda26f6f45f5be1c0c8c5e539b90e6c)
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 2009 QLogic Corporation.  All rights reserved.
24  * Use is subject to license terms.
25  */
26 
27 /*
28  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
29  * Use is subject to license terms.
30  */
31 
32 #ifndef	_QLT_H
33 #define	_QLT_H
34 
35 #include <stmf_defines.h>
36 #include <qlt_regs.h>
37 
38 #ifdef	__cplusplus
39 extern "C" {
40 #endif
41 
42 /*
43  * Qlogic logging
44  */
45 extern int enable_extended_logging;
46 
47 /*
48  * Caution: 1) LOG will be available in debug/non-debug mode
49  *	    2) Anything which can potentially flood the log should be under
50  *	       extended logging, and use QLT_EXT_LOG.
51  *	    3) Don't use QLT_EXT_LOG in performance-critical code path, such
52  *	       as normal SCSI I/O code path. It could hurt system performance.
53  *	    4) Use kmdb to change enable_extened_logging in the fly to adjust
54  *	       tracing
55  */
56 #define	QLT_EXT_LOG(log_ident, ...)	\
57 		if (enable_extended_logging) {	\
58 			stmf_trace(log_ident, __VA_ARGS__);	\
59 		}
60 
61 #define	QLT_LOG(log_ident, ...)	\
62 	stmf_trace(log_ident, __VA_ARGS__)
63 
64 /*
65  * Error codes. FSC stands for Failure sub code.
66  */
67 #define	QLT_FAILURE			FCT_FCA_FAILURE
68 #define	QLT_SUCCESS			FCT_SUCCESS
69 #define	QLT_FSC(x)			((uint64_t)(x) << 40)
70 #define	QLT_DMA_STUCK			(QLT_FAILURE | QLT_FSC(1))
71 #define	QLT_MAILBOX_STUCK		(QLT_FAILURE | QLT_FSC(2))
72 #define	QLT_ROM_STUCK			(QLT_FAILURE | QLT_FSC(3))
73 #define	QLT_UNEXPECTED_RESPONSE		(QLT_FAILURE | QLT_FSC(4))
74 #define	QLT_MBOX_FAILED			(QLT_FAILURE | QLT_FSC(5))
75 #define	QLT_MBOX_NOT_INITIALIZED	(QLT_FAILURE | QLT_FSC(6))
76 #define	QLT_MBOX_BUSY			(QLT_FAILURE | QLT_FSC(7))
77 #define	QLT_MBOX_ABORTED		(QLT_FAILURE | QLT_FSC(8))
78 #define	QLT_MBOX_TIMEOUT		(QLT_FAILURE | QLT_FSC(9))
79 #define	QLT_RESP_TIMEOUT		(QLT_FAILURE | QLT_FSC(10))
80 #define	QLT_FLASH_TIMEOUT		(QLT_FAILURE | QLT_FSC(11))
81 #define	QLT_FLASH_ACCESS_ERROR		(QLT_FAILURE | QLT_FSC(12))
82 #define	QLT_BAD_NVRAM_DATA		(QLT_FAILURE | QLT_FSC(13))
83 #define	QLT_FIRMWARE_ERROR_CODE		(QLT_FAILURE | QLT_FSC(14))
84 
85 #define	QLT_FIRMWARE_ERROR(s, c1, c2)	(QLT_FIRMWARE_ERROR_CODE | \
86 	(((uint64_t)s) << 32) | (((uint64_t)c1) << 24) | ((uint64_t)c2))
87 
88 extern uint32_t fw2400_code01[];
89 extern uint32_t fw2400_length01;
90 extern uint32_t fw2400_addr01;
91 extern uint32_t fw2400_code02[];
92 extern uint32_t fw2400_length02;
93 extern uint32_t fw2400_addr02;
94 
95 extern uint32_t fw2500_code01[];
96 extern uint32_t fw2500_length01;
97 extern uint32_t fw2500_addr01;
98 extern uint32_t fw2500_code02[];
99 extern uint32_t fw2500_length02;
100 extern uint32_t fw2500_addr02;
101 
102 extern uint32_t fw8100_code01[];
103 extern uint32_t fw8100_length01;
104 extern uint32_t fw8100_addr01;
105 extern uint32_t fw8100_code02[];
106 extern uint32_t fw8100_length02;
107 extern uint32_t fw8100_addr02;
108 
109 typedef enum {
110 	MBOX_STATE_UNKNOWN = 0,
111 	MBOX_STATE_READY,
112 	MBOX_STATE_CMD_RUNNING,
113 	MBOX_STATE_CMD_DONE
114 } mbox_state_t;
115 
116 /*
117  * ISP mailbox commands
118  */
119 #define	MBC_LOAD_RAM			0x01	/* Load RAM. */
120 #define	MBC_EXECUTE_FIRMWARE		0x02	/* Execute firmware. */
121 #define	MBC_DUMP_RAM			0x03	/* Dump RAM. */
122 #define	MBC_WRITE_RAM_WORD		0x04	/* Write RAM word. */
123 #define	MBC_READ_RAM_WORD		0x05	/* Read RAM word. */
124 #define	MBC_MAILBOX_REGISTER_TEST	0x06	/* Wrap incoming mailboxes */
125 #define	MBC_VERIFY_CHECKSUM		0x07	/* Verify checksum. */
126 #define	MBC_ABOUT_FIRMWARE		0x08	/* About Firmware. */
127 #define	MBC_DUMP_RISC_RAM		0x0a	/* Dump RISC RAM command. */
128 #define	MBC_LOAD_RAM_EXTENDED		0x0b	/* Load RAM extended. */
129 #define	MBC_DUMP_RAM_EXTENDED		0x0c	/* Dump RAM extended. */
130 #define	MBC_WRITE_RAM_EXTENDED		0x0d	/* Write RAM word. */
131 #define	MBC_READ_RAM_EXTENDED		0x0f	/* Read RAM extended. */
132 #define	MBC_SERDES_TRANSMIT_PARAMETERS	0x10	/* Serdes Xmit Parameters */
133 #define	MBC_2300_EXECUTE_IOCB		0x12	/* ISP2300 Execute IOCB cmd */
134 #define	MBC_GET_IO_STATUS		0x12	/* ISP2422 Get I/O Status */
135 #define	MBC_STOP_FIRMWARE		0x14	/* Stop firmware */
136 #define	MBC_ABORT_COMMAND_IOCB		0x15	/* Abort IOCB command. */
137 #define	MBC_ABORT_DEVICE		0x16	/* Abort device (ID/LUN). */
138 #define	MBC_ABORT_TARGET		0x17	/* Abort target (ID). */
139 #define	MBC_RESET			0x18	/* Target reset. */
140 #define	MBC_XMIT_PARM			0x19	/* Change default xmit parms */
141 #define	MBC_PORT_PARAM			0x1a	/* Get/set port speed parms */
142 #define	MBC_GET_ID			0x20	/* Get loop id of ISP2200. */
143 #define	MBC_GET_TIMEOUT_PARAMETERS	0x22	/* Get Timeout Parameters. */
144 #define	MBC_TRACE_CONTROL		0x27	/* Trace control. */
145 #define	MBC_GET_FIRMWARE_OPTIONS	0x28	/* Get firmware options */
146 #define	MBC_READ_SFP			0x31	/* Read SFP. */
147 
148 #define	MBC_SET_ADDITIONAL_FIRMWARE_OPT	0x38	/* set firmware options */
149 
150 #define	OPT_PUREX_ENABLE			(BIT_10)
151 
152 #define	MBC_RESET_MENLO			0x3a	/* Reset Menlo. */
153 #define	MBC_RESTART_MPI			0x3d	/* Restart MPI. */
154 #define	MBC_FLASH_ACCESS		0x3e	/* Flash Access Control */
155 #define	MBC_LOOP_PORT_BYPASS		0x40	/* Loop Port Bypass. */
156 #define	MBC_LOOP_PORT_ENABLE		0x41	/* Loop Port Enable. */
157 #define	MBC_GET_RESOURCE_COUNTS		0x42	/* Get Resource Counts. */
158 #define	MBC_NON_PARTICIPATE		0x43	/* Non-Participating Mode. */
159 #define	MBC_ECHO			0x44	/* ELS ECHO */
160 #define	MBC_DIAGNOSTIC_LOOP_BACK	0x45	/* Diagnostic loop back. */
161 #define	MBC_ONLINE_SELF_TEST		0x46	/* Online self-test. */
162 #define	MBC_ENHANCED_GET_PORT_DATABASE	0x47	/* Get Port Database + login */
163 #define	MBC_INITIALIZE_MULTI_ID_FW	0x48	/* Initialize multi-id fw */
164 #define	MBC_GET_DCBX_PARAMS		0x51	/* Get DCBX parameters */
165 #define	MBC_RESET_LINK_STATUS		0x52	/* Reset Link Error Status */
166 #define	MBC_EXECUTE_IOCB		0x54	/* 64 Bit Execute IOCB cmd. */
167 #define	MBC_SEND_RNID_ELS		0x57	/* Send RNID ELS request */
168 
169 #define	MBC_SET_PARAMETERS		0x59	/* Set parameters */
170 
171 #define	RNID_PARAMS_DF_FMT		0x00
172 #define	RNID_PARAMS_E0_FMT		0x01
173 #define	PUREX_ELS_CMDS			0x05
174 #define	FLOGI_PARAMS			0x06
175 
176 #define	PARAM_TYPE_FIELD_MASK		0xff
177 #define	PARAM_TYPE_FIELD_SHIFT		8
178 #define	PARAM_TYPE(type)		((type & PARAM_TYPE_FIELD_MASK) << \
179 					    PARAM_TYPE_FIELD_SHIFT)
180 
181 #define	MBC_GET_PARAMETERS		0x5a	/* Get RNID parameters */
182 #define	MBC_DATA_RATE			0x5d	/* Data Rate */
183 #define	MBC_INITIALIZE_FIRMWARE		0x60	/* Initialize firmware */
184 #define	MBC_INITIATE_LIP		0x62	/* Initiate LIP */
185 #define	MBC_GET_FC_AL_POSITION_MAP	0x63	/* Get FC_AL Position Map. */
186 #define	MBC_GET_PORT_DATABASE		0x64	/* Get Port Database. */
187 #define	MBC_CLEAR_ACA			0x65	/* Clear ACA. */
188 #define	MBC_TARGET_RESET		0x66	/* Target Reset. */
189 #define	MBC_CLEAR_TASK_SET		0x67	/* Clear Task Set. */
190 #define	MBC_ABORT_TASK_SET		0x68	/* Abort Task Set. */
191 #define	MBC_GET_FIRMWARE_STATE		0x69	/* Get firmware state. */
192 #define	MBC_GET_PORT_NAME		0x6a	/* Get port name. */
193 #define	MBC_GET_LINK_STATUS		0x6b	/* Get Link Status. */
194 #define	MBC_LIP_RESET			0x6c	/* LIP reset. */
195 #define	MBC_GET_STATUS_COUNTS		0x6d	/* Get Link Statistics and */
196 						/* Private Data Counts */
197 #define	MBC_SEND_SNS_COMMAND		0x6e	/* Send Simple Name Server */
198 #define	MBC_LOGIN_FABRIC_PORT		0x6f	/* Login fabric port. */
199 #define	MBC_SEND_CHANGE_REQUEST		0x70	/* Send Change Request. */
200 #define	MBC_LOGOUT_FABRIC_PORT		0x71	/* Logout fabric port. */
201 #define	MBC_LIP_FULL_LOGIN		0x72	/* Full login LIP. */
202 #define	MBC_LOGIN_LOOP_PORT		0x74	/* Login Loop Port. */
203 #define	MBC_PORT_NODE_NAME_LIST		0x75	/* Get port/node name list */
204 #define	MBC_INITIALIZE_IP		0x77	/* Initialize IP */
205 #define	MBC_SEND_FARP_REQ_COMMAND	0x78	/* FARP request. */
206 #define	MBC_UNLOAD_IP			0x79	/* Unload IP */
207 #define	MBC_GET_XGMAC_STATS		0x7a	/* Get XGMAC Statistics. */
208 #define	MBC_GET_ID_LIST			0x7c	/* Get port ID list. */
209 #define	MBC_SEND_LFA_COMMAND		0x7d	/* Send Loop Fabric Address */
210 #define	MBC_LUN_RESET			0x7e	/* Send Task mgmt LUN reset */
211 #define	MBC_IDC_REQUEST			0x100	/* IDC request */
212 #define	MBC_IDC_ACK			0x101	/* IDC acknowledge */
213 #define	MBC_IDC_TIME_EXTEND		0x102	/* IDC extend time */
214 #define	MBC_PORT_RESET			0x120	/* Port Reset */
215 #define	MBC_SET_PORT_CONFIG		0x122	/* Set port configuration */
216 #define	MBC_GET_PORT_CONFIG		0x123	/* Get port configuration */
217 
218 #define	IOCB_SIZE		64
219 
220 /*
221  * These should not be constents but should be obtained from fw.
222  */
223 #define	QLT_MAX_LOGINS	2048
224 #define	QLT_MAX_XCHGES	2048
225 
226 #define	MAX_MBOXES	32
227 #define	MBOX_TIMEOUT	(2*1000*1000)
228 #define	DEREG_RP_TIMEOUT	(2*1000*1000)
229 
230 typedef struct {
231 	uint16_t	to_fw[MAX_MBOXES];
232 	uint32_t	to_fw_mask;
233 	uint16_t	from_fw[MAX_MBOXES];
234 	uint32_t	from_fw_mask;
235 	stmf_data_buf_t *dbuf;
236 } mbox_cmd_t;
237 
238 typedef struct qlt_abts_cmd {
239 	uint8_t		buf[IOCB_SIZE];
240 } qlt_abts_cmd_t;
241 
242 struct qlt_dmem_bucket;
243 
244 #define	QLT_INTR_FIXED	0x1
245 #define	QLT_INTR_MSI	0x2
246 #define	QLT_INTR_MSIX	0x4
247 
248 typedef struct qlt_el_trace_desc {
249 	kmutex_t	mutex;
250 	uint16_t	next;
251 	uint32_t	trace_buffer_size;
252 	char		*trace_buffer;
253 } qlt_el_trace_desc_t;
254 
255 typedef struct qlt_state {
256 	dev_info_t		*dip;
257 	char			qlt_minor_name[16];
258 	char			qlt_port_alias[16];
259 	fct_local_port_t	*qlt_port;
260 	struct qlt_dmem_bucket	**dmem_buckets;
261 
262 	int			instance;
263 	uint8_t			qlt_state:7,
264 				qlt_state_not_acked:1;
265 	uint8_t			qlt_intr_enabled:1,
266 				qlt_25xx_chip:1,
267 				qlt_stay_offline:1,
268 				qlt_link_up,
269 				qlt_81xx_chip:1,
270 				qlt_rsvd1:3;
271 	uint8_t			cur_topology;
272 
273 	/* Registers */
274 	caddr_t		regs;
275 	ddi_acc_handle_t regs_acc_handle;
276 	ddi_acc_handle_t pcicfg_acc_handle;
277 
278 	/* Interrupt stuff */
279 	kmutex_t		intr_lock;	/* Only used by intr routine */
280 	int			intr_sneak_counter;
281 	ddi_intr_handle_t	*htable;
282 	int			intr_size;
283 	int			intr_cnt;
284 	uint_t			intr_pri;
285 	int			intr_cap;
286 	int			intr_flags;
287 
288 	/* Queues */
289 	ddi_dma_handle_t queue_mem_dma_handle;
290 	ddi_acc_handle_t queue_mem_acc_handle;
291 	caddr_t		 queue_mem_ptr;
292 	ddi_dma_cookie_t queue_mem_cookie;
293 
294 	kmutex_t	req_lock;
295 	caddr_t		req_ptr;
296 	uint32_t	req_ndx_to_fw;
297 	uint32_t	req_ndx_from_fw;
298 	uint32_t	req_available;
299 
300 	caddr_t		resp_ptr;
301 	uint32_t	resp_ndx_to_fw;
302 	uint32_t	resp_ndx_from_fw;
303 
304 	kmutex_t	preq_lock;
305 	caddr_t		preq_ptr;
306 	uint32_t	preq_ndx_to_fw;
307 	uint32_t	preq_ndx_from_fw;
308 
309 	kcondvar_t	rp_dereg_cv; /* for deregister cmd */
310 	uint32_t	rp_id_in_dereg; /* remote port in deregistering */
311 	fct_status_t	rp_dereg_status;
312 
313 	caddr_t		atio_ptr;
314 	uint16_t	atio_ndx_to_fw;
315 	uint16_t	atio_ndx_from_fw;
316 
317 	kmutex_t	dma_mem_lock;
318 
319 	/* MailBox data */
320 	kmutex_t	mbox_lock;
321 	kcondvar_t	mbox_cv;
322 	mbox_state_t	mbox_io_state;
323 	mbox_cmd_t	*mcp;
324 	qlt_nvram_t	*nvram;
325 
326 	uint8_t		link_speed;	/* Cached from intr routine */
327 	uint16_t	fw_major;
328 	uint16_t	fw_minor;
329 	uint16_t	fw_subminor;
330 	uint16_t	fw_endaddrlo;
331 	uint16_t	fw_endaddrhi;
332 	uint16_t	fw_attr;
333 
334 	uint32_t	fw_addr01;
335 	uint32_t	fw_length01;
336 	uint32_t	*fw_code01;
337 	uint32_t	fw_addr02;
338 	uint32_t	fw_length02;
339 	uint32_t	*fw_code02;
340 
341 	uint32_t	qlt_ioctl_flags;
342 	kmutex_t	qlt_ioctl_lock;
343 	caddr_t		qlt_fwdump_buf;	/* FWDUMP will use ioctl flags/lock */
344 	uint32_t	qlt_change_state_flags;	/* Cached for ACK handling */
345 
346 	qlt_el_trace_desc_t	*el_trace_desc;
347 
348 	/* temp ref & stat counters */
349 	uint32_t	qlt_bucketcnt[5];	/* element 0 = 2k */
350 	uint64_t	qlt_bufref[5];		/* element 0 = 2k */
351 	uint64_t	qlt_nullbufref[5];	/* element 0 = 2k */
352 	uint64_t	qlt_bumpbucket;		/* bigger buffer supplied */
353 
354 } qlt_state_t;
355 
356 /*
357  * FWDUMP flags (part of IOCTL flags)
358  */
359 #define	QLT_FWDUMP_INPROGRESS		0x0100	/* if it's dumping now */
360 #define	QLT_FWDUMP_TRIGGERED_BY_USER	0x0200	/* if users triggered it */
361 #define	QLT_FWDUMP_FETCHED_BY_USER	0x0400	/* if users have viewed it */
362 #define	QLT_FWDUMP_ISVALID		0x0800
363 
364 /*
365  * IOCTL supporting stuff
366  */
367 #define	QLT_IOCTL_FLAG_MASK		0xFF
368 #define	QLT_IOCTL_FLAG_IDLE		0x00
369 #define	QLT_IOCTL_FLAG_OPEN		0x01
370 #define	QLT_IOCTL_FLAG_EXCL		0x02
371 
372 typedef struct qlt_cmd {
373 	stmf_data_buf_t	*dbuf;		/* dbuf with handle 0 for SCSI cmds */
374 	stmf_data_buf_t	*dbuf_rsp_iu;	/* dbuf for possible FCP_RSP IU */
375 	uint32_t	fw_xchg_addr;
376 	uint16_t	flags;
377 	union {
378 		uint16_t	resp_offset;
379 		uint8_t		atio_byte3;
380 	} param;
381 } qlt_cmd_t;
382 
383 /*
384  * cmd flags
385  */
386 #define	QLT_CMD_ABORTING		1
387 #define	QLT_CMD_ABORTED			2
388 #define	QLT_CMD_TYPE_SOLICITED		4
389 
390 typedef struct {
391 	int	dummy;
392 } qlt_remote_port_t;
393 
394 #define	REQUEST_QUEUE_ENTRIES	2048
395 #define	RESPONSE_QUEUE_ENTRIES	2048
396 #define	ATIO_QUEUE_ENTRIES	2048
397 #define	PRIORITY_QUEUE_ENTRIES	128
398 
399 #define	REQUEST_QUEUE_OFFSET	0
400 #define	RESPONSE_QUEUE_OFFSET	(REQUEST_QUEUE_OFFSET + \
401 				    (REQUEST_QUEUE_ENTRIES * IOCB_SIZE))
402 #define	ATIO_QUEUE_OFFSET	(RESPONSE_QUEUE_OFFSET + \
403 				    (RESPONSE_QUEUE_ENTRIES * IOCB_SIZE))
404 #define	PRIORITY_QUEUE_OFFSET	(ATIO_QUEUE_OFFSET + \
405 				    (ATIO_QUEUE_ENTRIES * IOCB_SIZE))
406 #define	MBOX_DMA_MEM_SIZE	4096
407 #define	MBOX_DMA_MEM_OFFSET		(PRIORITY_QUEUE_OFFSET + \
408 				    (PRIORITY_QUEUE_ENTRIES * IOCB_SIZE))
409 #define	TOTAL_DMA_MEM_SIZE	(MBOX_DMA_MEM_OFFSET + MBOX_DMA_MEM_SIZE)
410 
411 #define	QLT_MAX_ITERATIONS_PER_INTR	32
412 
413 #define	REG_RD16(qlt, addr) \
414 	ddi_get16(qlt->regs_acc_handle, (uint16_t *)(qlt->regs + addr))
415 #define	REG_RD32(qlt, addr) \
416 	ddi_get32(qlt->regs_acc_handle, (uint32_t *)(qlt->regs + addr))
417 #define	REG_WR16(qlt, addr, data) \
418 	ddi_put16(qlt->regs_acc_handle, (uint16_t *)(qlt->regs + addr), \
419 	(uint16_t)(data))
420 #define	REG_WR32(qlt, addr, data) \
421 	ddi_put32(qlt->regs_acc_handle, (uint32_t *)(qlt->regs + addr), \
422 	(uint32_t)(data))
423 #define	PCICFG_RD16(qlt, addr) \
424 	pci_config_get16(qlt->pcicfg_acc_handle, (off_t)(addr))
425 #define	PCICFG_RD32(qlt, addr) \
426 	pci_config_get32(qlt->pcicfg_acc_handle, (off_t)(addr))
427 #define	PCICFG_WR16(qlt, addr, data) \
428 	pci_config_put16(qlt->pcicfg_acc_handle, (off_t)(addr), \
429 		(uint16_t)(data))
430 #define	QMEM_RD16(qlt, addr) \
431 	ddi_get16(qlt->queue_mem_acc_handle, (uint16_t *)(addr))
432 #define	DMEM_RD16(qlt, addr) LE_16((uint16_t)(*((uint16_t *)(addr))))
433 #define	QMEM_RD32(qlt, addr) \
434 	ddi_get32(qlt->queue_mem_acc_handle, (uint32_t *)(addr))
435 #define	DMEM_RD32(qlt, addr) LE_32((uint32_t)(*((uint32_t *)(addr))))
436 /*
437  * #define	QMEM_RD64(qlt, addr) \
438  *	ddi_get64(qlt->queue_mem_acc_handle, (uint64_t *)(addr))
439  */
440 #define	QMEM_WR16(qlt, addr, data) \
441 	ddi_put16(qlt->queue_mem_acc_handle, (uint16_t *)(addr), \
442 	(uint16_t)(data))
443 #define	DMEM_WR16(qlt, addr, data) (*((uint16_t *)(addr)) = \
444 	(uint16_t)LE_16((uint16_t)(data)))
445 #define	QMEM_WR32(qlt, addr, data) \
446 	ddi_put32(qlt->queue_mem_acc_handle, (uint32_t *)(addr), \
447 	(uint32_t)(data))
448 #define	DMEM_WR32(qlt, addr, data) (*((uint32_t *)(addr)) = \
449 						LE_32((uint32_t)(data)))
450 
451 /*
452  * [QD]MEM is always little endian so the [QD]MEM_WR64 macro works for
453  * both sparc and x86.
454  */
455 #define	QMEM_WR64(qlt, addr, data) \
456 	QMEM_WR32(qlt, addr, (data & 0xffffffff)), \
457 	QMEM_WR32(qlt, (addr)+4, ((uint64_t)data) >> 32)
458 
459 #define	DMEM_WR64(qlt, addr, data) \
460 	DMEM_WR32(qlt, addr, (data & 0xffffffff)), \
461 	DMEM_WR32(qlt, (addr)+4, ((uint64_t)data) >> 32)
462 
463 /*
464  * Structure used to associate values with strings which describe them.
465  */
466 typedef struct string_table_entry {
467 	uint32_t value;
468 	char    *string;
469 } string_table_t;
470 
471 char *prop_text(int prop_status);
472 char *value2string(string_table_t *entry, int value, int delimiter);
473 
474 #define	PROP_STATUS_DELIMITER	((uint32_t)0xFFFF)
475 
476 #define	DDI_PROP_STATUS()					\
477 {								\
478 	{DDI_PROP_SUCCESS, "DDI_PROP_SUCCESS"},			\
479 	{DDI_PROP_NOT_FOUND, "DDI_PROP_NOT_FOUND"},		\
480 	{DDI_PROP_UNDEFINED, "DDI_PROP_UNDEFINED"},		\
481 	{DDI_PROP_NO_MEMORY, "DDI_PROP_NO_MEMORY"},		\
482 	{DDI_PROP_INVAL_ARG, "DDI_PROP_INVAL_ARG"},		\
483 	{DDI_PROP_BUF_TOO_SMALL, "DDI_PROP_BUF_TOO_SMALL"},	\
484 	{DDI_PROP_CANNOT_DECODE, "DDI_PROP_CANNOT_DECODE"},	\
485 	{DDI_PROP_CANNOT_ENCODE, "DDI_PROP_CANNOT_ENCODE"},	\
486 	{DDI_PROP_END_OF_DATA, "DDI_PROP_END_OF_DATA"},		\
487 	{PROP_STATUS_DELIMITER, "DDI_PROP_UNKNOWN"}		\
488 }
489 
490 #ifndef TRUE
491 #define	TRUE	B_TRUE
492 #endif
493 
494 #ifndef FALSE
495 #define	FALSE	B_FALSE
496 #endif
497 
498 /* Little endian machine correction defines. */
499 #ifdef _LITTLE_ENDIAN
500 #define	LITTLE_ENDIAN_16(x)
501 #define	LITTLE_ENDIAN_24(x)
502 #define	LITTLE_ENDIAN_32(x)
503 #define	LITTLE_ENDIAN_64(x)
504 #define	LITTLE_ENDIAN(bp, bytes)
505 #define	BIG_ENDIAN_16(x)	qlt_chg_endian((uint8_t *)x, 2)
506 #define	BIG_ENDIAN_24(x)	qlt_chg_endian((uint8_t *)x, 3)
507 #define	BIG_ENDIAN_32(x)	qlt_chg_endian((uint8_t *)x, 4)
508 #define	BIG_ENDIAN_64(x)	qlt_chg_endian((uint8_t *)x, 8)
509 #define	BIG_ENDIAN(bp, bytes)	qlt_chg_endian((uint8_t *)bp, bytes)
510 #endif /* _LITTLE_ENDIAN */
511 
512 /* Big endian machine correction defines. */
513 #ifdef _BIG_ENDIAN
514 #define	LITTLE_ENDIAN_16(x)		qlt_chg_endian((uint8_t *)x, 2)
515 #define	LITTLE_ENDIAN_24(x)		qlt_chg_endian((uint8_t *)x, 3)
516 #define	LITTLE_ENDIAN_32(x)		qlt_chg_endian((uint8_t *)x, 4)
517 #define	LITTLE_ENDIAN_64(x)		qlt_chg_endian((uint8_t *)x, 8)
518 #define	LITTLE_ENDIAN(bp, bytes)	qlt_chg_endian((uint8_t *)bp, bytes)
519 #define	BIG_ENDIAN_16(x)
520 #define	BIG_ENDIAN_24(x)
521 #define	BIG_ENDIAN_32(x)
522 #define	BIG_ENDIAN_64(x)
523 #define	BIG_ENDIAN(bp, bytes)
524 #endif /* _BIG_ENDIAN */
525 
526 #define	LSB(x)		(uint8_t)(x)
527 #define	MSB(x)		(uint8_t)((uint16_t)(x) >> 8)
528 #define	MSW(x)		(uint16_t)((uint32_t)(x) >> 16)
529 #define	LSW(x)		(uint16_t)(x)
530 #define	LSD(x)		(uint32_t)(x)
531 #define	MSD(x)		(uint32_t)((uint64_t)(x) >> 32)
532 
533 void	qlt_chg_endian(uint8_t *, size_t);
534 
535 void qlt_el_msg(qlt_state_t *qlt, const char *fn, int ce, ...);
536 void qlt_dump_el_trace_buffer(qlt_state_t *qlt);
537 #define	EL(qlt, ...) 	qlt_el_msg(qlt, __func__, CE_CONT, __VA_ARGS__);
538 #define	EL_TRACE_BUF_SIZE	8192
539 #define	EL_BUFFER_RESERVE	256
540 #define	DEBUG_STK_DEPTH		24
541 #define	EL_TRACE_BUF_SIZE	8192
542 
543 #ifdef	__cplusplus
544 }
545 #endif
546 
547 #endif /* _QLT_H */
548