/** @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_ |