]> git.proxmox.com Git - mirror_edk2.git/blame - DuetPkg/PciBusNoEnumerationDxe/PciDriverOverride.c
remove work around, since we had added return value check.
[mirror_edk2.git] / DuetPkg / PciBusNoEnumerationDxe / PciDriverOverride.c
CommitLineData
10590588 1/*++\r
2\r
3Copyright (c) 2005 - 2007, Intel Corporation \r
4All rights reserved. This 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
12Module Name:\r
13\r
14 PciDriverOverride.c\r
15 \r
16Abstract:\r
17\r
18 PCI Bus Driver\r
19\r
20Revision History\r
21\r
22--*/\r
23\r
d8bee43c 24#include "PciBus.h"\r
10590588 25\r
26EFI_STATUS\r
27EFIAPI\r
28GetDriver(\r
c7b5f50f 29 IN EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *This,\r
10590588 30 IN OUT EFI_HANDLE *DriverImageHandle\r
31 );\r
32\r
33\r
34\r
35EFI_STATUS\r
36InitializePciDriverOverrideInstance (\r
37 PCI_IO_DEVICE *PciIoDevice\r
38 )\r
39/*++\r
40\r
41Routine Description:\r
42\r
43 Initializes a PCI Driver Override Instance\r
44\r
45Arguments:\r
46 \r
47Returns:\r
48\r
49 None\r
50\r
51--*/\r
52\r
53{\r
54 PciIoDevice->PciDriverOverride.GetDriver = GetDriver;\r
55 return EFI_SUCCESS;\r
56}\r
57\r
58EFI_STATUS\r
59EFIAPI\r
60GetDriver (\r
61 IN EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *This,\r
62 IN OUT EFI_HANDLE *DriverImageHandle\r
63 )\r
64/*++\r
65\r
66Routine Description:\r
67\r
68 Get a overriding driver image\r
69\r
70Arguments:\r
71 \r
72Returns:\r
73\r
74 None\r
75\r
76--*/\r
77{\r
78 PCI_IO_DEVICE *PciIoDevice;\r
79 LIST_ENTRY *CurrentLink;\r
80 PCI_DRIVER_OVERRIDE_LIST *Node;\r
81\r
82 PciIoDevice = PCI_IO_DEVICE_FROM_PCI_DRIVER_OVERRIDE_THIS (This);\r
83\r
84 CurrentLink = PciIoDevice->OptionRomDriverList.ForwardLink;\r
85\r
86 while (CurrentLink && CurrentLink != &PciIoDevice->OptionRomDriverList) {\r
87\r
88 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink);\r
89\r
90 if (*DriverImageHandle == NULL) {\r
91\r
92 *DriverImageHandle = Node->DriverImageHandle;\r
93 return EFI_SUCCESS;\r
94 }\r
95\r
96 if (*DriverImageHandle == Node->DriverImageHandle) {\r
97\r
98 if (CurrentLink->ForwardLink == &PciIoDevice->OptionRomDriverList ||\r
99 CurrentLink->ForwardLink == NULL) {\r
100 return EFI_NOT_FOUND;\r
101 }\r
102\r
103 //\r
104 // Get next node\r
105 //\r
106 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink->ForwardLink);\r
107 *DriverImageHandle = Node->DriverImageHandle;\r
108 return EFI_SUCCESS;\r
109 }\r
110\r
111 CurrentLink = CurrentLink->ForwardLink;\r
112 }\r
113\r
114 return EFI_INVALID_PARAMETER;\r
115}\r
116\r
117EFI_STATUS\r
118AddDriver (\r
119 IN PCI_IO_DEVICE *PciIoDevice,\r
120 IN EFI_HANDLE DriverImageHandle\r
121 )\r
122/*++\r
123\r
124Routine Description:\r
125\r
126 Add a overriding driver image\r
127\r
128Arguments:\r
129 \r
130Returns:\r
131\r
132 None\r
133\r
134--*/\r
135\r
136{\r
137 EFI_STATUS Status;\r
10590588 138 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
e8ba34ff 139 PE_COFF_LOADER_IMAGE_CONTEXT ImageContext;\r
10590588 140 PCI_DRIVER_OVERRIDE_LIST *Node;\r
141#if (EFI_SPECIFICATION_VERSION < 0x00020000)\r
142 EFI_DRIVER_OS_HANDOFF_HEADER *DriverOsHandoffHeader;\r
143 EFI_DRIVER_OS_HANDOFF_HEADER *NewDriverOsHandoffHeader;\r
144 EFI_DRIVER_OS_HANDOFF *DriverOsHandoff;\r
145 EFI_DEVICE_PATH_PROTOCOL *DevicePath;\r
146 EFI_HANDLE DeviceHandle;\r
147 UINTN NumberOfEntries;\r
148 UINTN Size;\r
149 UINTN Index;\r
150#endif\r
151\r
152 Status = gBS->HandleProtocol (DriverImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);\r
153 if (EFI_ERROR (Status)) {\r
154 return Status;\r
155 }\r
156\r
157 Node = AllocatePool (sizeof (PCI_DRIVER_OVERRIDE_LIST));\r
158 if (Node == NULL) {\r
159 return EFI_OUT_OF_RESOURCES;\r
160 }\r
161\r
162 Node->Signature = DRIVER_OVERRIDE_SIGNATURE;\r
163 Node->DriverImageHandle = DriverImageHandle;\r
164\r
165 InsertTailList (&PciIoDevice->OptionRomDriverList, &(Node->Link));\r
166\r
167 PciIoDevice->BusOverride = TRUE;\r
168\r
e8ba34ff 169\r
170 ImageContext.Handle = LoadedImage->ImageBase;\r
171 ImageContext.ImageRead = PeCoffLoaderImageReadFromMemory;\r
172\r
173 //\r
174 // Get information about the image \r
175 //\r
176 Status = PeCoffLoaderGetImageInfo (&ImageContext);\r
177 if (EFI_ERROR (Status)) {\r
10590588 178 return EFI_SUCCESS;\r
179 }\r
180\r
e8ba34ff 181 if (ImageContext.Machine != EFI_IMAGE_MACHINE_EBC) {\r
10590588 182 return EFI_SUCCESS;\r
183 }\r
184\r
185#if (EFI_SPECIFICATION_VERSION < 0x00020000)\r
186 DriverOsHandoffHeader = NULL;\r
187 Status = EfiLibGetSystemConfigurationTable (&gEfiUgaIoProtocolGuid, (VOID **) &DriverOsHandoffHeader);\r
188 if (!EFI_ERROR (Status) && DriverOsHandoffHeader != NULL) {\r
189 for (Index = 0; Index < DriverOsHandoffHeader->NumberOfEntries; Index++) {\r
190 DriverOsHandoff = (EFI_DRIVER_OS_HANDOFF *)((UINTN)(DriverOsHandoffHeader) + \r
191 DriverOsHandoffHeader->HeaderSize + \r
192 Index * DriverOsHandoffHeader->SizeOfEntries);\r
193 DevicePath = DriverOsHandoff->DevicePath;\r
194 Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &DevicePath, &DeviceHandle);\r
195 if (!EFI_ERROR (Status) && DeviceHandle != NULL && IsDevicePathEnd (DevicePath)) {\r
196 if (DeviceHandle == PciIoDevice->Handle) {\r
197 return EFI_SUCCESS;\r
198 }\r
199 }\r
200 }\r
201\r
202 NumberOfEntries = DriverOsHandoffHeader->NumberOfEntries + 1;\r
203 } else {\r
204 NumberOfEntries = 1;\r
205 }\r
206\r
207 Status = gBS->AllocatePool (\r
208 EfiRuntimeServicesData,\r
209 sizeof (EFI_DRIVER_OS_HANDOFF_HEADER) + NumberOfEntries * sizeof (EFI_DRIVER_OS_HANDOFF),\r
210 (VOID **) &NewDriverOsHandoffHeader\r
211 );\r
212 if (EFI_ERROR (Status)) {\r
213 return Status;\r
214 }\r
215\r
216 if (DriverOsHandoffHeader == NULL) {\r
217 NewDriverOsHandoffHeader->Version = 0;\r
218 NewDriverOsHandoffHeader->HeaderSize = sizeof (EFI_DRIVER_OS_HANDOFF_HEADER);\r
219 NewDriverOsHandoffHeader->SizeOfEntries = sizeof (EFI_DRIVER_OS_HANDOFF);\r
220 NewDriverOsHandoffHeader->NumberOfEntries = (UINT32) NumberOfEntries;\r
221 } else {\r
222 gBS->CopyMem (\r
223 NewDriverOsHandoffHeader,\r
224 DriverOsHandoffHeader,\r
225 DriverOsHandoffHeader->HeaderSize + (NumberOfEntries - 1) * DriverOsHandoffHeader->SizeOfEntries\r
226 );\r
227 NewDriverOsHandoffHeader->NumberOfEntries = (UINT32) NumberOfEntries;\r
228 }\r
229\r
230 DriverOsHandoff = (EFI_DRIVER_OS_HANDOFF *)((UINTN)NewDriverOsHandoffHeader + \r
231 NewDriverOsHandoffHeader->HeaderSize + \r
232 (NumberOfEntries - 1) * NewDriverOsHandoffHeader->SizeOfEntries);\r
233\r
234 //\r
235 // Fill in the EFI_DRIVER_OS_HANDOFF structure\r
236 //\r
237 DriverOsHandoff->Type = EfiUgaDriverFromPciRom;\r
238\r
239 //\r
240 // Compute the size of the device path\r
241 //\r
242 Size = EfiDevicePathSize (PciIoDevice->DevicePath);\r
243 if (Size == 0) {\r
244 DriverOsHandoff->DevicePath = NULL;\r
245 } else {\r
246\r
247 //\r
248 // Allocate space for duplicate device path\r
249 //\r
250 Status = gBS->AllocatePool (\r
251 EfiRuntimeServicesData,\r
252 Size,\r
253 (VOID **) &DriverOsHandoff->DevicePath\r
254 );\r
255 if (EFI_ERROR (Status)) {\r
256 gBS->FreePool (NewDriverOsHandoffHeader);\r
257 return Status;\r
258 }\r
259\r
260 //\r
261 // Make copy of device path\r
262 //\r
263 CopyMem (DriverOsHandoff->DevicePath, PciIoDevice->DevicePath, Size);\r
264 }\r
265\r
266 DriverOsHandoff->PciRomSize = (UINT64) PciIoDevice->PciIo.RomSize;\r
267 Status = gBS->AllocatePool (\r
268 EfiRuntimeServicesData,\r
269 (UINTN) DriverOsHandoff->PciRomSize,\r
270 (VOID **) &DriverOsHandoff->PciRomImage\r
271 );\r
272 if (EFI_ERROR (Status)) {\r
273 gBS->FreePool (NewDriverOsHandoffHeader);\r
274 return Status;\r
275 }\r
276\r
277 gBS->CopyMem (\r
278 DriverOsHandoff->PciRomImage,\r
279 PciIoDevice->PciIo.RomImage,\r
280 (UINTN) DriverOsHandoff->PciRomSize\r
281 );\r
282\r
283 Status = gBS->InstallConfigurationTable (&gEfiUgaIoProtocolGuid, NewDriverOsHandoffHeader);\r
284 if (EFI_ERROR (Status)) {\r
285 return Status;\r
286 }\r
287\r
288 if (DriverOsHandoffHeader != NULL) {\r
289 gBS->FreePool (DriverOsHandoffHeader);\r
290 }\r
291#endif\r
292\r
293 return EFI_SUCCESS;\r
294}\r