diff options
author | Marcin Wojtas <mw@FreeBSD.org> | 2021-04-06 15:10:04 +0000 |
---|---|---|
committer | Marcin Wojtas <mw@FreeBSD.org> | 2021-04-06 15:15:04 +0000 |
commit | f2f1ab39c04088ce53287528549e652cf68cee09 (patch) | |
tree | 3844a479a23233b226774fc9c715e97eb2b49d0b | |
parent | 1c1ead9b94a1a731646327ec3b09e8f3acd577b8 (diff) | |
download | src-f2f1ab39c04088ce53287528549e652cf68cee09.tar.gz src-f2f1ab39c04088ce53287528549e652cf68cee09.zip |
pci_user: call bus_translate_resource before BAR mmap
On some armv8 machines it is possible that the mapping between CPU
and PCI bus BAR base addresses is not 1:1. In case a BAR is allocated
in kernel using bus_alloc_resource_any this translation is handled in
ofw_pci_activate_resource.
Do the same in pci_user.c by calling bus_translate_resource devmethod.
This fixes mmaping BARs to userspace on Marvell SoCs (Armada 7k8k/CN913x)
and possibly many other platforms.
Submitted by: Kornel Duleba <mindal@semihalf.com>
Reviewed by: kib
Obtained from: Semihalf
Sponsored by: Marvell
MFC after: 2 weeks
Differential revision: https://reviews.freebsd.org/D29604
-rw-r--r-- | sys/dev/pci/pci_user.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/sys/dev/pci/pci_user.c b/sys/dev/pci/pci_user.c index c34fd715707e..0496b3bf6c06 100644 --- a/sys/dev/pci/pci_user.c +++ b/sys/dev/pci/pci_user.c @@ -878,6 +878,11 @@ pci_bar_mmap(device_t pcidev, struct pci_bar_mmap *pbm) if (!PCI_BAR_MEM(pm->pm_value)) return (EIO); membase = pm->pm_value & PCIM_BAR_MEM_BASE; + error = BUS_TRANSLATE_RESOURCE(pcidev, SYS_RES_MEMORY, membase, + &membase); + if (error != 0) + return (error); + pbase = trunc_page(membase); plen = round_page(membase + ((pci_addr_t)1 << pm->pm_size)) - pbase; |