]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Pci/VgaMiniPortDxe/VgaMiniPort.c
Add function doxygen header for VgaMiniPort module.
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / VgaMiniPortDxe / VgaMiniPort.c
CommitLineData
733f03aa 1/** @file\r
2\r
3Copyright (c) 2006 Intel Corporation. All rights reserved\r
4This program and the accompanying materials\r
5are licensed and made available under the terms and conditions of the BSD License\r
6which accompanies this distribution. The full text of the license may be found at\r
7http://opensource.org/licenses/bsd-license.php\r
8\r
9THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
10WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
11\r
12**/\r
13\r
14#include "VgaMiniPort.h"\r
15\r
16//\r
17// EFI Driver Binding Protocol Instance\r
18//\r
19// This driver has a version value of 0x00000000. This is the\r
20// lowest possible priority for a driver. This is done on purpose to help\r
21// the developers of UGA drivers. This driver can bind if no UGA driver\r
22// is present, so a console is available. Then, when a UGA driver is loaded\r
23// this driver can be disconnected, and the UGA driver can be connected.\r
24// As long as the UGA driver has a version value greater than 0x00000000, it\r
25// will be connected first and will block this driver from connecting.\r
26//\r
27EFI_DRIVER_BINDING_PROTOCOL gPciVgaMiniPortDriverBinding = {\r
28 PciVgaMiniPortDriverBindingSupported,\r
29 PciVgaMiniPortDriverBindingStart,\r
30 PciVgaMiniPortDriverBindingStop,\r
31 0x00000000,\r
32 NULL,\r
33 NULL\r
34};\r
35\r
fcf03596 36/**\r
37 Driver entry point for VgaMiniPort driver.\r
38 \r
39 @param ImageHandle Driver image handle\r
40 @param SystemTable Point to EFI_SYSTEM_TABLE\r
41 \r
42 @retval Status of install driver binding protocol.\r
43**/\r
733f03aa 44EFI_STATUS\r
45EFIAPI\r
46PciVgaMiniPortDriverEntryPoint (\r
47 IN EFI_HANDLE ImageHandle,\r
48 IN EFI_SYSTEM_TABLE *SystemTable\r
49 )\r
733f03aa 50{\r
51 return EfiLibInstallDriverBindingComponentName2 (\r
52 ImageHandle,\r
53 SystemTable,\r
54 &gPciVgaMiniPortDriverBinding,\r
55 ImageHandle,\r
56 &gPciVgaMiniPortComponentName,\r
57 &gPciVgaMiniPortComponentName2\r
58 );\r
59}\r
60\r
61\r
62/**\r
63 Supported.\r
64\r
65 (Standard DriverBinding Protocol Supported() function)\r
66\r
67 @return EFI_STATUS\r
68\r
69**/\r
70EFI_STATUS\r
71EFIAPI\r
72PciVgaMiniPortDriverBindingSupported (\r
73 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
74 IN EFI_HANDLE Controller,\r
75 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
76 )\r
77{\r
78 EFI_STATUS Status;\r
79 EFI_PCI_IO_PROTOCOL *PciIo;\r
80 PCI_TYPE00 Pci;\r
81\r
82 //\r
83 // Open the IO Abstraction(s) needed to perform the supported test\r
84 //\r
85 Status = gBS->OpenProtocol (\r
86 Controller,\r
87 &gEfiPciIoProtocolGuid,\r
88 (VOID **) &PciIo,\r
89 This->DriverBindingHandle,\r
90 Controller,\r
91 EFI_OPEN_PROTOCOL_BY_DRIVER\r
92 );\r
93 if (EFI_ERROR (Status)) {\r
94 return Status;\r
95 }\r
96 //\r
97 // See if this is a PCI VGA Controller by looking at the Command register and\r
98 // Class Code Register\r
99 //\r
100 Status = PciIo->Pci.Read (\r
101 PciIo,\r
102 EfiPciIoWidthUint32,\r
103 0,\r
104 sizeof (Pci) / sizeof (UINT32),\r
105 &Pci\r
106 );\r
107 if (EFI_ERROR (Status)) {\r
108 goto Done;\r
109 }\r
110\r
111 Status = EFI_UNSUPPORTED;\r
112 //\r
113 // See if the device is an enabled VGA device.\r
114 // Most systems can only have on VGA device on at a time.\r
115 //\r
116 if (((Pci.Hdr.Command & 0x03) == 0x03) && IS_PCI_VGA (&Pci)) {\r
117 Status = EFI_SUCCESS;\r
118 }\r
119\r
120Done:\r
121 gBS->CloseProtocol (\r
122 Controller,\r
123 &gEfiPciIoProtocolGuid,\r
124 This->DriverBindingHandle,\r
125 Controller\r
126 );\r
127\r
128 return Status;\r
129}\r
130\r
131\r
132/**\r
133 Install VGA Mini Port Protocol onto VGA device handles\r
134\r
135 (Standard DriverBinding Protocol Start() function)\r
136\r
137 @return EFI_STATUS\r
138\r
139**/\r
140EFI_STATUS\r
141EFIAPI\r
142PciVgaMiniPortDriverBindingStart (\r
143 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
144 IN EFI_HANDLE Controller,\r
145 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
146 )\r
147{\r
148 EFI_STATUS Status;\r
149 EFI_PCI_IO_PROTOCOL *PciIo;\r
150 PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate;\r
151\r
152 PciVgaMiniPortPrivate = NULL;\r
153 PciIo = NULL;\r
154 //\r
155 // Open the IO Abstraction(s) needed\r
156 //\r
157 Status = gBS->OpenProtocol (\r
158 Controller,\r
159 &gEfiPciIoProtocolGuid,\r
160 (VOID **) &PciIo,\r
161 This->DriverBindingHandle,\r
162 Controller,\r
163 EFI_OPEN_PROTOCOL_BY_DRIVER\r
164 );\r
165 if (EFI_ERROR (Status)) {\r
166 goto Done;\r
167 }\r
168 //\r
169 // Allocate the private device structure\r
170 //\r
171 Status = gBS->AllocatePool (\r
172 EfiBootServicesData,\r
173 sizeof (PCI_VGA_MINI_PORT_DEV),\r
174 (VOID **) &PciVgaMiniPortPrivate\r
175 );\r
176 if (EFI_ERROR (Status)) {\r
177 goto Done;\r
178 }\r
179\r
180 ZeroMem (PciVgaMiniPortPrivate, sizeof (PCI_VGA_MINI_PORT_DEV));\r
181\r
182 //\r
183 // Initialize the private device structure\r
184 //\r
185 PciVgaMiniPortPrivate->Signature = PCI_VGA_MINI_PORT_DEV_SIGNATURE;\r
186 PciVgaMiniPortPrivate->Handle = Controller;\r
187 PciVgaMiniPortPrivate->PciIo = PciIo;\r
188\r
189 PciVgaMiniPortPrivate->VgaMiniPort.SetMode = PciVgaMiniPortSetMode;\r
190 PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryOffset = 0xb8000;\r
191 PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterOffset = 0x3d4;\r
192 PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterOffset = 0x3d5;\r
193 PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
194 PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
195 PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
196 PciVgaMiniPortPrivate->VgaMiniPort.MaxMode = 1;\r
197\r
198 //\r
199 // Install Vga Mini Port Protocol\r
200 //\r
201 Status = gBS->InstallMultipleProtocolInterfaces (\r
202 &Controller,\r
203 &gEfiVgaMiniPortProtocolGuid,\r
204 &PciVgaMiniPortPrivate->VgaMiniPort,\r
205 NULL\r
206 );\r
207Done:\r
208 if (EFI_ERROR (Status)) {\r
209 gBS->CloseProtocol (\r
210 Controller,\r
211 &gEfiPciIoProtocolGuid,\r
212 This->DriverBindingHandle,\r
213 Controller\r
214 );\r
215 if (PciVgaMiniPortPrivate) {\r
216 gBS->FreePool (PciVgaMiniPortPrivate);\r
217 }\r
218 }\r
219\r
220 return Status;\r
221}\r
222\r
223\r
224/**\r
225 Stop.\r
226\r
227 (Standard DriverBinding Protocol Stop() function)\r
228\r
229 @return EFI_STATUS\r
230\r
231**/\r
232EFI_STATUS\r
233EFIAPI\r
234PciVgaMiniPortDriverBindingStop (\r
235 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
236 IN EFI_HANDLE Controller,\r
237 IN UINTN NumberOfChildren,\r
238 IN EFI_HANDLE *ChildHandleBuffer\r
239 )\r
240{\r
241 EFI_STATUS Status;\r
242 EFI_VGA_MINI_PORT_PROTOCOL *VgaMiniPort;\r
243 PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate;\r
244\r
245 Status = gBS->OpenProtocol (\r
246 Controller,\r
247 &gEfiVgaMiniPortProtocolGuid,\r
248 (VOID **) &VgaMiniPort,\r
249 This->DriverBindingHandle,\r
250 Controller,\r
251 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
252 );\r
253 if (EFI_ERROR (Status)) {\r
254 return Status;\r
255 }\r
256\r
257 PciVgaMiniPortPrivate = PCI_VGA_MINI_PORT_DEV_FROM_THIS (VgaMiniPort);\r
258\r
259 Status = gBS->UninstallProtocolInterface (\r
260 Controller,\r
261 &gEfiVgaMiniPortProtocolGuid,\r
262 &PciVgaMiniPortPrivate->VgaMiniPort\r
263 );\r
264 if (EFI_ERROR (Status)) {\r
265 return Status;\r
266 }\r
267\r
268 gBS->CloseProtocol (\r
269 Controller,\r
270 &gEfiPciIoProtocolGuid,\r
271 This->DriverBindingHandle,\r
272 Controller\r
273 );\r
274\r
275 gBS->FreePool (PciVgaMiniPortPrivate);\r
276\r
277 return EFI_SUCCESS;\r
278}\r
279//\r
280// VGA Mini Port Protocol Functions\r
281//\r
282\r
283/**\r
fcf03596 284 Thunk function of EFI_VGA_MINI_PORT_SET_MODE\r
733f03aa 285\r
fcf03596 286 @param This Point to instance of EFI_VGA_MINI_PORT_PROTOCOL\r
287 @param ModeNumber Mode number\r
733f03aa 288\r
fcf03596 289 @retval EFI_UNSUPPORTED Invalid mode number\r
290 @retval EFI_SUCCESS Success\r
733f03aa 291\r
292**/\r
293EFI_STATUS\r
294EFIAPI\r
295PciVgaMiniPortSetMode (\r
296 IN EFI_VGA_MINI_PORT_PROTOCOL *This,\r
297 IN UINTN ModeNumber\r
298 )\r
299{\r
300 if (ModeNumber > This->MaxMode) {\r
301 return EFI_UNSUPPORTED;\r
302 }\r
303\r
304 return EFI_SUCCESS;\r
305}\r
fcf03596 306 \r