mirror of https://github.com/acidanthera/audk.git
OvmfPkg: introduce virtio-scsi driver
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: Jordan Justen <jordan.l.justen@intel.com> [jordan.l.justen@intel.com: fix build for VS2012] Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Jordan Justen <jordan.l.justen@intel.com> git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@13867 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
parent
c8c2e4d613
commit
37078a63b1
|
@ -0,0 +1,100 @@
|
|||
/** @file
|
||||
|
||||
Virtio SCSI Host Device specific type and macro definitions corresponding to
|
||||
the virtio-0.9.5 specification.
|
||||
|
||||
Copyright (C) 2012, Red Hat, Inc.
|
||||
|
||||
This program and the accompanying materials are licensed and made available
|
||||
under the terms and conditions of the BSD License which accompanies this
|
||||
distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _VIRTIO_SCSI_H_
|
||||
#define _VIRTIO_SCSI_H_
|
||||
|
||||
#include <IndustryStandard/Virtio.h>
|
||||
|
||||
|
||||
//
|
||||
// virtio-0.9.5, Appendix I: SCSI Host Device
|
||||
//
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
VIRTIO_HDR Generic;
|
||||
UINT32 VhdrNumQueues;
|
||||
UINT32 VhdrSegMax;
|
||||
UINT32 VhdrMaxSectors;
|
||||
UINT32 VhdrCmdPerLun;
|
||||
UINT32 VhdrEventInfoSize;
|
||||
UINT32 VhdrSenseSize;
|
||||
UINT32 VhdrCdbSize;
|
||||
UINT16 VhdrMaxChannel;
|
||||
UINT16 VhdrMaxTarget;
|
||||
UINT32 VhdrMaxLun;
|
||||
} VSCSI_HDR;
|
||||
#pragma pack()
|
||||
|
||||
#define OFFSET_OF_VSCSI(Field) OFFSET_OF (VSCSI_HDR, Field)
|
||||
#define SIZE_OF_VSCSI(Field) (sizeof ((VSCSI_HDR *) 0)->Field)
|
||||
|
||||
#define VIRTIO_SCSI_F_INOUT BIT0
|
||||
#define VIRTIO_SCSI_F_HOTPLUG BIT1
|
||||
|
||||
//
|
||||
// We expect these maximum sizes from the host. Also we force the CdbLength and
|
||||
// SenseDataLength parameters of EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru() not
|
||||
// to exceed these limits. See UEFI 2.3.1 errata C 14.7.
|
||||
//
|
||||
#define VIRTIO_SCSI_CDB_SIZE 32
|
||||
#define VIRTIO_SCSI_SENSE_SIZE 96
|
||||
|
||||
//
|
||||
// We pass the dynamically sized buffers ("dataout", "datain") in separate ring
|
||||
// descriptors.
|
||||
//
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
UINT8 Lun[8];
|
||||
UINT64 Id;
|
||||
UINT8 TaskAttr;
|
||||
UINT8 Prio;
|
||||
UINT8 Crn;
|
||||
UINT8 Cdb[VIRTIO_SCSI_CDB_SIZE];
|
||||
} VIRTIO_SCSI_REQ;
|
||||
|
||||
typedef struct {
|
||||
UINT32 SenseLen;
|
||||
UINT32 Residual;
|
||||
UINT16 StatusQualifier;
|
||||
UINT8 Status;
|
||||
UINT8 Response;
|
||||
UINT8 Sense[VIRTIO_SCSI_SENSE_SIZE];
|
||||
} VIRTIO_SCSI_RESP;
|
||||
#pragma pack()
|
||||
|
||||
//
|
||||
// selector of first virtio queue usable for request transfer
|
||||
//
|
||||
#define VIRTIO_SCSI_REQUEST_QUEUE 2
|
||||
|
||||
//
|
||||
// host response codes
|
||||
//
|
||||
#define VIRTIO_SCSI_S_OK 0
|
||||
#define VIRTIO_SCSI_S_OVERRUN 1
|
||||
#define VIRTIO_SCSI_S_ABORTED 2
|
||||
#define VIRTIO_SCSI_S_BAD_TARGET 3
|
||||
#define VIRTIO_SCSI_S_RESET 4
|
||||
#define VIRTIO_SCSI_S_BUSY 5
|
||||
#define VIRTIO_SCSI_S_TRANSPORT_FAILURE 6
|
||||
#define VIRTIO_SCSI_S_TARGET_FAILURE 7
|
||||
#define VIRTIO_SCSI_S_NEXUS_FAILURE 8
|
||||
#define VIRTIO_SCSI_S_FAILURE 9
|
||||
|
||||
#endif // _VIRTIO_SCSI_H_
|
|
@ -53,6 +53,17 @@
|
|||
# to PIIX4 function 3 offset 0x40-0x43 bits [15:6].
|
||||
gUefiOvmfPkgTokenSpaceGuid.PcdAcpiPmBaseAddress|0xB000|UINT16|5
|
||||
|
||||
## When VirtioScsiDxe is instantiated for a HBA, the numbers of targets and
|
||||
# LUNs are retrieved from the host during virtio-scsi setup.
|
||||
# MdeModulePkg/Bus/Scsi/ScsiBusDxe then scans all MaxTarget * MaxLun
|
||||
# possible devices. This can take extremely long, for example with
|
||||
# MaxTarget=255 and MaxLun=16383. The *inclusive* constants below limit
|
||||
# MaxTarget and MaxLun, independently, should the host report higher values,
|
||||
# so that scanning the number of devices given by their product is still
|
||||
# acceptably fast.
|
||||
gUefiOvmfPkgTokenSpaceGuid.PcdVirtioScsiMaxTargetLimit|31|UINT16|6
|
||||
gUefiOvmfPkgTokenSpaceGuid.PcdVirtioScsiMaxLunLimit|7|UINT32|7
|
||||
|
||||
[PcdsDynamic, PcdsDynamicEx]
|
||||
gUefiOvmfPkgTokenSpaceGuid.PcdEmuVariableEvent|0|UINT64|2
|
||||
|
||||
|
|
|
@ -409,6 +409,7 @@
|
|||
|
||||
OvmfPkg/BlockMmioToBlockIoDxe/BlockIo.inf
|
||||
OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
|
||||
OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
|
||||
OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf {
|
||||
<LibraryClasses>
|
||||
PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf
|
||||
|
|
|
@ -181,6 +181,7 @@ INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
|
|||
|
||||
INF OvmfPkg/BlockMmioToBlockIoDxe/BlockIo.inf
|
||||
INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
|
||||
INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
|
||||
INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
|
||||
INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
|
||||
|
||||
|
|
|
@ -416,6 +416,7 @@
|
|||
|
||||
OvmfPkg/BlockMmioToBlockIoDxe/BlockIo.inf
|
||||
OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
|
||||
OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
|
||||
OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf {
|
||||
<LibraryClasses>
|
||||
PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf
|
||||
|
|
|
@ -181,6 +181,7 @@ INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
|
|||
|
||||
INF OvmfPkg/BlockMmioToBlockIoDxe/BlockIo.inf
|
||||
INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
|
||||
INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
|
||||
INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
|
||||
INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
|
||||
|
||||
|
|
|
@ -414,6 +414,7 @@
|
|||
|
||||
OvmfPkg/BlockMmioToBlockIoDxe/BlockIo.inf
|
||||
OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
|
||||
OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
|
||||
OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf {
|
||||
<LibraryClasses>
|
||||
PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf
|
||||
|
|
|
@ -181,6 +181,7 @@ INF PcAtChipsetPkg/PcatRealTimeClockRuntimeDxe/PcatRealTimeClockRuntimeDxe.inf
|
|||
|
||||
INF OvmfPkg/BlockMmioToBlockIoDxe/BlockIo.inf
|
||||
INF OvmfPkg/VirtioBlkDxe/VirtioBlk.inf
|
||||
INF OvmfPkg/VirtioScsiDxe/VirtioScsi.inf
|
||||
INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf
|
||||
INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf
|
||||
|
||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,209 @@
|
|||
/** @file
|
||||
|
||||
Internal definitions for the virtio-scsi driver, which produces Extended SCSI
|
||||
Pass Thru Protocol instances for virtio-scsi devices.
|
||||
|
||||
Copyright (C) 2012, Red Hat, Inc.
|
||||
|
||||
This program and the accompanying materials are licensed and made available
|
||||
under the terms and conditions of the BSD License which accompanies this
|
||||
distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
|
||||
WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _VIRTIO_SCSI_DXE_H_
|
||||
#define _VIRTIO_SCSI_DXE_H_
|
||||
|
||||
#include <Protocol/ComponentName.h>
|
||||
#include <Protocol/DriverBinding.h>
|
||||
#include <Protocol/PciIo.h>
|
||||
#include <Protocol/ScsiPassThruExt.h>
|
||||
|
||||
#include <IndustryStandard/Virtio.h>
|
||||
|
||||
|
||||
//
|
||||
// This driver supports 2-byte target identifiers and 4-byte LUN identifiers.
|
||||
//
|
||||
// EFI_EXT_SCSI_PASS_THRU_PROTOCOL provides TARGET_MAX_BYTES bytes for target
|
||||
// identification, and 8 bytes for LUN identification.
|
||||
//
|
||||
// EFI_EXT_SCSI_PASS_THRU_MODE.AdapterId is also a target identifier,
|
||||
// consisting of 4 bytes. Make sure TARGET_MAX_BYTES can accomodate both
|
||||
// AdapterId and our target identifiers.
|
||||
//
|
||||
#if TARGET_MAX_BYTES < 4
|
||||
# error "virtio-scsi requires TARGET_MAX_BYTES >= 4"
|
||||
#endif
|
||||
|
||||
|
||||
#define VSCSI_SIG SIGNATURE_32 ('V', 'S', 'C', 'S')
|
||||
|
||||
typedef struct {
|
||||
//
|
||||
// Parts of this structure are initialized / torn down in various functions
|
||||
// at various call depths. The table to the right should make it easier to
|
||||
// track them.
|
||||
//
|
||||
// field init function init depth
|
||||
// ---------------------- ------------------ ----------
|
||||
UINT32 Signature; // DriverBindingStart 0
|
||||
EFI_PCI_IO_PROTOCOL *PciIo; // DriverBindingStart 0
|
||||
UINT64 OriginalPciAttributes; // DriverBindingStart 0
|
||||
BOOLEAN InOutSupported; // VirtioScsiInit 1
|
||||
UINT16 MaxTarget; // VirtioScsiInit 1
|
||||
UINT32 MaxLun; // VirtioScsiInit 1
|
||||
UINT32 MaxSectors; // VirtioScsiInit 1
|
||||
VRING Ring; // VirtioRingInit 2
|
||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru; // VirtioScsiInit 1
|
||||
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode; // VirtioScsiInit 1
|
||||
} VSCSI_DEV;
|
||||
|
||||
#define VIRTIO_SCSI_FROM_PASS_THRU(PassThruPointer) \
|
||||
CR (PassThruPointer, VSCSI_DEV, PassThru, VSCSI_SIG)
|
||||
|
||||
|
||||
//
|
||||
// Probe, start and stop functions of this driver, called by the DXE core for
|
||||
// specific devices.
|
||||
//
|
||||
// The following specifications document these interfaces:
|
||||
// - Driver Writer's Guide for UEFI 2.3.1 v1.01, 9 Driver Binding Protocol
|
||||
// - UEFI Spec 2.3.1 + Errata C, 10.1 EFI Driver Binding Protocol
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL
|
||||
// for the virtio-scsi HBA. Refer to UEFI Spec 2.3.1 + Errata C, sections
|
||||
// - 14.1 SCSI Driver Model Overview,
|
||||
// - 14.7 Extended SCSI Pass Thru Protocol.
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiPassThru (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun,
|
||||
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiGetNextTargetLun (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT8 **Target,
|
||||
IN OUT UINT64 *Lun
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiBuildDevicePath (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiGetTargetLun (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT8 **Target,
|
||||
OUT UINT64 *Lun
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiResetChannel (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiResetTargetLun (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiGetNextTarget (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT8 **Target
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and
|
||||
// EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name
|
||||
// in English, for display on standard console devices. This is recommended for
|
||||
// UEFI drivers that follow the UEFI Driver Model. Refer to the Driver Writer's
|
||||
// Guide for UEFI 2.3.1 v1.01, 11 UEFI Driver and Controller Names.
|
||||
//
|
||||
// Device type names ("Virtio SCSI Host Device") are not formatted because the
|
||||
// driver supports only that device type. Therefore the driver name suffices
|
||||
// for unambiguous identification.
|
||||
//
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
VirtioScsiGetDeviceName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_HANDLE ChildHandle,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
#endif // _VIRTIO_SCSI_DXE_H_
|
|
@ -0,0 +1,47 @@
|
|||
## @file
|
||||
# This driver produces Extended SCSI Pass Thru Protocol instances for
|
||||
# virtio-scsi devices.
|
||||
#
|
||||
# Copyright (C) 2012, Red Hat, Inc.
|
||||
#
|
||||
# This program and the accompanying materials are licensed and made available
|
||||
# under the terms and conditions of the BSD License which accompanies this
|
||||
# distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, WITHOUT
|
||||
# WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
##
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010005
|
||||
BASE_NAME = VirtioScsiDxe
|
||||
FILE_GUID = FAB5D4F4-83C0-4AAF-8480-442D11DF6CEA
|
||||
MODULE_TYPE = UEFI_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
ENTRY_POINT = VirtioScsiEntryPoint
|
||||
|
||||
[Sources]
|
||||
VirtioScsi.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
OvmfPkg/OvmfPkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
MemoryAllocationLib
|
||||
UefiBootServicesTableLib
|
||||
UefiDriverEntryPoint
|
||||
UefiLib
|
||||
VirtioLib
|
||||
|
||||
[Protocols]
|
||||
gEfiExtScsiPassThruProtocolGuid ## BY_START
|
||||
gEfiPciIoProtocolGuid ## TO_START
|
||||
|
||||
[Pcd]
|
||||
gUefiOvmfPkgTokenSpaceGuid.PcdVirtioScsiMaxTargetLimit ## CONSUMES
|
||||
gUefiOvmfPkgTokenSpaceGuid.PcdVirtioScsiMaxLunLimit ## CONSUMES
|
Loading…
Reference in New Issue