/** Start this driver on ControllerHandle and enumerate Pci bus and start all device under PCI bus. @param This Protocol instance pointer. @param Controller Handle of device to bind driver to. @param RemainingDevicePath Optional parameter use to pick a specific child device to start. @retval EFI_SUCCESS This driver is added to ControllerHandle. @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle. @retval other This driver does not support this device. **/ EFI_STATUS EFIAPI PciBusDriverBindingStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *PciRootBridgeIo; // // Initialize PciRootBridgeIo to suppress incorrect compiler warning. // PciRootBridgeIo = NULL; // // Check RemainingDevicePath validation // if (RemainingDevicePath != NULL) { // // Check if RemainingDevicePath is the End of Device Path Node, // if yes, return EFI_SUCCESS // if (IsDevicePathEnd (RemainingDevicePath)) { return EFI_SUCCESS; } } gBS->LocateProtocol ( &gEfiIncompatiblePciDeviceSupportProtocolGuid, NULL, (VOID **) &gIncompatiblePciDeviceSupport ); // // If PCI Platform protocol is available, get it now. // If the platform implements this, it must be installed before BDS phase // gPciPlatformProtocol = NULL; gBS->LocateProtocol ( &gEfiPciPlatformProtocolGuid, NULL, (VOID **) &gPciPlatformProtocol ); // // If PCI Platform protocol doesn't exist, try to Pci Override Protocol. // if (gPciPlatformProtocol == NULL) { gPciOverrideProtocol = NULL; gBS->LocateProtocol ( &gEfiPciOverrideProtocolGuid, NULL, (VOID **) &gPciOverrideProtocol ); } if (mIoMmuProtocol == NULL) { gBS->LocateProtocol ( &gEdkiiIoMmuProtocolGuid, NULL, (VOID **) &mIoMmuProtocol ); } if (PcdGetBool (PcdPciDisableBusEnumeration)) { gFullEnumeration = FALSE; } else { gFullEnumeration = (BOOLEAN) ((SearchHostBridgeHandle (Controller) ? FALSE : TRUE)); } // // Open Device Path Protocol for PCI root bridge // Status = gBS->OpenProtocol ( Controller, &gEfiDevicePathProtocolGuid, (VOID **) &ParentDevicePath, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); ASSERT_EFI_ERROR (Status); // // Report Status Code to indicate PCI bus starts // REPORT_STATUS_CODE_WITH_DEVICE_PATH ( EFI_PROGRESS_CODE, (EFI_IO_BUS_PCI | EFI_IOB_PC_INIT), ParentDevicePath ); Status = EFI_SUCCESS; // // Enumerate the entire host bridge // After enumeration, a database that records all the device information will be created // // if (gFullEnumeration) { // // Get the rootbridge Io protocol to find the host bridge handle // Status = gBS->OpenProtocol ( Controller, &gEfiPciRootBridgeIoProtocolGuid, (VOID **) &PciRootBridgeIo, gPciBusDriverBinding.DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); if (!EFI_ERROR (Status)) { Status = PciEnumerator (Controller, PciRootBridgeIo->ParentHandle); } } else { // // If PCI bus has already done the full enumeration, never do it again // Status = PciEnumeratorLight (Controller); } if (EFI_ERROR (Status)) { return Status; } // // Start all the devices under the entire host bridge. // StartPciDevices (Controller); if (gFullEnumeration) { gFullEnumeration = FALSE; Status = gBS->InstallProtocolInterface ( &PciRootBridgeIo->ParentHandle, &gEfiPciEnumerationCompleteProtocolGuid, EFI_NATIVE_INTERFACE, NULL ); ASSERT_EFI_ERROR (Status); } return Status; }
EFI_STATUS EFIAPI PciBusDriverBindingStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) /*++ Routine Description: Start to management the controller passed in Arguments: IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath Returns: --*/ { EFI_STATUS Status; Status = gBS->LocateProtocol ( &gEfiIncompatiblePciDeviceSupportProtocolGuid, NULL, (VOID **) &gEfiIncompatiblePciDeviceSupport ); // // If PCI Platform protocol is available, get it now. // If the platform implements this, it must be installed before BDS phase // gPciPlatformProtocol = NULL; gBS->LocateProtocol ( &gEfiPciPlatformProtocolGuid, NULL, (VOID **) &gPciPlatformProtocol ); gFullEnumeration = (BOOLEAN) ((SearchHostBridgeHandle (Controller) ? FALSE : TRUE)); // // Enumerate the entire host bridge // After enumeration, a database that records all the device information will be created // // Status = PciEnumerator (Controller); if (EFI_ERROR (Status)) { return Status; } // // Start all the devices under the entire host bridge. // StartPciDevices (Controller); return EFI_SUCCESS; }
/** Start this driver on ControllerHandle and enumerate Pci bus and start all device under PCI bus. @param This Protocol instance pointer. @param Controller Handle of device to bind driver to. @param RemainingDevicePath Optional parameter use to pick a specific child. device to start. @retval EFI_SUCCESS This driver is added to ControllerHandle. @retval EFI_ALREADY_STARTED This driver is already running on ControllerHandle. @retval other This driver does not support this device. **/ EFI_STATUS EFIAPI PciBusDriverBindingStart ( IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_HANDLE Controller, IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath ) { EFI_STATUS Status; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; // // Check RemainingDevicePath validation // if (RemainingDevicePath != NULL) { // // Check if RemainingDevicePath is the End of Device Path Node, // if yes, return EFI_SUCCESS // if (IsDevicePathEnd (RemainingDevicePath)) { return EFI_SUCCESS; } } Status = gBS->LocateProtocol ( &gEfiIncompatiblePciDeviceSupportProtocolGuid, NULL, (VOID **) &gEfiIncompatiblePciDeviceSupport ); // // If PCI Platform protocol is available, get it now. // If the platform implements this, it must be installed before BDS phase // gPciPlatformProtocol = NULL; gBS->LocateProtocol ( &gEfiPciPlatformProtocolGuid, NULL, (VOID **) &gPciPlatformProtocol ); // // If PCI Platform protocol doesn't exist, try to Pci Override Protocol. // if (gPciPlatformProtocol == NULL) { gPciOverrideProtocol = NULL; gBS->LocateProtocol ( &gEfiPciOverrideProtocolGuid, NULL, (VOID **) &gPciOverrideProtocol ); } if (PcdGetBool (PcdPciDisableBusEnumeration)) { gFullEnumeration = FALSE; } else { gFullEnumeration = (BOOLEAN) ((SearchHostBridgeHandle (Controller) ? FALSE : TRUE)); } // // Open Device Path Protocol for PCI root bridge // Status = gBS->OpenProtocol ( Controller, &gEfiDevicePathProtocolGuid, (VOID **) &ParentDevicePath, This->DriverBindingHandle, Controller, EFI_OPEN_PROTOCOL_GET_PROTOCOL ); ASSERT_EFI_ERROR (Status); // // Report Status Code to indicate PCI bus starts // REPORT_STATUS_CODE_WITH_DEVICE_PATH ( EFI_PROGRESS_CODE, (EFI_IO_BUS_PCI | EFI_IOB_PC_INIT), ParentDevicePath ); // // Enumerate the entire host bridge // After enumeration, a database that records all the device information will be created // // Status = PciEnumerator (Controller); if (EFI_ERROR (Status)) { return Status; } // // Start all the devices under the entire host bridge. // StartPciDevices (Controller); return EFI_SUCCESS; }