summaryrefslogtreecommitdiffstats
path: root/CorebootPayloadPkg
diff options
context:
space:
mode:
authorMaurice Ma <maurice.ma@intel.com>2016-05-26 15:13:23 -0700
committerMaurice Ma <maurice.ma@intel.com>2016-05-27 14:28:37 -0700
commit8a3a97814e5402840164cb53ad6bb12ed851c54e (patch)
tree5fc73e06d9e218cd3cff50bd72d7f8b6b052ca98 /CorebootPayloadPkg
parentee70e58bd28a1bd6decf173a98b85c6e7066b486 (diff)
downloadedk2-8a3a97814e5402840164cb53ad6bb12ed851c54e.tar.gz
edk2-8a3a97814e5402840164cb53ad6bb12ed851c54e.tar.bz2
edk2-8a3a97814e5402840164cb53ad6bb12ed851c54e.zip
CorebootModulePkg/PciHostBridgeLib: Fix PCI 64bit memory BAR size issue
The current PCI 64bit memory BAR size calculation in PciHostBridgeLib assumes all 32 bits in the upper BAR are fully writable. However, platform might only support partial address programming, such as 40bit PCI BAR address. In this case the complement cannot be used for size calculation. Instead, the lowest non-zero bit should be used for BAR size calculation. Cc: Prince Agyeman <prince.agyeman@intel.com> Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Maurice Ma <maurice.ma@intel.com> Reviewed-by: Prince Agyeman <prince.agyeman@intel.com>
Diffstat (limited to 'CorebootPayloadPkg')
-rw-r--r--CorebootPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/CorebootPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c b/CorebootPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c
index a95ffcaf64..0f1c8cb1a2 100644
--- a/CorebootPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c
+++ b/CorebootPayloadPkg/Library/PciHostBridgeLib/PciHostBridgeSupport.c
@@ -193,6 +193,7 @@ PcatPciRootBridgeParseBars (
UINT32 UpperValue;
UINT64 Mask;
UINTN Offset;
+ UINTN LowBit;
UINT64 Base;
UINT64 Length;
UINT64 Limit;
@@ -262,7 +263,10 @@ PcatPciRootBridgeParseBars (
Base = Base | LShiftU64 ((UINT64) OriginalUpperValue, 32);
Length = Length | LShiftU64 ((UINT64) UpperValue, 32);
- Length = (~Length) + 1;
+ if (Length != 0) {
+ LowBit = LowBitSet64 (Length);
+ Length = LShiftU64 (1ULL, LowBit);
+ }
if ((Value & BIT3) == BIT3) {
MemAperture = PMemAbove4G;