/** @file VMware PVSCSI Device specific type and macro definitions. Copyright (C) 2020, Oracle and/or its affiliates. SPDX-License-Identifier: BSD-2-Clause-Patent **/ #ifndef __PVSCSI_H_ #define __PVSCSI_H_ // // Device offsets and constants // #define PCI_VENDOR_ID_VMWARE (0x15ad) #define PCI_DEVICE_ID_VMWARE_PVSCSI (0x07c0) // // CDB (Command Descriptor Block) with size above this constant // should be considered out-of-band // #define PVSCSI_CDB_MAX_SIZE (16) typedef enum { PvScsiRegOffsetCommand = 0x0, PvScsiRegOffsetCommandData = 0x4, PvScsiRegOffsetCommandStatus = 0x8, PvScsiRegOffsetLastSts0 = 0x100, PvScsiRegOffsetLastSts1 = 0x104, PvScsiRegOffsetLastSts2 = 0x108, PvScsiRegOffsetLastSts3 = 0x10c, PvScsiRegOffsetIntrStatus = 0x100c, PvScsiRegOffsetIntrMask = 0x2010, PvScsiRegOffsetKickNonRwIo = 0x3014, PvScsiRegOffsetDebug = 0x3018, PvScsiRegOffsetKickRwIo = 0x4018, } PVSCSI_BAR0_OFFSETS; // // Define Interrupt-Status register flags // #define PVSCSI_INTR_CMPL_0 BIT0 #define PVSCSI_INTR_CMPL_1 BIT1 #define PVSCSI_INTR_CMPL_MASK (PVSCSI_INTR_CMPL_0 | PVSCSI_INTR_CMPL_1) typedef enum { PvScsiCmdFirst = 0, PvScsiCmdAdapterReset = 1, PvScsiCmdIssueScsi = 2, PvScsiCmdSetupRings = 3, PvScsiCmdResetBus = 4, PvScsiCmdResetDevice = 5, PvScsiCmdAbortCmd = 6, PvScsiCmdConfig = 7, PvScsiCmdSetupMsgRing = 8, PvScsiCmdDeviceUnplug = 9, PvScsiCmdLast = 10 } PVSCSI_COMMANDS; #define PVSCSI_SETUP_RINGS_MAX_NUM_PAGES (32) #pragma pack (1) typedef struct { UINT32 ReqRingNumPages; UINT32 CmpRingNumPages; UINT64 RingsStatePPN; UINT64 ReqRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES]; UINT64 CmpRingPPNs[PVSCSI_SETUP_RINGS_MAX_NUM_PAGES]; } PVSCSI_CMD_DESC_SETUP_RINGS; #pragma pack () #define PVSCSI_MAX_CMD_DATA_WORDS \ (sizeof (PVSCSI_CMD_DESC_SETUP_RINGS) / sizeof (UINT32)) #pragma pack (1) typedef struct { UINT32 ReqProdIdx; UINT32 ReqConsIdx; UINT32 ReqNumEntriesLog2; UINT32 CmpProdIdx; UINT32 CmpConsIdx; UINT32 CmpNumEntriesLog2; UINT8 Pad[104]; UINT32 MsgProdIdx; UINT32 MsgConsIdx; UINT32 MsgNumEntriesLog2; } PVSCSI_RINGS_STATE; #pragma pack () // // Define PVSCSI request descriptor tags // #define PVSCSI_SIMPLE_QUEUE_TAG (0x20) // // Define PVSCSI request descriptor flags // #define PVSCSI_FLAG_CMD_WITH_SG_LIST BIT0 #define PVSCSI_FLAG_CMD_OUT_OF_BAND_CDB BIT1 #define PVSCSI_FLAG_CMD_DIR_NONE BIT2 #define PVSCSI_FLAG_CMD_DIR_TOHOST BIT3 #define PVSCSI_FLAG_CMD_DIR_TODEVICE BIT4 #pragma pack (1) typedef struct { UINT64 Context; UINT64 DataAddr; UINT64 DataLen; UINT64 SenseAddr; UINT32 SenseLen; UINT32 Flags; UINT8 Cdb[16]; UINT8 CdbLen; UINT8 Lun[8]; UINT8 Tag; UINT8 Bus; UINT8 Target; UINT8 VcpuHint; UINT8 Unused[59]; } PVSCSI_RING_REQ_DESC; #pragma pack () // // Host adapter status/error codes // typedef enum { PvScsiBtStatSuccess = 0x00, // CCB complete normally with no errors PvScsiBtStatLinkedCommandCompleted = 0x0a, PvScsiBtStatLinkedCommandCompletedWithFlag = 0x0b, PvScsiBtStatDataUnderrun = 0x0c, PvScsiBtStatSelTimeout = 0x11, // SCSI selection timeout PvScsiBtStatDatarun = 0x12, // Data overrun/underrun PvScsiBtStatBusFree = 0x13, // Unexpected bus free PvScsiBtStatInvPhase = 0x14, // // Invalid bus phase or sequence requested // by target // PvScsiBtStatLunMismatch = 0x17, // // Linked CCB has different LUN from first // CCB // PvScsiBtStatSensFailed = 0x1b, // Auto request sense failed PvScsiBtStatTagReject = 0x1c, // // SCSI II tagged queueing message rejected // by target // PvScsiBtStatBadMsg = 0x1d, // // Unsupported message received by the host // adapter // PvScsiBtStatHaHardware = 0x20, // Host adapter hardware failed PvScsiBtStatNoResponse = 0x21, // // Target did not respond to SCSI ATN sent // a SCSI RST // PvScsiBtStatSentRst = 0x22, // Host adapter asserted a SCSI RST PvScsiBtStatRecvRst = 0x23, // Other SCSI devices asserted a SCSI RST PvScsiBtStatDisconnect = 0x24, // // Target device reconnected improperly // (w/o tag) // PvScsiBtStatBusReset = 0x25, // Host adapter issued BUS device reset PvScsiBtStatAbortQueue = 0x26, // Abort queue generated PvScsiBtStatHaSoftware = 0x27, // Host adapter software error PvScsiBtStatHaTimeout = 0x30, // Host adapter hardware timeout error PvScsiBtStatScsiParity = 0x34, // SCSI parity error detected } PVSCSI_HOST_BUS_ADAPTER_STATUS; #pragma pack (1) typedef struct { UINT64 Context; UINT64 DataLen; UINT32 SenseLen; UINT16 HostStatus; UINT16 ScsiStatus; UINT32 Pad[2]; } PVSCSI_RING_CMP_DESC; #pragma pack () #endif // __PVSCSI_H_