diff options
author | Ian Moffett <ian@osmora.org> | 2025-10-11 17:52:48 -0400 |
---|---|---|
committer | Ian Moffett <ian@osmora.org> | 2025-10-11 17:52:48 -0400 |
commit | 7e6f05f1241c3c298f7475f60158d04176ef162a (patch) | |
tree | 301be09449d106629f20be22cfb556aef94ee692 /src/sys/arch/amd64/io/pci | |
parent | 2e3fe8af5ff3b0a4c004c9e31438f059c8e2c1b7 (diff) |
kern/amd64: pci: Handle 64-bit BAR addresses
Signed-off-by: Ian Moffett <ian@osmora.org>
Diffstat (limited to 'src/sys/arch/amd64/io/pci')
-rw-r--r-- | src/sys/arch/amd64/io/pci/bar.c | 13 |
1 files changed, 12 insertions, 1 deletions
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 <sys/types.h> +#include <sys/param.h> #include <sys/errno.h> #include <sys/panic.h> #include <io/pci/bar.h> @@ -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); } |