]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Pci/VgaMiniPortDxe/VgaMiniPort.c
Update For R9 Review.
[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
eeefcb9d 39 @param ImageHandle Driver image handle.\r
40 @param SystemTable Point to EFI_SYSTEM_TABLE.\r
fcf03596 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
eeefcb9d 67 @param This The driver binding protocol.\r
68 @param Controller The controller handle to check.\r
69 @param RemainingDevicePath The remaining device path.\r
70\r
71 @retval EFI_SUCCESS The driver supports this controller.\r
72 @retval EFI_UNSUPPORTED This device isn't supported.\r
733f03aa 73\r
74**/\r
75EFI_STATUS\r
76EFIAPI\r
77PciVgaMiniPortDriverBindingSupported (\r
78 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
79 IN EFI_HANDLE Controller,\r
80 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
81 )\r
82{\r
83 EFI_STATUS Status;\r
84 EFI_PCI_IO_PROTOCOL *PciIo;\r
85 PCI_TYPE00 Pci;\r
86\r
87 //\r
88 // Open the IO Abstraction(s) needed to perform the supported test\r
89 //\r
90 Status = gBS->OpenProtocol (\r
91 Controller,\r
92 &gEfiPciIoProtocolGuid,\r
93 (VOID **) &PciIo,\r
94 This->DriverBindingHandle,\r
95 Controller,\r
96 EFI_OPEN_PROTOCOL_BY_DRIVER\r
97 );\r
98 if (EFI_ERROR (Status)) {\r
99 return Status;\r
100 }\r
101 //\r
102 // See if this is a PCI VGA Controller by looking at the Command register and\r
103 // Class Code Register\r
104 //\r
105 Status = PciIo->Pci.Read (\r
106 PciIo,\r
107 EfiPciIoWidthUint32,\r
108 0,\r
109 sizeof (Pci) / sizeof (UINT32),\r
110 &Pci\r
111 );\r
112 if (EFI_ERROR (Status)) {\r
113 goto Done;\r
114 }\r
115\r
116 Status = EFI_UNSUPPORTED;\r
117 //\r
118 // See if the device is an enabled VGA device.\r
119 // Most systems can only have on VGA device on at a time.\r
120 //\r
121 if (((Pci.Hdr.Command & 0x03) == 0x03) && IS_PCI_VGA (&Pci)) {\r
122 Status = EFI_SUCCESS;\r
123 }\r
124\r
125Done:\r
126 gBS->CloseProtocol (\r
127 Controller,\r
128 &gEfiPciIoProtocolGuid,\r
129 This->DriverBindingHandle,\r
130 Controller\r
131 );\r
132\r
133 return Status;\r
134}\r
135\r
136\r
137/**\r
138 Install VGA Mini Port Protocol onto VGA device handles\r
139\r
140 (Standard DriverBinding Protocol Start() function)\r
141\r
eeefcb9d 142 @param This The driver binding instance.\r
143 @param Controller The controller to check.\r
144 @param RemainingDevicePath The remaining device patch.\r
145\r
146 @retval EFI_SUCCESS The controller is controlled by the driver.\r
147 @retval EFI_ALREADY_STARTED The controller is already controlled by the driver.\r
148 @retval EFI_OUT_OF_RESOURCES Failed to allocate resources.\r
733f03aa 149\r
150**/\r
151EFI_STATUS\r
152EFIAPI\r
153PciVgaMiniPortDriverBindingStart (\r
154 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
155 IN EFI_HANDLE Controller,\r
156 IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath\r
157 )\r
158{\r
159 EFI_STATUS Status;\r
160 EFI_PCI_IO_PROTOCOL *PciIo;\r
161 PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate;\r
162\r
163 PciVgaMiniPortPrivate = NULL;\r
164 PciIo = NULL;\r
165 //\r
166 // Open the IO Abstraction(s) needed\r
167 //\r
168 Status = gBS->OpenProtocol (\r
169 Controller,\r
170 &gEfiPciIoProtocolGuid,\r
171 (VOID **) &PciIo,\r
172 This->DriverBindingHandle,\r
173 Controller,\r
174 EFI_OPEN_PROTOCOL_BY_DRIVER\r
175 );\r
176 if (EFI_ERROR (Status)) {\r
177 goto Done;\r
178 }\r
179 //\r
180 // Allocate the private device structure\r
181 //\r
182 Status = gBS->AllocatePool (\r
183 EfiBootServicesData,\r
184 sizeof (PCI_VGA_MINI_PORT_DEV),\r
185 (VOID **) &PciVgaMiniPortPrivate\r
186 );\r
187 if (EFI_ERROR (Status)) {\r
188 goto Done;\r
189 }\r
190\r
191 ZeroMem (PciVgaMiniPortPrivate, sizeof (PCI_VGA_MINI_PORT_DEV));\r
192\r
193 //\r
194 // Initialize the private device structure\r
195 //\r
196 PciVgaMiniPortPrivate->Signature = PCI_VGA_MINI_PORT_DEV_SIGNATURE;\r
197 PciVgaMiniPortPrivate->Handle = Controller;\r
198 PciVgaMiniPortPrivate->PciIo = PciIo;\r
199\r
200 PciVgaMiniPortPrivate->VgaMiniPort.SetMode = PciVgaMiniPortSetMode;\r
201 PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryOffset = 0xb8000;\r
202 PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterOffset = 0x3d4;\r
203 PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterOffset = 0x3d5;\r
204 PciVgaMiniPortPrivate->VgaMiniPort.VgaMemoryBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
205 PciVgaMiniPortPrivate->VgaMiniPort.CrtcAddressRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
206 PciVgaMiniPortPrivate->VgaMiniPort.CrtcDataRegisterBar = EFI_PCI_IO_PASS_THROUGH_BAR;\r
207 PciVgaMiniPortPrivate->VgaMiniPort.MaxMode = 1;\r
208\r
209 //\r
210 // Install Vga Mini Port Protocol\r
211 //\r
212 Status = gBS->InstallMultipleProtocolInterfaces (\r
213 &Controller,\r
214 &gEfiVgaMiniPortProtocolGuid,\r
215 &PciVgaMiniPortPrivate->VgaMiniPort,\r
216 NULL\r
217 );\r
218Done:\r
219 if (EFI_ERROR (Status)) {\r
220 gBS->CloseProtocol (\r
221 Controller,\r
222 &gEfiPciIoProtocolGuid,\r
223 This->DriverBindingHandle,\r
224 Controller\r
225 );\r
eeefcb9d 226 if (PciVgaMiniPortPrivate != NULL) {\r
733f03aa 227 gBS->FreePool (PciVgaMiniPortPrivate);\r
228 }\r
229 }\r
230\r
231 return Status;\r
232}\r
233\r
234\r
235/**\r
236 Stop.\r
237\r
238 (Standard DriverBinding Protocol Stop() function)\r
239\r
eeefcb9d 240 @param This The driver binding protocol.\r
241 @param Controller The controller to release.\r
242 @param NumberOfChildren The child number that opened controller\r
243 BY_CHILD.\r
244 @param ChildHandleBuffer The array of child handle.\r
245\r
246 @retval EFI_SUCCESS The controller or children are stopped.\r
247 @retval EFI_DEVICE_ERROR Failed to stop the driver.\r
733f03aa 248\r
249**/\r
250EFI_STATUS\r
251EFIAPI\r
252PciVgaMiniPortDriverBindingStop (\r
253 IN EFI_DRIVER_BINDING_PROTOCOL *This,\r
254 IN EFI_HANDLE Controller,\r
255 IN UINTN NumberOfChildren,\r
256 IN EFI_HANDLE *ChildHandleBuffer\r
257 )\r
258{\r
259 EFI_STATUS Status;\r
260 EFI_VGA_MINI_PORT_PROTOCOL *VgaMiniPort;\r
261 PCI_VGA_MINI_PORT_DEV *PciVgaMiniPortPrivate;\r
262\r
263 Status = gBS->OpenProtocol (\r
264 Controller,\r
265 &gEfiVgaMiniPortProtocolGuid,\r
266 (VOID **) &VgaMiniPort,\r
267 This->DriverBindingHandle,\r
268 Controller,\r
269 EFI_OPEN_PROTOCOL_GET_PROTOCOL\r
270 );\r
271 if (EFI_ERROR (Status)) {\r
272 return Status;\r
273 }\r
274\r
275 PciVgaMiniPortPrivate = PCI_VGA_MINI_PORT_DEV_FROM_THIS (VgaMiniPort);\r
276\r
277 Status = gBS->UninstallProtocolInterface (\r
278 Controller,\r
279 &gEfiVgaMiniPortProtocolGuid,\r
280 &PciVgaMiniPortPrivate->VgaMiniPort\r
281 );\r
282 if (EFI_ERROR (Status)) {\r
283 return Status;\r
284 }\r
285\r
286 gBS->CloseProtocol (\r
287 Controller,\r
288 &gEfiPciIoProtocolGuid,\r
289 This->DriverBindingHandle,\r
290 Controller\r
291 );\r
292\r
293 gBS->FreePool (PciVgaMiniPortPrivate);\r
294\r
295 return EFI_SUCCESS;\r
296}\r
297//\r
298// VGA Mini Port Protocol Functions\r
299//\r
300\r
301/**\r
eeefcb9d 302 Thunk function of EFI_VGA_MINI_PORT_SET_MODE.\r
733f03aa 303\r
eeefcb9d 304 @param This Point to instance of EFI_VGA_MINI_PORT_PROTOCOL.\r
305 @param ModeNumber Mode number.\r
733f03aa 306\r
eeefcb9d 307 @retval EFI_UNSUPPORTED Invalid mode number.\r
308 @retval EFI_SUCCESS Success.\r
733f03aa 309\r
310**/\r
311EFI_STATUS\r
312EFIAPI\r
313PciVgaMiniPortSetMode (\r
314 IN EFI_VGA_MINI_PORT_PROTOCOL *This,\r
315 IN UINTN ModeNumber\r
316 )\r
317{\r
318 if (ModeNumber > This->MaxMode) {\r
319 return EFI_UNSUPPORTED;\r
320 }\r
321\r
322 return EFI_SUCCESS;\r
323}\r
fcf03596 324 \r