From aac5073d768926322ec38ca7153fd8f14e20a88e Mon Sep 17 00:00:00 2001 From: Ian Moffett Date: Sat, 20 Sep 2025 17:20:14 -0400 Subject: kern: pci: Add bus framework and PCI BAR mapper Signed-off-by: Ian Moffett --- src/sys/arch/amd64/io/pci/bar.c | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'src/sys/arch/amd64/io/pci') diff --git a/src/sys/arch/amd64/io/pci/bar.c b/src/sys/arch/amd64/io/pci/bar.c index 265d873..1a7e766 100644 --- a/src/sys/arch/amd64/io/pci/bar.c +++ b/src/sys/arch/amd64/io/pci/bar.c @@ -65,3 +65,33 @@ pci_bar_size(struct pci_device *dev, uint8_t bar) pci_writel(dev, barreg, reg_tmp); return reg; } + +/* + * Map a BAR into host memory + */ +int +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); + uintptr_t tmp; + + if (dev == NULL || bs_res == NULL) { + return -EINVAL; + } + + if (barreg == 0) { + return -EINVAL; + } + + /* This must be MMIO */ + tmp = pci_readl(dev, barreg); + if (PCI_BAR_IO(tmp)) { + return -EINVAL; + } + + pa = tmp & ~0x7; + len = pci_bar_size(dev, bar); + return bus_space_map(bs_res, pa, len); +} -- cgit v1.2.3