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;
|
UINT16 ControlBlockBaseAddr;
|
||||||
UINTN DataSize;
|
UINTN DataSize;
|
||||||
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;
|
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;
|
||||||
|
UINT64 Supports;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Local variables declaration for IdeControllerInit support
|
// Local variables declaration for IdeControllerInit support
|
||||||
@ -297,10 +298,20 @@ IDEBusDriverBindingStart (
|
|||||||
|
|
||||||
Status = PciIo->Attributes (
|
Status = PciIo->Attributes (
|
||||||
PciIo,
|
PciIo,
|
||||||
EfiPciIoAttributeOperationEnable,
|
EfiPciIoAttributeOperationSupported,
|
||||||
EFI_PCI_DEVICE_ENABLE,
|
0,
|
||||||
NULL
|
&Supports
|
||||||
);
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||||
|
Status = PciIo->Attributes (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoAttributeOperationEnable,
|
||||||
|
Supports,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto ErrorExit;
|
goto ErrorExit;
|
||||||
}
|
}
|
||||||
@ -835,6 +846,7 @@ IDEBusDriverBindingStop (
|
|||||||
BOOLEAN AllChildrenStopped;
|
BOOLEAN AllChildrenStopped;
|
||||||
UINTN Index;
|
UINTN Index;
|
||||||
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;
|
IDE_BUS_DRIVER_PRIVATE_DATA *IdeBusDriverPrivateData;
|
||||||
|
UINT64 Supports;
|
||||||
|
|
||||||
IdeBusDriverPrivateData = NULL;
|
IdeBusDriverPrivateData = NULL;
|
||||||
|
|
||||||
@ -849,12 +861,21 @@ IDEBusDriverBindingStop (
|
|||||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
PciIo->Attributes (
|
Status = PciIo->Attributes (
|
||||||
PciIo,
|
PciIo,
|
||||||
EfiPciIoAttributeOperationDisable,
|
EfiPciIoAttributeOperationSupported,
|
||||||
EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO | EFI_PCI_DEVICE_ENABLE,
|
0,
|
||||||
NULL
|
&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 (
|
gBS->OpenProtocol (
|
||||||
|
@ -1462,19 +1462,21 @@ Returns:
|
|||||||
}
|
}
|
||||||
//
|
//
|
||||||
// Just a trick for ENABLE attribute
|
// 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) {
|
// if ((Attributes & EFI_PCI_DEVICE_ENABLE) == EFI_PCI_DEVICE_ENABLE) {
|
||||||
Attributes &= (PciIoDevice->Supports);
|
// Attributes &= (PciIoDevice->Supports);
|
||||||
|
//
|
||||||
//
|
// //
|
||||||
// Raise the EFI_P_PC_ENABLE Status code
|
// // Raise the EFI_P_PC_ENABLE Status code
|
||||||
//
|
// //
|
||||||
REPORT_STATUS_CODE_WITH_DEVICE_PATH (
|
// REPORT_STATUS_CODE_WITH_DEVICE_PATH (
|
||||||
EFI_PROGRESS_CODE,
|
// EFI_PROGRESS_CODE,
|
||||||
EFI_IO_BUS_PCI | EFI_P_PC_ENABLE,
|
// EFI_IO_BUS_PCI | EFI_P_PC_ENABLE,
|
||||||
PciIoDevice->DevicePath
|
// PciIoDevice->DevicePath
|
||||||
);
|
// );
|
||||||
}
|
// }
|
||||||
|
|
||||||
//
|
//
|
||||||
// If no attributes can be supported, then return.
|
// If no attributes can be supported, then return.
|
||||||
|
@ -1491,6 +1491,7 @@ EhcDriverBindingStart (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
USB2_HC_DEV *Ehc;
|
USB2_HC_DEV *Ehc;
|
||||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||||
|
UINT64 Supports;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open the PciIo Protocol, then enable the USB host controller
|
// Open the PciIo Protocol, then enable the USB host controller
|
||||||
@ -1511,10 +1512,19 @@ EhcDriverBindingStart (
|
|||||||
|
|
||||||
Status = PciIo->Attributes (
|
Status = PciIo->Attributes (
|
||||||
PciIo,
|
PciIo,
|
||||||
EfiPciIoAttributeOperationEnable,
|
EfiPciIoAttributeOperationSupported,
|
||||||
EFI_PCI_DEVICE_ENABLE,
|
0,
|
||||||
NULL
|
&Supports
|
||||||
);
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||||
|
Status = PciIo->Attributes (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoAttributeOperationEnable,
|
||||||
|
Supports,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
EHC_ERROR (("EhcDriverBindingStart: failed to enable controller\n"));
|
EHC_ERROR (("EhcDriverBindingStart: failed to enable controller\n"));
|
||||||
@ -1643,6 +1653,7 @@ EhcDriverBindingStop (
|
|||||||
EFI_USB2_HC_PROTOCOL *Usb2Hc;
|
EFI_USB2_HC_PROTOCOL *Usb2Hc;
|
||||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||||
USB2_HC_DEV *Ehc;
|
USB2_HC_DEV *Ehc;
|
||||||
|
UINT64 Supports;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Test whether the Controller handler passed in is a valid
|
// Test whether the Controller handler passed in is a valid
|
||||||
@ -1695,12 +1706,21 @@ EhcDriverBindingStop (
|
|||||||
//
|
//
|
||||||
// Disable the USB Host Controller
|
// Disable the USB Host Controller
|
||||||
//
|
//
|
||||||
PciIo->Attributes (
|
Status = PciIo->Attributes (
|
||||||
PciIo,
|
PciIo,
|
||||||
EfiPciIoAttributeOperationDisable,
|
EfiPciIoAttributeOperationSupported,
|
||||||
EFI_PCI_DEVICE_ENABLE,
|
0,
|
||||||
NULL
|
&Supports
|
||||||
);
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||||
|
Status = PciIo->Attributes (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoAttributeOperationDisable,
|
||||||
|
Supports,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
gBS->CloseProtocol (
|
gBS->CloseProtocol (
|
||||||
Controller,
|
Controller,
|
||||||
@ -1710,7 +1730,7 @@ EhcDriverBindingStop (
|
|||||||
);
|
);
|
||||||
|
|
||||||
gBS->FreePool (Ehc);
|
gBS->FreePool (Ehc);
|
||||||
return Status;
|
return EFI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
EFI_DRIVER_BINDING_PROTOCOL
|
EFI_DRIVER_BINDING_PROTOCOL
|
||||||
|
@ -2068,6 +2068,7 @@ UhciCleanDevUp (
|
|||||||
)
|
)
|
||||||
{
|
{
|
||||||
USB_HC_DEV *Uhc;
|
USB_HC_DEV *Uhc;
|
||||||
|
UINT64 Supports;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Uninstall the USB_HC and USB_HC2 protocol, then disable the controller
|
// Uninstall the USB_HC and USB_HC2 protocol, then disable the controller
|
||||||
@ -2089,11 +2090,18 @@ UhciCleanDevUp (
|
|||||||
|
|
||||||
UhciFreeAllAsyncReq (Uhc);
|
UhciFreeAllAsyncReq (Uhc);
|
||||||
UhciDestoryFrameList (Uhc);
|
UhciDestoryFrameList (Uhc);
|
||||||
|
|
||||||
|
Uhc->PciIo->Attributes (
|
||||||
|
Uhc->PciIo,
|
||||||
|
EfiPciIoAttributeOperationSupported,
|
||||||
|
0,
|
||||||
|
&Supports
|
||||||
|
);
|
||||||
|
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||||
Uhc->PciIo->Attributes (
|
Uhc->PciIo->Attributes (
|
||||||
Uhc->PciIo,
|
Uhc->PciIo,
|
||||||
EfiPciIoAttributeOperationDisable,
|
EfiPciIoAttributeOperationDisable,
|
||||||
EFI_PCI_DEVICE_ENABLE,
|
Supports,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -2126,6 +2134,7 @@ UhciDriverBindingStart (
|
|||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||||
USB_HC_DEV *Uhc;
|
USB_HC_DEV *Uhc;
|
||||||
|
UINT64 Supports;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Open PCIIO, then enable the EHC device and turn off emulation
|
// Open PCIIO, then enable the EHC device and turn off emulation
|
||||||
@ -2148,10 +2157,19 @@ UhciDriverBindingStart (
|
|||||||
|
|
||||||
Status = PciIo->Attributes (
|
Status = PciIo->Attributes (
|
||||||
PciIo,
|
PciIo,
|
||||||
EfiPciIoAttributeOperationEnable,
|
EfiPciIoAttributeOperationSupported,
|
||||||
EFI_PCI_DEVICE_ENABLE,
|
0,
|
||||||
NULL
|
&Supports
|
||||||
);
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||||
|
Status = PciIo->Attributes (
|
||||||
|
PciIo,
|
||||||
|
EfiPciIoAttributeOperationEnable,
|
||||||
|
Supports,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto CLOSE_PCIIO;
|
goto CLOSE_PCIIO;
|
||||||
|
@ -287,6 +287,7 @@ Returns:
|
|||||||
UINT8 *TmpPxePointer;
|
UINT8 *TmpPxePointer;
|
||||||
EFI_PCI_IO_PROTOCOL *PciIoFncs;
|
EFI_PCI_IO_PROTOCOL *PciIoFncs;
|
||||||
UINTN Len;
|
UINTN Len;
|
||||||
|
UINT64 Supports;
|
||||||
|
|
||||||
Status = gBS->OpenProtocol (
|
Status = gBS->OpenProtocol (
|
||||||
Controller,
|
Controller,
|
||||||
@ -380,10 +381,19 @@ Returns:
|
|||||||
|
|
||||||
Status = PciIoFncs->Attributes (
|
Status = PciIoFncs->Attributes (
|
||||||
PciIoFncs,
|
PciIoFncs,
|
||||||
EfiPciIoAttributeOperationEnable,
|
EfiPciIoAttributeOperationSupported,
|
||||||
EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER,
|
0,
|
||||||
NULL
|
&Supports
|
||||||
);
|
);
|
||||||
|
if (!EFI_ERROR (Status)) {
|
||||||
|
Supports &= EFI_PCI_DEVICE_ENABLE;
|
||||||
|
Status = PciIoFncs->Attributes (
|
||||||
|
PciIoFncs,
|
||||||
|
EfiPciIoAttributeOperationEnable,
|
||||||
|
Supports,
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
}
|
||||||
//
|
//
|
||||||
// Read all the registers from device's PCI Configuration space
|
// Read all the registers from device's PCI Configuration space
|
||||||
//
|
//
|
||||||
|
@ -1232,7 +1232,7 @@ Returns:
|
|||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
mBdsImageHandle,
|
mBdsImageHandle,
|
||||||
&gEfiLoadedImageProtocolGuid,
|
&gEfiLoadedImageProtocolGuid,
|
||||||
&LoadedImage
|
(VOID **) &LoadedImage
|
||||||
);
|
);
|
||||||
if (!EFI_ERROR (Status)) {
|
if (!EFI_ERROR (Status)) {
|
||||||
Status = gBS->HandleProtocol (
|
Status = gBS->HandleProtocol (
|
||||||
|
Reference in New Issue
Block a user