xref: /illumos-gate/usr/src/uts/common/io/scsi/adapters/lmrc/lmrc_reg.h (revision 98f0a994ee13c4f450852a3d01f2e340abe69fb8)
11e091e43SHans Rosenfeld /*
21e091e43SHans Rosenfeld  * This file and its contents are supplied under the terms of the
31e091e43SHans Rosenfeld  * Common Development and Distribution License ("CDDL"), version 1.0.
41e091e43SHans Rosenfeld  * You may only use this file in accordance with the terms of version
51e091e43SHans Rosenfeld  * 1.0 of the CDDL.
61e091e43SHans Rosenfeld  *
71e091e43SHans Rosenfeld  * A full copy of the text of the CDDL should have accompanied this
81e091e43SHans Rosenfeld  * source.  A copy of the CDDL is also available via the Internet at
91e091e43SHans Rosenfeld  * http://www.illumos.org/license/CDDL.
101e091e43SHans Rosenfeld  */
111e091e43SHans Rosenfeld 
121e091e43SHans Rosenfeld /*
13*98f0a994SHans Rosenfeld  * Copyright 2024 Racktop Systems, Inc.
141e091e43SHans Rosenfeld  */
151e091e43SHans Rosenfeld #ifndef _LMRC_REG_H
161e091e43SHans Rosenfeld #define	_LMRC_REG_H
171e091e43SHans Rosenfeld 
181e091e43SHans Rosenfeld #include <sys/bitext.h>
191e091e43SHans Rosenfeld #include <sys/debug.h>
201e091e43SHans Rosenfeld #include <sys/stddef.h>
211e091e43SHans Rosenfeld 
22*98f0a994SHans Rosenfeld #include <sys/scsi/adapters/mfi/mfi.h>
23*98f0a994SHans Rosenfeld 
241e091e43SHans Rosenfeld typedef struct lmrc_raid_mfa_io_req_desc	lmrc_raid_mfa_io_req_desc_t;
251e091e43SHans Rosenfeld typedef union lmrc_atomic_req_desc		lmrc_atomic_req_desc_t;
261e091e43SHans Rosenfeld typedef union lmrc_req_desc			lmrc_req_desc_t;
271e091e43SHans Rosenfeld 
281e091e43SHans Rosenfeld #include "lmrc_raid.h"
291e091e43SHans Rosenfeld 
301e091e43SHans Rosenfeld /* PCI device IDs of Gen 3.5 Controllers */
311e091e43SHans Rosenfeld #define	LMRC_VENTURA		0x0014
321e091e43SHans Rosenfeld #define	LMRC_CRUSADER		0x0015
331e091e43SHans Rosenfeld #define	LMRC_HARPOON		0x0016
341e091e43SHans Rosenfeld #define	LMRC_TOMCAT		0x0017
351e091e43SHans Rosenfeld #define	LMRC_VENTURA_4PORT	0x001B
361e091e43SHans Rosenfeld #define	LMRC_CRUSADER_4PORT	0x001C
371e091e43SHans Rosenfeld #define	LMRC_AERO_10E0		0x10E0
381e091e43SHans Rosenfeld #define	LMRC_AERO_10E1		0x10E1
391e091e43SHans Rosenfeld #define	LMRC_AERO_10E2		0x10E2
401e091e43SHans Rosenfeld #define	LMRC_AERO_10E3		0x10E3
411e091e43SHans Rosenfeld #define	LMRC_AERO_10E4		0x10E4
421e091e43SHans Rosenfeld #define	LMRC_AERO_10E5		0x10E5
431e091e43SHans Rosenfeld #define	LMRC_AERO_10E6		0x10E6
441e091e43SHans Rosenfeld #define	LMRC_AERO_10E7		0x10E7
451e091e43SHans Rosenfeld 
461e091e43SHans Rosenfeld /*
471e091e43SHans Rosenfeld  * Message Frame Defines
481e091e43SHans Rosenfeld  */
491e091e43SHans Rosenfeld #define	LMRC_SENSE_LEN		96
501e091e43SHans Rosenfeld 
511e091e43SHans Rosenfeld #define	LMRC_MPI2_RAID_DEFAULT_IO_FRAME_SIZE	256
521e091e43SHans Rosenfeld 
531e091e43SHans Rosenfeld #define	LMRC_SPECIFIC_MPI2_FUNCTION(x)		\
541e091e43SHans Rosenfeld 	(MPI2_FUNCTION_MIN_PRODUCT_SPECIFIC + (x))
551e091e43SHans Rosenfeld #define	LMRC_MPI2_FUNCTION_PASSTHRU_IO_REQUEST	LMRC_SPECIFIC_MPI2_FUNCTION(0)
561e091e43SHans Rosenfeld #define	LMRC_MPI2_FUNCTION_LD_IO_REQUEST	LMRC_SPECIFIC_MPI2_FUNCTION(1)
571e091e43SHans Rosenfeld 
581e091e43SHans Rosenfeld 
591e091e43SHans Rosenfeld #define	LMRC_MAX_MFI_CMDS			16
601e091e43SHans Rosenfeld #define	LMRC_MAX_IOCTL_CMDS			3
611e091e43SHans Rosenfeld 
621e091e43SHans Rosenfeld /*
631e091e43SHans Rosenfeld  * Firmware Status Register
641e091e43SHans Rosenfeld  * For Ventura and Aero controllers, this is outbound scratch pad register 0.
651e091e43SHans Rosenfeld  */
661e091e43SHans Rosenfeld #define	LMRC_FW_RESET_REQUIRED(reg)		(bitx32((reg), 0, 0) != 0)
671e091e43SHans Rosenfeld #define	LMRC_FW_RESET_ADAPTER(reg)		(bitx32((reg), 1, 1) != 0)
681e091e43SHans Rosenfeld #define	LMRC_FW_MAX_CMD(reg)			bitx32((reg), 15, 0)
691e091e43SHans Rosenfeld #define	LMRC_FW_MSIX_ENABLED(reg)		(bitx32((reg), 26, 26) != 0)
701e091e43SHans Rosenfeld #define	LMRC_FW_STATE(reg)			bitx32((reg), 31, 28)
711e091e43SHans Rosenfeld 
721e091e43SHans Rosenfeld /* outbound scratch pad register 1 */
731e091e43SHans Rosenfeld #define	LMRC_MAX_CHAIN_SIZE(reg)		bitx32((reg), 9, 5)
741e091e43SHans Rosenfeld #define	LMRC_MAX_REPLY_QUEUES_EXT(reg)		bitx32((reg), 21, 14)
751e091e43SHans Rosenfeld #define	LMRC_EXT_CHAIN_SIZE_SUPPORT(reg)	(bitx32((reg), 22, 22) != 0)
761e091e43SHans Rosenfeld #define	LMRC_RDPQ_MODE_SUPPORT(reg)		(bitx32((reg), 23, 23) != 0)
771e091e43SHans Rosenfeld #define	LMRC_SYNC_CACHE_SUPPORT(reg)		(bitx32((reg), 24, 24) != 0)
781e091e43SHans Rosenfeld #define	LMRC_ATOMIC_DESCRIPTOR_SUPPORT(reg)	(bitx32((reg), 24, 24) != 0)
791e091e43SHans Rosenfeld #define	LMRC_64BIT_DMA_SUPPORT(reg)		(bitx32((reg), 25, 25) != 0)
801e091e43SHans Rosenfeld #define	LMRC_INTR_COALESCING_SUPPORT(reg)	(bitx32((reg), 26, 26) != 0)
811e091e43SHans Rosenfeld 
821e091e43SHans Rosenfeld #define	LMRC_256K_IO				128
831e091e43SHans Rosenfeld #define	LMRC_1MB_IO				(LMRC_256K_IO * 4)
841e091e43SHans Rosenfeld 
851e091e43SHans Rosenfeld /* outbound scratch pad register 2 */
861e091e43SHans Rosenfeld #define	LMRC_MAX_RAID_MAP_SZ(reg)		bitx32((reg), 24, 16)
871e091e43SHans Rosenfeld 
881e091e43SHans Rosenfeld /* outbound scratch pad register 3 */
891e091e43SHans Rosenfeld #define	LMRC_NVME_PAGE_SHIFT(reg)		bitx32((reg), 7, 0)
901e091e43SHans Rosenfeld #define	LMRC_DEFAULT_NVME_PAGE_SHIFT		12
911e091e43SHans Rosenfeld 
921e091e43SHans Rosenfeld /*
931e091e43SHans Rosenfeld  * FW posts its state in the upper 4 bits of the status register, extracted
941e091e43SHans Rosenfeld  * with LMRC_FW_STATE(reg).
951e091e43SHans Rosenfeld  */
961e091e43SHans Rosenfeld #define	LMRC_FW_STATE_UNDEFINED			0x0
971e091e43SHans Rosenfeld #define	LMRC_FW_STATE_BB_INIT			0x1
981e091e43SHans Rosenfeld #define	LMRC_FW_STATE_FW_INIT			0x4
991e091e43SHans Rosenfeld #define	LMRC_FW_STATE_WAIT_HANDSHAKE		0x6
1001e091e43SHans Rosenfeld #define	LMRC_FW_STATE_FW_INIT_2			0x7
1011e091e43SHans Rosenfeld #define	LMRC_FW_STATE_DEVICE_SCAN		0x8
1021e091e43SHans Rosenfeld #define	LMRC_FW_STATE_BOOT_MSG_PENDING		0x9
1031e091e43SHans Rosenfeld #define	LMRC_FW_STATE_FLUSH_CACHE		0xa
1041e091e43SHans Rosenfeld #define	LMRC_FW_STATE_READY			0xb
1051e091e43SHans Rosenfeld #define	LMRC_FW_STATE_OPERATIONAL		0xc
1061e091e43SHans Rosenfeld #define	LMRC_FW_STATE_FAULT			0xf
1071e091e43SHans Rosenfeld 
1081e091e43SHans Rosenfeld #define	LMRC_MAX_PD_CHANNELS		1
1091e091e43SHans Rosenfeld #define	LMRC_MAX_LD_CHANNELS		1
1101e091e43SHans Rosenfeld #define	LMRC_MAX_DEV_PER_CHANNEL	256
1111e091e43SHans Rosenfeld #define	LMRC_MAX_PD			\
1121e091e43SHans Rosenfeld 	(LMRC_MAX_PD_CHANNELS * LMRC_MAX_DEV_PER_CHANNEL)
1131e091e43SHans Rosenfeld #define	LMRC_MAX_LD			\
1141e091e43SHans Rosenfeld 	(LMRC_MAX_LD_CHANNELS * LMRC_MAX_DEV_PER_CHANNEL)
1151e091e43SHans Rosenfeld #define	LMRC_MAX_TM_TARGETS		(LMRC_MAX_PD + LMRC_MAX_LD)
1161e091e43SHans Rosenfeld 
1171e091e43SHans Rosenfeld #define	LMRC_DEFAULT_INIT_ID		-1
1181e091e43SHans Rosenfeld #define	LMRC_MAX_LUN			8
1191e091e43SHans Rosenfeld #define	LMRC_DEFAULT_CMD_PER_LUN	256
1201e091e43SHans Rosenfeld 
1211e091e43SHans Rosenfeld #define	LMRC_MAX_REPLY_POST_HOST_INDEX	16
1221e091e43SHans Rosenfeld 
1231e091e43SHans Rosenfeld 
1241e091e43SHans Rosenfeld /* By default, the firmware programs for 8k of memory */
1251e091e43SHans Rosenfeld #define	LMRC_MFI_MIN_MEM	4096
1261e091e43SHans Rosenfeld #define	LMRC_MFI_DEF_MEM	8192
1271e091e43SHans Rosenfeld #define	LMRC_MFI_MAX_CMD	16
1281e091e43SHans Rosenfeld 
1291e091e43SHans Rosenfeld 
1301e091e43SHans Rosenfeld #pragma pack(1)
1311e091e43SHans Rosenfeld 
1321e091e43SHans Rosenfeld /*
1331e091e43SHans Rosenfeld  * MPT RAID MFA IO Descriptor.
1341e091e43SHans Rosenfeld  *
1351e091e43SHans Rosenfeld  * Note: The use of the lowest 8 bits for flags implies that an alignment
1361e091e43SHans Rosenfeld  * of 256 bytes is required for the physical address.
1371e091e43SHans Rosenfeld  */
1381e091e43SHans Rosenfeld struct lmrc_raid_mfa_io_req_desc {
1391e091e43SHans Rosenfeld 	uint32_t RequestFlags:8;
1401e091e43SHans Rosenfeld 	uint32_t MessageAddress1:24;	/* bits 31:8 */
1411e091e43SHans Rosenfeld 	uint32_t MessageAddress2;	/* bits 61:32 */
1421e091e43SHans Rosenfeld };
1431e091e43SHans Rosenfeld 
1441e091e43SHans Rosenfeld /*
1451e091e43SHans Rosenfeld  * unions of Request Descriptors
1461e091e43SHans Rosenfeld  */
1471e091e43SHans Rosenfeld union lmrc_atomic_req_desc {
1481e091e43SHans Rosenfeld 	Mpi26AtomicRequestDescriptor_t rd_atomic;
1491e091e43SHans Rosenfeld 	uint32_t rd_reg;
1501e091e43SHans Rosenfeld };
1511e091e43SHans Rosenfeld 
1521e091e43SHans Rosenfeld union lmrc_req_desc {
1531e091e43SHans Rosenfeld 	uint64_t	rd_reg;
1541e091e43SHans Rosenfeld 
1551e091e43SHans Rosenfeld 	struct {
1561e091e43SHans Rosenfeld 		uint32_t	rd_reg_lo;
1571e091e43SHans Rosenfeld 		uint32_t	rd_reg_hi;
1581e091e43SHans Rosenfeld 	};
1591e091e43SHans Rosenfeld 
1601e091e43SHans Rosenfeld 	lmrc_atomic_req_desc_t		rd_atomic;
1611e091e43SHans Rosenfeld 	lmrc_raid_mfa_io_req_desc_t	rd_mfa_io;
1621e091e43SHans Rosenfeld };
1631e091e43SHans Rosenfeld 
1641e091e43SHans Rosenfeld #pragma pack(0)
1651e091e43SHans Rosenfeld 
1661e091e43SHans Rosenfeld /*
1671e091e43SHans Rosenfeld  * Request descriptor types, in addition to those defined by mpi2.h
1681e091e43SHans Rosenfeld  *
1691e091e43SHans Rosenfeld  * FreeBSD and Linux drivers shift these, while mpi2.h defines them
1701e091e43SHans Rosenfeld  * pre-shifted. The latter seems more sensible.
1711e091e43SHans Rosenfeld  *
1721e091e43SHans Rosenfeld  * XXX: LMRC_REQ_DESCRIPT_FLAGS_MFA has the same value as
1731e091e43SHans Rosenfeld  * MPI2_REQ_DESCRIPT_FLAGS_SCSI_TARGET. Why?
1741e091e43SHans Rosenfeld  */
1751e091e43SHans Rosenfeld #define	LMRC_REQ_DESCRIPT_FLAGS_MFA		0x02
1761e091e43SHans Rosenfeld #define	LMRC_REQ_DESCRIPT_FLAGS_NO_LOCK		0x04
1771e091e43SHans Rosenfeld #define	LMRC_REQ_DESCRIPT_FLAGS_LD_IO		0x0e
1781e091e43SHans Rosenfeld 
1791e091e43SHans Rosenfeld #define	MPI2_TYPE_CUDA				0x2
1801e091e43SHans Rosenfeld 
1811e091e43SHans Rosenfeld #endif /* _LMRC_REG_H */
182