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