1 /** @file 2 UGA IO protocol from the EFI 1.10 specification. 3 4 Abstraction of a very simple graphics device. 5 6 Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR> 7 This program and the accompanying materials 8 are licensed and made available under the terms and conditions of the BSD License 9 which accompanies this distribution. The full text of the license may be found at 10 http://opensource.org/licenses/bsd-license.php 11 12 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 13 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 14 15 **/ 16 17 #ifndef __UGA_IO_H__ 18 #define __UGA_IO_H__ 19 20 #define EFI_UGA_IO_PROTOCOL_GUID \ 21 { 0x61a4d49e, 0x6f68, 0x4f1b, { 0xb9, 0x22, 0xa8, 0x6e, 0xed, 0xb, 0x7, 0xa2 } } 22 23 typedef struct _EFI_UGA_IO_PROTOCOL EFI_UGA_IO_PROTOCOL; 24 25 typedef UINT32 UGA_STATUS; 26 27 typedef enum { 28 UgaDtParentBus = 1, 29 UgaDtGraphicsController, 30 UgaDtOutputController, 31 UgaDtOutputPort, 32 UgaDtOther 33 } UGA_DEVICE_TYPE, *PUGA_DEVICE_TYPE; 34 35 typedef UINT32 UGA_DEVICE_ID, *PUGA_DEVICE_ID; 36 37 typedef struct { 38 UGA_DEVICE_TYPE deviceType; 39 UGA_DEVICE_ID deviceId; 40 UINT32 ui32DeviceContextSize; 41 UINT32 ui32SharedContextSize; 42 } UGA_DEVICE_DATA, *PUGA_DEVICE_DATA; 43 44 typedef struct _UGA_DEVICE { 45 VOID *pvDeviceContext; 46 VOID *pvSharedContext; 47 VOID *pvRunTimeContext; 48 struct _UGA_DEVICE *pParentDevice; 49 VOID *pvBusIoServices; 50 VOID *pvStdIoServices; 51 UGA_DEVICE_DATA deviceData; 52 } UGA_DEVICE, *PUGA_DEVICE; 53 54 typedef enum { 55 UgaIoGetVersion = 1, 56 UgaIoGetChildDevice, 57 UgaIoStartDevice, 58 UgaIoStopDevice, 59 UgaIoFlushDevice, 60 UgaIoResetDevice, 61 UgaIoGetDeviceState, 62 UgaIoSetDeviceState, 63 UgaIoSetPowerState, 64 UgaIoGetMemoryConfiguration, 65 UgaIoSetVideoMode, 66 UgaIoCopyRectangle, 67 UgaIoGetEdidSegment, 68 UgaIoDeviceChannelOpen, 69 UgaIoDeviceChannelClose, 70 UgaIoDeviceChannelRead, 71 UgaIoDeviceChannelWrite, 72 UgaIoGetPersistentDataSize, 73 UgaIoGetPersistentData, 74 UgaIoSetPersistentData, 75 UgaIoGetDevicePropertySize, 76 UgaIoGetDeviceProperty, 77 UgaIoBtPrivateInterface 78 } UGA_IO_REQUEST_CODE, *PUGA_IO_REQUEST_CODE; 79 80 typedef struct { 81 IN UGA_IO_REQUEST_CODE ioRequestCode; 82 IN VOID *pvInBuffer; 83 IN UINT64 ui64InBufferSize; 84 OUT VOID *pvOutBuffer; 85 IN UINT64 ui64OutBufferSize; 86 OUT UINT64 ui64BytesReturned; 87 } UGA_IO_REQUEST, *PUGA_IO_REQUEST; 88 89 90 /** 91 Dynamically allocate storage for a child UGA_DEVICE. 92 93 @param[in] This The EFI_UGA_IO_PROTOCOL instance. 94 @param[in] ParentDevice ParentDevice specifies a pointer to the parent device of Device. 95 @param[in] DeviceData A pointer to UGA_DEVICE_DATA returned from a call to DispatchService() 96 with a UGA_DEVICE of Parent and an IoRequest of type UgaIoGetChildDevice. 97 @param[in] RunTimeContext Context to associate with Device. 98 @param[out] Device The Device returns a dynamically allocated child UGA_DEVICE object 99 for ParentDevice. The caller is responsible for deleting Device. 100 101 102 @retval EFI_SUCCESS Device was returned. 103 @retval EFI_INVALID_PARAMETER One of the arguments was not valid. 104 @retval EFI_DEVICE_ERROR The device had an error and could not complete the request. 105 106 **/ 107 typedef 108 EFI_STATUS 109 (EFIAPI *EFI_UGA_IO_PROTOCOL_CREATE_DEVICE)( 110 IN EFI_UGA_IO_PROTOCOL *This, 111 IN UGA_DEVICE *ParentDevice, 112 IN UGA_DEVICE_DATA *DeviceData, 113 IN VOID *RunTimeContext, 114 OUT UGA_DEVICE **Device 115 ); 116 117 118 /** 119 Delete a dynamically allocated child UGA_DEVICE object that was allocated via CreateDevice(). 120 121 @param[in] This The EFI_UGA_IO_PROTOCOL instance. Type EFI_UGA_IO_PROTOCOL is 122 defined in Section 10.7. 123 @param[in] Device The Device points to a UGA_DEVICE object that was dynamically 124 allocated via a CreateDevice() call. 125 126 127 @retval EFI_SUCCESS Device was returned. 128 @retval EFI_INVALID_PARAMETER The Device was not allocated via CreateDevice(). 129 130 **/ 131 typedef 132 EFI_STATUS 133 (EFIAPI *EFI_UGA_IO_PROTOCOL_DELETE_DEVICE)( 134 IN EFI_UGA_IO_PROTOCOL * This, 135 IN UGA_DEVICE * Device 136 ); 137 138 /** 139 This is the main UGA service dispatch routine for all UGA_IO_REQUEST s. 140 141 @param pDevice pDevice specifies a pointer to a device object associated with a 142 device enumerated by a pIoRequest->ioRequestCode of type 143 UgaIoGetChildDevice. The root device for the EFI_UGA_IO_PROTOCOL 144 is represented by pDevice being set to NULL. 145 146 @param pIoRequest 147 pIoRequest points to a caller allocated buffer that contains data 148 defined by pIoRequest->ioRequestCode. See Related Definitions for 149 a definition of UGA_IO_REQUEST_CODE s and their associated data 150 structures. 151 152 @return UGA_STATUS 153 154 **/ 155 typedef UGA_STATUS 156 (EFIAPI *PUGA_FW_SERVICE_DISPATCH)( 157 IN PUGA_DEVICE pDevice, 158 IN OUT PUGA_IO_REQUEST pIoRequest 159 ); 160 161 /// 162 /// Provides a basic abstraction to send I/O requests to the graphics device and any of its children. 163 /// 164 struct _EFI_UGA_IO_PROTOCOL { 165 EFI_UGA_IO_PROTOCOL_CREATE_DEVICE CreateDevice; 166 EFI_UGA_IO_PROTOCOL_DELETE_DEVICE DeleteDevice; 167 PUGA_FW_SERVICE_DISPATCH DispatchService; 168 }; 169 170 extern EFI_GUID gEfiUgaIoProtocolGuid; 171 172 // 173 // Data structure that is stored in the EFI Configuration Table with the 174 // EFI_UGA_IO_PROTOCOL_GUID. The option ROMs listed in this table may have 175 // EBC UGA drivers. 176 // 177 typedef struct { 178 UINT32 Version; 179 UINT32 HeaderSize; 180 UINT32 SizeOfEntries; 181 UINT32 NumberOfEntries; 182 } EFI_DRIVER_OS_HANDOFF_HEADER; 183 184 typedef enum { 185 EfiUgaDriverFromPciRom, 186 EfiUgaDriverFromSystem, 187 EfiDriverHandoffMax 188 } EFI_DRIVER_HANOFF_ENUM; 189 190 typedef struct { 191 EFI_DRIVER_HANOFF_ENUM Type; 192 EFI_DEVICE_PATH_PROTOCOL *DevicePath; 193 VOID *PciRomImage; 194 UINT64 PciRomSize; 195 } EFI_DRIVER_OS_HANDOFF; 196 197 #endif 198