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