From 7e6f05f1241c3c298f7475f60158d04176ef162a Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sat, 11 Oct 2025 17:52:48 -0400 Subject: kern/amd64: pci: Handle 64-bit BAR addresses Signed-off-by: Ian Moffett --- src/sys/arch/amd64/io/pci/bar.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/src/sys/arch/amd64/io/pci/bar.c b/src/sys/arch/amd64/io/pci/bar.c index 1a7e766..dc7601b 100644 --- a/src/sys/arch/amd64/io/pci/bar.c +++ b/src/sys/arch/amd64/io/pci/bar.c @@ -33,6 +33,7 @@ */ #include +#include #include #include #include @@ -75,6 +76,7 @@ pci_map_bar(struct pci_device *dev, uint8_t bar, struct bus_space *bs_res) size_t len; bus_addr_t pa; uint8_t barreg = pci_get_barreg(bar); + uint32_t lo, hi; uintptr_t tmp; if (dev == NULL || bs_res == NULL) { @@ -91,7 +93,16 @@ pci_map_bar(struct pci_device *dev, uint8_t bar, struct bus_space *bs_res) return -EINVAL; } - pa = tmp & ~0x7; + /* Is this a 64-bit BAR? */ + if (PCI_BAR_64(tmp) && bar != 5) { + barreg = pci_get_barreg(bar + 1); + lo = tmp & ~7; + hi = pci_readl(dev, barreg); + pa = COMBINE32(hi, lo); + } else { + pa = tmp & ~0x7; + } + len = pci_bar_size(dev, bar); return bus_space_map(bs_res, pa, len); } -- cgit v1.2.3