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:
lgao4
2007-10-15 07:44:27 +00:00
parent c8c6d794df
commit 96f6af14d6
6 changed files with 111 additions and 40 deletions

View File

@ -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 (

View File

@ -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.

View File

@ -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

View File

@ -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;

View File

@ -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
// //

View File

@ -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 (