]> git.proxmox.com Git - mirror_edk2.git/blame - IntelFrameworkModulePkg/Bus/Pci/PciBusDxe/PciDriverOverride.c
Roll back to add rule for uni file, change Uni output file to $(DEBUG_DIR)(+)$(MODULE...
[mirror_edk2.git] / IntelFrameworkModulePkg / Bus / Pci / PciBusDxe / PciDriverOverride.c
CommitLineData
3db51098 1/**@file\r
ead42efc 2\r
3db51098 3Copyright (c) 2006, 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
ead42efc 11\r
3db51098 12**/\r
ead42efc 13\r
ead42efc 14\r
03417d8d 15#include "PciBus.h"\r
ead42efc 16\r
bcd70414 17/**\r
ead42efc 18 Initializes a PCI Driver Override Instance\r
19\r
a3b8e257 20 @param PciIoDevice Device instance\r
ead42efc 21\r
a3b8e257 22 @retval EFI_SUCCESS Operation success\r
bcd70414 23**/\r
a3b8e257 24EFI_STATUS\r
25InitializePciDriverOverrideInstance (\r
26 PCI_IO_DEVICE *PciIoDevice\r
27 )\r
ead42efc 28{\r
29 PciIoDevice->PciDriverOverride.GetDriver = GetDriver;\r
30 return EFI_SUCCESS;\r
31}\r
32\r
a3b8e257 33/**\r
34 Get a overriding driver image\r
35 @param This Pointer to instance of EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL\r
36 @param DriverImageHandle Override driver image,\r
37 \r
38 @retval EFI_SUCCESS Success to get driver image handle\r
39 @retval EFI_NOT_FOUND can not find override driver image\r
40 @retval EFI_INVALID_PARAMETER Invalid parameter\r
41**/\r
ead42efc 42EFI_STATUS\r
43EFIAPI\r
44GetDriver (\r
45 IN EFI_BUS_SPECIFIC_DRIVER_OVERRIDE_PROTOCOL *This,\r
46 IN OUT EFI_HANDLE *DriverImageHandle\r
47 )\r
ead42efc 48{\r
49 PCI_IO_DEVICE *PciIoDevice;\r
50 LIST_ENTRY *CurrentLink;\r
51 PCI_DRIVER_OVERRIDE_LIST *Node;\r
52\r
53 PciIoDevice = PCI_IO_DEVICE_FROM_PCI_DRIVER_OVERRIDE_THIS (This);\r
54\r
55 CurrentLink = PciIoDevice->OptionRomDriverList.ForwardLink;\r
56\r
57 while (CurrentLink && CurrentLink != &PciIoDevice->OptionRomDriverList) {\r
58\r
59 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink);\r
60\r
61 if (*DriverImageHandle == NULL) {\r
62\r
63 *DriverImageHandle = Node->DriverImageHandle;\r
64 return EFI_SUCCESS;\r
65 }\r
66\r
67 if (*DriverImageHandle == Node->DriverImageHandle) {\r
68\r
69 if (CurrentLink->ForwardLink == &PciIoDevice->OptionRomDriverList ||\r
70 CurrentLink->ForwardLink == NULL) {\r
71 return EFI_NOT_FOUND;\r
72 }\r
73\r
74 //\r
75 // Get next node\r
76 //\r
77 Node = DRIVER_OVERRIDE_FROM_LINK (CurrentLink->ForwardLink);\r
78 *DriverImageHandle = Node->DriverImageHandle;\r
79 return EFI_SUCCESS;\r
80 }\r
81\r
82 CurrentLink = CurrentLink->ForwardLink;\r
83 }\r
84\r
85 return EFI_INVALID_PARAMETER;\r
86}\r
87\r
a3b8e257 88/**\r
89 Add an overriding driver image\r
90 \r
91 @param PciIoDevice Instance of PciIo device\r
92 @param DriverImageHandle new added driver image\r
93 \r
94 @retval EFI_OUT_OF_RESOURCES no memory resource for new driver instance\r
95 @retval EFI_SUCCESS Success add driver\r
96**/\r
ead42efc 97EFI_STATUS\r
98AddDriver (\r
99 IN PCI_IO_DEVICE *PciIoDevice,\r
100 IN EFI_HANDLE DriverImageHandle\r
101 )\r
ead42efc 102{\r
103 EFI_STATUS Status;\r
104 EFI_IMAGE_DOS_HEADER *DosHdr;\r
105 EFI_IMAGE_NT_HEADERS *PeHdr;\r
106 EFI_LOADED_IMAGE_PROTOCOL *LoadedImage;\r
107 PCI_DRIVER_OVERRIDE_LIST *Node;\r
108\r
109 Status = gBS->HandleProtocol (DriverImageHandle, &gEfiLoadedImageProtocolGuid, (VOID **) &LoadedImage);\r
110 if (EFI_ERROR (Status)) {\r
111 return Status;\r
112 }\r
113\r
114 Node = AllocatePool (sizeof (PCI_DRIVER_OVERRIDE_LIST));\r
115 if (Node == NULL) {\r
116 return EFI_OUT_OF_RESOURCES;\r
117 }\r
118\r
119 Node->Signature = DRIVER_OVERRIDE_SIGNATURE;\r
120 Node->DriverImageHandle = DriverImageHandle;\r
121\r
122 InsertTailList (&PciIoDevice->OptionRomDriverList, &(Node->Link));\r
123\r
124 PciIoDevice->BusOverride = TRUE;\r
125\r
126 DosHdr = (EFI_IMAGE_DOS_HEADER *) LoadedImage->ImageBase;\r
127 if (DosHdr->e_magic != EFI_IMAGE_DOS_SIGNATURE) {\r
128 return EFI_SUCCESS;\r
129 }\r
130\r
131 PeHdr = (EFI_IMAGE_NT_HEADERS *) ((UINTN) LoadedImage->ImageBase + DosHdr->e_lfanew);\r
132\r
133 if (PeHdr->FileHeader.Machine != EFI_IMAGE_MACHINE_EBC) {\r
134 return EFI_SUCCESS;\r
135 }\r
136 return EFI_SUCCESS;\r
137}\r
a3b8e257 138\r