59 PciDeviceNode->Parent = Bridge;
91 ASSERT (PciIoDevice !=
NULL);
95 if (PciIoDevice->ResourcePaddingDescriptors !=
NULL) {
96 FreePool (PciIoDevice->ResourcePaddingDescriptors);
99 if (PciIoDevice->DevicePath !=
NULL) {
103 if (PciIoDevice->BusNumberRanges !=
NULL) {
104 FreePool (PciIoDevice->BusNumberRanges);
126 CurrentLink = Bridge->ChildList.ForwardLink;
133 Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
164 CurrentLink = mPciDevicePool.ForwardLink;
166 while (CurrentLink !=
NULL && CurrentLink != &mPciDevicePool) {
167 Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
169 if (Temp->Handle == Controller) {
179 CurrentLink = CurrentLink->ForwardLink;
182 return EFI_NOT_FOUND;
208 VOID *PlatformOpRomBuffer;
209 UINTN PlatformOpRomSize;
217 Status =
gBS->InstallMultipleProtocolInterfaces (
218 &PciIoDevice->Handle,
219 &gEfiDevicePathProtocolGuid,
220 PciIoDevice->DevicePath,
221 &gEfiPciIoProtocolGuid,
225 if (EFI_ERROR (Status)) {
232 PciIo = &(PciIoDevice->PciIo);
234 PciIo->Pci.
Write (PciIo, EfiPciIoWidthUint8, 0x3C, 1, &Data8);
239 if (!PciIoDevice->AllOpRomProcessed) {
243 if (gPciPlatformProtocol !=
NULL) {
244 Status = gPciPlatformProtocol->
GetPciRom (
245 gPciPlatformProtocol,
247 &PlatformOpRomBuffer,
250 if (!EFI_ERROR (Status)) {
251 PciIoDevice->EmbeddedRom =
FALSE;
252 PciIoDevice->RomSize = (UINT32)PlatformOpRomSize;
253 PciIoDevice->PciIo.RomSize = PlatformOpRomSize;
254 PciIoDevice->PciIo.RomImage = PlatformOpRomBuffer;
261 PciIoDevice->PciRootBridgeIo->SegmentNumber,
262 PciIoDevice->BusNumber,
263 PciIoDevice->DeviceNumber,
264 PciIoDevice->FunctionNumber,
265 PciIoDevice->PciIo.RomImage,
266 PciIoDevice->PciIo.RomSize
269 }
else if (gPciOverrideProtocol !=
NULL) {
270 Status = gPciOverrideProtocol->
GetPciRom (
271 gPciOverrideProtocol,
273 &PlatformOpRomBuffer,
276 if (!EFI_ERROR (Status)) {
277 PciIoDevice->EmbeddedRom =
FALSE;
278 PciIoDevice->RomSize = (UINT32)PlatformOpRomSize;
279 PciIoDevice->PciIo.RomSize = PlatformOpRomSize;
280 PciIoDevice->PciIo.RomImage = PlatformOpRomBuffer;
287 PciIoDevice->PciRootBridgeIo->SegmentNumber,
288 PciIoDevice->BusNumber,
289 PciIoDevice->DeviceNumber,
290 PciIoDevice->FunctionNumber,
291 PciIoDevice->PciIo.RomImage,
292 PciIoDevice->PciIo.RomSize
301 HasEfiImage =
ContainEfiImage (PciIoDevice->PciIo.RomImage, PciIoDevice->PciIo.RomSize);
304 Status =
gBS->InstallMultipleProtocolInterfaces (
305 &PciIoDevice->Handle,
306 &gEfiLoadFile2ProtocolGuid,
307 &PciIoDevice->LoadFile2,
310 if (EFI_ERROR (Status)) {
311 gBS->UninstallMultipleProtocolInterfaces (
313 &gEfiDevicePathProtocolGuid,
314 PciIoDevice->DevicePath,
315 &gEfiPciIoProtocolGuid,
323 if (!PciIoDevice->AllOpRomProcessed) {
324 PciIoDevice->AllOpRomProcessed =
TRUE;
339 if (Status == EFI_NOT_FOUND) {
345 if (PciIoDevice->BusOverride) {
349 Status =
gBS->InstallMultipleProtocolInterfaces (
350 &PciIoDevice->Handle,
351 &gEfiBusSpecificDriverOverrideProtocolGuid,
352 &PciIoDevice->PciDriverOverride,
355 if (EFI_ERROR (Status)) {
356 gBS->UninstallMultipleProtocolInterfaces (
358 &gEfiDevicePathProtocolGuid,
359 PciIoDevice->DevicePath,
360 &gEfiPciIoProtocolGuid,
365 gBS->UninstallMultipleProtocolInterfaces (
367 &gEfiLoadFile2ProtocolGuid,
368 &PciIoDevice->LoadFile2,
377 Status =
gBS->OpenProtocol (
379 &gEfiPciRootBridgeIoProtocolGuid,
380 (
VOID **)&(PciIoDevice->PciRootBridgeIo),
383 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
385 if (EFI_ERROR (Status)) {
389 if (Handle !=
NULL) {
390 *Handle = PciIoDevice->Handle;
396 PciIoDevice->Registered =
TRUE;
419 CurrentLink = Bridge->ChildList.ForwardLink;
420 Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
426 if (Temp->Registered) {
470 Status =
gBS->OpenProtocol (
472 &gEfiPciIoProtocolGuid,
476 EFI_OPEN_PROTOCOL_GET_PROTOCOL
478 if (!EFI_ERROR (Status)) {
479 PciIoDevice = PCI_IO_DEVICE_FROM_PCI_IO_THIS (PciIo);
484 if (!PciIoDevice->Registered) {
493 CurrentLink = PciIoDevice->ChildList.ForwardLink;
495 while (CurrentLink !=
NULL && CurrentLink != &PciIoDevice->ChildList) {
496 Node = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
499 if (EFI_ERROR (Status)) {
503 CurrentLink = CurrentLink->ForwardLink;
510 Status =
gBS->CloseProtocol (
512 &gEfiPciRootBridgeIoProtocolGuid,
521 if (PciIoDevice->BusOverride) {
522 Status =
gBS->UninstallMultipleProtocolInterfaces (
524 &gEfiDevicePathProtocolGuid,
525 PciIoDevice->DevicePath,
526 &gEfiPciIoProtocolGuid,
528 &gEfiBusSpecificDriverOverrideProtocolGuid,
529 &PciIoDevice->PciDriverOverride,
533 Status =
gBS->UninstallMultipleProtocolInterfaces (
535 &gEfiDevicePathProtocolGuid,
536 PciIoDevice->DevicePath,
537 &gEfiPciIoProtocolGuid,
543 if (!EFI_ERROR (Status)) {
547 Status =
gBS->OpenProtocol (
549 &gEfiLoadFile2ProtocolGuid,
553 EFI_OPEN_PROTOCOL_TEST_PROTOCOL
555 if (!EFI_ERROR (Status)) {
556 Status =
gBS->UninstallMultipleProtocolInterfaces (
558 &gEfiLoadFile2ProtocolGuid,
559 &PciIoDevice->LoadFile2,
570 if (EFI_ERROR (Status)) {
573 &gEfiPciRootBridgeIoProtocolGuid,
574 (
VOID **)&PciRootBridgeIo,
577 EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
587 PciIoDevice->Registered =
FALSE;
588 PciIoDevice->Handle =
NULL;
619 IN OUT UINT8 *NumberOfChildren,
632 CurrentLink = RootBridge->ChildList.ForwardLink;
634 while (CurrentLink !=
NULL && CurrentLink != &RootBridge->ChildList) {
635 PciIoDevice = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
636 if (RemainingDevicePath !=
NULL) {
637 Node.DevPath = RemainingDevicePath;
639 if ((Node.Pci->
Device != PciIoDevice->DeviceNumber) ||
640 (Node.Pci->
Function != PciIoDevice->FunctionNumber))
642 CurrentLink = CurrentLink->ForwardLink;
649 if (!PciIoDevice->Allocated) {
650 return EFI_NOT_READY;
657 if (!PciIoDevice->Registered) {
665 if ((NumberOfChildren !=
NULL) && (ChildHandleBuffer !=
NULL) && PciIoDevice->Registered) {
666 ChildHandleBuffer[*NumberOfChildren] = PciIoDevice->Handle;
667 (*NumberOfChildren)++;
690 PciIoDevice->PciIo.Attributes (
691 &(PciIoDevice->PciIo),
696 Supports &= (UINT64)EFI_PCI_DEVICE_ENABLE;
697 PciIoDevice->PciIo.Attributes (
698 &(PciIoDevice->PciIo),
709 return EFI_UNSUPPORTED;
716 if (!PciIoDevice->Registered && PciIoDevice->Allocated) {
724 if ((NumberOfChildren !=
NULL) && (ChildHandleBuffer !=
NULL) && PciIoDevice->Registered) {
725 ChildHandleBuffer[*NumberOfChildren] = PciIoDevice->Handle;
726 (*NumberOfChildren)++;
738 PciIoDevice->PciIo.Attributes (
739 &(PciIoDevice->PciIo),
744 Supports &= (UINT64)EFI_PCI_DEVICE_ENABLE;
745 PciIoDevice->PciIo.Attributes (
746 &(PciIoDevice->PciIo),
753 CurrentLink = CurrentLink->ForwardLink;
757 if (PciIoDevice ==
NULL) {
758 return EFI_NOT_FOUND;
784 ASSERT (RootBridge !=
NULL);
785 ThisHostBridge = RootBridge->PciRootBridgeIo->
ParentHandle;
787 CurrentLink = mPciDevicePool.ForwardLink;
789 while (CurrentLink !=
NULL && CurrentLink != &mPciDevicePool) {
790 RootBridge = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
794 if (RootBridge->PciRootBridgeIo->
ParentHandle == ThisHostBridge) {
804 CurrentLink = CurrentLink->ForwardLink;
834 Dev->Signature = PCI_IO_DEVICE_SIGNATURE;
835 Dev->Handle = RootBridgeHandle;
838 Status =
gBS->OpenProtocol (
840 &gEfiDevicePathProtocolGuid,
841 (
VOID **)&ParentDevicePath,
844 EFI_OPEN_PROTOCOL_GET_PROTOCOL
847 if (EFI_ERROR (Status)) {
860 Status =
gBS->OpenProtocol (
862 &gEfiPciRootBridgeIoProtocolGuid,
863 (
VOID **)&PciRootBridgeIo,
866 EFI_OPEN_PROTOCOL_GET_PROTOCOL
869 if (EFI_ERROR (Status)) {
874 Dev->PciRootBridgeIo = PciRootBridgeIo;
910 CurrentLink = mPciDevicePool.ForwardLink;
912 while (CurrentLink !=
NULL && CurrentLink != &mPciDevicePool) {
913 RootBridgeDev = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
914 if (RootBridgeDev->Handle == RootBridgeHandle) {
915 return RootBridgeDev;
918 CurrentLink = CurrentLink->ForwardLink;
943 CurrentLink = Bridge->ChildList.ForwardLink;
945 while (CurrentLink !=
NULL && CurrentLink != &Bridge->ChildList) {
946 Temp = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
948 if (Temp == PciIoDevice) {
958 CurrentLink = CurrentLink->ForwardLink;
980 CurrentLink = mPciDevicePool.ForwardLink;
982 while (CurrentLink !=
NULL && CurrentLink != &mPciDevicePool) {
983 PciIoDevice = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
985 if (PciIoDevice->PciRootBridgeIo->
ParentHandle == HostBridgeHandle) {
988 if (PciIoDevice !=
NULL) {
993 CurrentLink = CurrentLink->ForwardLink;
1015 CurrentLink = Bridge->ChildList.ForwardLink;
1017 while (CurrentLink !=
NULL && CurrentLink != &Bridge->ChildList) {
1018 PciIoDevice = PCI_IO_DEVICE_FROM_LINK (CurrentLink);
1021 ((PciIoDevice->Attributes &
1032 if (PciIoDevice !=
NULL) {
1037 CurrentLink = CurrentLink->ForwardLink;
BOOLEAN EFIAPI IsListEmpty(IN CONST LIST_ENTRY *ListHead)
LIST_ENTRY *EFIAPI RemoveEntryList(IN CONST LIST_ENTRY *Entry)
LIST_ENTRY *EFIAPI InitializeListHead(IN OUT LIST_ENTRY *ListHead)
LIST_ENTRY *EFIAPI InsertTailList(IN OUT LIST_ENTRY *ListHead, IN OUT LIST_ENTRY *Entry)
BOOLEAN EFIAPI IsDevicePathEnd(IN CONST VOID *Node)
EFI_DEVICE_PATH_PROTOCOL *EFIAPI NextDevicePathNode(IN CONST VOID *Node)
EFI_DEVICE_PATH_PROTOCOL *EFIAPI DuplicateDevicePath(IN CONST EFI_DEVICE_PATH_PROTOCOL *DevicePath)
VOID *EFIAPI AllocateZeroPool(IN UINTN AllocationSize)
VOID EFIAPI FreePool(IN VOID *Buffer)
#define EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY
MEM cycles 0xA0000-0xBFFFF (24 bit decode)
#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16
I/O cycles 0x3B0-0x3BB and 0x3C0-0x3DF (16 bit decode)
@ EfiPciIoAttributeOperationEnable
@ EfiPciIoAttributeOperationSupported
#define EFI_PCI_IO_ATTRIBUTE_VGA_IO
I/O cycles 0x3B0-0x3BB and 0x3C0-0x3DF (10 bit decode)
#define IS_PCI_BRIDGE(_p)
#define PCI_INT_LINE_UNKNOWN
EFI_STATUS DeRegisterPciDevice(IN EFI_HANDLE Controller, IN EFI_HANDLE Handle)
EFI_STATUS RegisterPciDevice(IN EFI_HANDLE Controller, IN PCI_IO_DEVICE *PciIoDevice, OUT EFI_HANDLE *Handle OPTIONAL)
PCI_IO_DEVICE * CreateRootBridge(IN EFI_HANDLE RootBridgeHandle)
VOID DestroyPciDeviceTree(IN PCI_IO_DEVICE *Bridge)
VOID DestroyRootBridge(IN PCI_IO_DEVICE *RootBridge)
EFI_STATUS DestroyRootBridgeByHandle(IN EFI_HANDLE Controller)
VOID InsertRootBridge(IN PCI_IO_DEVICE *RootBridge)
EFI_STATUS StartPciDevicesOnBridge(IN EFI_HANDLE Controller, IN PCI_IO_DEVICE *RootBridge, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath, IN OUT UINT8 *NumberOfChildren, IN OUT EFI_HANDLE *ChildHandleBuffer)
BOOLEAN PciDeviceExisted(IN PCI_IO_DEVICE *Bridge, IN PCI_IO_DEVICE *PciIoDevice)
VOID InitializePciDevicePool(VOID)
EFI_STATUS StartPciDevices(IN EFI_HANDLE Controller)
PCI_IO_DEVICE * GetRootBridgeByHandle(EFI_HANDLE RootBridgeHandle)
VOID FreePciDevice(IN PCI_IO_DEVICE *PciIoDevice)
PCI_IO_DEVICE * LocateVgaDevice(IN PCI_IO_DEVICE *Bridge)
VOID InsertPciDevice(IN PCI_IO_DEVICE *Bridge, IN PCI_IO_DEVICE *PciDeviceNode)
PCI_IO_DEVICE * LocateVgaDeviceOnHostBridge(IN EFI_HANDLE HostBridgeHandle)
VOID RemoveAllPciDeviceOnBridge(EFI_HANDLE RootBridgeHandle, PCI_IO_DEVICE *Bridge)
VOID InitializePciDriverOverrideInstance(IN OUT PCI_IO_DEVICE *PciIoDevice)
VOID InitializePciIoInstance(IN PCI_IO_DEVICE *PciIoDevice)
EFI_STATUS ProcessOpRomImage(IN PCI_IO_DEVICE *PciDevice, IN BOOLEAN NativeOnly)
VOID InitializePciLoadFile2(IN PCI_IO_DEVICE *PciIoDevice)
BOOLEAN ContainEfiImage(IN VOID *RomImage, IN UINT64 RomSize)
VOID PciRomAddImageMapping(IN EFI_HANDLE ImageHandle, IN UINTN Seg, IN UINT8 Bus, IN UINT8 Dev, IN UINT8 Func, IN VOID *RomImage, IN UINT64 RomSize)
EFI_HANDLE DriverBindingHandle
EFI_PCI_PLATFORM_GET_PCI_ROM GetPciRom
EFI_PCI_IO_PROTOCOL_CONFIG Write