xref: /freebsd/sys/dev/smartpqi/smartpqi_defines.h (revision 7ea28254ec5376b5deb86c136e1838d0134dbb22)
11e66f787SSean Bruno /*-
2*7ea28254SJohn Hall  * Copyright 2016-2023 Microchip Technology, Inc. and/or its subsidiaries.
31e66f787SSean Bruno  *
41e66f787SSean Bruno  * Redistribution and use in source and binary forms, with or without
51e66f787SSean Bruno  * modification, are permitted provided that the following conditions
61e66f787SSean Bruno  * are met:
71e66f787SSean Bruno  * 1. Redistributions of source code must retain the above copyright
81e66f787SSean Bruno  *    notice, this list of conditions and the following disclaimer.
91e66f787SSean Bruno  * 2. Redistributions in binary form must reproduce the above copyright
101e66f787SSean Bruno  *    notice, this list of conditions and the following disclaimer in the
111e66f787SSean Bruno  *    documentation and/or other materials provided with the distribution.
121e66f787SSean Bruno  *
131e66f787SSean Bruno  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
141e66f787SSean Bruno  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
151e66f787SSean Bruno  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
161e66f787SSean Bruno  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
171e66f787SSean Bruno  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
181e66f787SSean Bruno  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
191e66f787SSean Bruno  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
201e66f787SSean Bruno  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
211e66f787SSean Bruno  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
221e66f787SSean Bruno  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
231e66f787SSean Bruno  * SUCH DAMAGE.
241e66f787SSean Bruno  */
251e66f787SSean Bruno 
261e66f787SSean Bruno 
271e66f787SSean Bruno #ifndef _PQI_DEFINES_H
281e66f787SSean Bruno #define _PQI_DEFINES_H
291e66f787SSean Bruno 
30*7ea28254SJohn Hall #define SIS_POLL_WAIT
31*7ea28254SJohn Hall #define DEVICE_HINT
32*7ea28254SJohn Hall 
33*7ea28254SJohn Hall #ifndef CT_ASSERT
34*7ea28254SJohn Hall /* If the OS hasn't specified a preferred compile time assert, create one */
35*7ea28254SJohn Hall #if !defined(__C_ASSERT__)
36*7ea28254SJohn Hall   #define CT_ASSERT(e)  extern char __assert_test_case[1 - (2*(!(e)))]
37*7ea28254SJohn Hall #else
38*7ea28254SJohn Hall   #define CT_ASSERT(e)  typedef char __C_ASSERT__[(e)?1:-1]
39*7ea28254SJohn Hall #endif
40*7ea28254SJohn Hall #endif
411e66f787SSean Bruno #define PQI_STATUS_FAILURE			-1
421e66f787SSean Bruno #define PQI_STATUS_TIMEOUT			-2
431e66f787SSean Bruno #define PQI_STATUS_QFULL			-3
441e66f787SSean Bruno #define PQI_STATUS_SUCCESS			0
451e66f787SSean Bruno 
46*7ea28254SJohn Hall #define BITS_PER_BYTE 8
47*7ea28254SJohn Hall #define PQI_VENDOR_GENERAL_CONFIG_TABLE_UPDATE	0
48*7ea28254SJohn Hall #define PQI_VENDOR_GENERAL_HOST_MEMORY_UPDATE	1
49*7ea28254SJohn Hall #define PQI_REQUEST_HEADER_LENGTH				4
50*7ea28254SJohn Hall 
519fac68fcSPAPANI SRIKANTH /* Maximum timeout for internal command completion */
529fac68fcSPAPANI SRIKANTH #define TIMEOUT_INFINITE				((uint32_t) (-1))
539fac68fcSPAPANI SRIKANTH #define PQISRC_CMD_TIMEOUT				TIMEOUT_INFINITE
549fac68fcSPAPANI SRIKANTH #define PQISRC_PASSTHROUGH_CMD_TIMEOUT	PQISRC_CMD_TIMEOUT
559fac68fcSPAPANI SRIKANTH /* Delay in milli seconds */
569fac68fcSPAPANI SRIKANTH #define PQISRC_TMF_TIMEOUT				(OS_TMF_TIMEOUT_SEC * 1000)
579fac68fcSPAPANI SRIKANTH /* Delay in micro seconds */
589fac68fcSPAPANI SRIKANTH #define PQISRC_PENDING_IO_TIMEOUT_USEC		30000000 /* 30 seconds */
599fac68fcSPAPANI SRIKANTH 
609fac68fcSPAPANI SRIKANTH /* If want to disable atomic operations on device active io, then set to zero */
619fac68fcSPAPANI SRIKANTH #define PQISRC_DEVICE_IO_COUNTER		1
621e66f787SSean Bruno 
63*7ea28254SJohn Hall /* #define SHARE_EVENT_QUEUE_FOR_IO		1 */
64*7ea28254SJohn Hall 
651e66f787SSean Bruno #define	INVALID_ELEM				0xffff
661e66f787SSean Bruno #ifndef MIN
671e66f787SSean Bruno #define MIN(a,b)                                ((a) < (b) ? (a) : (b))
681e66f787SSean Bruno #endif
691e66f787SSean Bruno 
701e66f787SSean Bruno #ifndef MAX
711e66f787SSean Bruno #define MAX(a,b)                                ((a) > (b) ? (a) : (b))
721e66f787SSean Bruno #endif
731e66f787SSean Bruno 
74*7ea28254SJohn Hall /* defines for stream detection */
75*7ea28254SJohn Hall #define TICKS ticks
76*7ea28254SJohn Hall 
77*7ea28254SJohn Hall #ifndef INT_MAX
78*7ea28254SJohn Hall #define INT_MAX 0x7FFFFFFF
79*7ea28254SJohn Hall #endif
80*7ea28254SJohn Hall 
81*7ea28254SJohn Hall #define PQISRC_ROUND_UP(x, y)          (((x) + (y) - 1) / (y) * (y))
82*7ea28254SJohn Hall #define PQISRC_ROUND_DOWN(x, y)        (((x) / (y)) * (y))
831e66f787SSean Bruno #define PQISRC_DIV_ROUND_UP(x, y)      (((x) + (y) - 1) / (y))
841e66f787SSean Bruno 
85*7ea28254SJohn Hall #if !defined(offsetofend)
86*7ea28254SJohn Hall #define offsetofend(TYPE, MEMBER) \
87*7ea28254SJohn Hall 	(offsetof(TYPE, MEMBER)	+ sizeof(((TYPE *)0)->MEMBER))
88*7ea28254SJohn Hall #endif
89*7ea28254SJohn Hall 
901e66f787SSean Bruno #define ALIGN_BOUNDARY(a, n)	{	\
911e66f787SSean Bruno 		if (a % n)	\
921e66f787SSean Bruno 			a = a + (n - a % n);	\
931e66f787SSean Bruno 	}
941e66f787SSean Bruno 
951e66f787SSean Bruno /* Busy wait timeout on a condition */
961e66f787SSean Bruno #define	COND_BUSYWAIT(cond, timeout /* in millisecond */) { \
971e66f787SSean Bruno 		if (!(cond)) { \
981e66f787SSean Bruno 			while (timeout) { \
991e66f787SSean Bruno 				OS_BUSYWAIT(1000); \
1001e66f787SSean Bruno 				if (cond) \
1011e66f787SSean Bruno 					break; \
1021e66f787SSean Bruno 				timeout--; \
1031e66f787SSean Bruno 			} \
1041e66f787SSean Bruno 		} \
1051e66f787SSean Bruno 	}
1061e66f787SSean Bruno 
1071e66f787SSean Bruno /* Wait timeout on a condition*/
1081e66f787SSean Bruno #define	COND_WAIT(cond, timeout /* in millisecond */) { \
1091e66f787SSean Bruno 		if (!(cond)) { \
1101e66f787SSean Bruno 			while (timeout) { \
1111e66f787SSean Bruno 				OS_SLEEP(1000); \
1121e66f787SSean Bruno 				if (cond) \
1131e66f787SSean Bruno 					break; \
1141e66f787SSean Bruno 				timeout--; \
1151e66f787SSean Bruno 			} \
1161e66f787SSean Bruno 		} \
1171e66f787SSean Bruno 	}
1181e66f787SSean Bruno 
1191e66f787SSean Bruno #define FILL_QUEUE_ARRAY_ADDR(q,virt,dma) { 	\
1201e66f787SSean Bruno 			q->array_virt_addr = virt;	\
1211e66f787SSean Bruno 			q->array_dma_addr = dma;	\
1221e66f787SSean Bruno 		}
1231e66f787SSean Bruno 
1241e66f787SSean Bruno #define	true	1
1251e66f787SSean Bruno #define false	0
1261e66f787SSean Bruno 
1271e66f787SSean Bruno enum INTR_TYPE {
1281e66f787SSean Bruno 	LOCK_INTR,
1291e66f787SSean Bruno 	LOCK_SLEEP
1301e66f787SSean Bruno };
1311e66f787SSean Bruno 
1321e66f787SSean Bruno #define LOCKNAME_SIZE       32
1331e66f787SSean Bruno 
134b17f4335SSean Bruno #define INTR_TYPE_NONE		0x0
1351e66f787SSean Bruno #define INTR_TYPE_FIXED		0x1
1361e66f787SSean Bruno #define INTR_TYPE_MSI		0x2
1371e66f787SSean Bruno #define INTR_TYPE_MSIX		0x4
1381e66f787SSean Bruno #define SIS_ENABLE_MSIX		0x40
139b17f4335SSean Bruno #define SIS_ENABLE_INTX		0x80
140b17f4335SSean Bruno #define PQISRC_LEGACY_INTX_MASK	0x1
1411e66f787SSean Bruno 
1421e66f787SSean Bruno #define DMA_TO_VIRT(mem)			((mem)->virt_addr)
1431e66f787SSean Bruno #define DMA_PHYS_LOW(mem)		(((mem)->dma_addr)  & 0x00000000ffffffff)
1441e66f787SSean Bruno #define DMA_PHYS_HIGH(mem)		((((mem)->dma_addr) & 0xffffffff00000000) >> 32)
1451e66f787SSean Bruno 
1461e66f787SSean Bruno typedef enum IO_PATH {
147*7ea28254SJohn Hall 	UNKNOWN_PATH,
1481e66f787SSean Bruno 	AIO_PATH,
1491e66f787SSean Bruno 	RAID_PATH
1501e66f787SSean Bruno }IO_PATH_T;
1511e66f787SSean Bruno 
1521e66f787SSean Bruno typedef enum device_type
1531e66f787SSean Bruno {
1541e66f787SSean Bruno 	DISK_DEVICE,
1551e66f787SSean Bruno 	TAPE_DEVICE,
1561e66f787SSean Bruno 	ROM_DEVICE = 5,
157b17f4335SSean Bruno 	SES_DEVICE,
158b17f4335SSean Bruno 	CONTROLLER_DEVICE,
159b17f4335SSean Bruno 	MEDIUM_CHANGER_DEVICE,
1601e66f787SSean Bruno 	RAID_DEVICE = 0x0c,
1611e66f787SSean Bruno 	ENCLOSURE_DEVICE,
1621e66f787SSean Bruno 	ZBC_DEVICE = 0x14
1631e66f787SSean Bruno } device_type_t;
1641e66f787SSean Bruno 
1651e66f787SSean Bruno typedef enum controller_state {
1661e66f787SSean Bruno 	PQI_UP_RUNNING,
1671e66f787SSean Bruno 	PQI_BUS_RESET,
1681e66f787SSean Bruno }controller_state_t;
1691e66f787SSean Bruno 
1709fac68fcSPAPANI SRIKANTH 
1711e66f787SSean Bruno #define PQISRC_MAX_MSIX_SUPPORTED		64
1721e66f787SSean Bruno 
1731e66f787SSean Bruno /* SIS Specific */
1741e66f787SSean Bruno #define PQISRC_INIT_STRUCT_REVISION		9
1751e66f787SSean Bruno #define	PQISRC_SECTOR_SIZE			512
1761e66f787SSean Bruno #define	PQISRC_BLK_SIZE				PQISRC_SECTOR_SIZE
1771e66f787SSean Bruno #define	PQISRC_DEFAULT_DMA_ALIGN		4
1781e66f787SSean Bruno #define	PQISRC_DMA_ALIGN_MASK			(PQISRC_DEFAULT_DMA_ALIGN - 1)
1791e66f787SSean Bruno #define PQISRC_ERR_BUF_DMA_ALIGN		32
1801e66f787SSean Bruno #define PQISRC_ERR_BUF_ELEM_SIZE		MAX(sizeof(raid_path_error_info_elem_t),sizeof(aio_path_error_info_elem_t))
1811e66f787SSean Bruno #define	PQISRC_INIT_STRUCT_DMA_ALIGN		16
1821e66f787SSean Bruno 
1831e66f787SSean Bruno #define SIS_CMD_GET_ADAPTER_PROPERTIES		0x19
1841e66f787SSean Bruno #define SIS_CMD_GET_COMM_PREFERRED_SETTINGS	0x26
1851e66f787SSean Bruno #define SIS_CMD_GET_PQI_CAPABILITIES		0x3000
1861e66f787SSean Bruno #define SIS_CMD_INIT_BASE_STRUCT_ADDRESS	0x1b
1871e66f787SSean Bruno 
1881e66f787SSean Bruno #define SIS_SUPPORT_EXT_OPT			0x00800000
1891e66f787SSean Bruno #define SIS_SUPPORT_PQI				0x00000004
1901e66f787SSean Bruno #define SIS_SUPPORT_PQI_RESET_QUIESCE		0x00000008
1911e66f787SSean Bruno 
1921e66f787SSean Bruno #define SIS_PQI_RESET_QUIESCE			0x1000000
1931e66f787SSean Bruno 
1941e66f787SSean Bruno #define SIS_STATUS_OK_TIMEOUT			120000	/* in milli sec, 5 sec */
1951e66f787SSean Bruno 
1961e66f787SSean Bruno #define SIS_CMD_COMPLETE_TIMEOUT   		30000  /* in milli sec, 30 secs */
1971e66f787SSean Bruno #define SIS_POLL_START_WAIT_TIME		20000  /* in micro sec, 20 milli sec */
1981e66f787SSean Bruno #define SIS_DB_BIT_CLEAR_TIMEOUT_CNT		120000	/* 500usec * 120000 = 60 sec */
1991e66f787SSean Bruno 
2001e66f787SSean Bruno #define SIS_ENABLE_TIMEOUT			3000
2011e66f787SSean Bruno #define REENABLE_SIS				0x1
2021e66f787SSean Bruno #define TRIGGER_NMI_SIS				0x800000
2031e66f787SSean Bruno /*SIS Register status defines */
2041e66f787SSean Bruno 
2051e66f787SSean Bruno #define PQI_CTRL_KERNEL_UP_AND_RUNNING		0x80
2061e66f787SSean Bruno #define PQI_CTRL_KERNEL_PANIC			0x100
2071e66f787SSean Bruno 
2081e66f787SSean Bruno #define SIS_CTL_TO_HOST_DB_DISABLE_ALL	0xFFFFFFFF
2091e66f787SSean Bruno #define SIS_CTL_TO_HOST_DB_CLEAR			0x00001000
2101e66f787SSean Bruno #define SIS_CMD_SUBMIT						0x00000200  /* Bit 9 */
2111e66f787SSean Bruno #define SIS_CMD_COMPLETE					0x00001000  /* Bit 12 */
2121e66f787SSean Bruno #define SIS_CMD_STATUS_SUCCESS			0x1
2131e66f787SSean Bruno 
2141e66f787SSean Bruno /* PQI specific */
2151e66f787SSean Bruno 
2161e66f787SSean Bruno /* defines */
2171e66f787SSean Bruno #define PQISRC_PQI_REG_OFFSET					0x4000
218*7ea28254SJohn Hall 
219*7ea28254SJohn Hall 
220*7ea28254SJohn Hall /* Number of Queues this driver compile can potentially support */
221*7ea28254SJohn Hall #define PQISRC_MAX_SUPPORTED_OP_IB_Q		128
222*7ea28254SJohn Hall #define PQISRC_MAX_SUPPORTED_OP_RAID_IB_Q	(PQISRC_MAX_SUPPORTED_OP_IB_Q / 2)
223*7ea28254SJohn Hall #define PQISRC_MAX_SUPPORTED_OP_AIO_IB_Q	(PQISRC_MAX_SUPPORTED_OP_RAID_IB_Q)
224*7ea28254SJohn Hall #define PQISRC_MAX_SUPPORTED_OP_OB_Q		64
225*7ea28254SJohn Hall 
226*7ea28254SJohn Hall 
227*7ea28254SJohn Hall /* PQI Capability maxes (from controller) */
228*7ea28254SJohn Hall #define PQISRC_MAX_ELEMENTS                     8192
229*7ea28254SJohn Hall #define PQISRC_OP_MIN_ELEM_SIZE                 1 /* 16 bytes */
230*7ea28254SJohn Hall #define PQISRC_OP_MAX_ELEM_SIZE                 8 /* 8 * 16  = 128 bytes */
231*7ea28254SJohn Hall #define PQISRC_MAX_SPANNING_IU_LENGTH           1152
2321e66f787SSean Bruno #define PQISRC_MAX_OUTSTANDING_REQ              4096
233*7ea28254SJohn Hall /* #define PQISRC_MAX_OP_IB_QUEUE_ELEM_NUM       (PQISRC_MAX_OUTSTANDING_REQ / PQISRC_MAX_SUPPORTED_OP_IB_Q) */
234*7ea28254SJohn Hall /* #define PQISRC_MAX_OP_OB_QUEUE_ELEM_NUM       PQISRC_MAX_OUTSTANDING_REQ */
235*7ea28254SJohn Hall /* #define PQISRC_MIN_OP_OB_QUEUE_ELEM_NUM       2 */
236*7ea28254SJohn Hall 
237*7ea28254SJohn Hall #ifdef DEVICE_HINT
238*7ea28254SJohn Hall #define PQISRC_MIN_OUTSTANDING_REQ              (PQI_RESERVED_IO_SLOTS_CNT + OS_MIN_OUTSTANDING_REQ)
239*7ea28254SJohn Hall #endif
2401e66f787SSean Bruno 
2419fac68fcSPAPANI SRIKANTH 
2429fac68fcSPAPANI SRIKANTH 
243*7ea28254SJohn Hall /* Queue IDs Enumeration */
244*7ea28254SJohn Hall #define PQI_ADMIN_IB_QUEUE_ID					0
245*7ea28254SJohn Hall #define PQI_ADMIN_OB_QUEUE_ID					0
2461e66f787SSean Bruno #define PQI_MIN_OP_IB_QUEUE_ID				1
2471e66f787SSean Bruno #define PQI_OP_EVENT_QUEUE_ID					1
2481e66f787SSean Bruno #define PQI_MIN_OP_OB_QUEUE_ID				2
2491e66f787SSean Bruno 
2501e66f787SSean Bruno 
251*7ea28254SJohn Hall /* PQI IU Element Sizes */
252*7ea28254SJohn Hall #define PQISRC_ADMIN_IBQ_ELEM_SIZE_BYTES	64
253*7ea28254SJohn Hall #define PQISRC_ADMIN_OBQ_ELEM_SIZE_BYTES	64
254*7ea28254SJohn Hall #define PQISRC_OP_IBQ_ELEM_SIZE_BYTES		128
255*7ea28254SJohn Hall #define PQISRC_OP_OBQ_ELEM_SIZE_BYTES		16
256*7ea28254SJohn Hall #define PQISRC_EVENT_Q_ELEM_SIZE_BYTES		32
2571e66f787SSean Bruno 
258*7ea28254SJohn Hall 
259*7ea28254SJohn Hall /* Number of elements this driver compile will potentially use */
260*7ea28254SJohn Hall #define PQISRC_MAX_ADMIN_IB_QUEUE_ELEM_NUM	16
261*7ea28254SJohn Hall #define PQISRC_MAX_ADMIN_OB_QUEUE_ELEM_NUM	16
262*7ea28254SJohn Hall #define PQISRC_MAX_EVENT_QUEUE_ELEM_NUM		32
263*7ea28254SJohn Hall #define PQISRC_MAX_SPANNING_ELEMS				9
264*7ea28254SJohn Hall 
265*7ea28254SJohn Hall /* setting maximums for adv aio	*/
266*7ea28254SJohn Hall #define PQISRC_MAX_AIO_RAID5_OR_6_WRITE		(8*1024)  /* 8 KiB */
267*7ea28254SJohn Hall #define PQISRC_MAX_AIO_RAID1_OR_10_WRITE_2DRV	0x0000	/* No Limit */
268*7ea28254SJohn Hall #define PQISRC_MAX_AIO_RAID1_OR_10_WRITE_3DRV	0x0000	/* No Limit */
269*7ea28254SJohn Hall #define PQISRC_MAX_AIO_NVME_CRYPTO		(32*1024) /* 32 KiB */
270*7ea28254SJohn Hall #define PQISRC_MAX_AIO_NO_LIMIT			0x0000 /* No Limit */
271*7ea28254SJohn Hall #define PQISRC_MAX_AIO_RW_XFER_SAS_SATA_CRYPTO	0x0000 /* No Limit */
272*7ea28254SJohn Hall #define PQISRC_MAX_AIO_RW_XFER_NVME_CRYPTO	(32*1024)
273*7ea28254SJohn Hall 
274*7ea28254SJohn Hall #define SENSE_FEATURES_CRYPTO_OFFSET offsetof(bmic_sense_feature_page_io_aio_subpage_t, max_aio_rw_xfer_crypto_sas_sata)
275*7ea28254SJohn Hall #define MINIMUM_AIO_SUBPAGE_LENGTH \
276*7ea28254SJohn Hall 	(offsetofend(bmic_sense_feature_page_io_aio_subpage_t, \
277*7ea28254SJohn Hall 	max_aio_write_raid1_10_3drv) - \
278*7ea28254SJohn Hall 	(sizeof(((bmic_sense_feature_page_io_aio_subpage_t *)0)->header)))
279*7ea28254SJohn Hall 
280*7ea28254SJohn Hall /* Not used or useful yet */
281*7ea28254SJohn Hall /* #define PQISRC_INTR_COALSC_GRAN				0 */
282*7ea28254SJohn Hall /* #define PQISRC_PROTO_BIT_MASK					0 */
283*7ea28254SJohn Hall /* #define PQISRC_SGL_SUPPORTED_BIT_MASK		0 */
284*7ea28254SJohn Hall 
285*7ea28254SJohn Hall #define PQISRC_MAX_SUPPORTED_MIRRORS	3
2861e66f787SSean Bruno /* PQI Registers state status */
2871e66f787SSean Bruno 
2881e66f787SSean Bruno #define PQI_RESET_ACTION_RESET			0x1
2891e66f787SSean Bruno #define PQI_RESET_ACTION_COMPLETED		0x2
2901e66f787SSean Bruno #define PQI_RESET_TYPE_NO_RESET			0x0
2911e66f787SSean Bruno #define PQI_RESET_TYPE_SOFT_RESET		0x1
2921e66f787SSean Bruno #define PQI_RESET_TYPE_FIRM_RESET		0x2
2931e66f787SSean Bruno #define PQI_RESET_TYPE_HARD_RESET		0x3
2941e66f787SSean Bruno 
2951e66f787SSean Bruno #define PQI_RESET_POLL_INTERVAL 		100000 /*100 msec*/
2961e66f787SSean Bruno 
2971e66f787SSean Bruno enum pqisrc_ctrl_mode{
2981e66f787SSean Bruno 	CTRL_SIS_MODE = 0,
2991e66f787SSean Bruno 	CTRL_PQI_MODE
3001e66f787SSean Bruno };
3011e66f787SSean Bruno 
3021e66f787SSean Bruno /* PQI device performing internal initialization (e.g., POST). */
3031e66f787SSean Bruno #define PQI_DEV_STATE_POWER_ON_AND_RESET	0x0
3041e66f787SSean Bruno /* Upon entry to this state PQI device initialization begins. */
3051e66f787SSean Bruno #define PQI_DEV_STATE_PQI_STATUS_AVAILABLE	0x1
3061e66f787SSean Bruno /* PQI device Standard registers are available to the driver. */
3071e66f787SSean Bruno #define PQI_DEV_STATE_ALL_REGISTERS_READY	0x2
3081e66f787SSean Bruno /* PQI device is initialized and ready to process any PCI transactions. */
3091e66f787SSean Bruno #define PQI_DEV_STATE_ADMIN_QUEUE_PAIR_READY	0x3
3101e66f787SSean Bruno /* The PQI Device Error register indicates the error. */
3111e66f787SSean Bruno #define PQI_DEV_STATE_ERROR			0x4
3121e66f787SSean Bruno 
3131e66f787SSean Bruno #define PQI_DEV_STATE_AT_INIT			( PQI_DEV_STATE_PQI_STATUS_AVAILABLE | \
3141e66f787SSean Bruno 						  PQI_DEV_STATE_ALL_REGISTERS_READY | \
3151e66f787SSean Bruno 						  PQI_DEV_STATE_ADMIN_QUEUE_PAIR_READY )
3161e66f787SSean Bruno 
3171e66f787SSean Bruno #define PQISRC_PQI_DEVICE_SIGNATURE		"PQI DREG"
318*7ea28254SJohn Hall 
319*7ea28254SJohn Hall #define PQI_ADDR_ALIGN_MASK_4K			0xFFF/* lsb 12 bits */
320*7ea28254SJohn Hall #define PQI_ADDR_ALIGN_MASK_1K			0x3FF/* lsb 10 bits */
3211e66f787SSean Bruno #define PQI_ADDR_ALIGN_MASK_64			0x3F /* lsb 6 bits  */
3221e66f787SSean Bruno #define PQI_ADDR_ALIGN_MASK_4			0x3  /* lsb 2 bits  */
323*7ea28254SJohn Hall #define PQI_ADDR_ALIGN				4096
324*7ea28254SJohn Hall #define PQI_ADDR_ALIGN_MASK			PQI_ADDR_ALIGN_MASK_4K
325*7ea28254SJohn Hall 
326*7ea28254SJohn Hall 
327*7ea28254SJohn Hall #define PQI_FORCE_IQ_ELEMENTS       32    /* 4096/128 = 32 (see PQISRC_OP_IBQ_ELEM_SIZE_BYTES) */
328*7ea28254SJohn Hall #define PQI_FORCE_OQ_ELEMENTS       256   /* 4096/16 = 256 (see PQISRC_OP_OBQ_ELEM_SIZE_BYTES) */
329*7ea28254SJohn Hall 
330*7ea28254SJohn Hall #define	PQI_CI_PI_ALIGN            64
331*7ea28254SJohn Hall #define	PQI_CI_PI_ALIGN_MASK       PQI_ADDR_ALIGN_MASK_64
3321e66f787SSean Bruno 
3331e66f787SSean Bruno #define	PQISRC_PQIMODE_READY_TIMEOUT   		(30 * 1000 ) /* 30 secs */
3341e66f787SSean Bruno #define	PQISRC_MODE_READY_POLL_INTERVAL		1000 /* 1 msec */
3351e66f787SSean Bruno 
3361e66f787SSean Bruno #define PRINT_PQI_SIGNATURE(sign)		{ int i = 0; \
3371e66f787SSean Bruno 						  char si[9]; \
3381e66f787SSean Bruno 						  for(i=0;i<8;i++) \
3391e66f787SSean Bruno 							si[i] = *((char *)&(sign)+i); \
3401e66f787SSean Bruno 						  si[i] = '\0'; \
3411e66f787SSean Bruno 						  DBG_INFO("Signature is %s",si); \
3421e66f787SSean Bruno 						}
3431e66f787SSean Bruno #define PQI_CONF_TABLE_MAX_LEN		((uint16_t)~0)
3441e66f787SSean Bruno #define PQI_CONF_TABLE_SIGNATURE	"CFGTABLE"
3451e66f787SSean Bruno 
3461e66f787SSean Bruno /* PQI configuration table section IDs */
3479fac68fcSPAPANI SRIKANTH #define PQI_CONF_TABLE_ALL_SECTIONS			(-1)
3481e66f787SSean Bruno #define PQI_CONF_TABLE_SECTION_GENERAL_INFO			0
3491e66f787SSean Bruno #define PQI_CONF_TABLE_SECTION_FIRMWARE_FEATURES	1
3501e66f787SSean Bruno #define PQI_CONF_TABLE_SECTION_FIRMWARE_ERRATA		2
3511e66f787SSean Bruno #define PQI_CONF_TABLE_SECTION_DEBUG				3
3521e66f787SSean Bruno #define PQI_CONF_TABLE_SECTION_HEARTBEAT			4
353*7ea28254SJohn Hall #define PQI_CONF_TABLE_SOFT_RESET					5
3541e66f787SSean Bruno 
355*7ea28254SJohn Hall /* PQI feature bits as defined in PQI_SPEC.doc */
3569fac68fcSPAPANI SRIKANTH #define PQI_FIRMWARE_FEATURE_OFA                    0
3579fac68fcSPAPANI SRIKANTH #define PQI_FIRMWARE_FEATURE_SMP                    1
358*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_MAX_KNOWN_FEATURE      2
359*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_0_READ_BYPASS     3
360*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_1_READ_BYPASS     4
361*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_5_READ_BYPASS     5
362*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_6_READ_BYPASS     6
363*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_0_WRITE_BYPASS    7
364*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_1_WRITE_BYPASS    8
365*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_5_WRITE_BYPASS    9
366*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_6_WRITE_BYPASS    10
3679fac68fcSPAPANI SRIKANTH #define PQI_FIRMWARE_FEATURE_SOFT_RESET_HANDSHAKE   11
368*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_UNIQUE_SATA_WWN        12
369*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_RAID_IU_TIMEOUT        13
370*7ea28254SJohn Hall #define PQI_FIRMWARE_FEATURE_TMF_IU_TIMEOUT         14
3719fac68fcSPAPANI SRIKANTH #define PQI_FIRMWARE_FEATURE_MAXIMUM                14
372*7ea28254SJohn Hall #define	PQI_FIRMWARE_FEATURE_PAGE83_IDENTIFIER_FOR_RPL_WWID 16
3739fac68fcSPAPANI SRIKANTH 
374*7ea28254SJohn Hall #define CTRLR_HEARTBEAT_CNT(softs)		LE_64(PCI_MEM_GET64(softs, softs->heartbeat_counter_abs_addr, softs->heartbeat_counter_off))
3759fac68fcSPAPANI SRIKANTH #define PQI_HEARTBEAT_TIMEOUT_SEC		(10) /* 10 sec interval */
3769fac68fcSPAPANI SRIKANTH #define PQI_HOST_WELLNESS_TIMEOUT_SEC		(24*3600)
3771e66f787SSean Bruno 
3781e66f787SSean Bruno  /* pqi-2r00a table 36 */
3791e66f787SSean Bruno #define PQI_ADMIN_QUEUE_MSIX_DISABLE		(0x80000000)
3801e66f787SSean Bruno #define PQI_ADMIN_QUEUE_MSIX_ENABLE		(0 << 31)
3811e66f787SSean Bruno 
3821e66f787SSean Bruno #define	PQI_ADMIN_QUEUE_CONF_FUNC_CREATE_Q_PAIR	0x01
3831e66f787SSean Bruno #define	PQI_ADMIN_QUEUE_CONF_FUNC_DEL_Q_PAIR	0x02
3841e66f787SSean Bruno #define	PQI_ADMIN_QUEUE_CONF_FUNC_STATUS_IDLE	0x00
3851e66f787SSean Bruno #define PQISRC_ADMIN_QUEUE_CREATE_TIMEOUT	1000  /* in miLLI sec, 1 sec, 100 ms is standard */
3861e66f787SSean Bruno #define PQISRC_ADMIN_QUEUE_DELETE_TIMEOUT	100  /* 100 ms is standard */
3871e66f787SSean Bruno #define	PQISRC_ADMIN_CMD_RESP_TIMEOUT		3000 /* 3 sec  */
3881e66f787SSean Bruno #define PQISRC_RAIDPATH_CMD_TIMEOUT		30000 /* 30 sec */
3891e66f787SSean Bruno 
3901e66f787SSean Bruno #define REPORT_PQI_DEV_CAP_DATA_BUF_SIZE   	sizeof(pqi_dev_cap_t)
3911e66f787SSean Bruno #define REPORT_MANUFACTURER_INFO_DATA_BUF_SIZE	0x80   /* Data buffer size specified in bytes 0-1 of data buffer.  128 bytes. */
3921e66f787SSean Bruno /* PQI IUs */
3931e66f787SSean Bruno /* Admin IU request length not including header. */
3941e66f787SSean Bruno #define	PQI_STANDARD_IU_LENGTH			0x003C  /* 60 bytes. */
3951e66f787SSean Bruno #define PQI_IU_TYPE_GENERAL_ADMIN_REQUEST	0x60
3961e66f787SSean Bruno #define PQI_IU_TYPE_GENERAL_ADMIN_RESPONSE	0xe0
3971e66f787SSean Bruno 
3981e66f787SSean Bruno /* PQI / Vendor specific IU */
3991e66f787SSean Bruno #define PQI_FUNCTION_REPORT_DEV_CAP				0x00
4009fac68fcSPAPANI SRIKANTH #define PQI_REQUEST_IU_RAID_TASK_MANAGEMENT			0x13
4011e66f787SSean Bruno #define PQI_IU_TYPE_RAID_PATH_IO_REQUEST			0x14
4021e66f787SSean Bruno #define PQI_IU_TYPE_AIO_PATH_IO_REQUEST				0x15
4039fac68fcSPAPANI SRIKANTH #define PQI_REQUEST_IU_AIO_TASK_MANAGEMENT			0x16
404*7ea28254SJohn Hall #define PQI_IU_TYPE_RAID5_WRITE_BYPASS_REQUEST			0x18
405*7ea28254SJohn Hall #define PQI_IU_TYPE_RAID6_WRITE_BYPASS_REQUEST			0x19
406*7ea28254SJohn Hall #define PQI_IU_TYPE_RAID1_WRITE_BYPASS_REQUEST			0x1A
407*7ea28254SJohn Hall #define PQI_REQUEST_IU_AIO_BYPASS_TASK_MGMT			0x20
4081e66f787SSean Bruno #define PQI_REQUEST_IU_GENERAL_ADMIN				0x60
4091e66f787SSean Bruno #define PQI_REQUEST_IU_REPORT_VENDOR_EVENT_CONFIG		0x72
4101e66f787SSean Bruno #define PQI_REQUEST_IU_SET_VENDOR_EVENT_CONFIG			0x73
4119fac68fcSPAPANI SRIKANTH #define PQI_REQUEST_IU_VENDOR_GENERAL				0x75
4121e66f787SSean Bruno #define PQI_RESPONSE_IU_GENERAL_MANAGEMENT			0x81
4131e66f787SSean Bruno #define PQI_RESPONSE_IU_TASK_MANAGEMENT				0x93
4141e66f787SSean Bruno #define PQI_RESPONSE_IU_GENERAL_ADMIN				0xe0
4151e66f787SSean Bruno 
4161e66f787SSean Bruno #define PQI_RESPONSE_IU_RAID_PATH_IO_SUCCESS			0xf0
4171e66f787SSean Bruno #define PQI_RESPONSE_IU_AIO_PATH_IO_SUCCESS			0xf1
4181e66f787SSean Bruno #define PQI_RESPONSE_IU_RAID_PATH_IO_ERROR			0xf2
4191e66f787SSean Bruno #define PQI_RESPONSE_IU_AIO_PATH_IO_ERROR			0xf3
4201e66f787SSean Bruno #define PQI_RESPONSE_IU_AIO_PATH_IS_OFF				0xf4
4211e66f787SSean Bruno #define PQI_REQUEST_IU_ACKNOWLEDGE_VENDOR_EVENT			0xf6
4229fac68fcSPAPANI SRIKANTH #define PQI_RESPONSE_IU_VENDOR_GENERAL				0xf7
4231e66f787SSean Bruno #define PQI_REQUEST_HEADER_LENGTH				4
4241e66f787SSean Bruno #define PQI_FUNCTION_CREATE_OPERATIONAL_IQ			0x10
4251e66f787SSean Bruno #define PQI_FUNCTION_CREATE_OPERATIONAL_OQ			0x11
4261e66f787SSean Bruno #define PQI_FUNCTION_DELETE_OPERATIONAL_IQ			0x12
4271e66f787SSean Bruno #define PQI_FUNCTION_DELETE_OPERATIONAL_OQ			0x13
4281e66f787SSean Bruno #define PQI_FUNCTION_CHANGE_OPERATIONAL_IQ_PROP			0x14
4291e66f787SSean Bruno #define PQI_CHANGE_OP_IQ_PROP_ASSIGN_AIO			1
4301e66f787SSean Bruno 
4311e66f787SSean Bruno #define PQI_DEFAULT_IB_QUEUE						0
4329fac68fcSPAPANI SRIKANTH #define PQI_VENDOR_GENERAL_CONFIG_TABLE_UPDATE		0
4339fac68fcSPAPANI SRIKANTH 
4349fac68fcSPAPANI SRIKANTH #define PQI_VENDOR_RESPONSE_IU_SUCCESS				0
4359fac68fcSPAPANI SRIKANTH #define PQI_VENDOR_RESPONSE_IU_UNSUCCESS			1
4369fac68fcSPAPANI SRIKANTH #define PQI_VENDOR_RESPONSE_IU_INVALID_PARAM		2
4379fac68fcSPAPANI SRIKANTH #define PQI_VENDOR_RESPONSE_IU_INSUFF_RESRC			3
4389fac68fcSPAPANI SRIKANTH 
4391e66f787SSean Bruno /* Interface macros */
4401e66f787SSean Bruno 
4411e66f787SSean Bruno #define GET_FW_STATUS(softs) \
4421e66f787SSean Bruno         (PCI_MEM_GET32(softs, &softs->ioa_reg->scratchpad3_fw_status, LEGACY_SIS_OMR))
4431e66f787SSean Bruno 
4441e66f787SSean Bruno #define SIS_IS_KERNEL_PANIC(softs) \
4451e66f787SSean Bruno 	(GET_FW_STATUS(softs) & PQI_CTRL_KERNEL_PANIC)
4461e66f787SSean Bruno 
4471e66f787SSean Bruno #define SIS_IS_KERNEL_UP(softs) \
4481e66f787SSean Bruno 	(GET_FW_STATUS(softs) & PQI_CTRL_KERNEL_UP_AND_RUNNING)
4491e66f787SSean Bruno 
4501e66f787SSean Bruno #define PQI_GET_CTRL_MODE(softs) \
4511e66f787SSean Bruno 	(PCI_MEM_GET32(softs, &softs->ioa_reg->scratchpad0, LEGACY_SIS_SCR0))
4521e66f787SSean Bruno 
453*7ea28254SJohn Hall #define PQI_SAVE_CTRL_MODE(softs, mode) { \
454*7ea28254SJohn Hall 	PCI_MEM_PUT32(softs, &softs->ioa_reg->scratchpad0, LEGACY_SIS_SCR0, mode); \
455*7ea28254SJohn Hall 	OS_SLEEP(1000); \
456*7ea28254SJohn Hall 	}
457*7ea28254SJohn Hall 
458*7ea28254SJohn Hall #define LEGACY_SIS_SCR_REG_LENGTH		4
459*7ea28254SJohn Hall #define LEGACY_SIS_SCR1		LEGACY_SIS_SCR0 + LEGACY_SIS_SCR_REG_LENGTH
460*7ea28254SJohn Hall #define PQI_GET_CTRL_TYPE(softs) \
461*7ea28254SJohn Hall 	((PCI_MEM_GET32(softs, &softs->ioa_reg->scratchpad1, LEGACY_SIS_SCR1)) \
462*7ea28254SJohn Hall 	& 0x0000FFFF)
463*7ea28254SJohn Hall 
464*7ea28254SJohn Hall /* smart raid-hba pqi functional spec, scratchpad register 1 spec */
465*7ea28254SJohn Hall #define PQI_CTRL_PRODUCT_ID_GEN1	0x0000
466*7ea28254SJohn Hall #define PQI_CTRL_PRODUCT_ID_GEN2_REV_A	0x0007
467*7ea28254SJohn Hall #define PQI_CTRL_PRODUCT_ID_GEN2_REV_B	0x0107
4681e66f787SSean Bruno 
4691e66f787SSean Bruno #define PQISRC_MAX_TARGETID			1024
4701e66f787SSean Bruno #define PQISRC_MAX_TARGETLUN			64
4711e66f787SSean Bruno 
4721e66f787SSean Bruno /* Vendor specific IU Type for Event config Cmds */
4731e66f787SSean Bruno #define PQI_REQUEST_IU_REPORT_EVENT_CONFIG			0x72
4741e66f787SSean Bruno #define PQI_REQUEST_IU_SET_EVENT_CONFIG				0x73
4751e66f787SSean Bruno #define PQI_REQUEST_IU_ACKNOWLEDGE_VENDOR_EVENT		0xf6
4769fac68fcSPAPANI SRIKANTH 
477*7ea28254SJohn Hall 
4781e66f787SSean Bruno #define PQI_RESPONSE_IU_GENERAL_MANAGEMENT	0x81
4791e66f787SSean Bruno #define	PQI_MANAGEMENT_CMD_RESP_TIMEOUT		3000
4801e66f787SSean Bruno #define	PQISRC_EVENT_ACK_RESP_TIMEOUT		1000
4811e66f787SSean Bruno 
4829fac68fcSPAPANI SRIKANTH 
4831e66f787SSean Bruno /* Supported Event types by controller */
4849fac68fcSPAPANI SRIKANTH 
4859fac68fcSPAPANI SRIKANTH #define PQI_NUM_SUPPORTED_EVENTS		6
4861e66f787SSean Bruno 
4871e66f787SSean Bruno #define PQI_EVENT_TYPE_HOTPLUG			0x1
4881e66f787SSean Bruno #define PQI_EVENT_TYPE_HARDWARE			0x2
4891e66f787SSean Bruno #define PQI_EVENT_TYPE_PHYSICAL_DEVICE		0x4
4901e66f787SSean Bruno #define PQI_EVENT_TYPE_LOGICAL_DEVICE		0x5
4911e66f787SSean Bruno #define PQI_EVENT_TYPE_AIO_STATE_CHANGE		0xfd
4921e66f787SSean Bruno #define PQI_EVENT_TYPE_AIO_CONFIG_CHANGE	0xfe
4931e66f787SSean Bruno 
4941e66f787SSean Bruno /* for indexing into the pending_events[] field of struct pqisrc_softstate */
4959fac68fcSPAPANI SRIKANTH #define PQI_EVENT_HOTPLUG			0
4969fac68fcSPAPANI SRIKANTH #define PQI_EVENT_HARDWARE			1
4979fac68fcSPAPANI SRIKANTH #define PQI_EVENT_PHYSICAL_DEVICE		2
4989fac68fcSPAPANI SRIKANTH #define PQI_EVENT_LOGICAL_DEVICE		3
4999fac68fcSPAPANI SRIKANTH #define PQI_EVENT_AIO_STATE_CHANGE		4
5009fac68fcSPAPANI SRIKANTH #define PQI_EVENT_AIO_CONFIG_CHANGE		5
5011e66f787SSean Bruno 
5029fac68fcSPAPANI SRIKANTH 
5031e66f787SSean Bruno 
5041e66f787SSean Bruno /* Device flags */
5051e66f787SSean Bruno #define	PQISRC_DFLAG_VALID				(1 << 0)
5061e66f787SSean Bruno #define	PQISRC_DFLAG_CONFIGURING			(1 << 1)
5071e66f787SSean Bruno 
508*7ea28254SJohn Hall #define MAX_EMBEDDED_SG_IN_FIRST_IU_DEFAULT		4
509*7ea28254SJohn Hall #define MAX_EMBEDDED_SG_IN_FIRST_IU_RAID56_AIO		3
5101e66f787SSean Bruno #define MAX_EMBEDDED_SG_IN_IU				8
5111e66f787SSean Bruno #define SG_FLAG_LAST				0x40000000
5121e66f787SSean Bruno #define SG_FLAG_CHAIN				0x80000000
5131e66f787SSean Bruno 
5141e66f787SSean Bruno #define IN_PQI_RESET(softs)			(softs->ctlr_state & PQI_BUS_RESET)
5151e66f787SSean Bruno #define DEV_GONE(dev)				(!dev || (dev->invalid == true))
5161e66f787SSean Bruno #define IS_AIO_PATH(dev)				(dev->aio_enabled)
5171e66f787SSean Bruno #define IS_RAID_PATH(dev)				(!dev->aio_enabled)
5181e66f787SSean Bruno 
5199fac68fcSPAPANI SRIKANTH #define DEVICE_RESET(dvp)			(dvp->reset_in_progress)
5209fac68fcSPAPANI SRIKANTH 
5211e66f787SSean Bruno /* SOP data direction flags */
522*7ea28254SJohn Hall #define SOP_DATA_DIR_UNKNOWN			0xFF
5231e66f787SSean Bruno #define SOP_DATA_DIR_NONE			0x00
5241e66f787SSean Bruno #define SOP_DATA_DIR_FROM_DEVICE		0x01
5251e66f787SSean Bruno #define SOP_DATA_DIR_TO_DEVICE			0x02
5261e66f787SSean Bruno #define SOP_DATA_DIR_BIDIRECTIONAL		0x03
5271e66f787SSean Bruno #define SOP_PARTIAL_DATA_BUFFER			0x04
5281e66f787SSean Bruno 
5291e66f787SSean Bruno #define PQISRC_DMA_VALID				(1 << 0)
5301e66f787SSean Bruno #define PQISRC_CMD_NO_INTR				(1 << 1)
5311e66f787SSean Bruno 
5321e66f787SSean Bruno #define SOP_TASK_ATTRIBUTE_SIMPLE			0
5331e66f787SSean Bruno #define SOP_TASK_ATTRIBUTE_HEAD_OF_QUEUE	1
5341e66f787SSean Bruno #define SOP_TASK_ATTRIBUTE_ORDERED			2
5351e66f787SSean Bruno #define SOP_TASK_ATTRIBUTE_ACA				4
5361e66f787SSean Bruno 
5371e66f787SSean Bruno #define SOP_TASK_MANAGEMENT_FUNCTION_COMPLETE           0x0
5381e66f787SSean Bruno #define SOP_TASK_MANAGEMENT_FUNCTION_REJECTED           0x4
5391e66f787SSean Bruno #define SOP_TASK_MANAGEMENT_FUNCTION_FAILED		0x5
5401e66f787SSean Bruno #define SOP_TASK_MANAGEMENT_FUNCTION_SUCCEEDED          0x8
5411e66f787SSean Bruno #define SOP_TASK_MANAGEMENT_FUNCTION_ABORT_TASK		0x01
5421e66f787SSean Bruno #define SOP_TASK_MANAGEMENT_FUNCTION_ABORT_TASK_SET	0x02
5431e66f787SSean Bruno #define SOP_TASK_MANAGEMENT_LUN_RESET			0x8
5441e66f787SSean Bruno 
5459fac68fcSPAPANI SRIKANTH 
5461e66f787SSean Bruno /* Additional CDB bytes  */
5471e66f787SSean Bruno #define PQI_ADDITIONAL_CDB_BYTES_0		0	/* 16 byte CDB */
5481e66f787SSean Bruno #define PQI_ADDITIONAL_CDB_BYTES_4		1	/* 20 byte CDB */
5491e66f787SSean Bruno #define PQI_ADDITIONAL_CDB_BYTES_8		2	/* 24 byte CDB */
5501e66f787SSean Bruno #define PQI_ADDITIONAL_CDB_BYTES_12		3	/* 28 byte CDB */
5511e66f787SSean Bruno #define PQI_ADDITIONAL_CDB_BYTES_16		4	/* 32 byte CDB */
5521e66f787SSean Bruno 
5531e66f787SSean Bruno #define PQI_PROTOCOL_SOP			0x0
5541e66f787SSean Bruno 
5551e66f787SSean Bruno #define PQI_AIO_STATUS_GOOD			0x0
5561e66f787SSean Bruno #define PQI_AIO_STATUS_CHECK_CONDITION		0x2
5571e66f787SSean Bruno #define PQI_AIO_STATUS_CONDITION_MET		0x4
5581e66f787SSean Bruno #define PQI_AIO_STATUS_DEVICE_BUSY		0x8
5591e66f787SSean Bruno #define PQI_AIO_STATUS_INT_GOOD			0x10
5601e66f787SSean Bruno #define PQI_AIO_STATUS_INT_COND_MET		0x14
5611e66f787SSean Bruno #define PQI_AIO_STATUS_RESERV_CONFLICT		0x18
5621e66f787SSean Bruno #define PQI_AIO_STATUS_CMD_TERMINATED		0x22
5631e66f787SSean Bruno #define PQI_AIO_STATUS_QUEUE_FULL		0x28
5641e66f787SSean Bruno #define PQI_AIO_STATUS_TASK_ABORTED		0x40
5651e66f787SSean Bruno #define PQI_AIO_STATUS_UNDERRUN			0x51
5661e66f787SSean Bruno #define PQI_AIO_STATUS_OVERRUN			0x75
5671e66f787SSean Bruno /* Status when Target Failure */
5681e66f787SSean Bruno #define PQI_AIO_STATUS_IO_ERROR			0x1
5691e66f787SSean Bruno #define PQI_AIO_STATUS_IO_ABORTED		0x2
5701e66f787SSean Bruno #define PQI_AIO_STATUS_IO_NO_DEVICE		0x3
5711e66f787SSean Bruno #define PQI_AIO_STATUS_INVALID_DEVICE		0x4
5721e66f787SSean Bruno #define PQI_AIO_STATUS_AIO_PATH_DISABLED	0xe
5731e66f787SSean Bruno 
5741e66f787SSean Bruno /* Service Response */
5751e66f787SSean Bruno #define PQI_AIO_SERV_RESPONSE_COMPLETE			0
5761e66f787SSean Bruno #define PQI_AIO_SERV_RESPONSE_FAILURE			1
5771e66f787SSean Bruno #define PQI_AIO_SERV_RESPONSE_TMF_COMPLETE		2
5781e66f787SSean Bruno #define PQI_AIO_SERV_RESPONSE_TMF_SUCCEEDED		3
5791e66f787SSean Bruno #define PQI_AIO_SERV_RESPONSE_TMF_REJECTED		4
5801e66f787SSean Bruno #define PQI_AIO_SERV_RESPONSE_TMF_INCORRECT_LUN		5
5811e66f787SSean Bruno 
5821e66f787SSean Bruno #define PQI_TMF_WAIT_DELAY			10000000	/* 10 seconds */
5831e66f787SSean Bruno 
5841e66f787SSean Bruno #define PQI_RAID_STATUS_GOOD			PQI_AIO_STATUS_GOOD
5851e66f787SSean Bruno #define PQI_RAID_STATUS_CHECK_CONDITION		PQI_AIO_STATUS_CHECK_CONDITION
5861e66f787SSean Bruno #define PQI_RAID_STATUS_CONDITION_MET		PQI_AIO_STATUS_CONDITION_MET
5871e66f787SSean Bruno #define PQI_RAID_STATUS_DEVICE_BUSY		PQI_AIO_STATUS_DEVICE_BUSY
5881e66f787SSean Bruno #define PQI_RAID_STATUS_INT_GOOD		PQI_AIO_STATUS_INT_GOOD
5891e66f787SSean Bruno #define PQI_RAID_STATUS_INT_COND_MET		PQI_AIO_STATUS_INT_COND_MET
5901e66f787SSean Bruno #define PQI_RAID_STATUS_RESERV_CONFLICT		PQI_AIO_STATUS_RESERV_CONFLICT
5911e66f787SSean Bruno #define PQI_RAID_STATUS_CMD_TERMINATED		PQI_AIO_STATUS_CMD_TERMINATED
5921e66f787SSean Bruno #define PQI_RAID_STATUS_QUEUE_FULL		PQI_AIO_STATUS_QUEUE_FULL
5931e66f787SSean Bruno #define PQI_RAID_STATUS_TASK_ABORTED		PQI_AIO_STATUS_TASK_ABORTED
5941e66f787SSean Bruno #define PQI_RAID_STATUS_UNDERRUN		PQI_AIO_STATUS_UNDERRUN
5951e66f787SSean Bruno #define PQI_RAID_STATUS_OVERRUN			PQI_AIO_STATUS_OVERRUN
5961e66f787SSean Bruno 
597*7ea28254SJohn Hall #define NUM_STREAMS_PER_LUN	8
598*7ea28254SJohn Hall 
5991e66f787SSean Bruno /* VPD inquiry pages */
6001e66f787SSean Bruno #define SCSI_VPD_SUPPORTED_PAGES	0x0		/* standard page */
6011e66f787SSean Bruno #define SCSI_VPD_DEVICE_ID			0x83	/* standard page */
6021e66f787SSean Bruno #define SA_VPD_PHYS_DEVICE_ID		0xc0	/* vendor-specific page */
6031e66f787SSean Bruno #define SA_VPD_LV_DEVICE_GEOMETRY	0xc1	/* vendor-specific page */
6041e66f787SSean Bruno #define SA_VPD_LV_IOACCEL_STATUS	0xc2	/* vendor-specific page */
6051e66f787SSean Bruno #define SA_VPD_LV_STATUS			0xc3	/* vendor-specific page */
6061e66f787SSean Bruno 
6071e66f787SSean Bruno #define VPD_PAGE	(1 << 8)
6081e66f787SSean Bruno 
6099fac68fcSPAPANI SRIKANTH 
6101e66f787SSean Bruno /* logical volume states */
6111e66f787SSean Bruno #define SA_LV_OK                                        0x0
6129fac68fcSPAPANI SRIKANTH #define SA_LV_FAILED                                    0x1
6139fac68fcSPAPANI SRIKANTH #define SA_LV_NOT_CONFIGURED                            0x2
6149fac68fcSPAPANI SRIKANTH #define SA_LV_DEGRADED                                  0x3
6159fac68fcSPAPANI SRIKANTH #define SA_LV_READY_FOR_RECOVERY                        0x4
6169fac68fcSPAPANI SRIKANTH #define SA_LV_UNDERGOING_RECOVERY                       0x5
6179fac68fcSPAPANI SRIKANTH #define SA_LV_WRONG_PHYSICAL_DRIVE_REPLACED             0x6
6189fac68fcSPAPANI SRIKANTH #define SA_LV_PHYSICAL_DRIVE_CONNECTION_PROBLEM         0x7
6199fac68fcSPAPANI SRIKANTH #define SA_LV_HARDWARE_OVERHEATING                      0x8
6209fac68fcSPAPANI SRIKANTH #define SA_LV_HARDWARE_HAS_OVERHEATED                   0x9
6219fac68fcSPAPANI SRIKANTH #define SA_LV_UNDERGOING_EXPANSION                      0xA
6221e66f787SSean Bruno #define SA_LV_NOT_AVAILABLE                             0xb
6239fac68fcSPAPANI SRIKANTH #define SA_LV_QUEUED_FOR_EXPANSION                      0xc
6249fac68fcSPAPANI SRIKANTH #define SA_LV_DISABLED_SCSI_ID_CONFLICT                 0xd
6259fac68fcSPAPANI SRIKANTH #define SA_LV_EJECTED                                   0xe
6261e66f787SSean Bruno #define SA_LV_UNDERGOING_ERASE                          0xf
6271e66f787SSean Bruno #define SA_LV_UNDERGOING_RPI                            0x12
6281e66f787SSean Bruno #define SA_LV_PENDING_RPI                               0x13
6291e66f787SSean Bruno #define SA_LV_ENCRYPTED_NO_KEY                          0x14
6301e66f787SSean Bruno #define SA_LV_PLAINTEXT_IN_ENCRYPT_ONLY_CONTROLLER      0x15
6311e66f787SSean Bruno #define SA_LV_UNDERGOING_ENCRYPTION                     0x16
6321e66f787SSean Bruno #define SA_LV_UNDERGOING_ENCRYPTION_REKEYING            0x17
6331e66f787SSean Bruno #define SA_LV_ENCRYPTED_IN_NON_ENCRYPTED_CONTROLLER     0x18
6341e66f787SSean Bruno #define SA_LV_PENDING_ENCRYPTION                        0x19
6351e66f787SSean Bruno #define SA_LV_PENDING_ENCRYPTION_REKEYING               0x1a
6361e66f787SSean Bruno #define SA_LV_STATUS_VPD_UNSUPPORTED                    0xff
6371e66f787SSean Bruno 
6389fac68fcSPAPANI SRIKANTH 
6399fac68fcSPAPANI SRIKANTH /* constants for flags field of ciss_vpd_logical_volume_status */
6409fac68fcSPAPANI SRIKANTH #define SA_LV_FLAGS_NO_HOST_IO	0x1	/* volume not available for */
6419fac68fcSPAPANI SRIKANTH 
6421e66f787SSean Bruno /*
6431e66f787SSean Bruno  * assume worst case: SATA queue depth of 31 minus 4 internal firmware commands
6441e66f787SSean Bruno  */
6451e66f787SSean Bruno #define PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH	27
6461e66f787SSean Bruno 
6471e66f787SSean Bruno /* 0 = no limit */
6481e66f787SSean Bruno #define PQI_LOGICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH	0
6499fac68fcSPAPANI SRIKANTH #define PQI_LOG_EXT_QUEUE_DEPTH_ENABLED			0x20
6509fac68fcSPAPANI SRIKANTH #define PQI_LOG_EXT_QUEUE_ENABLE			0x56
6519fac68fcSPAPANI SRIKANTH #define MAX_RAW_M256_QDEPTH				32512
6529fac68fcSPAPANI SRIKANTH #define MAX_RAW_M16_QDEPTH				2032
6539fac68fcSPAPANI SRIKANTH #define PQI_PTRAID_UPDATE_ON_RESCAN_LUNS		0x80000000
6541e66f787SSean Bruno 
655*7ea28254SJohn Hall #define RAID_CTLR_LUNID		((uint8_t *) "\0\0\0\0\0\0\0\0")
6561e66f787SSean Bruno 
657*7ea28254SJohn Hall /* SCSI Cmds @todo: move SCMD_READ_6, etc. into library */
658*7ea28254SJohn Hall #define SCSI_INQUIRY          0x12
659*7ea28254SJohn Hall #define SCSI_MODE_SENSE       0x1a
660*7ea28254SJohn Hall #define SCSI_REPORT_LUNS      0xa0
661*7ea28254SJohn Hall #define SCSI_LOG_SENSE        0x4d
662*7ea28254SJohn Hall #define SCSI_ATA_PASSTHRU16   0x85
663*7ea28254SJohn Hall 
6649fac68fcSPAPANI SRIKANTH #define PQISRC_INQUIRY_TIMEOUT 30
665*7ea28254SJohn Hall 
6661e66f787SSean Bruno #define SA_INQUIRY		0x12
6671e66f787SSean Bruno #define SA_REPORT_LOG		0xc2	/* Report Logical LUNs */
6681e66f787SSean Bruno #define SA_REPORT_PHYS		0xc3	/* Report Physical LUNs */
6691e66f787SSean Bruno #define SA_CISS_READ		0xc0
6701e66f787SSean Bruno #define SA_GET_RAID_MAP		0xc8
6711e66f787SSean Bruno 
6729fac68fcSPAPANI SRIKANTH #define SCSI_SENSE_RESPONSE_70      0x70
6739fac68fcSPAPANI SRIKANTH #define SCSI_SENSE_RESPONSE_71      0x71
6749fac68fcSPAPANI SRIKANTH #define SCSI_SENSE_RESPONSE_72      0x72
6759fac68fcSPAPANI SRIKANTH #define SCSI_SENSE_RESPONSE_73      0x73
6769fac68fcSPAPANI SRIKANTH 
6771e66f787SSean Bruno #define SA_REPORT_LOG_EXTENDED		0x1
6781e66f787SSean Bruno #define SA_REPORT_PHYS_EXTENDED		0x2
6791e66f787SSean Bruno 
6809fac68fcSPAPANI SRIKANTH #define GET_SCSI_SNO(cmd)	(cmd->cmdId.serialNumber)
6819fac68fcSPAPANI SRIKANTH 
6821e66f787SSean Bruno #define REPORT_LUN_DEV_FLAG_AIO_ENABLED 0x8
6831e66f787SSean Bruno #define PQI_MAX_TRANSFER_SIZE	(4 * 1024U * 1024U)
6841e66f787SSean Bruno #define RAID_MAP_MAX_ENTRIES	1024
6851e66f787SSean Bruno #define RAID_MAP_ENCRYPTION_ENABLED	0x1
6861e66f787SSean Bruno #define PQI_PHYSICAL_DISK_DEFAULT_MAX_QUEUE_DEPTH	27
6871e66f787SSean Bruno 
6881e66f787SSean Bruno #define ASC_LUN_NOT_READY				0x4
6891e66f787SSean Bruno #define ASCQ_LUN_NOT_READY_FORMAT_IN_PROGRESS		0x4
6901e66f787SSean Bruno #define ASCQ_LUN_NOT_READY_INITIALIZING_CMD_REQ		0x2
6911e66f787SSean Bruno 
6929fac68fcSPAPANI SRIKANTH 
6931e66f787SSean Bruno #define OBDR_SIG_OFFSET		43
6941e66f787SSean Bruno #define OBDR_TAPE_SIG		"$DR-10"
6951e66f787SSean Bruno #define OBDR_SIG_LEN		(sizeof(OBDR_TAPE_SIG) - 1)
6961e66f787SSean Bruno #define OBDR_TAPE_INQ_SIZE	(OBDR_SIG_OFFSET + OBDR_SIG_LEN)
6971e66f787SSean Bruno 
6989fac68fcSPAPANI SRIKANTH 
6991e66f787SSean Bruno #define IOACCEL_STATUS_BYTE	4
7001e66f787SSean Bruno #define OFFLOAD_CONFIGURED_BIT	0x1
7011e66f787SSean Bruno #define OFFLOAD_ENABLED_BIT	0x2
7021e66f787SSean Bruno 
7031e66f787SSean Bruno #define PQI_RAID_DATA_IN_OUT_GOOD                                    0x0
7041e66f787SSean Bruno #define PQI_RAID_DATA_IN_OUT_UNDERFLOW                               0x1
7059fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_BUFFER_ERROR                            0x40
7069fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_BUFFER_OVERFLOW                         0x41
7079fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_BUFFER_OVERFLOW_DESCRIPTOR_AREA         0x42
7089fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_BUFFER_OVERFLOW_BRIDGE                  0x43
7099fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_FABRIC_ERROR                       0x60
7109fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_COMPLETION_TIMEOUT                 0x61
7119fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_COMPLETER_ABORT_RECEIVED           0x62
7129fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_POISONED_MEMORY_READ               0x63
7139fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_ECRC_CHECK_FAILED                  0x64
7149fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_UNSUPPORTED_REQUEST                0x65
7159fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_ACS_VIOLATION                      0x66
7169fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PCIE_TLP_PREFIX_BLOCKED                 0x67
7179fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_ERROR                                   0xf0
7189fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_PROTOCOL_ERROR                          0xf1
7199fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_HARDWARE_ERROR                          0xf2
7201e66f787SSean Bruno #define PQI_RAID_DATA_IN_OUT_UNSOLICITED_ABORT                       0xf3
7211e66f787SSean Bruno #define PQI_RAID_DATA_IN_OUT_ABORTED                                 0xf4
7229fac68fcSPAPANI SRIKANTH #define PQI_RAID_DATA_IN_OUT_TIMEOUT                                 0xf5
7239fac68fcSPAPANI SRIKANTH 
7241e66f787SSean Bruno 
7251e66f787SSean Bruno #define PQI_PHYSICAL_DEVICE_BUS		0
7261e66f787SSean Bruno #define PQI_RAID_VOLUME_BUS		1
7271e66f787SSean Bruno #define PQI_HBA_BUS			2
7281e66f787SSean Bruno #define PQI_EXTERNAL_RAID_VOLUME_BUS	3
7291e66f787SSean Bruno #define PQI_MAX_BUS			PQI_EXTERNAL_RAID_VOLUME_BUS
7301e66f787SSean Bruno 
7311e66f787SSean Bruno #define TEST_UNIT_READY		0x00
7321e66f787SSean Bruno #define SCSI_VPD_HEADER_LENGTH	64
7331e66f787SSean Bruno 
7349fac68fcSPAPANI SRIKANTH 
7351e66f787SSean Bruno #define PQI_MAX_MULTILUN	256
7361e66f787SSean Bruno #define PQI_MAX_LOGICALS	64
7371e66f787SSean Bruno #define PQI_MAX_PHYSICALS	1024
7381e66f787SSean Bruno #define	PQI_MAX_DEVICES		(PQI_MAX_LOGICALS + PQI_MAX_PHYSICALS + 1) /* 1 for controller device entry */
739b17f4335SSean Bruno #define PQI_MAX_EXT_TARGETS	32
7401e66f787SSean Bruno 
741*7ea28254SJohn Hall #define PQI_CTLR_INDEX		0
7421e66f787SSean Bruno #define PQI_PD_INDEX(t)		(t + PQI_MAX_LOGICALS)
7431e66f787SSean Bruno 
7441e66f787SSean Bruno #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
7451e66f787SSean Bruno #define MAX_TARGET_DEVICES 1024
746*7ea28254SJohn Hall #define MAX_TARGET_BIT	1025
747*7ea28254SJohn Hall #define SLOT_AVAILABLE	false
748*7ea28254SJohn Hall #define SLOT_TAKEN	true
7491e66f787SSean Bruno 
7501e66f787SSean Bruno #define PQI_NO_MEM	2
7511e66f787SSean Bruno 
7521e66f787SSean Bruno typedef enum pqisrc_device_status {
7531e66f787SSean Bruno 	DEVICE_NOT_FOUND,
7541e66f787SSean Bruno 	DEVICE_CHANGED,
7551e66f787SSean Bruno 	DEVICE_UNCHANGED,
756*7ea28254SJohn Hall 	DEVICE_IN_REMOVE,
7571e66f787SSean Bruno } device_status_t;
7581e66f787SSean Bruno 
7591e66f787SSean Bruno #define SA_RAID_0			0
7601e66f787SSean Bruno #define SA_RAID_4			1
7611e66f787SSean Bruno #define SA_RAID_1			2	/* also used for RAID 10 */
7621e66f787SSean Bruno #define SA_RAID_5			3	/* also used for RAID 50 */
7631e66f787SSean Bruno #define SA_RAID_51			4
7641e66f787SSean Bruno #define SA_RAID_6			5	/* also used for RAID 60 */
7651e66f787SSean Bruno #define SA_RAID_ADM			6	/* also used for RAID 1+0 ADM */
7661e66f787SSean Bruno #define SA_RAID_MAX			SA_RAID_ADM
7671e66f787SSean Bruno #define SA_RAID_UNKNOWN			0xff
7681e66f787SSean Bruno 
7699fac68fcSPAPANI SRIKANTH #define BIT0 (1 << 0)
7709fac68fcSPAPANI SRIKANTH #define BIT1 (1 << 1)
7719fac68fcSPAPANI SRIKANTH #define BIT2 (1 << 2)
7729fac68fcSPAPANI SRIKANTH #define BIT3 (1 << 3)
7739fac68fcSPAPANI SRIKANTH 
7749fac68fcSPAPANI SRIKANTH #define BITS_PER_BYTE	8
775*7ea28254SJohn Hall 
776*7ea28254SJohn Hall 
777*7ea28254SJohn Hall /* Vendor Specific (BMIC) Op Code */
778*7ea28254SJohn Hall #define BMIC_READ									0x26
779*7ea28254SJohn Hall #define BMIC_WRITE								0x27
780*7ea28254SJohn Hall #define IS_BMIC_OPCODE(opcode)				(opcode == BMIC_READ || opcode == BMIC_WRITE)
7811e66f787SSean Bruno /* BMIC commands */
7821e66f787SSean Bruno #define BMIC_IDENTIFY_CONTROLLER				0x11
7831e66f787SSean Bruno #define BMIC_IDENTIFY_PHYSICAL_DEVICE		0x15
784*7ea28254SJohn Hall #define BMIC_SENSE_FEATURE					0x61
7851e66f787SSean Bruno #define BMIC_SENSE_CONTROLLER_PARAMETERS	0x64
7861e66f787SSean Bruno #define BMIC_SENSE_SUBSYSTEM_INFORMATION	0x66
7871e66f787SSean Bruno #define BMIC_WRITE_HOST_WELLNESS				0xa5
788*7ea28254SJohn Hall #define BMIC_CACHE_FLUSH						0xc2
7899fac68fcSPAPANI SRIKANTH #define BMIC_SET_DIAGS_OPTIONS				0xf4
7909fac68fcSPAPANI SRIKANTH #define BMIC_SENSE_DIAGS_OPTIONS				0xf5
791*7ea28254SJohn Hall #define BMIC_FLASH_FIRMWARE					0xf7
7929fac68fcSPAPANI SRIKANTH 
793*7ea28254SJohn Hall /* Sense Feature Pages/Subpages */
794*7ea28254SJohn Hall #define IO_SENSE_FEATURES_PAGE				0x08
795*7ea28254SJohn Hall #define SENSE_FEATURES_AIO_SUBPAGE			0x02
7961e66f787SSean Bruno 
7971e66f787SSean Bruno #define MASKED_DEVICE(lunid)			((lunid)[3] & 0xC0)
7981e66f787SSean Bruno #define BMIC_GET_LEVEL_2_BUS(lunid)		((lunid)[7] & 0x3F)
7991e66f787SSean Bruno #define BMIC_GET_LEVEL_TWO_TARGET(lunid)	((lunid)[6])
8001e66f787SSean Bruno #define BMIC_GET_DRIVE_NUMBER(lunid)		\
8011e66f787SSean Bruno 	(((BMIC_GET_LEVEL_2_BUS((lunid)) - 1) << 8) +	\
8021e66f787SSean Bruno 	BMIC_GET_LEVEL_TWO_TARGET((lunid)))
8031e66f787SSean Bruno #define NON_DISK_PHYS_DEV(rle)			\
8041e66f787SSean Bruno 	(((reportlun_ext_entry_t *)(rle))->device_flags & 0x1)
8051e66f787SSean Bruno 
8061e66f787SSean Bruno #define NO_TIMEOUT		((unsigned long) -1)
8071e66f787SSean Bruno 
8081e66f787SSean Bruno #define BMIC_DEVICE_TYPE_SATA	0x1
8091e66f787SSean Bruno 
8101e66f787SSean Bruno /* No of IO slots required for internal requests */
8111e66f787SSean Bruno #define PQI_RESERVED_IO_SLOTS_SYNC_REQUESTS	3
8121e66f787SSean Bruno #define PQI_RESERVED_IO_SLOTS_TMF		1
8131e66f787SSean Bruno #define PQI_RESERVED_IO_SLOTS_CNT		(PQI_NUM_SUPPORTED_EVENTS + \
8141e66f787SSean Bruno 						PQI_RESERVED_IO_SLOTS_TMF + \
8151e66f787SSean Bruno 						PQI_RESERVED_IO_SLOTS_SYNC_REQUESTS)
8161e66f787SSean Bruno 
817*7ea28254SJohn Hall /* Defines for counter flags */
818*7ea28254SJohn Hall #define COUNTER_FLAG_CLEAR_COUNTS			0x0001
819*7ea28254SJohn Hall #define COUNTER_FLAG_ONLY_NON_ZERO			0x0002
820*7ea28254SJohn Hall 
8219fac68fcSPAPANI SRIKANTH /* Defines for print flags */
8229fac68fcSPAPANI SRIKANTH #define PRINT_FLAG_HDR_COLUMN					0x0001
8239fac68fcSPAPANI SRIKANTH 
8249fac68fcSPAPANI SRIKANTH 
825*7ea28254SJohn Hall /* Function-specific debug flags */
826*7ea28254SJohn Hall #if 0
827*7ea28254SJohn Hall #define DEBUG_AIO		/* show AIO eligibility, IU, etc. (very spammy!) */
828*7ea28254SJohn Hall #define DEBUG_AIO_LOCATOR	/* show AIO row/column etc. calc.	*/
829*7ea28254SJohn Hall #define DEBUG_RAID_MAP		/* show AIO raid map content from FW */
830*7ea28254SJohn Hall #endif
831*7ea28254SJohn Hall 
GET_LE16(const uint8_t * p)8321e66f787SSean Bruno static inline uint16_t GET_LE16(const uint8_t *p)
8331e66f787SSean Bruno {
8341e66f787SSean Bruno 	return p[0] | p[1] << 8;
8351e66f787SSean Bruno }
8361e66f787SSean Bruno 
GET_LE32(const uint8_t * p)8371e66f787SSean Bruno static inline uint32_t GET_LE32(const uint8_t *p)
8381e66f787SSean Bruno {
8391e66f787SSean Bruno 	return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
8401e66f787SSean Bruno }
8411e66f787SSean Bruno 
GET_LE64(const uint8_t * p)8421e66f787SSean Bruno static inline uint64_t GET_LE64(const uint8_t *p)
8431e66f787SSean Bruno {
8441e66f787SSean Bruno 	return (((uint64_t)GET_LE32(p + 4) << 32) |
8451e66f787SSean Bruno 		GET_LE32(p));
8461e66f787SSean Bruno }
8471e66f787SSean Bruno 
GET_BE16(const uint8_t * p)8481e66f787SSean Bruno static inline uint16_t GET_BE16(const uint8_t *p)
8491e66f787SSean Bruno {
8501e66f787SSean Bruno         return p[0] << 8 | p[1];
8511e66f787SSean Bruno }
8521e66f787SSean Bruno 
GET_BE32(const uint8_t * p)8531e66f787SSean Bruno static inline uint32_t GET_BE32(const uint8_t *p)
8541e66f787SSean Bruno {
8551e66f787SSean Bruno         return p[0] << 24 | p[1] << 16 | p[2] << 8 | p[3];
8561e66f787SSean Bruno }
8571e66f787SSean Bruno 
GET_BE64(const uint8_t * p)8581e66f787SSean Bruno static inline uint64_t GET_BE64(const uint8_t *p)
8591e66f787SSean Bruno {
8601e66f787SSean Bruno         return (((uint64_t)GET_BE32(p) << 32) |
8611e66f787SSean Bruno                GET_BE32(p + 4));
8621e66f787SSean Bruno }
8631e66f787SSean Bruno 
PUT_BE16(uint16_t val,uint8_t * p)8641e66f787SSean Bruno static inline void PUT_BE16(uint16_t val, uint8_t *p)
8651e66f787SSean Bruno {
8661e66f787SSean Bruno         *p++ = val >> 8;
8671e66f787SSean Bruno         *p++ = val;
8681e66f787SSean Bruno }
8691e66f787SSean Bruno 
PUT_BE32(uint32_t val,uint8_t * p)8701e66f787SSean Bruno static inline void PUT_BE32(uint32_t val, uint8_t *p)
8711e66f787SSean Bruno {
8721e66f787SSean Bruno         PUT_BE16(val >> 16, p);
8731e66f787SSean Bruno         PUT_BE16(val, p + 2);
8741e66f787SSean Bruno }
8751e66f787SSean Bruno 
PUT_BE64(uint64_t val,uint8_t * p)8761e66f787SSean Bruno static inline void PUT_BE64(uint64_t val, uint8_t *p)
8771e66f787SSean Bruno {
8781e66f787SSean Bruno         PUT_BE32(val >> 32, p);
8791e66f787SSean Bruno         PUT_BE32(val, p + 4);
8801e66f787SSean Bruno }
8811e66f787SSean Bruno 
882*7ea28254SJohn Hall 
883*7ea28254SJohn Hall /* Calculates percentage of val vs total, i.e. 20 out of 100 --> 20% */
CALC_PERCENT_TOTAL(uint64_t val,uint64_t total)884*7ea28254SJohn Hall static inline uint64_t CALC_PERCENT_TOTAL(uint64_t val, uint64_t total)
885*7ea28254SJohn Hall {
886*7ea28254SJohn Hall 	uint64_t percent = 0;
887*7ea28254SJohn Hall 	if (total)
888*7ea28254SJohn Hall 		percent = (val * 100) / total;
889*7ea28254SJohn Hall 	return percent;
890*7ea28254SJohn Hall }
891*7ea28254SJohn Hall 
892*7ea28254SJohn Hall /* Calculates percentage of a vs b, i.e. 50 vs 100 -> 50/150 -> 33% */
893*7ea28254SJohn Hall #define CALC_PERCENT_VS(a, b)  (CALC_PERCENT_TOTAL(a, (a+b)))
894*7ea28254SJohn Hall 
895*7ea28254SJohn Hall #define STREAM_DETECTION         "stream_disable"
896*7ea28254SJohn Hall #define SATA_UNIQUE_WWN          "sata_unique_wwn_disable"
897*7ea28254SJohn Hall #define AIO_RAID1_WRITE_BYPASS   "aio_raid1_write_disable"
898*7ea28254SJohn Hall #define AIO_RAID5_WRITE_BYPASS   "aio_raid5_write_disable"
899*7ea28254SJohn Hall #define AIO_RAID6_WRITE_BYPASS   "aio_raid6_write_disable"
900*7ea28254SJohn Hall #define ADAPTER_QUEUE_DEPTH      "queue_depth"
901*7ea28254SJohn Hall #define SCATTER_GATHER_COUNT     "sg_count"
902*7ea28254SJohn Hall #define QUEUE_COUNT              "queue_count"
9031e66f787SSean Bruno 
9041e66f787SSean Bruno #define OS_ATTRIBUTE_PACKED         __attribute__((__packed__))
9051e66f787SSean Bruno #define OS_ATTRIBUTE_ALIGNED(n)     __attribute__((aligned(n)))
9061e66f787SSean Bruno 
9079fac68fcSPAPANI SRIKANTH 
9081e66f787SSean Bruno /* Management Interface */
9091e66f787SSean Bruno #define CCISS_IOC_MAGIC		'C'
9101e66f787SSean Bruno #define SMARTPQI_IOCTL_BASE     'M'
9111e66f787SSean Bruno #define CCISS_GETDRIVVER       _IOWR(SMARTPQI_IOCTL_BASE, 0, driver_info)
9121e66f787SSean Bruno #define CCISS_GETPCIINFO       _IOWR(SMARTPQI_IOCTL_BASE, 1, pqi_pci_info_t)
9131e66f787SSean Bruno #define SMARTPQI_PASS_THRU     _IOWR(SMARTPQI_IOCTL_BASE, 2, IOCTL_Command_struct)
9141e66f787SSean Bruno #define CCISS_PASSTHRU         _IOWR('C', 210, IOCTL_Command_struct)
9151e66f787SSean Bruno #define CCISS_REGNEWD          _IO(CCISS_IOC_MAGIC, 14)
9161e66f787SSean Bruno 
9171e66f787SSean Bruno /*IOCTL  pci_info structure */
9181e66f787SSean Bruno typedef struct pqi_pci_info
9191e66f787SSean Bruno {
9201e66f787SSean Bruno        unsigned char   bus;
9211e66f787SSean Bruno        unsigned char   dev_fn;
9221e66f787SSean Bruno        unsigned short  domain;
9231e66f787SSean Bruno        uint32_t        board_id;
9241e66f787SSean Bruno        uint32_t        chip_id;
9251e66f787SSean Bruno }pqi_pci_info_t;
9261e66f787SSean Bruno 
9271e66f787SSean Bruno typedef struct _driver_info
9281e66f787SSean Bruno {
9291e66f787SSean Bruno 	unsigned char 	major_version;
9309fac68fcSPAPANI SRIKANTH 	unsigned long 	minor_version;
9311e66f787SSean Bruno 	unsigned char 	release_version;
9321e66f787SSean Bruno 	unsigned long 	build_revision;
9331e66f787SSean Bruno 	unsigned long 	max_targets;
9341e66f787SSean Bruno 	unsigned long 	max_io;
9351e66f787SSean Bruno 	unsigned long 	max_transfer_length;
9361e66f787SSean Bruno }driver_info, *pdriver_info;
9371e66f787SSean Bruno 
9381e66f787SSean Bruno typedef uint8_t *passthru_buf_type_t;
9391e66f787SSean Bruno 
940*7ea28254SJohn Hall #define PQISRC_DRIVER_MAJOR		__FreeBSD__
941*7ea28254SJohn Hall #define PQISRC_DRIVER_MINOR	   4410
942*7ea28254SJohn Hall #define PQISRC_DRIVER_RELEASE	   0
943*7ea28254SJohn Hall #define PQISRC_DRIVER_REVISION   2005
9441e66f787SSean Bruno 
9451e66f787SSean Bruno #define STR(s)                          # s
946*7ea28254SJohn Hall #define PQISRC_VERSION(a, b, c, d)      STR(a.b.c-d)
947*7ea28254SJohn Hall #define PQISRC_DRIVER_VERSION           PQISRC_VERSION(PQISRC_DRIVER_MAJOR, \
948*7ea28254SJohn Hall                                         PQISRC_DRIVER_MINOR, \
949*7ea28254SJohn Hall                                         PQISRC_DRIVER_RELEASE, \
950*7ea28254SJohn Hall                                         PQISRC_DRIVER_REVISION)
9511e66f787SSean Bruno 
9521e66f787SSean Bruno /* End Management interface */
9531e66f787SSean Bruno 
9541e66f787SSean Bruno #ifdef ASSERT
9551e66f787SSean Bruno #undef ASSERT
9561e66f787SSean Bruno #endif
9571e66f787SSean Bruno 
9589fac68fcSPAPANI SRIKANTH /*
9599fac68fcSPAPANI SRIKANTH *os_atomic64_cas--
9609fac68fcSPAPANI SRIKANTH *
9619fac68fcSPAPANI SRIKANTH *Atomically read, compare, and conditionally write.
9629fac68fcSPAPANI SRIKANTH *i.e. compare and swap.
9639fac68fcSPAPANI SRIKANTH *retval True    On Success
9649fac68fcSPAPANI SRIKANTH *retval False   On Failure
9659fac68fcSPAPANI SRIKANTH *
9669fac68fcSPAPANI SRIKANTH */
9679fac68fcSPAPANI SRIKANTH static inline boolean_t
os_atomic64_cas(volatile uint64_t * var,uint64_t old_val,uint64_t new_val)9689fac68fcSPAPANI SRIKANTH os_atomic64_cas(volatile uint64_t* var, uint64_t old_val, uint64_t new_val)
9699fac68fcSPAPANI SRIKANTH {
9709fac68fcSPAPANI SRIKANTH         return (atomic_cmpset_64(var, old_val, new_val));
9719fac68fcSPAPANI SRIKANTH }
9729fac68fcSPAPANI SRIKANTH 
9731e66f787SSean Bruno #define ASSERT(cond) {\
9741e66f787SSean Bruno         	if (!(cond)) { \
9751e66f787SSean Bruno 			printf("Assertion failed at file %s line %d\n",__FILE__,__LINE__);	\
9761e66f787SSean Bruno 		}	\
9771e66f787SSean Bruno 		}
9781e66f787SSean Bruno 
9799fac68fcSPAPANI SRIKANTH /* Atomic */
9809fac68fcSPAPANI SRIKANTH typedef volatile uint64_t       OS_ATOMIC64_T;
9819fac68fcSPAPANI SRIKANTH #define OS_ATOMIC64_READ(p)     atomic_load_acq_64(p)
9829fac68fcSPAPANI SRIKANTH #define OS_ATOMIC64_INIT(p,val) atomic_store_rel_64(p, val)
9839fac68fcSPAPANI SRIKANTH 
9849fac68fcSPAPANI SRIKANTH /* 64-bit post atomic increment and decrement operations on value in pointer.*/
9859fac68fcSPAPANI SRIKANTH #define OS_ATOMIC64_DEC(p)      (atomic_fetchadd_64(p, -1) - 1)
9869fac68fcSPAPANI SRIKANTH #define OS_ATOMIC64_INC(p)      (atomic_fetchadd_64(p, 1) + 1)
9879fac68fcSPAPANI SRIKANTH 
9889fac68fcSPAPANI SRIKANTH 
9891e66f787SSean Bruno #define PQI_MAX_MSIX            64      /* vectors */
9901e66f787SSean Bruno #define PQI_MSI_CTX_SIZE        sizeof(pqi_intr_ctx)+1
9911e66f787SSean Bruno #define IS_POLLING_REQUIRED(softs)	if (cold) {\
9921e66f787SSean Bruno 					pqisrc_process_event_intr_src(softs, 0);\
9931e66f787SSean Bruno 					pqisrc_process_response_queue(softs, 1);\
9941e66f787SSean Bruno 				}
9951e66f787SSean Bruno 
9961e66f787SSean Bruno #define OS_GET_TASK_ATTR(rcb)		os_get_task_attr(rcb)
9971e66f787SSean Bruno #define OS_FW_HEARTBEAT_TIMER_INTERVAL (5)
9981e66f787SSean Bruno 
9991e66f787SSean Bruno typedef struct PCI_ACC_HANDLE {
10001e66f787SSean Bruno         bus_space_tag_t         pqi_btag;
10011e66f787SSean Bruno         bus_space_handle_t      pqi_bhandle;
10021e66f787SSean Bruno } PCI_ACC_HANDLE_T;
10031e66f787SSean Bruno 
10041e66f787SSean Bruno /*
10051e66f787SSean Bruno  * Legacy SIS Register definitions for the Adaptec PMC SRC/SRCv/smartraid adapters.
10061e66f787SSean Bruno  */
10071e66f787SSean Bruno /* accessible via BAR0 */
10081e66f787SSean Bruno #define LEGACY_SIS_IOAR		0x18	/* IOA->host interrupt register */
10091e66f787SSean Bruno #define LEGACY_SIS_IDBR		0x20	/* inbound doorbell register */
10101e66f787SSean Bruno #define LEGACY_SIS_IISR		0x24	/* inbound interrupt status register */
10111e66f787SSean Bruno #define LEGACY_SIS_OIMR		0x34	/* outbound interrupt mask register */
10121e66f787SSean Bruno #define LEGACY_SIS_ODBR_R	0x9c	/* outbound doorbell register read */
10131e66f787SSean Bruno #define LEGACY_SIS_ODBR_C	0xa0	/* outbound doorbell register clear */
10141e66f787SSean Bruno 
10151e66f787SSean Bruno #define LEGACY_SIS_SCR0		0xb0	/* scratchpad 0 */
10161e66f787SSean Bruno #define LEGACY_SIS_OMR		0xbc	/* outbound message register */
10171e66f787SSean Bruno #define LEGACY_SIS_IQUE64_L	0xc0	/* inbound queue address 64-bit (low) */
10181e66f787SSean Bruno #define LEGACY_SIS_IQUE64_H	0xc4	/* inbound queue address 64-bit (high)*/
10191e66f787SSean Bruno #define LEGACY_SIS_ODBR_MSI	0xc8	/* MSI register for sync./AIF */
10201e66f787SSean Bruno #define LEGACY_SIS_IQN_L	0xd0	/* inbound queue native mode (low) */
10211e66f787SSean Bruno #define LEGACY_SIS_IQN_H	0xd4	/* inbound queue native mode (high)*/
10221e66f787SSean Bruno #define LEGACY_SIS_MAILBOX	0x7fc60	/* mailbox (20 bytes) */
10231e66f787SSean Bruno #define LEGACY_SIS_SRCV_MAILBOX	0x1000	/* mailbox (20 bytes) */
10249fac68fcSPAPANI SRIKANTH #define LEGACY_SIS_SRCV_OFFSET_MAILBOX_7  0x101C   /* mailbox 7 register offset */
10259fac68fcSPAPANI SRIKANTH 
10261e66f787SSean Bruno #define LEGACY_SIS_ODR_SHIFT 	12	/* outbound doorbell shift */
10271e66f787SSean Bruno #define LEGACY_SIS_IDR_SHIFT 	9	/* inbound doorbell shift */
10281e66f787SSean Bruno 
10299fac68fcSPAPANI SRIKANTH 
10301e66f787SSean Bruno /*
10311e66f787SSean Bruno  * PQI Register definitions for the smartraid adapters
10321e66f787SSean Bruno  */
10331e66f787SSean Bruno /* accessible via BAR0 */
10341e66f787SSean Bruno #define PQI_SIGNATURE                  0x4000
10351e66f787SSean Bruno #define PQI_ADMINQ_CONFIG              0x4008
10361e66f787SSean Bruno #define PQI_ADMINQ_CAP                 0x4010
10371e66f787SSean Bruno #define PQI_LEGACY_INTR_STATUS         0x4018
10381e66f787SSean Bruno #define PQI_LEGACY_INTR_MASK_SET       0x401C
10391e66f787SSean Bruno #define PQI_LEGACY_INTR_MASK_CLR       0x4020
10401e66f787SSean Bruno #define PQI_DEV_STATUS                 0x4040
10411e66f787SSean Bruno #define PQI_ADMIN_IBQ_PI_OFFSET        0x4048
10421e66f787SSean Bruno #define PQI_ADMIN_OBQ_CI_OFFSET        0x4050
10431e66f787SSean Bruno #define PQI_ADMIN_IBQ_ELEM_ARRAY_ADDR  0x4058
10441e66f787SSean Bruno #define PQI_ADMIN_OBQ_ELEM_ARRAY_ADDR  0x4060
10451e66f787SSean Bruno #define PQI_ADMIN_IBQ_CI_ADDR          0x4068
10461e66f787SSean Bruno #define PQI_ADMIN_OBQ_PI_ADDR          0x4070
10471e66f787SSean Bruno #define PQI_ADMINQ_PARAM               0x4078
10481e66f787SSean Bruno #define PQI_DEV_ERR                    0x4080
10491e66f787SSean Bruno #define PQI_DEV_ERR_DETAILS            0x4088
10501e66f787SSean Bruno #define PQI_DEV_RESET                  0x4090
10511e66f787SSean Bruno #define PQI_POWER_ACTION               0x4094
10521e66f787SSean Bruno 
10531e66f787SSean Bruno /* Busy wait micro seconds */
10541e66f787SSean Bruno #define OS_BUSYWAIT(x) DELAY(x)
10551e66f787SSean Bruno #define OS_SLEEP(timeout)	\
10561e66f787SSean Bruno 	DELAY(timeout);
10571e66f787SSean Bruno 
10589fac68fcSPAPANI SRIKANTH /* TMF request timeout is 600 Sec */
10599fac68fcSPAPANI SRIKANTH #define OS_TMF_TIMEOUT_SEC		(10 * 60)
10601e66f787SSean Bruno 
10611e66f787SSean Bruno #define LE_16(x) htole16(x)
10621e66f787SSean Bruno #define LE_32(x) htole32(x)
10631e66f787SSean Bruno #define LE_64(x) htole64(x)
10641e66f787SSean Bruno #define BE_16(x) htobe16(x)
10651e66f787SSean Bruno #define BE_32(x) htobe32(x)
10661e66f787SSean Bruno #define BE_64(x) htobe64(x)
10671e66f787SSean Bruno 
10681e66f787SSean Bruno #define PQI_HWIF_SRCV           0
10691e66f787SSean Bruno #define PQI_HWIF_UNKNOWN        -1
10701e66f787SSean Bruno 
10719fac68fcSPAPANI SRIKANTH 
10721e66f787SSean Bruno #define SMART_STATE_SUSPEND     	(1<<0)
10731e66f787SSean Bruno #define SMART_STATE_UNUSED0     	(1<<1)
10741e66f787SSean Bruno #define SMART_STATE_INTERRUPTS_ON       (1<<2)
10751e66f787SSean Bruno #define SMART_STATE_AIF_SLEEPER 	(1<<3)
10761e66f787SSean Bruno #define SMART_STATE_RESET               (1<<4)
10771e66f787SSean Bruno 
10781e66f787SSean Bruno #define PQI_FLAG_BUSY 			(1<<0)
10791e66f787SSean Bruno #define PQI_MSI_ENABLED 		(1<<1)
10801e66f787SSean Bruno #define PQI_SIM_REGISTERED 		(1<<2)
10811e66f787SSean Bruno #define PQI_MTX_INIT	 		(1<<3)
10821e66f787SSean Bruno 
10839fac68fcSPAPANI SRIKANTH 
10841e66f787SSean Bruno #define PQI_CMD_MAPPED 			(1<<2)
10851e66f787SSean Bruno 
10861e66f787SSean Bruno /* Interrupt context to get oq_id */
10871e66f787SSean Bruno typedef struct pqi_intr_ctx {
10881e66f787SSean Bruno         int 	 oq_id;
10891e66f787SSean Bruno         device_t pqi_dev;
10901e66f787SSean Bruno }pqi_intr_ctx_t;
10911e66f787SSean Bruno 
10921e66f787SSean Bruno typedef uint8_t os_dev_info_t;
10931e66f787SSean Bruno 
10941e66f787SSean Bruno typedef struct OS_SPECIFIC {
10951e66f787SSean Bruno 	device_t                pqi_dev;
10961e66f787SSean Bruno 	struct resource		*pqi_regs_res0; /* reg. if. window */
10971e66f787SSean Bruno 	int			pqi_regs_rid0;		/* resource ID */
10981e66f787SSean Bruno 	bus_dma_tag_t		pqi_parent_dmat;	/* parent DMA tag */
10991e66f787SSean Bruno 	bus_dma_tag_t           pqi_buffer_dmat;
11001e66f787SSean Bruno 
11011e66f787SSean Bruno 	/* controller hardware interface */
11021e66f787SSean Bruno 	int			pqi_hwif;
11031e66f787SSean Bruno 	struct resource         *pqi_irq[PQI_MAX_MSIX];  /* interrupt */
11041e66f787SSean Bruno 	int                     pqi_irq_rid[PQI_MAX_MSIX];
11051e66f787SSean Bruno 	void                    *intrcookie[PQI_MAX_MSIX];
11061e66f787SSean Bruno 	bool                    intr_registered[PQI_MAX_MSIX];
11071e66f787SSean Bruno 	bool			msi_enabled;            /* MSI/MSI-X enabled */
11081e66f787SSean Bruno 	pqi_intr_ctx_t		*msi_ctx;
11091e66f787SSean Bruno 	int			oq_id;
11101e66f787SSean Bruno 	int			pqi_state;
11111e66f787SSean Bruno 	uint32_t		pqi_flags;
11121e66f787SSean Bruno 	struct mtx              cam_lock;
11131e66f787SSean Bruno 	struct mtx              map_lock;
11141e66f787SSean Bruno 	int                     mtx_init;
11151e66f787SSean Bruno 	int                     sim_registered;
11161e66f787SSean Bruno 	struct cam_devq         *devq;
11171e66f787SSean Bruno 	struct cam_sim          *sim;
11181e66f787SSean Bruno 	struct cam_path         *path;
11191e66f787SSean Bruno 	struct task		event_task;
11201e66f787SSean Bruno 	struct cdev             *cdev;
11219358ccebSJohn Baldwin 	struct callout		wellness_periodic;	/* periodic event handling */
11229358ccebSJohn Baldwin 	struct callout		heartbeat_timeout_id;	/* heart beat event handling */
11231e66f787SSean Bruno } OS_SPECIFIC_T;
11241e66f787SSean Bruno 
1125*7ea28254SJohn Hall 
1126*7ea28254SJohn Hall typedef struct device_hints {
1127*7ea28254SJohn Hall 	uint8_t     stream_status: 1;
1128*7ea28254SJohn Hall 	uint8_t     sata_unique_wwn_status: 1;
1129*7ea28254SJohn Hall 	uint8_t     aio_raid1_write_status: 1;
1130*7ea28254SJohn Hall 	uint8_t     aio_raid5_write_status: 1;
1131*7ea28254SJohn Hall 	uint8_t     aio_raid6_write_status: 1;
1132*7ea28254SJohn Hall 	uint32_t    queue_depth;
1133*7ea28254SJohn Hall 	uint32_t    sg_segments;
1134*7ea28254SJohn Hall 	uint32_t    cpu_count;
1135*7ea28254SJohn Hall } device_hint;
1136*7ea28254SJohn Hall 
11371e66f787SSean Bruno typedef bus_addr_t dma_addr_t;
11381e66f787SSean Bruno 
11391e66f787SSean Bruno 
11401e66f787SSean Bruno /* Register access macros */
11411e66f787SSean Bruno #define PCI_MEM_GET32( _softs, _absaddr, _offset ) \
11421e66f787SSean Bruno     bus_space_read_4(_softs->pci_mem_handle.pqi_btag, \
11431e66f787SSean Bruno         _softs->pci_mem_handle.pqi_bhandle, _offset)
11441e66f787SSean Bruno 
11459fac68fcSPAPANI SRIKANTH 
11469fac68fcSPAPANI SRIKANTH #if defined(__i386__)
11479fac68fcSPAPANI SRIKANTH #define PCI_MEM_GET64( _softs, _absaddr, _offset ) ({ \
11489fac68fcSPAPANI SRIKANTH 	(uint64_t)bus_space_read_4(_softs->pci_mem_handle.pqi_btag, \
11499fac68fcSPAPANI SRIKANTH 		_softs->pci_mem_handle.pqi_bhandle, _offset) + \
11509fac68fcSPAPANI SRIKANTH 		((uint64_t)bus_space_read_4(_softs->pci_mem_handle.pqi_btag, \
11519fac68fcSPAPANI SRIKANTH 		_softs->pci_mem_handle.pqi_bhandle, _offset + 4) << 32); \
11529fac68fcSPAPANI SRIKANTH 	})
11539fac68fcSPAPANI SRIKANTH #else
11541e66f787SSean Bruno #define PCI_MEM_GET64(_softs, _absaddr, _offset ) \
11551e66f787SSean Bruno     	bus_space_read_8(_softs->pci_mem_handle.pqi_btag, \
11561e66f787SSean Bruno         	_softs->pci_mem_handle.pqi_bhandle, _offset)
11579fac68fcSPAPANI SRIKANTH #endif
11581e66f787SSean Bruno 
11591e66f787SSean Bruno #define PCI_MEM_PUT32( _softs, _absaddr, _offset, _val ) \
11601e66f787SSean Bruno     bus_space_write_4(_softs->pci_mem_handle.pqi_btag, \
11611e66f787SSean Bruno         _softs->pci_mem_handle.pqi_bhandle, _offset, _val)
11621e66f787SSean Bruno 
11639fac68fcSPAPANI SRIKANTH #if defined(__i386__)
11649fac68fcSPAPANI SRIKANTH #define PCI_MEM_PUT64( _softs, _absaddr, _offset, _val ) \
11659fac68fcSPAPANI SRIKANTH 	bus_space_write_4(_softs->pci_mem_handle.pqi_btag, \
11669fac68fcSPAPANI SRIKANTH 		_softs->pci_mem_handle.pqi_bhandle, _offset, _val); \
11679fac68fcSPAPANI SRIKANTH 	bus_space_write_4(_softs->pci_mem_handle.pqi_btag, \
11689fac68fcSPAPANI SRIKANTH 		_softs->pci_mem_handle.pqi_bhandle, _offset + 4, _val >> 32);
11699fac68fcSPAPANI SRIKANTH #else
11701e66f787SSean Bruno #define PCI_MEM_PUT64( _softs, _absaddr, _offset, _val ) \
11711e66f787SSean Bruno     	bus_space_write_8(_softs->pci_mem_handle.pqi_btag, \
11721e66f787SSean Bruno         	_softs->pci_mem_handle.pqi_bhandle, _offset, _val)
11739fac68fcSPAPANI SRIKANTH #endif
11749fac68fcSPAPANI SRIKANTH 
11751e66f787SSean Bruno 
11761e66f787SSean Bruno #define PCI_MEM_GET_BUF(_softs, _absaddr, _offset, buf, size) \
11771e66f787SSean Bruno 	bus_space_read_region_1(_softs->pci_mem_handle.pqi_btag,\
11781e66f787SSean Bruno 	_softs->pci_mem_handle.pqi_bhandle, _offset, buf, size)
11791e66f787SSean Bruno 
11801e66f787SSean Bruno /* Lock */
11811e66f787SSean Bruno typedef struct mtx OS_LOCK_T;
11821e66f787SSean Bruno typedef struct sema OS_SEMA_LOCK_T;
11831e66f787SSean Bruno 
1184b17f4335SSean Bruno #define OS_PQILOCK_T OS_LOCK_T
1185b17f4335SSean Bruno 
11861e66f787SSean Bruno #define OS_ACQUIRE_SPINLOCK(_lock) mtx_lock_spin(_lock)
11871e66f787SSean Bruno #define OS_RELEASE_SPINLOCK(_lock) mtx_unlock_spin(_lock)
11881e66f787SSean Bruno 
11891e66f787SSean Bruno #define OS_INIT_PQILOCK(_softs,_lock,_lockname) os_init_spinlock(_softs,_lock,_lockname)
11901e66f787SSean Bruno #define OS_UNINIT_PQILOCK(_lock) os_uninit_spinlock(_lock)
11911e66f787SSean Bruno 
1192b17f4335SSean Bruno #define PQI_LOCK(_lock) OS_ACQUIRE_SPINLOCK(_lock)
1193b17f4335SSean Bruno #define PQI_UNLOCK(_lock) OS_RELEASE_SPINLOCK(_lock)
1194b17f4335SSean Bruno 
1195*7ea28254SJohn Hall #define OS_GET_CDBP(rcb)	((rcb->cm_ccb->ccb_h.flags & CAM_CDB_POINTER) ? rcb->cm_ccb->csio.cdb_io.cdb_ptr : rcb->cm_ccb->csio.cdb_io.cdb_bytes)
11961e66f787SSean Bruno #define GET_SCSI_BUFFLEN(rcb)	(rcb->cm_ccb->csio.dxfer_len)
11979fac68fcSPAPANI SRIKANTH #define IS_OS_SCSICMD(rcb)      (rcb && !rcb->tm_req && rcb->cm_ccb)
11981e66f787SSean Bruno 
11991e66f787SSean Bruno #define OS_GET_IO_QINDEX(softs,rcb)	curcpu % softs->num_op_obq
12001e66f787SSean Bruno #define OS_GET_IO_RESP_QID(softs,rcb)	(softs->op_ob_q[(OS_GET_IO_QINDEX(softs,rcb))].q_id)
12011e66f787SSean Bruno #define OS_GET_IO_REQ_QINDEX(softs,rcb)	OS_GET_IO_QINDEX(softs,rcb)
12021e66f787SSean Bruno #define OS_GET_TMF_RESP_QID		OS_GET_IO_RESP_QID
12031e66f787SSean Bruno #define OS_GET_TMF_REQ_QINDEX		OS_GET_IO_REQ_QINDEX
1204b17f4335SSean Bruno 
1205b17f4335SSean Bruno /* check request type */
12069fac68fcSPAPANI SRIKANTH #define is_internal_req(rcb)	(!(rcb->cm_ccb))
12079fac68fcSPAPANI SRIKANTH 
12089fac68fcSPAPANI SRIKANTH #define	os_io_memcpy(dest, src, len)	memcpy(dest, src, len)
1209b17f4335SSean Bruno 
12101e66f787SSean Bruno /* sg elements addr, len, flags */
12111e66f787SSean Bruno #define OS_GET_IO_SG_COUNT(rcb)		rcb->nseg
12121e66f787SSean Bruno #define OS_GET_IO_SG_ADDR(rcb,i)	rcb->sgt[i].addr
12131e66f787SSean Bruno #define OS_GET_IO_SG_LEN(rcb,i)		rcb->sgt[i].len
12141e66f787SSean Bruno 
12151e66f787SSean Bruno /* scsi commands used in pqilib for RAID bypass*/
12161e66f787SSean Bruno #define SCMD_READ_6	READ_6
12171e66f787SSean Bruno #define SCMD_WRITE_6	WRITE_6
12181e66f787SSean Bruno #define SCMD_READ_10	READ_10
12191e66f787SSean Bruno #define SCMD_WRITE_10	WRITE_10
12201e66f787SSean Bruno #define SCMD_READ_12	READ_12
12211e66f787SSean Bruno #define SCMD_WRITE_12	WRITE_12
12221e66f787SSean Bruno #define SCMD_READ_16	READ_16
12231e66f787SSean Bruno #define SCMD_WRITE_16	WRITE_16
12241e66f787SSean Bruno 
12259fac68fcSPAPANI SRIKANTH /* FreeBSD status macros */
12269fac68fcSPAPANI SRIKANTH #define BSD_SUCCESS           0
1227*7ea28254SJohn Hall #define DEVICE_HINT_SUCCESS   0
12289fac68fcSPAPANI SRIKANTH 
1229*7ea28254SJohn Hall /* Min outstanding commands that driver can register with CAM layer.*/
1230*7ea28254SJohn Hall #define OS_MIN_OUTSTANDING_REQ  6
1231*7ea28254SJohn Hall #define BSD_MIN_SG_SEGMENTS     16
1232*7ea28254SJohn Hall 
1233*7ea28254SJohn Hall #define DISABLE_ERR_RESP_VERBOSE 1
12349fac68fcSPAPANI SRIKANTH 
12351e66f787SSean Bruno /* Debug facility */
12361e66f787SSean Bruno 
12371e66f787SSean Bruno #define	PQISRC_FLAGS_MASK		0x0000ffff
12381e66f787SSean Bruno #define	PQISRC_FLAGS_INIT 		0x00000001
12391e66f787SSean Bruno #define	PQISRC_FLAGS_INFO 		0x00000002
12401e66f787SSean Bruno #define	PQISRC_FLAGS_FUNC		0x00000004
12411e66f787SSean Bruno #define	PQISRC_FLAGS_TRACEIO		0x00000008
1242b17f4335SSean Bruno #define	PQISRC_FLAGS_DISC		0x00000010
1243b17f4335SSean Bruno #define	PQISRC_FLAGS_WARN		0x00000020
1244b17f4335SSean Bruno #define	PQISRC_FLAGS_ERROR		0x00000040
12459fac68fcSPAPANI SRIKANTH #define	PQISRC_FLAGS_NOTE		0x00000080
12469fac68fcSPAPANI SRIKANTH 
12474f77349dSWarner Losh #define PQISRC_LOG_LEVEL  (PQISRC_FLAGS_WARN | PQISRC_FLAGS_ERROR | PQISRC_FLAGS_NOTE)
12484f77349dSWarner Losh 
12494f77349dSWarner Losh static int logging_level  = PQISRC_LOG_LEVEL;
12501e66f787SSean Bruno 
12511e66f787SSean Bruno #define	DBG_INIT(fmt,args...)						\
12521e66f787SSean Bruno 		do {							\
12531e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_INIT) { 	\
12541e66f787SSean Bruno 				printf("[INIT]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
12551e66f787SSean Bruno 			}						\
12561e66f787SSean Bruno 		}while(0);
12571e66f787SSean Bruno 
12581e66f787SSean Bruno #define	DBG_INFO(fmt,args...)						\
12591e66f787SSean Bruno 		do {							\
12601e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_INFO) { 	\
12611e66f787SSean Bruno 				printf("[INFO]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
12621e66f787SSean Bruno 			}						\
12631e66f787SSean Bruno 		}while(0);
12641e66f787SSean Bruno 
12651e66f787SSean Bruno #define	DBG_FUNC(fmt,args...)						\
12661e66f787SSean Bruno 		do {							\
12671e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_FUNC) { 	\
12681e66f787SSean Bruno 				printf("[FUNC]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
12691e66f787SSean Bruno 			}						\
12701e66f787SSean Bruno 		}while(0);
12711e66f787SSean Bruno 
1272b17f4335SSean Bruno #define	DBG_DISC(fmt,args...)						\
1273b17f4335SSean Bruno 		do {							\
1274b17f4335SSean Bruno 			if (logging_level & PQISRC_FLAGS_DISC) { 	\
1275b17f4335SSean Bruno 				printf("[DISC]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
1276b17f4335SSean Bruno 			}						\
1277b17f4335SSean Bruno 		}while(0);
1278b17f4335SSean Bruno 
1279*7ea28254SJohn Hall #define	DBG_TRACEIO(fmt,args...)					\
1280*7ea28254SJohn Hall 		do {							\
1281*7ea28254SJohn Hall 			if (logging_level & PQISRC_FLAGS_TRACEIO) { 	\
1282*7ea28254SJohn Hall 				printf("[TRACEIO]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
1283*7ea28254SJohn Hall 			}						\
1284*7ea28254SJohn Hall 		}while(0);
1285*7ea28254SJohn Hall 
12861e66f787SSean Bruno #define	DBG_WARN(fmt,args...)						\
12871e66f787SSean Bruno 		do {							\
12881e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_WARN) { 	\
12891e66f787SSean Bruno 				printf("[WARN]:[%u:%u.%u][CPU %d][%s][%d]:"fmt,softs->bus_id,softs->device_id,softs->func_id,curcpu,__func__,__LINE__,##args);\
12901e66f787SSean Bruno 			}						\
12911e66f787SSean Bruno 		}while(0);
12921e66f787SSean Bruno 
12931e66f787SSean Bruno #define	DBG_ERR(fmt,args...)						\
12941e66f787SSean Bruno 		do {							\
12951e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_ERROR) { 	\
12961e66f787SSean Bruno 				printf("[ERROR]::[%u:%u.%u][CPU %d][%s][%d]:"fmt,softs->bus_id,softs->device_id,softs->func_id,curcpu,__func__,__LINE__,##args); \
12971e66f787SSean Bruno 			}						\
12981e66f787SSean Bruno 		}while(0);
1299*7ea28254SJohn Hall #define DBG_ERR_NO_SOFTS(fmt,args...)                                           \
1300*7ea28254SJohn Hall 		do {                                                    \
1301*7ea28254SJohn Hall 			if (logging_level & PQISRC_FLAGS_ERROR) {       \
1302*7ea28254SJohn Hall 				printf("[ERROR]::[CPU %d][%s][%d]:"fmt,curcpu,__func__,__LINE__,##args); \
1303*7ea28254SJohn Hall 			}                                               \
1304*7ea28254SJohn Hall 		}while(0);
13051e66f787SSean Bruno #define	DBG_IO(fmt,args...)						\
13061e66f787SSean Bruno 		do {							\
13071e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_TRACEIO) { 	\
13081e66f787SSean Bruno 				printf("[IO]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
13091e66f787SSean Bruno 			}						\
13101e66f787SSean Bruno 		}while(0);
13111e66f787SSean Bruno 
13121e66f787SSean Bruno #define	DBG_ERR_BTL(device,fmt,args...)						\
13131e66f787SSean Bruno 		do {							\
13141e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_ERROR) { 	\
1315*7ea28254SJohn Hall 				printf("[ERROR]::[%u:%u.%u][%d,%d,%d][CPU %d][%s][%d]:"fmt, softs->bus_id, softs->device_id, softs->func_id, device->bus, device->target, device->lun,curcpu,__func__,__LINE__,##args); \
13161e66f787SSean Bruno 			}						\
13171e66f787SSean Bruno 		}while(0);
13181e66f787SSean Bruno 
13191e66f787SSean Bruno #define	DBG_WARN_BTL(device,fmt,args...)						\
13201e66f787SSean Bruno 		do {							\
13211e66f787SSean Bruno 			if (logging_level & PQISRC_FLAGS_WARN) { 	\
1322*7ea28254SJohn Hall 				printf("[WARN]:[%u:%u.%u][%d,%d,%d][CPU %d][%s][%d]:"fmt, softs->bus_id, softs->device_id, softs->func_id, device->bus, device->target, device->lun,curcpu,__func__,__LINE__,##args);\
13231e66f787SSean Bruno 			}						\
13241e66f787SSean Bruno 		}while(0);
13251e66f787SSean Bruno 
13269fac68fcSPAPANI SRIKANTH #define	DBG_NOTE(fmt,args...)						\
13279fac68fcSPAPANI SRIKANTH 		do {							\
13289fac68fcSPAPANI SRIKANTH 			if (logging_level & PQISRC_FLAGS_NOTE) { 	\
1329*7ea28254SJohn Hall 				printf("[NOTE]:[ %s ] [ %d ]"fmt,__func__,__LINE__,##args);			\
13309fac68fcSPAPANI SRIKANTH 			}						\
13319fac68fcSPAPANI SRIKANTH 		}while(0);
13329fac68fcSPAPANI SRIKANTH 
13339fac68fcSPAPANI SRIKANTH #endif /* _PQI_DEFINES_H */
1334