123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524 |
- /** @file
- Copyright (c) 2006 - 2012, Intel Corporation. All rights reserved.<BR>
- SPDX-License-Identifier: BSD-2-Clause-Patent
- **/
- #ifndef _BIOS_GRAPHICS_OUTPUT_H_
- #define _BIOS_GRAPHICS_OUTPUT_H_
- #include <FrameworkDxe.h>
- #include <Protocol/PciIo.h>
- #include <Protocol/EdidActive.h>
- #include <Protocol/DevicePath.h>
- #include <Protocol/EdidDiscovered.h>
- #include <Protocol/LegacyBios.h>
- #include <Protocol/VgaMiniPort.h>
- #include <Protocol/GraphicsOutput.h>
- #include <Protocol/EdidOverride.h>
- #include <Guid/StatusCodeDataTypeId.h>
- #include <Guid/LegacyBios.h>
- #include <Guid/EventGroup.h>
- #include <Library/PcdLib.h>
- #include <Library/DebugLib.h>
- #include <Library/ReportStatusCodeLib.h>
- #include <Library/BaseMemoryLib.h>
- #include <Library/UefiDriverEntryPoint.h>
- #include <Library/UefiBootServicesTableLib.h>
- #include <Library/UefiLib.h>
- #include <Library/DevicePathLib.h>
- #include <Library/MemoryAllocationLib.h>
- #include <IndustryStandard/Pci.h>
- #include "VesaBiosExtensions.h"
- //
- // Packed format support: The number of bits reserved for each of the colors and the actual
- // position of RGB in the frame buffer is specified in the VBE Mode information
- //
- typedef struct {
- UINT8 Position; // Position of the color
- UINT8 Mask; // The number of bits expressed as a mask
- } BIOS_VIDEO_COLOR_PLACEMENT;
- //
- // BIOS Graphics Output Graphical Mode Data
- //
- typedef struct {
- UINT16 VbeModeNumber;
- UINT16 BytesPerScanLine;
- VOID *LinearFrameBuffer;
- UINTN FrameBufferSize;
- UINT32 HorizontalResolution;
- UINT32 VerticalResolution;
- UINT32 ColorDepth;
- UINT32 RefreshRate;
- UINT32 BitsPerPixel;
- BIOS_VIDEO_COLOR_PLACEMENT Red;
- BIOS_VIDEO_COLOR_PLACEMENT Green;
- BIOS_VIDEO_COLOR_PLACEMENT Blue;
- BIOS_VIDEO_COLOR_PLACEMENT Reserved;
- EFI_GRAPHICS_PIXEL_FORMAT PixelFormat;
- EFI_PIXEL_BITMASK PixelBitMask;
- } BIOS_VIDEO_MODE_DATA;
- //
- // BIOS video child handle private data Structure
- //
- #define BIOS_VIDEO_DEV_SIGNATURE SIGNATURE_32 ('B', 'V', 'M', 'p')
- typedef struct {
- UINTN Signature;
- EFI_HANDLE Handle;
- //
- // Consumed Protocols
- //
- EFI_PCI_IO_PROTOCOL *PciIo;
- EFI_LEGACY_BIOS_PROTOCOL *LegacyBios;
- //
- // Produced Protocols
- //
- EFI_GRAPHICS_OUTPUT_PROTOCOL GraphicsOutput;
- EFI_EDID_DISCOVERED_PROTOCOL EdidDiscovered;
- EFI_EDID_ACTIVE_PROTOCOL EdidActive;
- EFI_VGA_MINI_PORT_PROTOCOL VgaMiniPort;
- //
- // General fields
- //
- BOOLEAN VgaCompatible;
- BOOLEAN ProduceGraphicsOutput;
- //
- // Graphics Output Protocol related fields
- //
- BOOLEAN HardwareNeedsStarting;
- UINTN CurrentMode;
- UINTN MaxMode;
- BIOS_VIDEO_MODE_DATA *ModeData;
- UINT8 *LineBuffer;
- EFI_GRAPHICS_OUTPUT_BLT_PIXEL *VbeFrameBuffer;
- UINT8 *VgaFrameBuffer;
- //
- // VESA Bios Extensions related fields
- //
- UINTN NumberOfPagesBelow1MB; // Number of 4KB pages in PagesBelow1MB
- EFI_PHYSICAL_ADDRESS PagesBelow1MB; // Buffer for all VBE Information Blocks
- VESA_BIOS_EXTENSIONS_INFORMATION_BLOCK *VbeInformationBlock; // 0x200 bytes. Must be allocated below 1MB
- VESA_BIOS_EXTENSIONS_MODE_INFORMATION_BLOCK *VbeModeInformationBlock; // 0x100 bytes. Must be allocated below 1MB
- VESA_BIOS_EXTENSIONS_EDID_DATA_BLOCK *VbeEdidDataBlock; // 0x80 bytes. Must be allocated below 1MB
- VESA_BIOS_EXTENSIONS_CRTC_INFORMATION_BLOCK *VbeCrtcInformationBlock; // 59 bytes. Must be allocated below 1MB
- UINTN VbeSaveRestorePages; // Number of 4KB pages in VbeSaveRestoreBuffer
- EFI_PHYSICAL_ADDRESS VbeSaveRestoreBuffer; // Must be allocated below 1MB
- //
- // Status code
- //
- EFI_DEVICE_PATH_PROTOCOL *GopDevicePath;
- EFI_EVENT ExitBootServicesEvent;
- } BIOS_VIDEO_DEV;
- #define BIOS_VIDEO_DEV_FROM_PCI_IO_THIS(a) CR (a, BIOS_VIDEO_DEV, PciIo, BIOS_VIDEO_DEV_SIGNATURE)
- #define BIOS_VIDEO_DEV_FROM_GRAPHICS_OUTPUT_THIS(a) CR (a, BIOS_VIDEO_DEV, GraphicsOutput, BIOS_VIDEO_DEV_SIGNATURE)
- #define BIOS_VIDEO_DEV_FROM_VGA_MINI_PORT_THIS(a) CR (a, BIOS_VIDEO_DEV, VgaMiniPort, BIOS_VIDEO_DEV_SIGNATURE)
- #define GRAPHICS_OUTPUT_INVALIDE_MODE_NUMBER 0xffff
- //
- // Global Variables
- //
- extern EFI_DRIVER_BINDING_PROTOCOL gBiosVideoDriverBinding;
- extern EFI_COMPONENT_NAME_PROTOCOL gBiosVideoComponentName;
- extern EFI_COMPONENT_NAME2_PROTOCOL gBiosVideoComponentName2;
- //
- // Driver Binding Protocol functions
- //
- /**
- Supported.
- @param This Pointer to driver binding protocol
- @param Controller Controller handle to connect
- @param RemainingDevicePath A pointer to the remaining portion of a device
- path
- @retval EFI_STATUS EFI_SUCCESS:This controller can be managed by this
- driver, Otherwise, this controller cannot be
- managed by this driver
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoDriverBindingSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
- /**
- Install Graphics Output Protocol onto VGA device handles.
- @param This Pointer to driver binding protocol
- @param Controller Controller handle to connect
- @param RemainingDevicePath A pointer to the remaining portion of a device
- path
- @return EFI_STATUS
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoDriverBindingStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
- /**
- Stop.
- @param This Pointer to driver binding protocol
- @param Controller Controller handle to connect
- @param NumberOfChildren Number of children handle created by this driver
- @param ChildHandleBuffer Buffer containing child handle created
- @retval EFI_SUCCESS Driver disconnected successfully from controller
- @retval EFI_UNSUPPORTED Cannot find BIOS_VIDEO_DEV structure
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoDriverBindingStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- );
- //
- // Private worker functions
- //
- /**
- Check for VBE device.
- @param BiosVideoPrivate Pointer to BIOS_VIDEO_DEV structure
- @retval EFI_SUCCESS VBE device found
- **/
- EFI_STATUS
- BiosVideoCheckForVbe (
- IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate
- );
- /**
- Check for VGA device.
- @param BiosVideoPrivate Pointer to BIOS_VIDEO_DEV structure
- @retval EFI_SUCCESS Standard VGA device found
- **/
- EFI_STATUS
- BiosVideoCheckForVga (
- IN OUT BIOS_VIDEO_DEV *BiosVideoPrivate
- );
- /**
- Release resource for BIOS video instance.
- @param BiosVideoPrivate Video child device private data structure
- **/
- VOID
- BiosVideoDeviceReleaseResource (
- BIOS_VIDEO_DEV *BiosVideoPrivate
- );
- //
- // BIOS Graphics Output Protocol functions
- //
- /**
- Graphics Output protocol interface to get video mode.
- @param This Protocol instance pointer.
- @param ModeNumber The mode number to return information on.
- @param SizeOfInfo A pointer to the size, in bytes, of the Info
- buffer.
- @param Info Caller allocated buffer that returns information
- about ModeNumber.
- @retval EFI_SUCCESS Mode information returned.
- @retval EFI_BUFFER_TOO_SMALL The Info buffer was too small.
- @retval EFI_DEVICE_ERROR A hardware error occurred trying to retrieve the
- video mode.
- @retval EFI_NOT_STARTED Video display is not initialized. Call SetMode ()
- @retval EFI_INVALID_PARAMETER One of the input args was NULL.
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoGraphicsOutputQueryMode (
- IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
- IN UINT32 ModeNumber,
- OUT UINTN *SizeOfInfo,
- OUT EFI_GRAPHICS_OUTPUT_MODE_INFORMATION **Info
- );
- /**
- Graphics Output protocol interface to set video mode.
- @param This Protocol instance pointer.
- @param ModeNumber The mode number to be set.
- @retval EFI_SUCCESS Graphics mode was changed.
- @retval EFI_DEVICE_ERROR The device had an error and could not complete the
- request.
- @retval EFI_UNSUPPORTED ModeNumber is not supported by this device.
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoGraphicsOutputSetMode (
- IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
- IN UINT32 ModeNumber
- );
- /**
- Graphics Output protocol instance to block transfer for VBE device.
- @param This Pointer to Graphics Output protocol instance
- @param BltBuffer The data to transfer to screen
- @param BltOperation The operation to perform
- @param SourceX The X coordinate of the source for BltOperation
- @param SourceY The Y coordinate of the source for BltOperation
- @param DestinationX The X coordinate of the destination for
- BltOperation
- @param DestinationY The Y coordinate of the destination for
- BltOperation
- @param Width The width of a rectangle in the blt rectangle in
- pixels
- @param Height The height of a rectangle in the blt rectangle in
- pixels
- @param Delta Not used for EfiBltVideoFill and
- EfiBltVideoToVideo operation. If a Delta of 0 is
- used, the entire BltBuffer will be operated on. If
- a subrectangle of the BltBuffer is used, then
- Delta represents the number of bytes in a row of
- the BltBuffer.
- @retval EFI_INVALID_PARAMETER Invalid parameter passed in
- @retval EFI_SUCCESS Blt operation success
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoGraphicsOutputVbeBlt (
- IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
- IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL,
- IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
- IN UINTN SourceX,
- IN UINTN SourceY,
- IN UINTN DestinationX,
- IN UINTN DestinationY,
- IN UINTN Width,
- IN UINTN Height,
- IN UINTN Delta
- );
- /**
- Graphics Output protocol instance to block transfer for VGA device.
- @param This Pointer to Graphics Output protocol instance
- @param BltBuffer The data to transfer to screen
- @param BltOperation The operation to perform
- @param SourceX The X coordinate of the source for BltOperation
- @param SourceY The Y coordinate of the source for BltOperation
- @param DestinationX The X coordinate of the destination for
- BltOperation
- @param DestinationY The Y coordinate of the destination for
- BltOperation
- @param Width The width of a rectangle in the blt rectangle in
- pixels
- @param Height The height of a rectangle in the blt rectangle in
- pixels
- @param Delta Not used for EfiBltVideoFill and
- EfiBltVideoToVideo operation. If a Delta of 0 is
- used, the entire BltBuffer will be operated on. If
- a subrectangle of the BltBuffer is used, then
- Delta represents the number of bytes in a row of
- the BltBuffer.
- @retval EFI_INVALID_PARAMETER Invalid parameter passed in
- @retval EFI_SUCCESS Blt operation success
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoGraphicsOutputVgaBlt (
- IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This,
- IN EFI_GRAPHICS_OUTPUT_BLT_PIXEL *BltBuffer OPTIONAL,
- IN EFI_GRAPHICS_OUTPUT_BLT_OPERATION BltOperation,
- IN UINTN SourceX,
- IN UINTN SourceY,
- IN UINTN DestinationX,
- IN UINTN DestinationY,
- IN UINTN Width,
- IN UINTN Height,
- IN UINTN Delta
- );
- //
- // BIOS VGA Mini Port Protocol functions
- //
- /**
- VgaMiniPort protocol interface to set mode.
- @param This Pointer to VgaMiniPort protocol instance
- @param ModeNumber The index of the mode
- @retval EFI_UNSUPPORTED The requested mode is not supported
- @retval EFI_SUCCESS The requested mode is set successfully
- **/
- EFI_STATUS
- EFIAPI
- BiosVideoVgaMiniPortSetMode (
- IN EFI_VGA_MINI_PORT_PROTOCOL *This,
- IN UINTN ModeNumber
- );
- /**
- Event handler for Exit Boot Service.
- @param Event The event that be signalled when exiting boot service.
- @param Context Pointer to instance of BIOS_VIDEO_DEV.
- **/
- VOID
- EFIAPI
- BiosVideoNotifyExitBootServices (
- IN EFI_EVENT Event,
- IN VOID *Context
- );
- //
- // Standard VGA Definitions
- //
- #define VGA_HORIZONTAL_RESOLUTION 640
- #define VGA_VERTICAL_RESOLUTION 480
- #define VGA_NUMBER_OF_BIT_PLANES 4
- #define VGA_PIXELS_PER_BYTE 8
- #define VGA_BYTES_PER_SCAN_LINE (VGA_HORIZONTAL_RESOLUTION / VGA_PIXELS_PER_BYTE)
- #define VGA_BYTES_PER_BIT_PLANE (VGA_VERTICAL_RESOLUTION * VGA_BYTES_PER_SCAN_LINE)
- #define VGA_GRAPHICS_CONTROLLER_ADDRESS_REGISTER 0x3ce
- #define VGA_GRAPHICS_CONTROLLER_DATA_REGISTER 0x3cf
- #define VGA_GRAPHICS_CONTROLLER_SET_RESET_REGISTER 0x00
- #define VGA_GRAPHICS_CONTROLLER_ENABLE_SET_RESET_REGISTER 0x01
- #define VGA_GRAPHICS_CONTROLLER_COLOR_COMPARE_REGISTER 0x02
- #define VGA_GRAPHICS_CONTROLLER_DATA_ROTATE_REGISTER 0x03
- #define VGA_GRAPHICS_CONTROLLER_FUNCTION_REPLACE 0x00
- #define VGA_GRAPHICS_CONTROLLER_FUNCTION_AND 0x08
- #define VGA_GRAPHICS_CONTROLLER_FUNCTION_OR 0x10
- #define VGA_GRAPHICS_CONTROLLER_FUNCTION_XOR 0x18
- #define VGA_GRAPHICS_CONTROLLER_READ_MAP_SELECT_REGISTER 0x04
- #define VGA_GRAPHICS_CONTROLLER_MODE_REGISTER 0x05
- #define VGA_GRAPHICS_CONTROLLER_READ_MODE_0 0x00
- #define VGA_GRAPHICS_CONTROLLER_READ_MODE_1 0x08
- #define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_0 0x00
- #define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_1 0x01
- #define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_2 0x02
- #define VGA_GRAPHICS_CONTROLLER_WRITE_MODE_3 0x03
- #define VGA_GRAPHICS_CONTROLLER_MISCELLANEOUS_REGISTER 0x06
- #define VGA_GRAPHICS_CONTROLLER_COLOR_DONT_CARE_REGISTER 0x07
- #define VGA_GRAPHICS_CONTROLLER_BIT_MASK_REGISTER 0x08
- /**
- Install child handles if the Handle supports MBR format.
- @param This Calling context.
- @param ParentHandle Parent Handle
- @param ParentPciIo Parent PciIo interface
- @param ParentLegacyBios Parent LegacyBios interface
- @param ParentDevicePath Parent Device Path
- @param RemainingDevicePath Remaining Device Path
- @retval EFI_SUCCESS If a child handle was added
- @retval other A child handle was not added
- **/
- EFI_STATUS
- BiosVideoChildHandleInstall (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE ParentHandle,
- IN EFI_PCI_IO_PROTOCOL *ParentPciIo,
- IN EFI_LEGACY_BIOS_PROTOCOL *ParentLegacyBios,
- IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- );
- /**
- Deregister an video child handle and free resources.
- @param This Protocol instance pointer.
- @param Controller Video controller handle
- @param Handle Video child handle
- @return EFI_STATUS
- **/
- EFI_STATUS
- BiosVideoChildHandleUninstall (
- EFI_DRIVER_BINDING_PROTOCOL *This,
- EFI_HANDLE Controller,
- EFI_HANDLE Handle
- );
- /**
- Release resource for BIOS video instance.
- @param BiosVideoPrivate Video child device private data structure
- **/
- VOID
- BiosVideoDeviceReleaseResource (
- BIOS_VIDEO_DEV *BiosVideoPrivate
- );
- /**
- Check if all video child handles have been uninstalled.
- @param Controller Video controller handle
- @return TRUE Child handles exist.
- @return FALSE All video child handles have been uninstalled.
- **/
- BOOLEAN
- HasChildHandle (
- IN EFI_HANDLE Controller
- );
- #endif
|