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
This commit is contained in:
Marcin Wojtas 2021-04-06 17:10:04 +02:00
parent 1c1ead9b94
commit f2f1ab39c0

View File

@ -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;