diff options
Diffstat (limited to 'roms/edk2/OvmfPkg/VirtioBlkDxe/VirtioBlk.h')
-rw-r--r-- | roms/edk2/OvmfPkg/VirtioBlkDxe/VirtioBlk.h | 286 |
1 files changed, 286 insertions, 0 deletions
diff --git a/roms/edk2/OvmfPkg/VirtioBlkDxe/VirtioBlk.h b/roms/edk2/OvmfPkg/VirtioBlkDxe/VirtioBlk.h new file mode 100644 index 000000000..efbbe2162 --- /dev/null +++ b/roms/edk2/OvmfPkg/VirtioBlkDxe/VirtioBlk.h @@ -0,0 +1,286 @@ +/** @file
+
+ Internal definitions for the virtio-blk driver, which produces Block I/O
+ Protocol instances for virtio-blk devices.
+
+ Copyright (C) 2012, Red Hat, Inc.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _VIRTIO_BLK_DXE_H_
+#define _VIRTIO_BLK_DXE_H_
+
+#include <Protocol/BlockIo.h>
+#include <Protocol/ComponentName.h>
+#include <Protocol/DriverBinding.h>
+
+#include <IndustryStandard/Virtio.h>
+
+
+#define VBLK_SIG SIGNATURE_32 ('V', 'B', 'L', 'K')
+
+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 dpth
+ // --------------------- ------------------ ---------
+ UINT32 Signature; // DriverBindingStart 0
+ VIRTIO_DEVICE_PROTOCOL *VirtIo; // DriverBindingStart 0
+ EFI_EVENT ExitBoot; // DriverBindingStart 0
+ VRING Ring; // VirtioRingInit 2
+ EFI_BLOCK_IO_PROTOCOL BlockIo; // VirtioBlkInit 1
+ EFI_BLOCK_IO_MEDIA BlockIoMedia; // VirtioBlkInit 1
+ VOID *RingMap; // VirtioRingMap 2
+} VBLK_DEV;
+
+#define VIRTIO_BLK_FROM_BLOCK_IO(BlockIoPointer) \
+ CR (BlockIoPointer, VBLK_DEV, BlockIo, VBLK_SIG)
+
+
+/**
+
+ Device probe function for this driver.
+
+ The DXE core calls this function for any given device in order to see if the
+ driver can drive the device.
+
+ Specs relevant in the general sense:
+
+ - UEFI Spec 2.3.1 + Errata C:
+ - 6.3 Protocol Handler Services -- for accessing the underlying device
+ - 10.1 EFI Driver Binding Protocol -- for exporting ourselves
+
+ - Driver Writer's Guide for UEFI 2.3.1 v1.01:
+ - 5.1.3.4 OpenProtocol() and CloseProtocol() -- for accessing the
+ underlying device
+ - 9 Driver Binding Protocol -- for exporting ourselves
+
+ @param[in] This The EFI_DRIVER_BINDING_PROTOCOL object
+ incorporating this driver (independently of
+ any device).
+
+ @param[in] DeviceHandle The device to probe.
+
+ @param[in] RemainingDevicePath Relevant only for bus drivers, ignored.
+
+
+ @retval EFI_SUCCESS The driver supports the device being probed.
+
+ @retval EFI_UNSUPPORTED Based on virtio-blk discovery, we do not support
+ the device.
+
+ @return Error codes from the OpenProtocol() boot service.
+
+**/
+
+EFI_STATUS
+EFIAPI
+VirtioBlkDriverBindingSupported (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE DeviceHandle,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
+ );
+
+
+/**
+
+ After we've pronounced support for a specific device in
+ DriverBindingSupported(), we start managing said device (passed in by the
+ Driver Execution Environment) with the following service.
+
+ See DriverBindingSupported() for specification references.
+
+ @param[in] This The EFI_DRIVER_BINDING_PROTOCOL object
+ incorporating this driver (independently of
+ any device).
+
+ @param[in] DeviceHandle The supported device to drive.
+
+ @param[in] RemainingDevicePath Relevant only for bus drivers, ignored.
+
+
+ @retval EFI_SUCCESS Driver instance has been created and
+ initialized for the virtio-blk device, it
+ is now accessible via EFI_BLOCK_IO_PROTOCOL.
+
+ @retval EFI_OUT_OF_RESOURCES Memory allocation failed.
+
+ @return Error codes from the OpenProtocol() boot
+ service, VirtioBlkInit(), or the
+ InstallProtocolInterface() boot service.
+
+**/
+
+EFI_STATUS
+EFIAPI
+VirtioBlkDriverBindingStart (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE DeviceHandle,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
+ );
+
+
+/**
+
+ Stop driving a virtio-blk device and remove its BlockIo interface.
+
+ This function replays the success path of DriverBindingStart() in reverse.
+ The host side virtio-blk device is reset, so that the OS boot loader or the
+ OS may reinitialize it.
+
+ @param[in] This The EFI_DRIVER_BINDING_PROTOCOL object
+ incorporating this driver (independently of any
+ device).
+
+ @param[in] DeviceHandle Stop driving this device.
+
+ @param[in] NumberOfChildren Since this function belongs to a device driver
+ only (as opposed to a bus driver), the caller
+ environment sets NumberOfChildren to zero, and
+ we ignore it.
+
+ @param[in] ChildHandleBuffer Ignored (corresponding to NumberOfChildren).
+
+**/
+
+EFI_STATUS
+EFIAPI
+VirtioBlkDriverBindingStop (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE DeviceHandle,
+ IN UINTN NumberOfChildren,
+ IN EFI_HANDLE *ChildHandleBuffer
+ );
+
+
+//
+// UEFI Spec 2.3.1 + Errata C, 12.8 EFI Block I/O Protocol
+// Driver Writer's Guide for UEFI 2.3.1 v1.01,
+// 24.2 Block I/O Protocol Implementations
+//
+EFI_STATUS
+EFIAPI
+VirtioBlkReset (
+ IN EFI_BLOCK_IO_PROTOCOL *This,
+ IN BOOLEAN ExtendedVerification
+ );
+
+
+/**
+
+ ReadBlocks() operation for virtio-blk.
+
+ See
+ - UEFI Spec 2.3.1 + Errata C, 12.8 EFI Block I/O Protocol, 12.8 EFI Block I/O
+ Protocol, EFI_BLOCK_IO_PROTOCOL.ReadBlocks().
+ - Driver Writer's Guide for UEFI 2.3.1 v1.01, 24.2.2. ReadBlocks() and
+ ReadBlocksEx() Implementation.
+
+ Parameter checks and conformant return values are implemented in
+ VerifyReadWriteRequest() and SynchronousRequest().
+
+ A zero BufferSize doesn't seem to be prohibited, so do nothing in that case,
+ successfully.
+
+**/
+
+EFI_STATUS
+EFIAPI
+VirtioBlkReadBlocks (
+ IN EFI_BLOCK_IO_PROTOCOL *This,
+ IN UINT32 MediaId,
+ IN EFI_LBA Lba,
+ IN UINTN BufferSize,
+ OUT VOID *Buffer
+ );
+
+
+/**
+
+ WriteBlocks() operation for virtio-blk.
+
+ See
+ - UEFI Spec 2.3.1 + Errata C, 12.8 EFI Block I/O Protocol, 12.8 EFI Block I/O
+ Protocol, EFI_BLOCK_IO_PROTOCOL.WriteBlocks().
+ - Driver Writer's Guide for UEFI 2.3.1 v1.01, 24.2.3 WriteBlocks() and
+ WriteBlockEx() Implementation.
+
+ Parameter checks and conformant return values are implemented in
+ VerifyReadWriteRequest() and SynchronousRequest().
+
+ A zero BufferSize doesn't seem to be prohibited, so do nothing in that case,
+ successfully.
+
+**/
+
+EFI_STATUS
+EFIAPI
+VirtioBlkWriteBlocks (
+ IN EFI_BLOCK_IO_PROTOCOL *This,
+ IN UINT32 MediaId,
+ IN EFI_LBA Lba,
+ IN UINTN BufferSize,
+ IN VOID *Buffer
+ );
+
+
+/**
+
+ FlushBlocks() operation for virtio-blk.
+
+ See
+ - UEFI Spec 2.3.1 + Errata C, 12.8 EFI Block I/O Protocol, 12.8 EFI Block I/O
+ Protocol, EFI_BLOCK_IO_PROTOCOL.FlushBlocks().
+ - Driver Writer's Guide for UEFI 2.3.1 v1.01, 24.2.4 FlushBlocks() and
+ FlushBlocksEx() Implementation.
+
+ If the underlying virtio-blk device doesn't support flushing (ie.
+ write-caching), then this function should not be called by higher layers,
+ according to EFI_BLOCK_IO_MEDIA characteristics set in VirtioBlkInit().
+ Should they do nonetheless, we do nothing, successfully.
+
+**/
+
+EFI_STATUS
+EFIAPI
+VirtioBlkFlushBlocks (
+ IN EFI_BLOCK_IO_PROTOCOL *This
+ );
+
+
+//
+// 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 Block Device") are not formatted because the
+// driver supports only that device type. Therefore the driver name suffices
+// for unambiguous identification.
+//
+
+EFI_STATUS
+EFIAPI
+VirtioBlkGetDriverName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN CHAR8 *Language,
+ OUT CHAR16 **DriverName
+ );
+
+EFI_STATUS
+EFIAPI
+VirtioBlkGetDeviceName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN EFI_HANDLE DeviceHandle,
+ IN EFI_HANDLE ChildHandle,
+ IN CHAR8 *Language,
+ OUT CHAR16 **ControllerName
+ );
+
+#endif // _VIRTIO_BLK_DXE_H_
|