mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-11-29 12:35:53 +01:00
416 lines
14 KiB
C
416 lines
14 KiB
C
/** @file
|
|
|
|
Internal type and macro definitions for the Virtio GPU hybrid driver.
|
|
|
|
Copyright (C) 2016, Red Hat, Inc.
|
|
|
|
SPDX-License-Identifier: BSD-2-Clause-Patent
|
|
|
|
**/
|
|
|
|
#ifndef _VIRTIO_GPU_DXE_H_
|
|
#define _VIRTIO_GPU_DXE_H_
|
|
|
|
#include <IndustryStandard/VirtioGpu.h>
|
|
#include <Library/BaseMemoryLib.h>
|
|
#include <Library/DebugLib.h>
|
|
#include <Library/UefiLib.h>
|
|
#include <Protocol/GraphicsOutput.h>
|
|
#include <Protocol/VirtioDevice.h>
|
|
|
|
//
|
|
// Forward declaration of VGPU_GOP.
|
|
//
|
|
typedef struct VGPU_GOP_STRUCT VGPU_GOP;
|
|
|
|
//
|
|
// The abstraction that directly corresponds to a Virtio GPU device.
|
|
//
|
|
// This structure will be installed on the handle that has the VirtIo Device
|
|
// Protocol interface, with GUID gEfiCallerIdGuid. A similar trick is employed
|
|
// in TerminalDxe, and it is necessary so that we can look up VGPU_DEV just
|
|
// from the VirtIo Device Protocol handle in the Component Name 2 Protocol
|
|
// implementation.
|
|
//
|
|
typedef struct {
|
|
//
|
|
// VirtIo represents access to the Virtio GPU device. Never NULL.
|
|
//
|
|
VIRTIO_DEVICE_PROTOCOL *VirtIo;
|
|
|
|
//
|
|
// BusName carries a customized name for
|
|
// EFI_COMPONENT_NAME2_PROTOCOL.GetControllerName(). It is expressed in table
|
|
// form because it can theoretically support several languages. Never NULL.
|
|
//
|
|
EFI_UNICODE_STRING_TABLE *BusName;
|
|
|
|
//
|
|
// VirtIo ring used for VirtIo communication.
|
|
//
|
|
VRING Ring;
|
|
|
|
//
|
|
// Token associated with Ring's mapping for bus master common buffer
|
|
// operation, from VirtioRingMap().
|
|
//
|
|
VOID *RingMap;
|
|
|
|
//
|
|
// Event to be signaled at ExitBootServices().
|
|
//
|
|
EFI_EVENT ExitBoot;
|
|
|
|
//
|
|
// Common running counter for all VirtIo GPU requests that ask for fencing.
|
|
//
|
|
UINT64 FenceId;
|
|
|
|
//
|
|
// The Child field references the GOP wrapper structure. If this pointer is
|
|
// NULL, then the hybrid driver has bound (i.e., started) the
|
|
// VIRTIO_DEVICE_PROTOCOL controller without producing the child GOP
|
|
// controller (that is, after Start() was called with RemainingDevicePath
|
|
// pointing to and End of Device Path node). Child can be created and
|
|
// destroyed, even repeatedly, independently of VGPU_DEV.
|
|
//
|
|
// In practice, this field represents the single head (scanout) that we
|
|
// support.
|
|
//
|
|
VGPU_GOP *Child;
|
|
} VGPU_DEV;
|
|
|
|
//
|
|
// The Graphics Output Protocol wrapper structure.
|
|
//
|
|
#define VGPU_GOP_SIG SIGNATURE_64 ('V', 'G', 'P', 'U', '_', 'G', 'O', 'P')
|
|
|
|
struct VGPU_GOP_STRUCT {
|
|
UINT64 Signature;
|
|
|
|
//
|
|
// ParentBus points to the parent VGPU_DEV object. Never NULL.
|
|
//
|
|
VGPU_DEV *ParentBus;
|
|
|
|
//
|
|
// GopName carries a customized name for
|
|
// EFI_COMPONENT_NAME2_PROTOCOL.GetControllerName(). It is expressed in table
|
|
// form because it can theoretically support several languages. Never NULL.
|
|
//
|
|
EFI_UNICODE_STRING_TABLE *GopName;
|
|
|
|
//
|
|
// GopHandle is the UEFI child handle that carries the device path ending
|
|
// with the ACPI ADR node, and the Graphics Output Protocol. Never NULL.
|
|
//
|
|
EFI_HANDLE GopHandle;
|
|
|
|
//
|
|
// The GopDevicePath field is the device path installed on GopHandle,
|
|
// ending with an ACPI ADR node. Never NULL.
|
|
//
|
|
EFI_DEVICE_PATH_PROTOCOL *GopDevicePath;
|
|
|
|
//
|
|
// The Gop field is installed on the child handle as Graphics Output Protocol
|
|
// interface.
|
|
//
|
|
EFI_GRAPHICS_OUTPUT_PROTOCOL Gop;
|
|
|
|
//
|
|
// Referenced by Gop.Mode, GopMode provides a summary about the supported
|
|
// graphics modes, and the current mode.
|
|
//
|
|
EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE GopMode;
|
|
|
|
//
|
|
// Referenced by GopMode.Info, GopModeInfo provides detailed information
|
|
// about the current mode.
|
|
//
|
|
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION GopModeInfo;
|
|
|
|
//
|
|
// Identifier of the 2D host resource that is in use by this head (scanout)
|
|
// of the VirtIo GPU device. Zero until the first successful -- internal --
|
|
// Gop.SetMode() call, never zero afterwards.
|
|
//
|
|
UINT32 ResourceId;
|
|
|
|
//
|
|
// A number of whole pages providing the backing store for the 2D host
|
|
// resource identified by ResourceId above. NULL until the first successful
|
|
// -- internal -- Gop.SetMode() call, never NULL afterwards.
|
|
//
|
|
UINT32 *BackingStore;
|
|
UINTN NumberOfPages;
|
|
|
|
//
|
|
// Token associated with BackingStore's mapping for bus master common
|
|
// buffer operation. BackingStoreMap is valid if, and only if,
|
|
// BackingStore is non-NULL.
|
|
//
|
|
VOID *BackingStoreMap;
|
|
|
|
//
|
|
// native display resolution
|
|
//
|
|
UINT32 NativeXRes;
|
|
UINT32 NativeYRes;
|
|
};
|
|
|
|
//
|
|
// VirtIo GPU initialization, and commands (primitives) for the GPU device.
|
|
//
|
|
|
|
/**
|
|
Configure the VirtIo GPU device that underlies VgpuDev.
|
|
|
|
@param[in,out] VgpuDev The VGPU_DEV object to set up VirtIo messaging for.
|
|
On input, the caller is responsible for having
|
|
initialized VgpuDev->VirtIo. On output, VgpuDev->Ring
|
|
has been initialized, and synchronous VirtIo GPU
|
|
commands (primitives) can be submitted to the device.
|
|
|
|
@retval EFI_SUCCESS VirtIo GPU configuration successful.
|
|
|
|
@retval EFI_UNSUPPORTED The host-side configuration of the VirtIo GPU is not
|
|
supported by this driver.
|
|
|
|
@retval Error codes from underlying functions.
|
|
**/
|
|
EFI_STATUS
|
|
VirtioGpuInit (
|
|
IN OUT VGPU_DEV *VgpuDev
|
|
);
|
|
|
|
/**
|
|
De-configure the VirtIo GPU device that underlies VgpuDev.
|
|
|
|
@param[in,out] VgpuDev The VGPU_DEV object to tear down VirtIo messaging
|
|
for. On input, the caller is responsible for having
|
|
called VirtioGpuInit(). On output, VgpuDev->Ring has
|
|
been uninitialized; VirtIo GPU commands (primitives)
|
|
can no longer be submitted to the device.
|
|
**/
|
|
VOID
|
|
VirtioGpuUninit (
|
|
IN OUT VGPU_DEV *VgpuDev
|
|
);
|
|
|
|
/**
|
|
Allocate, zero and map memory, for bus master common buffer operation, to be
|
|
attached as backing store to a host-side VirtIo GPU resource.
|
|
|
|
@param[in] VgpuDev The VGPU_DEV object that represents the VirtIo GPU
|
|
device.
|
|
|
|
@param[in] NumberOfPages The number of whole pages to allocate and map.
|
|
|
|
@param[out] HostAddress The system memory address of the allocated area.
|
|
|
|
@param[out] DeviceAddress The bus master device address of the allocated
|
|
area. The VirtIo GPU device may be programmed to
|
|
access the allocated area through DeviceAddress;
|
|
DeviceAddress is to be passed to the
|
|
VirtioGpuResourceAttachBacking() function, as the
|
|
BackingStoreDeviceAddress parameter.
|
|
|
|
@param[out] Mapping A resulting token to pass to
|
|
VirtioGpuUnmapAndFreeBackingStore().
|
|
|
|
@retval EFI_SUCCESS The requested number of pages has been allocated, zeroed
|
|
and mapped.
|
|
|
|
@return Status codes propagated from
|
|
VgpuDev->VirtIo->AllocateSharedPages() and
|
|
VirtioMapAllBytesInSharedBuffer().
|
|
**/
|
|
EFI_STATUS
|
|
VirtioGpuAllocateZeroAndMapBackingStore (
|
|
IN VGPU_DEV *VgpuDev,
|
|
IN UINTN NumberOfPages,
|
|
OUT VOID **HostAddress,
|
|
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
|
OUT VOID **Mapping
|
|
);
|
|
|
|
/**
|
|
Unmap and free memory originally allocated and mapped with
|
|
VirtioGpuAllocateZeroAndMapBackingStore().
|
|
|
|
If the memory allocated and mapped with
|
|
VirtioGpuAllocateZeroAndMapBackingStore() was attached to a host-side VirtIo
|
|
GPU resource with VirtioGpuResourceAttachBacking(), then the caller is
|
|
responsible for detaching the backing store from the same resource, with
|
|
VirtioGpuResourceDetachBacking(), before calling this function.
|
|
|
|
@param[in] VgpuDev The VGPU_DEV object that represents the VirtIo GPU
|
|
device.
|
|
|
|
@param[in] NumberOfPages The NumberOfPages parameter originally passed to
|
|
VirtioGpuAllocateZeroAndMapBackingStore().
|
|
|
|
@param[in] HostAddress The HostAddress value originally output by
|
|
VirtioGpuAllocateZeroAndMapBackingStore().
|
|
|
|
@param[in] Mapping The token that was originally output by
|
|
VirtioGpuAllocateZeroAndMapBackingStore().
|
|
**/
|
|
VOID
|
|
VirtioGpuUnmapAndFreeBackingStore (
|
|
IN VGPU_DEV *VgpuDev,
|
|
IN UINTN NumberOfPages,
|
|
IN VOID *HostAddress,
|
|
IN VOID *Mapping
|
|
);
|
|
|
|
/**
|
|
EFI_EVENT_NOTIFY function for the VGPU_DEV.ExitBoot event. It resets the
|
|
VirtIo device, causing it to release its resources and to forget its
|
|
configuration.
|
|
|
|
This function may only be called (that is, VGPU_DEV.ExitBoot may only be
|
|
signaled) after VirtioGpuInit() returns and before VirtioGpuUninit() is
|
|
called.
|
|
|
|
@param[in] Event Event whose notification function is being invoked.
|
|
|
|
@param[in] Context Pointer to the associated VGPU_DEV object.
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
VirtioGpuExitBoot (
|
|
IN EFI_EVENT Event,
|
|
IN VOID *Context
|
|
);
|
|
|
|
/**
|
|
The following functions send requests to the VirtIo GPU device model, await
|
|
the answer from the host, and return a status. They share the following
|
|
interface details:
|
|
|
|
@param[in,out] VgpuDev The VGPU_DEV object that represents the VirtIo GPU
|
|
device. The caller is responsible to have
|
|
successfully invoked VirtioGpuInit() on VgpuDev
|
|
previously, while VirtioGpuUninit() must not have
|
|
been called on VgpuDev.
|
|
|
|
@retval EFI_INVALID_PARAMETER Invalid command-specific parameters were
|
|
detected by this driver.
|
|
|
|
@retval EFI_SUCCESS Operation successful.
|
|
|
|
@retval EFI_DEVICE_ERROR The host rejected the request. The host error
|
|
code has been logged on the DEBUG_ERROR level.
|
|
|
|
@return Codes for unexpected errors in VirtIo
|
|
messaging.
|
|
|
|
For the command-specific parameters, please consult the GPU Device section of
|
|
the VirtIo 1.0 specification (see references in
|
|
"OvmfPkg/Include/IndustryStandard/VirtioGpu.h").
|
|
**/
|
|
EFI_STATUS
|
|
VirtioGpuResourceCreate2d (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
IN UINT32 ResourceId,
|
|
IN VIRTIO_GPU_FORMATS Format,
|
|
IN UINT32 Width,
|
|
IN UINT32 Height
|
|
);
|
|
|
|
EFI_STATUS
|
|
VirtioGpuResourceUnref (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
IN UINT32 ResourceId
|
|
);
|
|
|
|
EFI_STATUS
|
|
VirtioGpuResourceAttachBacking (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
IN UINT32 ResourceId,
|
|
IN EFI_PHYSICAL_ADDRESS BackingStoreDeviceAddress,
|
|
IN UINTN NumberOfPages
|
|
);
|
|
|
|
EFI_STATUS
|
|
VirtioGpuResourceDetachBacking (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
IN UINT32 ResourceId
|
|
);
|
|
|
|
EFI_STATUS
|
|
VirtioGpuSetScanout (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
IN UINT32 X,
|
|
IN UINT32 Y,
|
|
IN UINT32 Width,
|
|
IN UINT32 Height,
|
|
IN UINT32 ScanoutId,
|
|
IN UINT32 ResourceId
|
|
);
|
|
|
|
EFI_STATUS
|
|
VirtioGpuTransferToHost2d (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
IN UINT32 X,
|
|
IN UINT32 Y,
|
|
IN UINT32 Width,
|
|
IN UINT32 Height,
|
|
IN UINT64 Offset,
|
|
IN UINT32 ResourceId
|
|
);
|
|
|
|
EFI_STATUS
|
|
VirtioGpuResourceFlush (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
IN UINT32 X,
|
|
IN UINT32 Y,
|
|
IN UINT32 Width,
|
|
IN UINT32 Height,
|
|
IN UINT32 ResourceId
|
|
);
|
|
|
|
EFI_STATUS
|
|
VirtioGpuGetDisplayInfo (
|
|
IN OUT VGPU_DEV *VgpuDev,
|
|
volatile VIRTIO_GPU_RESP_DISPLAY_INFO *Response
|
|
);
|
|
|
|
/**
|
|
Release guest-side and host-side resources that are related to an initialized
|
|
VGPU_GOP.Gop.
|
|
|
|
param[in,out] VgpuGop The VGPU_GOP object to release resources for.
|
|
|
|
On input, the caller is responsible for having called
|
|
VgpuGop->Gop.SetMode() at least once successfully.
|
|
(This is equivalent to the requirement that
|
|
VgpuGop->BackingStore be non-NULL. It is also
|
|
equivalent to the requirement that VgpuGop->ResourceId
|
|
be nonzero.)
|
|
|
|
On output, resources will be released, and
|
|
VgpuGop->BackingStore and VgpuGop->ResourceId will be
|
|
nulled.
|
|
|
|
param[in] DisableHead Whether this head (scanout) currently references the
|
|
resource identified by VgpuGop->ResourceId. Only pass
|
|
FALSE when VgpuGop->Gop.SetMode() calls this function
|
|
while switching between modes, and set it to TRUE
|
|
every other time.
|
|
**/
|
|
VOID
|
|
ReleaseGopResources (
|
|
IN OUT VGPU_GOP *VgpuGop,
|
|
IN BOOLEAN DisableHead
|
|
);
|
|
|
|
//
|
|
// Template for initializing VGPU_GOP.Gop.
|
|
//
|
|
extern CONST EFI_GRAPHICS_OUTPUT_PROTOCOL mGopTemplate;
|
|
|
|
#endif // _VIRTIO_GPU_DXE_H_
|