EFI_STATUS PciEnumeratorLight ( IN EFI_HANDLE Controller ) /*++ Routine Description: This routine is used to enumerate entire pci bus system in a given platform Arguments: Returns: None --*/ { EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; PCI_IO_DEVICE *RootBridgeDev; UINT16 MinBus; UINT16 MaxBus; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Descriptors; MinBus = 0; MaxBus = PCI_MAX_BUS; Descriptors = NULL; // // If this host bridge has been already enumerated, then return successfully // if (RootBridgeExisted (Controller)) { return EFI_SUCCESS; } // // Open the IO Abstraction(s) needed to perform the supported test // Status = gBS->OpenProtocol ( Controller , &gEfiDevicePathProtocolGuid, (VOID **)&ParentDevicePath, gPciBusDriverBinding.DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { return Status; } // // Open pci root bridge io protocol // Status = gBS->OpenProtocol ( Controller, &gEfiPciRootBridgeIoProtocolGuid, (VOID **) &PciRootBridgeIo, gPciBusDriverBinding.DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_BY_DRIVER ); if (EFI_ERROR (Status) && Status != EFI_ALREADY_STARTED) { return Status; } // // Load all EFI Drivers from all PCI Option ROMs behind the PCI Root Bridge // Status = PciRomLoadEfiDriversFromOptionRomTable (&gPciBusDriverBinding, PciRootBridgeIo); Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Descriptors); if (EFI_ERROR (Status)) { return Status; } while (PciGetBusRange (&Descriptors, &MinBus, &MaxBus, NULL) == EFI_SUCCESS) { // // Create a device node for root bridge device with a NULL host bridge controller handle // RootBridgeDev = CreateRootBridge (Controller); // // Record the root bridge device path // RootBridgeDev->DevicePath = ParentDevicePath; // // Record the root bridge io protocol // RootBridgeDev->PciRootBridgeIo = PciRootBridgeIo; Status = PciPciDeviceInfoCollector ( RootBridgeDev, (UINT8) MinBus ); if (!EFI_ERROR (Status)) { // // If successfully, insert the node into device pool // InsertRootBridge (RootBridgeDev); } else { // // If unsuccessly, destroy the entire node // DestroyRootBridge (RootBridgeDev); } Descriptors++; } return EFI_SUCCESS; }
VOID EFIAPI SEnvPciRootBridgeIo ( IN EFI_HANDLE h, IN VOID *Interface ) /*++ Routine Description: Arguments: h - An EFI handle Interface - The interface Returns: --*/ { EFI_STATUS Status; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Configuration; UINT64 Supports; UINT64 Attributes; PciRootBridgeIo = Interface; // // Dump PciRootBridgeIo Info // Print (L"\n"); PrintToken (STRING_TOKEN (STR_SHELLENV_DPROT_PARENTHANDLE), HiiEnvHandle, PciRootBridgeIo->ParentHandle); PrintToken (STRING_TOKEN (STR_SHELLENV_DPROT_SEGMENT), HiiEnvHandle, PciRootBridgeIo->SegmentNumber); Status = PciRootBridgeIo->GetAttributes (PciRootBridgeIo, &Supports, &Attributes); if (!EFI_ERROR (Status)) { PrintToken (STRING_TOKEN (STR_SHELLENV_DPROT_ATTRIBUTES), HiiEnvHandle, Attributes); PrintToken (STRING_TOKEN (STR_SHELLENV_DPROT_SUPPORTS), HiiEnvHandle, Supports); } Configuration = NULL; Status = PciRootBridgeIo->Configuration (PciRootBridgeIo, (VOID **) &Configuration); if (!EFI_ERROR (Status) && (Configuration != NULL)) { Print (L"\n"); PrintToken (STRING_TOKEN (STR_SHELLENV_DPROT_TYPE_FLAG), HiiEnvHandle); Print (L" ==== ==== ================ ================ ===="); while (Configuration->Desc == ACPI_ADDRESS_SPACE_DESCRIPTOR) { Print (L"\n"); switch (Configuration->ResType) { case ACPI_ADDRESS_SPACE_TYPE_MEM: Print (L" MEM : "); break; case ACPI_ADDRESS_SPACE_TYPE_IO: Print (L" I/O : "); break; case ACPI_ADDRESS_SPACE_TYPE_BUS: PrintToken (STRING_TOKEN (STR_SHELLENV_DPROT_BUS), HiiEnvHandle); break; } PrintToken ( STRING_TOKEN (STR_SHELLENV_DPROT_FOUR_VARS), HiiEnvHandle, Configuration->SpecificFlag, Configuration->AddrRangeMin, Configuration->AddrRangeMax, Configuration->AddrSpaceGranularity ); Configuration++; } } }