]> git.proxmox.com Git - mirror_edk2.git/commitdiff
OvmfPkg/PvScsiDxe: Define device interface structures and constants
authorLiran Alon <liran.alon@oracle.com>
Sat, 28 Mar 2020 20:00:54 +0000 (23:00 +0300)
committermergify[bot] <37929162+mergify[bot]@users.noreply.github.com>
Mon, 30 Mar 2020 16:45:07 +0000 (16:45 +0000)
These definitions will be used by the following commits to complete the
implementation of PVSCSI device driver.

Ref: https://bugzilla.tianocore.org/show_bug.cgi?id=2567
Acked-by: Laszlo Ersek <lersek@redhat.com>
Signed-off-by: Liran Alon <liran.alon@oracle.com>
Message-Id: <20200328200100.60786-12-liran.alon@oracle.com>
Reviewed-by: Nikita Leshenko <nikita.leshchenko@oracle.com>
OvmfPkg/Include/IndustryStandard/PvScsi.h

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