isabus.c
来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· C语言 代码 · 共 707 行 · 第 1/2 页
C
707 行
);
//
// Create each ISA device handle in this ISA bus
//
IsaDevice = NULL;
do {
Status = IsaAcpi->DeviceEnumerate (IsaAcpi, &IsaDevice);
if (EFI_ERROR (Status)) {
break;
}
//
// Get current resource of this ISA device
//
ResourceList = NULL;
Status = IsaAcpi->GetCurResource (IsaAcpi, IsaDevice, &ResourceList);
if (EFI_ERROR (Status)) {
continue;
}
//
// Create handle for this ISA device
//
Status = IsaCreateDevice (
This,
Controller,
PciIo,
ParentDevicePath,
ResourceList,
&AllocFailExtendedData.DevicePath
);
if (EFI_ERROR (Status)) {
continue;
}
//
// Initialize ISA device
//
IsaAcpi->InitDevice (IsaAcpi, IsaDevice);
//
// Set resources for this ISA device
//
Status = IsaAcpi->SetResource (IsaAcpi, IsaDevice, ResourceList);
//
// Report Status Code here when failed to resource conflicts
//
if (EFI_ERROR (Status) && (Status != EFI_UNSUPPORTED)) {
//
// It's hard to tell which resource conflicts
//
AllocFailExtendedData.Bar = 0;
AllocFailExtendedData.ReqRes = NULL;
AllocFailExtendedData.AllocRes = NULL;
EfiLibReportStatusCode (
EFI_ERROR_CODE,
(EFI_IO_BUS_LPC | EFI_IOB_EC_RESOURCE_CONFLICT),
0,
&gEfiCallerIdGuid,
(EFI_STATUS_CODE_DATA *) &AllocFailExtendedData
);
}
//
// Set power for this ISA device
//
IsaAcpi->SetPower (IsaAcpi, IsaDevice, TRUE);
//
// Enable this ISA device
//
IsaAcpi->EnableDevice (IsaAcpi, IsaDevice, TRUE);
} while (TRUE);
return EFI_SUCCESS;
}
EFI_STATUS
EFIAPI
IsaBusControllerDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL * This,
IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren,
IN EFI_HANDLE * ChildHandleBuffer OPTIONAL
)
/*++
Routine Description:
This function tells the ISA Bus Driver to stop managing a PCI to ISA
Bridge controller.
Arguments:
This - The EFI_DRIVER_BINDING_PROTOCOL instance.
Controller - A handle to the device being stopped.
NumberOfChindren - The number of child device handles in ChildHandleBuffer.
ChildHandleBuffer - An array of child handles to be freed.
Returns:
EFI_SUCCESS - The device was stopped.
EFI_DEVICE_ERROR - The device could not be stopped due to a device error.
EFI_NOT_STARTED - The device has not been started.
EFI_INVALID_PARAMETER - One of the parameters has an invalid value.
EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of
resources.
--*/
{
EFI_STATUS Status;
UINTN Index;
BOOLEAN AllChildrenStopped;
ISA_IO_DEVICE *IsaIoDevice;
EFI_INTERFACE_DEFINITION_FOR_ISA_IO *IsaIo;
if (NumberOfChildren == 0) {
//
// Close the bus driver
//
Status = gBS->CloseProtocol (
Controller,
&gEfiPciIoProtocolGuid,
This->DriverBindingHandle,
Controller
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->CloseProtocol (
Controller,
&gEfiDevicePathProtocolGuid,
This->DriverBindingHandle,
Controller
);
if (EFI_ERROR (Status)) {
return Status;
}
Status = gBS->CloseProtocol (
Controller,
&gEfiIsaAcpiProtocolGuid,
This->DriverBindingHandle,
Controller
);
if (EFI_ERROR (Status)) {
return Status;
}
return EFI_SUCCESS;
}
//
// Complete all outstanding transactions to Controller.
// Don't allow any new transaction to Controller to be started.
//
//
// Stop all the children
// Find all the ISA devices that were discovered on this PCI to ISA Bridge
// with the Start() function.
//
AllChildrenStopped = TRUE;
for (Index = 0; Index < NumberOfChildren; Index++) {
Status = gBS->OpenProtocol (
ChildHandleBuffer[Index],
EFI_ISA_IO_PROTOCOL_VERSION,
(VOID **) &IsaIo,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (!EFI_ERROR (Status)) {
IsaIoDevice = ISA_IO_DEVICE_FROM_ISA_IO_THIS (IsaIo);
Status = gBS->UninstallMultipleProtocolInterfaces (
ChildHandleBuffer[Index],
&gEfiDevicePathProtocolGuid,
IsaIoDevice->DevicePath,
EFI_ISA_IO_PROTOCOL_VERSION,
&IsaIoDevice->IsaIo,
NULL
);
if (!EFI_ERROR (Status)) {
//
// Close the child handle
//
Status = gBS->CloseProtocol (
Controller,
&gEfiPciIoProtocolGuid,
This->DriverBindingHandle,
ChildHandleBuffer[Index]
);
gBS->FreePool (IsaIoDevice->DevicePath);
gBS->FreePool (IsaIoDevice);
}
}
if (EFI_ERROR (Status)) {
AllChildrenStopped = FALSE;
}
}
if (!AllChildrenStopped) {
return EFI_DEVICE_ERROR;
}
//
// Report Status Code here
//
EfiLibReportStatusCode (
EFI_PROGRESS_CODE,
(EFI_IO_BUS_LPC | EFI_IOB_PC_DISABLE),
0,
&gEfiCallerIdGuid,
NULL
);
return EFI_SUCCESS;
}
//
// Internal Function
//
EFI_STATUS
IsaCreateDevice (
IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller,
IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath,
IN EFI_ISA_ACPI_RESOURCE_LIST *IsaDeviceResourceList,
OUT EFI_DEVICE_PATH_PROTOCOL **ChildDevicePath
)
/*++
Routine Description:
Create ISA device found by IsaPnpProtocol
Arguments:
This - The EFI_DRIVER_BINDING_PROTOCOL instance.
Controller - The handle of ISA bus controller(PCI to ISA bridge)
PciIo - The Pointer to the PCI protocol
ParentDevicePath - Device path of the ISA bus controller
IsaDeviceResourceList - The resource list of the ISA device
ChildDevicePath - The pointer to the child device.
Returns:
EFI_SUCCESS - Create the child device.
EFI_OUT_OF_RESOURCES - The request could not be completed due to a lack of
resources.
EFI_DEVICE_ERROR - Can not create child device.
--*/
{
EFI_STATUS Status;
ISA_IO_DEVICE *IsaIoDevice;
EFI_DEV_PATH Node;
//
// Initialize the PCI_IO_DEVICE structure
//
IsaIoDevice = EfiLibAllocateZeroPool (sizeof (ISA_IO_DEVICE));
if (IsaIoDevice == NULL) {
return EFI_OUT_OF_RESOURCES;
}
IsaIoDevice->Signature = ISA_IO_DEVICE_SIGNATURE;
IsaIoDevice->Handle = NULL;
IsaIoDevice->PciIo = PciIo;
//
// Initialize the ISA I/O instance structure
//
Status = InitializeIsaIoInstance (IsaIoDevice, IsaDeviceResourceList);
if (EFI_ERROR (Status)) {
gBS->FreePool (IsaIoDevice);
return Status;
}
//
// Build the child device path
//
Node.DevPath.Type = ACPI_DEVICE_PATH;
Node.DevPath.SubType = ACPI_DP;
SetDevicePathNodeLength (&Node.DevPath, sizeof (ACPI_HID_DEVICE_PATH));
Node.Acpi.HID = IsaDeviceResourceList->Device.HID;
Node.Acpi.UID = IsaDeviceResourceList->Device.UID;
IsaIoDevice->DevicePath = EfiAppendDevicePathNode (
ParentDevicePath,
&Node.DevPath
);
if (IsaIoDevice->DevicePath == NULL) {
Status = EFI_DEVICE_ERROR;
goto Done;
}
*ChildDevicePath = IsaIoDevice->DevicePath;
//
// Create a child handle and attach the DevicePath,
// PCI I/O, and Controller State
//
Status = gBS->InstallMultipleProtocolInterfaces (
&IsaIoDevice->Handle,
&gEfiDevicePathProtocolGuid,
IsaIoDevice->DevicePath,
EFI_ISA_IO_PROTOCOL_VERSION,
&IsaIoDevice->IsaIo,
NULL
);
if (EFI_ERROR (Status)) {
goto Done;
}
Status = gBS->OpenProtocol (
Controller,
&gEfiPciIoProtocolGuid,
(VOID **) &PciIo,
This->DriverBindingHandle,
IsaIoDevice->Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
);
if (EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces (
IsaIoDevice->Handle,
&gEfiDevicePathProtocolGuid,
IsaIoDevice->DevicePath,
EFI_ISA_IO_PROTOCOL_VERSION,
&IsaIoDevice->IsaIo,
NULL
);
}
Done:
if (EFI_ERROR (Status)) {
if (IsaIoDevice->DevicePath != NULL) {
gBS->FreePool (IsaIoDevice->DevicePath);
}
gBS->FreePool (IsaIoDevice);
}
return Status;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?