CloverBootloader/OvmfPkg/Include/IndustryStandard/PvScsi.h

187 lines
6.3 KiB
C

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