3 Copyright (c) 2006, Intel Corporation
4 All rights reserved. This program and the accompanying materials
5 are licensed and made available under the terms and conditions of the BSD License
6 which accompanies this distribution. The full text of the license may be found at
7 http://opensource.org/licenses/bsd-license.php
9 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
10 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
27 InitializePciDriverOverrideInstance (
28 PCI_IO_DEVICE
*PciIoDevice
34 Initializes a PCI Driver Override Instance
43 // TODO: PciIoDevice - add argument and description to function comment
44 // TODO: EFI_SUCCESS - add return value to function comment
46 PciIoDevice
->PciDriverOverride
.GetDriver
= GetDriver
;
53 IN EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL
*This
,
54 IN OUT EFI_HANDLE
*DriverImageHandle
60 Get a overriding driver image
69 // TODO: This - add argument and description to function comment
70 // TODO: DriverImageHandle - add argument and description to function comment
71 // TODO: EFI_SUCCESS - add return value to function comment
72 // TODO: EFI_NOT_FOUND - add return value to function comment
73 // TODO: EFI_SUCCESS - add return value to function comment
74 // TODO: EFI_INVALID_PARAMETER - add return value to function comment
76 PCI_IO_DEVICE
*PciIoDevice
;
77 LIST_ENTRY
*CurrentLink
;
78 PCI_DRIVER_OVERRIDE_LIST
*Node
;
80 PciIoDevice
= PCI_IO_DEVICE_FROM_PCI_DRIVER_OVERRIDE_THIS (This
);
82 CurrentLink
= PciIoDevice
->OptionRomDriverList
.ForwardLink
;
84 while (CurrentLink
&& CurrentLink
!= &PciIoDevice
->OptionRomDriverList
) {
86 Node
= DRIVER_OVERRIDE_FROM_LINK (CurrentLink
);
88 if (*DriverImageHandle
== NULL
) {
90 *DriverImageHandle
= Node
->DriverImageHandle
;
94 if (*DriverImageHandle
== Node
->DriverImageHandle
) {
96 if (CurrentLink
->ForwardLink
== &PciIoDevice
->OptionRomDriverList
||
97 CurrentLink
->ForwardLink
== NULL
) {
104 Node
= DRIVER_OVERRIDE_FROM_LINK (CurrentLink
->ForwardLink
);
105 *DriverImageHandle
= Node
->DriverImageHandle
;
109 CurrentLink
= CurrentLink
->ForwardLink
;
112 return EFI_INVALID_PARAMETER
;
117 IN PCI_IO_DEVICE
*PciIoDevice
,
118 IN EFI_HANDLE DriverImageHandle
124 Add a overriding driver image
133 // TODO: PciIoDevice - add argument and description to function comment
134 // TODO: DriverImageHandle - add argument and description to function comment
135 // TODO: EFI_OUT_OF_RESOURCES - add return value to function comment
136 // TODO: EFI_SUCCESS - add return value to function comment
137 // TODO: EFI_SUCCESS - add return value to function comment
138 // TODO: EFI_SUCCESS - add return value to function comment
139 // TODO: EFI_SUCCESS - add return value to function comment
142 EFI_LOADED_IMAGE_PROTOCOL
*LoadedImage
;
143 PCI_DRIVER_OVERRIDE_LIST
*Node
;
144 EFI_DRIVER_OS_HANDOFF_HEADER
*DriverOsHandoffHeader
;
145 EFI_DRIVER_OS_HANDOFF_HEADER
*NewDriverOsHandoffHeader
;
146 EFI_DRIVER_OS_HANDOFF
*DriverOsHandoff
;
147 EFI_DEVICE_PATH_PROTOCOL
*DevicePath
;
148 EFI_HANDLE DeviceHandle
;
149 UINTN NumberOfEntries
;
153 Status
= gBS
->HandleProtocol (DriverImageHandle
, &gEfiLoadedImageProtocolGuid
, (VOID
**) &LoadedImage
);
154 if (EFI_ERROR (Status
)) {
158 Node
= AllocatePool (sizeof (PCI_DRIVER_OVERRIDE_LIST
));
160 return EFI_OUT_OF_RESOURCES
;
163 Node
->Signature
= DRIVER_OVERRIDE_SIGNATURE
;
164 Node
->DriverImageHandle
= DriverImageHandle
;
166 InsertTailList (&PciIoDevice
->OptionRomDriverList
, &(Node
->Link
));
168 PciIoDevice
->BusOverride
= TRUE
;
170 if (PeCoffLoaderGetMachineType ((VOID
*)(UINTN
)LoadedImage
->ImageBase
) != EFI_IMAGE_MACHINE_EBC
) {
174 DriverOsHandoffHeader
= NULL
;
175 Status
= EfiGetSystemConfigurationTable (&gEfiUgaIoProtocolGuid
, (VOID
**) &DriverOsHandoffHeader
);
176 if (!EFI_ERROR (Status
) && DriverOsHandoffHeader
!= NULL
) {
177 for (Index
= 0; Index
< DriverOsHandoffHeader
->NumberOfEntries
; Index
++) {
178 DriverOsHandoff
= (EFI_DRIVER_OS_HANDOFF
*)((UINTN
)(DriverOsHandoffHeader
) +
179 DriverOsHandoffHeader
->HeaderSize
+
180 Index
* DriverOsHandoffHeader
->SizeOfEntries
);
181 DevicePath
= DriverOsHandoff
->DevicePath
;
182 Status
= gBS
->LocateDevicePath (&gEfiDevicePathProtocolGuid
, &DevicePath
, &DeviceHandle
);
183 if (!EFI_ERROR (Status
) && DeviceHandle
!= NULL
&& IsDevicePathEnd (DevicePath
)) {
184 if (DeviceHandle
== PciIoDevice
->Handle
) {
190 NumberOfEntries
= DriverOsHandoffHeader
->NumberOfEntries
+ 1;
195 Status
= gBS
->AllocatePool (
196 EfiRuntimeServicesData
,
197 sizeof (EFI_DRIVER_OS_HANDOFF_HEADER
) + NumberOfEntries
* sizeof (EFI_DRIVER_OS_HANDOFF
),
198 (VOID
**) &NewDriverOsHandoffHeader
200 if (EFI_ERROR (Status
)) {
204 if (DriverOsHandoffHeader
== NULL
) {
205 NewDriverOsHandoffHeader
->Version
= 0;
206 NewDriverOsHandoffHeader
->HeaderSize
= sizeof (EFI_DRIVER_OS_HANDOFF_HEADER
);
207 NewDriverOsHandoffHeader
->SizeOfEntries
= sizeof (EFI_DRIVER_OS_HANDOFF
);
208 NewDriverOsHandoffHeader
->NumberOfEntries
= (UINT32
) NumberOfEntries
;
211 NewDriverOsHandoffHeader
,
212 DriverOsHandoffHeader
,
213 DriverOsHandoffHeader
->HeaderSize
+ (NumberOfEntries
- 1) * DriverOsHandoffHeader
->SizeOfEntries
215 NewDriverOsHandoffHeader
->NumberOfEntries
= (UINT32
) NumberOfEntries
;
218 DriverOsHandoff
= (EFI_DRIVER_OS_HANDOFF
*)((UINTN
)NewDriverOsHandoffHeader
+
219 NewDriverOsHandoffHeader
->HeaderSize
+
220 (NumberOfEntries
- 1) * NewDriverOsHandoffHeader
->SizeOfEntries
);
223 // Fill in the EFI_DRIVER_OS_HANDOFF structure
225 DriverOsHandoff
->Type
= EfiUgaDriverFromPciRom
;
228 // Compute the size of the device path
230 Size
= GetDevicePathSize (PciIoDevice
->DevicePath
);
232 DriverOsHandoff
->DevicePath
= NULL
;
236 // Allocate space for duplicate device path
238 Status
= gBS
->AllocatePool (
239 EfiRuntimeServicesData
,
241 (VOID
**) &DriverOsHandoff
->DevicePath
243 if (EFI_ERROR (Status
)) {
244 gBS
->FreePool (NewDriverOsHandoffHeader
);
249 // Make copy of device path
251 CopyMem (DriverOsHandoff
->DevicePath
, PciIoDevice
->DevicePath
, Size
);
254 DriverOsHandoff
->PciRomSize
= (UINT64
) PciIoDevice
->PciIo
.RomSize
;
255 Status
= gBS
->AllocatePool (
256 EfiRuntimeServicesData
,
257 (UINTN
) DriverOsHandoff
->PciRomSize
,
258 (VOID
**) &DriverOsHandoff
->PciRomImage
260 if (EFI_ERROR (Status
)) {
261 gBS
->FreePool (NewDriverOsHandoffHeader
);
266 DriverOsHandoff
->PciRomImage
,
267 PciIoDevice
->PciIo
.RomImage
,
268 (UINTN
) DriverOsHandoff
->PciRomSize
271 Status
= gBS
->InstallConfigurationTable (&gEfiUgaIoProtocolGuid
, NewDriverOsHandoffHeader
);
272 if (EFI_ERROR (Status
)) {
276 if (DriverOsHandoffHeader
!= NULL
) {
277 gBS
->FreePool (DriverOsHandoffHeader
);