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