From e0ee9d9314c7c2816b89908a1fac871c911f1cb0 Mon Sep 17 00:00:00 2001 From: rsun3 Date: Tue, 28 Dec 2010 10:10:10 +0000 Subject: [PATCH] =?utf8?q?Clean=20ISA=5FIO/ISA=5FIO=5F16=20and=20VGA=5FIO/?= =?utf8?q?VGA=5FIO=5F16=20attribute=20usage=20in=20PCI=20bus=20driver/PCI?= =?utf8?q?=20host=20bridge=20drivers/LPC/VGA=20device=20drivers.=201.=20Fi?= =?utf8?q?x=20the=20incorrect=20definition=20of=20EFI=5FPCI=5FIO=5FATTRIBU?= =?utf8?q?TE=5FVGA=5FIO=5F16=20(does=20not=20conform=20to=20the=20UEFI=20s?= =?utf8?q?pec)=20in=20PciIo.h.=202.=20Add=20missing=20definitions=20of=20I?= =?utf8?q?SA=20and=20VGA=20IO=20attributes=20in=20PCI=20Root=20Bridge=20IO?= =?utf8?q?=20protocol.=203.=20Improve=20the=20algorithm=20in=20the=20PCI?= =?utf8?q?=20bus=20driver=20to=20get=20PCI=20platform=20policy=20from=20PC?= =?utf8?q?I=20Platform=20Protocol=20and=20PCI=20Override=20Protocol.=204.?= =?utf8?q?=20Update=20the=20PCI=20bus=20driver=20to=20use=20the=20PCI=20pl?= =?utf8?q?atform=20policy=20to=20determine=20the=20supported=20attributes?= =?utf8?q?=20that=20are=20returned=20by=20the=20EFI=5FPCI=5FIO=5FPROTOCOL.?= =?utf8?q?Attributes()=20function.=20This=20is=20required=20by=20the=20PI?= =?utf8?q?=20spec.=205.=20Add=20a=20backward=20compatibility=20workaround?= =?utf8?q?=20for=20PCI=20VGA=20drivers=20in=20Option=20ROM,=20which=20typi?= =?utf8?q?cally=20sets=20VGA=5FIO=20without=20checking=20supported=20attri?= =?utf8?q?butes.=206.=20Update=20the=20PCI=20host=20bridge=20driver=20in?= =?utf8?q?=20PcAtChipsetPkg=20to=20report=20VGA=5FIO=5F16=20and=20ISA=5FIO?= =?utf8?q?=5F16=20instead=20of=20VGA=5FIO/ISA=5FIO=20attributes.=20Modern?= =?utf8?q?=20chipsets=20don=E2=80=99t=20have=20hardware=20capability=20to?= =?utf8?q?=20control=2010-bit=20or=2016-bit=20decoding=20for=20ISA/VGA=20a?= =?utf8?q?liases.=207.=20Update=20LPC/VGA=20device=20drivers=20to=20check?= =?utf8?q?=20supported=20attributes=20of=20VGA=5FIO/VGA=5FIO=5F16=20or=20I?= =?utf8?q?SA=5FIO/ISA=5FIO=5F16.?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@11204 6f19259b-4bc3-4df7-8a09-765794883524 --- MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h | 4 +- .../Bus/Pci/PciBusDxe/PciEnumeratorSupport.c | 18 ++- MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c | 46 ++++--- .../Bus/Pci/PciBusDxe/PciResourceSupport.c | 64 +++++----- MdePkg/Include/Protocol/PciIo.h | 4 +- MdePkg/Include/Protocol/PciRootBridgeIo.h | 5 +- .../CirrusLogic5430Dxe/CirrusLogic5430.c | 32 ++++- PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c | 50 +++++++- .../PciHostBridgeDxe/PciHostBridge.c | 118 ++---------------- .../PciHostBridgeDxe/PciRootBridgeIo.c | 7 +- 10 files changed, 170 insertions(+), 178 deletions(-) diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h index e268014d34..d77982c02a 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciBus.h @@ -309,8 +309,8 @@ extern UINT64 gAllOne; extern UINT64 gAllZero; extern EFI_PCI_PLATFORM_PROTOCOL *gPciPlatformProtocol; extern EFI_PCI_OVERRIDE_PROTOCOL *gPciOverrideProtocol; - - +extern BOOLEAN mReserveIsaAliases; +extern BOOLEAN mReserveVgaAliases; /** Macro that checks whether device is a GFX device. diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c index c8689c0421..2dd5889afc 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciEnumeratorSupport.c @@ -910,9 +910,10 @@ PciSetDeviceAttribute ( EFI_PCI_IO_ATTRIBUTE_EMBEDDED_ROM | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE; - if ((Attributes & EFI_PCI_IO_ATTRIBUTE_IO) != 0) { - Attributes |= EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO; - Attributes |= EFI_PCI_IO_ATTRIBUTE_ISA_IO; + if (IS_PCI_LPC (&PciIoDevice->Pci)) { + Attributes |= EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO; + Attributes |= (mReserveIsaAliases ? EFI_PCI_IO_ATTRIBUTE_ISA_IO : \ + EFI_PCI_IO_ATTRIBUTE_ISA_IO_16); } if (IS_PCI_BRIDGE (&PciIoDevice->Pci) || IS_CARDBUS_BRIDGE (&PciIoDevice->Pci)) { @@ -921,6 +922,14 @@ PciSetDeviceAttribute ( // Attributes |= EFI_PCI_IO_ATTRIBUTE_IDE_SECONDARY_IO; Attributes |= EFI_PCI_IO_ATTRIBUTE_IDE_PRIMARY_IO; + + if (mReserveVgaAliases) { + Attributes &= ~(UINT64)(EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 | \ + EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16); + } else { + Attributes &= ~(UINT64)(EFI_PCI_IO_ATTRIBUTE_VGA_IO | \ + EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO); + } } else { if (IS_PCI_IDE (&PciIoDevice->Pci)) { @@ -930,7 +939,8 @@ PciSetDeviceAttribute ( if (IS_PCI_VGA (&PciIoDevice->Pci)) { Attributes |= EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY; - Attributes |= EFI_PCI_IO_ATTRIBUTE_VGA_IO; + Attributes |= (mReserveVgaAliases ? EFI_PCI_IO_ATTRIBUTE_VGA_IO : \ + EFI_PCI_IO_ATTRIBUTE_VGA_IO_16); } } diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c index c39de9dd7e..5f6d3763e9 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciIo.c @@ -1529,6 +1529,38 @@ PciIoAttributes ( ); } + // + // Check VGA and VGA16, they can not be set at the same time + // + if (((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) != 0 && + (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16) != 0) || + ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) != 0 && + (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16) != 0) || + ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) != 0 && + (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16) != 0) || + ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) != 0 && + (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16) != 0) ) { + return EFI_UNSUPPORTED; + } + + // + // workaround for PCI drivers which always set ISA_IO or VGA_IO attribute without detecting support of + // ISA_IO/ISA_IO_16 or VGA_IO/VGA_IO_16 to maintain backward-compatibility. + // + if (((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) != 0) && + ((PciIoDevice->Supports & (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) \ + == EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) { + Attributes &= ~(UINT64)EFI_PCI_IO_ATTRIBUTE_VGA_IO; + Attributes |= EFI_PCI_IO_ATTRIBUTE_VGA_IO_16; + } + + if (((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) != 0) && + ((PciIoDevice->Supports & (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO | EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) \ + == EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16)) { + Attributes &= ~(UINT64)EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO; + Attributes |= EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16; + } + // // If no attributes can be supported, then return. // Otherwise, set the attributes that it can support. @@ -1549,20 +1581,6 @@ PciIoAttributes ( Command = 0; BridgeControl = 0; - // - // Check VGA and VGA16, they can not be set at the same time - // - if (((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) != 0 && - (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16) != 0) || - ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO) != 0 && - (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16) != 0) || - ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) != 0 && - (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_IO_16) != 0) || - ((Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO) != 0 && - (Attributes & EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16) != 0) ) { - return EFI_UNSUPPORTED; - } - // // For PPB & P2C, set relevant attribute bits // diff --git a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c index cca365370f..6fa4001a62 100644 --- a/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c +++ b/MdeModulePkg/Bus/Pci/PciBusDxe/PciResourceSupport.c @@ -14,6 +14,13 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. #include "PciBus.h" +// +// The default policy for the PCI bus driver is NOT to reserve I/O ranges for both ISA aliases and VGA aliases. +// +BOOLEAN mReserveIsaAliases = FALSE; +BOOLEAN mReserveVgaAliases = FALSE; +BOOLEAN mPolicyDetermined = FALSE; + /** The function is used to skip VGA range. @@ -188,46 +195,37 @@ CalculateApertureIo16 ( LIST_ENTRY *CurrentLink; PCI_RESOURCE_NODE *Node; UINT64 Offset; - BOOLEAN IsaEnable; - BOOLEAN VGAEnable; EFI_PCI_PLATFORM_POLICY PciPolicy; - // - // Always assume there is ISA device and VGA device on the platform - // will be customized later - // - IsaEnable = FALSE; - VGAEnable = FALSE; + if (!mPolicyDetermined) { + // + // Check PciPlatform policy + // + Status = EFI_NOT_FOUND; + PciPolicy = 0; + if (gPciPlatformProtocol != NULL) { + Status = gPciPlatformProtocol->GetPlatformPolicy ( + gPciPlatformProtocol, + &PciPolicy + ); + } - // - // Check PciPlatform policy - // - if (gPciPlatformProtocol != NULL) { - Status = gPciPlatformProtocol->GetPlatformPolicy ( - gPciPlatformProtocol, - &PciPolicy - ); - if (!EFI_ERROR (Status)) { - if ((PciPolicy & EFI_RESERVE_ISA_IO_ALIAS) != 0) { - IsaEnable = TRUE; - } - if ((PciPolicy & EFI_RESERVE_VGA_IO_ALIAS) != 0) { - VGAEnable = TRUE; - } + if (EFI_ERROR (Status) && gPciOverrideProtocol != NULL) { + Status = gPciOverrideProtocol->GetPlatformPolicy ( + gPciOverrideProtocol, + &PciPolicy + ); } - } else if (gPciOverrideProtocol != NULL) { - Status = gPciOverrideProtocol->GetPlatformPolicy ( - gPciOverrideProtocol, - &PciPolicy - ); + if (!EFI_ERROR (Status)) { if ((PciPolicy & EFI_RESERVE_ISA_IO_ALIAS) != 0) { - IsaEnable = TRUE; + mReserveIsaAliases = TRUE; } if ((PciPolicy & EFI_RESERVE_VGA_IO_ALIAS) != 0) { - VGAEnable = TRUE; + mReserveVgaAliases = TRUE; } } + mPolicyDetermined = TRUE; } Aperture = 0; @@ -261,13 +259,13 @@ CalculateApertureIo16 ( // If both of them are enabled, then the IO resource would // become too limited to meet the requirement of most of devices. // - if (IsaEnable || VGAEnable) { + if (mReserveIsaAliases || mReserveVgaAliases) { if (!IS_PCI_BRIDGE (&(Node->PciDev->Pci)) && !IS_CARDBUS_BRIDGE (&(Node->PciDev->Pci))) { // // Check if there is need to support ISA/VGA decoding // If so, we need to avoid isa/vga aliasing range // - if (IsaEnable) { + if (mReserveIsaAliases) { SkipIsaAliasAperture ( &Aperture, Node->Length @@ -276,7 +274,7 @@ CalculateApertureIo16 ( if (Offset != 0) { Aperture = Aperture + (Node->Alignment + 1) - Offset; } - } else if (VGAEnable) { + } else if (mReserveVgaAliases) { SkipVGAAperture ( &Aperture, Node->Length diff --git a/MdePkg/Include/Protocol/PciIo.h b/MdePkg/Include/Protocol/PciIo.h index e1896bf296..6068260be6 100644 --- a/MdePkg/Include/Protocol/PciIo.h +++ b/MdePkg/Include/Protocol/PciIo.h @@ -2,7 +2,7 @@ EFI PCI I/O Protocol provides the basic Memory, I/O, PCI configuration, and DMA interfaces that a driver uses to access its PCI controller. - Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -70,7 +70,7 @@ typedef enum { #define EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 ///< Clear for PCI controllers that can not genrate a DAC #define EFI_PCI_IO_ATTRIBUTE_ISA_IO_16 0x10000 ///< I/O cycles 0x0100-0x03FF or greater (16 bit decode) #define EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 ///< I/O cycles 0x3C6, 0x3C8, 0x3C9 (16 bit decode) -#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x30000 ///< I/O cycles 0x3B0-0x3BB and 0x3C0-0x3DF (16 bit decode) +#define EFI_PCI_IO_ATTRIBUTE_VGA_IO_16 0x40000 ///< I/O cycles 0x3B0-0x3BB and 0x3C0-0x3DF (16 bit decode) #define EFI_PCI_DEVICE_ENABLE (EFI_PCI_IO_ATTRIBUTE_IO | EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER) #define EFI_VGA_DEVICE_ENABLE (EFI_PCI_IO_ATTRIBUTE_VGA_PALETTE_IO | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_IO) diff --git a/MdePkg/Include/Protocol/PciRootBridgeIo.h b/MdePkg/Include/Protocol/PciRootBridgeIo.h index 8c66bed4cc..30645a560e 100644 --- a/MdePkg/Include/Protocol/PciRootBridgeIo.h +++ b/MdePkg/Include/Protocol/PciRootBridgeIo.h @@ -5,7 +5,7 @@ and PCI Configuration cycles on a PCI Root Bridge. It also provides services to perform defferent types of bus mastering DMA. - Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -97,6 +97,9 @@ typedef enum { #define EFI_PCI_ATTRIBUTE_MEMORY_CACHED 0x0800 #define EFI_PCI_ATTRIBUTE_MEMORY_DISABLE 0x1000 #define EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE 0x8000 +#define EFI_PCI_ATTRIBUTE_ISA_IO_16 0x10000 +#define EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16 0x20000 +#define EFI_PCI_ATTRIBUTE_VGA_IO_16 0x40000 #define EFI_PCI_ATTRIBUTE_VALID_FOR_ALLOCATE_BUFFER (EFI_PCI_ATTRIBUTE_MEMORY_WRITE_COMBINE | EFI_PCI_ATTRIBUTE_MEMORY_CACHED | EFI_PCI_ATTRIBUTE_DUAL_ADDRESS_CYCLE) diff --git a/OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430.c b/OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430.c index d5ea4e294d..8b6dfac1fe 100644 --- a/OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430.c +++ b/OptionRomPkg/CirrusLogic5430Dxe/CirrusLogic5430.c @@ -11,7 +11,7 @@ documentation on UGA for details on how to write a UGA driver that is able to function both in the EFI pre-boot environment and from the OS runtime. - Copyright (c) 2006 - 2009, Intel Corporation. All rights reserved.
+ Copyright (c) 2006 - 2010, Intel Corporation. All rights reserved.
This program and the accompanying materials are licensed and made available under the terms and conditions of the BSD License which accompanies this distribution. The full text of the license may be found at @@ -233,6 +233,7 @@ CirrusLogic5430ControllerDriverStart ( BOOLEAN PciAttributesSaved; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; ACPI_ADR_DEVICE_PATH AcpiDeviceNode; + UINT64 Supports; PciAttributesSaved = FALSE; // @@ -265,6 +266,25 @@ CirrusLogic5430ControllerDriverStart ( goto Error; } + // + // Get supported PCI attributes + // + Status = Private->PciIo->Attributes ( + Private->PciIo, + EfiPciIoAttributeOperationSupported, + 0, + &Supports + ); + if (EFI_ERROR (Status)) { + goto Error; + } + + Supports &= (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16); + if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_VGA_IO | EFI_PCI_IO_ATTRIBUTE_VGA_IO_16)) { + Status = EFI_UNSUPPORTED; + goto Error; + } + // // Save original PCI attributes // @@ -281,11 +301,11 @@ CirrusLogic5430ControllerDriverStart ( PciAttributesSaved = TRUE; Status = Private->PciIo->Attributes ( - Private->PciIo, - EfiPciIoAttributeOperationEnable, - EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | EFI_PCI_IO_ATTRIBUTE_VGA_IO, - NULL - ); + Private->PciIo, + EfiPciIoAttributeOperationEnable, + EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY | Supports, + NULL + ); if (EFI_ERROR (Status)) { goto Error; } diff --git a/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c b/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c index 8e6d8b7f82..ea1180f3ab 100644 --- a/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c +++ b/PcAtChipsetPkg/IsaAcpiDxe/PcatIsaAcpi.c @@ -171,7 +171,11 @@ PcatIsaAcpiDriverBindingStart ( EFI_STATUS Status; EFI_PCI_IO_PROTOCOL *PciIo; PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev; - + UINT64 Supports; + BOOLEAN Enabled; + + Enabled = FALSE; + Supports = 0; PcatIsaAcpiDev = NULL; // // Open the PCI I/O Protocol Interface @@ -189,10 +193,30 @@ PcatIsaAcpiDriverBindingStart ( goto Done; } + // + // Get supported PCI attributes + // + Status = PciIo->Attributes ( + PciIo, + EfiPciIoAttributeOperationSupported, + 0, + &Supports + ); + if (EFI_ERROR (Status)) { + goto Done; + } + + Supports &= (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16); + if (Supports == 0 || Supports == (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16)) { + Status = EFI_UNSUPPORTED; + goto Done; + } + + Enabled = TRUE; Status = PciIo->Attributes ( PciIo, EfiPciIoAttributeOperationEnable, - EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, + EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, NULL ); if (EFI_ERROR (Status)) { @@ -242,11 +266,11 @@ PcatIsaAcpiDriverBindingStart ( Done: if (EFI_ERROR (Status)) { - if (PciIo != NULL) { + if (PciIo != NULL && Enabled) { PciIo->Attributes ( PciIo, EfiPciIoAttributeOperationDisable, - EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, + EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, NULL ); } @@ -292,6 +316,7 @@ PcatIsaAcpiDriverBindingStop ( EFI_STATUS Status; EFI_ISA_ACPI_PROTOCOL *IsaAcpi; PCAT_ISA_ACPI_DEV *PcatIsaAcpiDev; + UINT64 Supports; // // Get the ISA ACPI Protocol Interface @@ -313,10 +338,25 @@ PcatIsaAcpiDriverBindingStop ( // PcatIsaAcpiDev = PCAT_ISA_ACPI_DEV_FROM_THIS (IsaAcpi); + // + // Get supported PCI attributes + // + Status = PcatIsaAcpiDev->PciIo->Attributes ( + PcatIsaAcpiDev->PciIo, + EfiPciIoAttributeOperationSupported, + 0, + &Supports + ); + if (EFI_ERROR (Status)) { + return Status; + } + + Supports &= (EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_IO_16); + PcatIsaAcpiDev->PciIo->Attributes ( PcatIsaAcpiDev->PciIo, EfiPciIoAttributeOperationDisable, - EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_ISA_IO | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, + EFI_PCI_DEVICE_ENABLE | Supports | EFI_PCI_IO_ATTRIBUTE_ISA_MOTHERBOARD_IO, NULL ); diff --git a/PcAtChipsetPkg/PciHostBridgeDxe/PciHostBridge.c b/PcAtChipsetPkg/PciHostBridgeDxe/PciHostBridge.c index 27a54461cd..6403a0723c 100644 --- a/PcAtChipsetPkg/PciHostBridgeDxe/PciHostBridge.c +++ b/PcAtChipsetPkg/PciHostBridgeDxe/PciHostBridge.c @@ -1123,109 +1123,6 @@ GetProposedResources( return EFI_INVALID_PARAMETER; } -/** - Update attribute for PCI root bridge for specifc device. - - @param RootBridge Point to PCI root bridge. - @param PciAddress The specific device PCI address -**/ -VOID -UpdateRootBridgeAttributes ( - IN PCI_ROOT_BRIDGE_INSTANCE *RootBridge, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_PCI_ADDRESS PciAddress - ) -{ - EFI_STATUS Status; - PCI_TYPE01 PciConfigurationHeader; - UINT64 Attributes; - - // - // Read the PCI Configuration Header for the device - // - Status = RootBridge->Io.Pci.Read ( - &RootBridge->Io, - EfiPciWidthUint16, - EFI_PCI_ADDRESS( - PciAddress.Bus, - PciAddress.Device, - PciAddress.Function, - 0 - ), - sizeof (PciConfigurationHeader) / sizeof (UINT16), - &PciConfigurationHeader - ); - if (EFI_ERROR (Status)) { - return; - } - - Attributes = RootBridge->Attributes; - - // - // Look for devices with the VGA Palette Snoop enabled in the COMMAND register of the PCI Config Header - // - if (PciConfigurationHeader.Hdr.Command & 0x20) { - Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO; - } - - // - // If the device is a PCI-PCI Bridge, then look at the Subordinate Bus Number - // - if (IS_PCI_BRIDGE(&PciConfigurationHeader)) { - // - // Look at the PPB Configuration for legacy decoding attributes - // - if (PciConfigurationHeader.Bridge.BridgeControl & 0x04) { - Attributes |= EFI_PCI_ATTRIBUTE_ISA_IO; - Attributes |= EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO; - } - if (PciConfigurationHeader.Bridge.BridgeControl & 0x08) { - Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO; - Attributes |= EFI_PCI_ATTRIBUTE_VGA_MEMORY; - Attributes |= EFI_PCI_ATTRIBUTE_VGA_IO; - } - } else { - // - // See if the PCI device is an IDE controller - // - if (PciConfigurationHeader.Hdr.ClassCode[2] == 0x01 && - PciConfigurationHeader.Hdr.ClassCode[1] == 0x01 ) { - if (PciConfigurationHeader.Hdr.ClassCode[0] & 0x80) { - Attributes |= EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO; - Attributes |= EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO; - } - if (PciConfigurationHeader.Hdr.ClassCode[0] & 0x01) { - Attributes |= EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO; - } - if (PciConfigurationHeader.Hdr.ClassCode[0] & 0x04) { - Attributes |= EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO; - } - } - - // - // See if the PCI device is a legacy VGA controller - // - if (PciConfigurationHeader.Hdr.ClassCode[2] == 0x00 && - PciConfigurationHeader.Hdr.ClassCode[1] == 0x01 ) { - Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO; - Attributes |= EFI_PCI_ATTRIBUTE_VGA_MEMORY; - Attributes |= EFI_PCI_ATTRIBUTE_VGA_IO; - } - - // - // See if the PCI device is a standard VGA controller - // - if (PciConfigurationHeader.Hdr.ClassCode[2] == 0x03 && - PciConfigurationHeader.Hdr.ClassCode[1] == 0x00 ) { - Attributes |= EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO; - Attributes |= EFI_PCI_ATTRIBUTE_VGA_MEMORY; - Attributes |= EFI_PCI_ATTRIBUTE_VGA_IO; - } - } - - RootBridge->Attributes = Attributes; - RootBridge->Supports = Attributes; -} - /** Provides the hooks from the PCI bus driver to every PCI controller (device/function) at various stages of the PCI enumeration process that allow the host bridge driver to preinitialize individual @@ -1275,14 +1172,17 @@ PreprocessController ( while (List != &HostBridgeInstance->Head) { RootBridgeInstance = DRIVER_INSTANCE_FROM_LIST_ENTRY (List); if (RootBridgeHandle == RootBridgeInstance->Handle) { - UpdateRootBridgeAttributes ( - RootBridgeInstance, - PciAddress - ); - return EFI_SUCCESS; + break; } List = List->ForwardLink; } + if (List == &HostBridgeInstance->Head) { + return EFI_INVALID_PARAMETER; + } - return EFI_INVALID_PARAMETER; + if (Phase < EfiPciBeforeChildBusEnumeration || Phase > EfiMaxPciHostBridgeEnumerationPhase) { + return EFI_INVALID_PARAMETER; + } + + return EFI_SUCCESS; } diff --git a/PcAtChipsetPkg/PciHostBridgeDxe/PciRootBridgeIo.c b/PcAtChipsetPkg/PciHostBridgeDxe/PciRootBridgeIo.c index cd39f2bbf7..512a5049c1 100644 --- a/PcAtChipsetPkg/PciHostBridgeDxe/PciRootBridgeIo.c +++ b/PcAtChipsetPkg/PciHostBridgeDxe/PciRootBridgeIo.c @@ -674,8 +674,11 @@ RootBridgeConstructor ( PrivateData->RootBridgeAttrib = Attri; - PrivateData->Attributes = 0; - PrivateData->Supports = 0; + PrivateData->Supports = EFI_PCI_ATTRIBUTE_IDE_PRIMARY_IO | EFI_PCI_ATTRIBUTE_IDE_SECONDARY_IO | \ + EFI_PCI_ATTRIBUTE_ISA_IO_16 | EFI_PCI_ATTRIBUTE_ISA_MOTHERBOARD_IO | \ + EFI_PCI_ATTRIBUTE_VGA_MEMORY | \ + EFI_PCI_ATTRIBUTE_VGA_IO_16 | EFI_PCI_ATTRIBUTE_VGA_PALETTE_IO_16; + PrivateData->Attributes = PrivateData->Supports; Protocol->ParentHandle = HostBridgeHandle; -- 2.39.2