Remove the special logic on EFI_PCI_DEVICE_ENABLE in PciBus driver. And update drivers that use this macro. The reason is that
PciIoAttributes() in PciIo.c treats EFI_PCI_DEVICE_ENABLE specially so that when EFI_PCI_DEVICE_ENABLE is passed in, only the supported bits of driver will be enabled. Now many drivers use EFI_PCI_DEVICE_ENABLE to enable PCI device even if some of them don't support some of the attributes like EFI_PCI_IO_ATTRIBUTE_MEMORY. This doesn't conform to UEFI 2.0 spec. git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@4115 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@@ -182,6 +182,7 @@ IDEBusDriverBindingStart (
|
||||
UINT16 ControlBlockBaseAddr;
|
||||
UINTN DataSize;
|
||||
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;
|
||||
UINT64 Supports;
|
||||
|
||||
//
|
||||
// Local variables declaration for IdeControllerInit support
|
||||
@@ -297,10 +298,20 @@ IDEBusDriverBindingStart (
|
||||
|
||||
Status = PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationEnable,
|
||||
EFI_PCI_DEVICE_ENABLE,
|
||||
NULL
|
||||
EfiPciIoAttributeOperationSupported,
|
||||
0,
|
||||
&Supports
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||
Status = PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationEnable,
|
||||
Supports,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto ErrorExit;
|
||||
}
|
||||
@@ -835,6 +846,7 @@ IDEBusDriverBindingStop (
|
||||
BOOLEAN AllChildrenStopped;
|
||||
UINTN Index;
|
||||
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;
|
||||
UINT64 Supports;
|
||||
|
||||
IdeBusDriverPrivateData = NULL;
|
||||
|
||||
@@ -849,12 +861,21 @@ IDEBusDriverBindingStop (
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationDisable,
|
||||
EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO | EFI_PCI_DEVICE_ENABLE,
|
||||
NULL
|
||||
);
|
||||
Status = PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationSupported,
|
||||
0,
|
||||
&Supports
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Supports &= EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO | EFI_PCI_DEVICE_ENABLE;
|
||||
PciIo->Attributes (
|
||||
PciIo,
|
||||
EfiPciIoAttributeOperationDisable,
|
||||
Supports,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
gBS->OpenProtocol (
|
||||
|
@@ -1462,19 +1462,21 @@ Returns:
|
||||
}
|
||||
//
|
||||
// Just a trick for ENABLE attribute
|
||||
// EFI_PCI_DEVICE_ENABLE is not defined in UEFI spec, which is the internal usage.
|
||||
// So, this logic doesn't confrom to UEFI spec, which should be removed.
|
||||
//
|
||||
if ((Attributes & EFI_PCI_DEVICE_ENABLE) == EFI_PCI_DEVICE_ENABLE) {
|
||||
Attributes &= (PciIoDevice->Supports);
|
||||
|
||||
//
|
||||
// Raise the EFI_P_PC_ENABLE Status code
|
||||
//
|
||||
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
|
||||
EFI_PROGRESS_CODE,
|
||||
EFI_IO_BUS_PCI | EFI_P_PC_ENABLE,
|
||||
PciIoDevice->DevicePath
|
||||
);
|
||||
}
|
||||
// if ((Attributes & EFI_PCI_DEVICE_ENABLE) == EFI_PCI_DEVICE_ENABLE) {
|
||||
// Attributes &= (PciIoDevice->Supports);
|
||||
//
|
||||
// //
|
||||
// // Raise the EFI_P_PC_ENABLE Status code
|
||||
// //
|
||||
// REPORT_STATUS_CODE_WITH_DEVICE_PATH (
|
||||
// EFI_PROGRESS_CODE,
|
||||
// EFI_IO_BUS_PCI | EFI_P_PC_ENABLE,
|
||||
// PciIoDevice->DevicePath
|
||||
// );
|
||||
// }
|
||||
|
||||
//
|
||||
// If no attributes can be supported, then return.
|
||||
|
Reference in New Issue
Block a user