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