aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Brown <mcb30@ipxe.org>2023-11-02 15:05:15 +0000
committerMichael Brown <mcb30@ipxe.org>2023-11-02 15:05:15 +0000
commit74ec00a9f336152fccf8df9cc9c5a46ab1a649b4 (patch)
tree14a5793350c82398ec2aa4f4360f41613a3e4f9f
parentf883203132b3d06ffb354f1b11d1f65a0c70ff42 (diff)
downloadipxe-74ec00a9f336152fccf8df9cc9c5a46ab1a649b4.zip
ipxe-74ec00a9f336152fccf8df9cc9c5a46ab1a649b4.tar.gz
ipxe-74ec00a9f336152fccf8df9cc9c5a46ab1a649b4.tar.bz2
[pci] Handle non-zero starting bus in ECAM allocations
The base address provided in the PCI ECAM allocation within the ACPI MCFG table is the base address for the segment as a whole, not for the starting bus within that allocation. On machines that provide ECAM allocations with a non-zero starting bus number (observed with an AWS EC2 m7a.large instance), this will result in iPXE accessing the wrong memory addresses within the ECAM region. Fix by adding the appropriate starting bus offset to the base address. Signed-off-by: Michael Brown <mcb30@ipxe.org>
-rw-r--r--src/drivers/bus/ecam.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/drivers/bus/ecam.c b/src/drivers/bus/ecam.c
index 376f349..dd3e1e5 100644
--- a/src/drivers/bus/ecam.c
+++ b/src/drivers/bus/ecam.c
@@ -150,6 +150,7 @@ static int ecam_access ( struct pci_device *pci ) {
/* Map configuration space for this allocation */
base = le64_to_cpu ( ecam.alloc.base );
+ base += ( ecam.alloc.start * ECAM_SIZE * PCI_BUSDEVFN ( 0, 1, 0, 0 ) );
len = ( ecam.range.count * ECAM_SIZE );
ecam.regs = ioremap ( base, len );
if ( ! ecam.regs ) {