/** @file Macros and type definitions for LSI Fusion MPT SCSI devices. Copyright (C) 2020, Oracle and/or its affiliates. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __FUSION_MPT_SCSI_H__ #define __FUSION_MPT_SCSI_H__ // // Device offsets and constants // #define LSI_LOGIC_PCI_VENDOR_ID 0x1000 #define LSI_53C1030_PCI_DEVICE_ID 0x0030 #define LSI_SAS1068_PCI_DEVICE_ID 0x0054 #define LSI_SAS1068E_PCI_DEVICE_ID 0x0058 #define MPT_REG_DOORBELL 0x00 #define MPT_REG_WRITE_SEQ 0x04 #define MPT_REG_HOST_DIAG 0x08 #define MPT_REG_TEST 0x0c #define MPT_REG_DIAG_DATA 0x10 #define MPT_REG_DIAG_ADDR 0x14 #define MPT_REG_ISTATUS 0x30 #define MPT_REG_IMASK 0x34 #define MPT_REG_REQ_Q 0x40 #define MPT_REG_REP_Q 0x44 #define MPT_DOORBELL_RESET 0x40 #define MPT_DOORBELL_HANDSHAKE 0x42 #define MPT_IMASK_DOORBELL 0x01 #define MPT_IMASK_REPLY 0x08 #define MPT_MESSAGE_HDR_FUNCTION_SCSI_IO_REQUEST 0x00 #define MPT_MESSAGE_HDR_FUNCTION_IOC_INIT 0x02 #define MPT_SG_ENTRY_TYPE_SIMPLE 0x01 #define MPT_IOC_WHOINIT_ROM_BIOS 0x02 #define MPT_SCSIIO_REQUEST_CONTROL_TXDIR_NONE (0x00 << 24) #define MPT_SCSIIO_REQUEST_CONTROL_TXDIR_WRITE (0x01 << 24) #define MPT_SCSIIO_REQUEST_CONTROL_TXDIR_READ (0x02 << 24) #define MPT_SCSI_IOCSTATUS_SUCCESS 0x0000 #define MPT_SCSI_IOCSTATUS_DEVICE_NOT_THERE 0x0043 #define MPT_SCSI_IOCSTATUS_DATA_OVERRUN 0x0044 #define MPT_SCSI_IOCSTATUS_DATA_UNDERRUN 0x0045 // // Device structures // #pragma pack (1) typedef struct { UINT8 WhoInit; UINT8 Reserved1; UINT8 ChainOffset; UINT8 Function; UINT8 Flags; UINT8 MaxDevices; UINT8 MaxBuses; UINT8 MessageFlags; UINT32 MessageContext; UINT16 ReplyFrameSize; UINT16 Reserved2; UINT32 HostMfaHighAddr; UINT32 SenseBufferHighAddr; } MPT_IO_CONTROLLER_INIT_REQUEST; typedef struct { UINT8 WhoInit; UINT8 Reserved1; UINT8 MessageLength; UINT8 Function; UINT8 Flags; UINT8 MaxDevices; UINT8 MaxBuses; UINT8 MessageFlags; UINT32 MessageContext; UINT16 Reserved2; UINT16 IocStatus; UINT32 IocLogInfo; } MPT_IO_CONTROLLER_INIT_REPLY; typedef struct { UINT8 TargetId; UINT8 Bus; UINT8 ChainOffset; UINT8 Function; UINT8 CdbLength; UINT8 SenseBufferLength; UINT8 Reserved; UINT8 MessageFlags; UINT32 MessageContext; UINT8 Lun[8]; UINT32 Control; UINT8 Cdb[16]; UINT32 DataLength; UINT32 SenseBufferLowAddress; } MPT_SCSI_IO_REQUEST; typedef struct { UINT32 Length : 24; UINT32 EndOfList : 1; UINT32 Is64BitAddress : 1; // // True when the buffer contains data to be transfered. Otherwise it's the // destination buffer // UINT32 BufferContainsData : 1; UINT32 LocalAddress : 1; UINT32 ElementType : 2; UINT32 EndOfBuffer : 1; UINT32 LastElement : 1; UINT64 DataBufferAddress; } MPT_SG_ENTRY_SIMPLE; typedef struct { UINT8 TargetId; UINT8 Bus; UINT8 MessageLength; UINT8 Function; UINT8 CdbLength; UINT8 SenseBufferLength; UINT8 Reserved; UINT8 MessageFlags; UINT32 MessageContext; UINT8 ScsiStatus; UINT8 ScsiState; UINT16 IocStatus; UINT32 IocLogInfo; UINT32 TransferCount; UINT32 SenseCount; UINT32 ResponseInfo; } MPT_SCSI_IO_REPLY; typedef struct { MPT_SCSI_IO_REQUEST Header; MPT_SG_ENTRY_SIMPLE Sg; } MPT_SCSI_REQUEST_WITH_SG; #pragma pack () typedef union { MPT_SCSI_IO_REPLY Data; UINT64 Uint64; // 8 byte alignment required by HW } MPT_SCSI_IO_REPLY_ALIGNED; typedef union { MPT_SCSI_REQUEST_WITH_SG Data; UINT64 Uint64; // 8 byte alignment required by HW } MPT_SCSI_REQUEST_ALIGNED; #endif // __FUSION_MPT_SCSI_H__