aboutsummaryrefslogtreecommitdiffstats
path: root/tools/firmware/hvmloader/pci.c
diff options
context:
space:
mode:
Diffstat (limited to 'tools/firmware/hvmloader/pci.c')
-rw-r--r--tools/firmware/hvmloader/pci.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/tools/firmware/hvmloader/pci.c b/tools/firmware/hvmloader/pci.c
index 1fe250ddc7..68d4e44028 100644
--- a/tools/firmware/hvmloader/pci.c
+++ b/tools/firmware/hvmloader/pci.c
@@ -271,6 +271,11 @@ void pci_setup(void)
bar_sz = bars[i].bar_sz;
/*
+ * Relocate to high memory if the total amount of MMIO needed
+ * is more than the low MMIO available. Because devices are
+ * processed in order of bar_sz, this will preferentially
+ * relocate larger devices to high memory first.
+ *
* NB: The code here is rather fragile, as the check here to see
* whether bar_sz will fit in the low MMIO region doesn't match the
* real check made below, which involves aligning the base offset of the
@@ -284,7 +289,7 @@ void pci_setup(void)
* Should either of those two conditions change, this code will break.
*/
using_64bar = bars[i].is_64bar && bar64_relocate
- && (bar_sz > (mem_resource.max - mem_resource.base));
+ && (mmio_total > (mem_resource.max - mem_resource.base));
bar_data = pci_readl(devfn, bar_reg);
if ( (bar_data & PCI_BASE_ADDRESS_SPACE) ==
@@ -306,6 +311,7 @@ void pci_setup(void)
resource = &mem_resource;
bar_data &= ~PCI_BASE_ADDRESS_MEM_MASK;
}
+ mmio_total -= bar_sz;
}
else
{