git: 14721190e829 - stable/12 - pci_user: call bus_translate_resource before BAR mmap

From: Marcin Wojtas <mw_at_FreeBSD.org>
Date: Mon, 11 Oct 2021 13:57:52 UTC
The branch stable/12 has been updated by mw:

URL: https://cgit.FreeBSD.org/src/commit/?id=14721190e8298199a6cfbb6d2568ea1d17e7a107

commit 14721190e8298199a6cfbb6d2568ea1d17e7a107
Author:     Marcin Wojtas <mw@FreeBSD.org>
AuthorDate: 2021-04-06 15:10:04 +0000
Commit:     Marcin Wojtas <mw@FreeBSD.org>
CommitDate: 2021-10-11 13:40:11 +0000

    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
    
    (cherry picked from commit f2f1ab39c04088ce53287528549e652cf68cee09)
    
    pci_user: fix build for 32-bit platforms
    
    Commit: f2f1ab39c040 ("pci_user: call bus_translate_resource before BAR mmap")
    broke build for 32-bit platforms due to rman_res_t and vm_paddr_t
    incompatible types. Fix that.
    
    (cherry picked from commit 9857e00a528bb230c8935ded5f118a7374bf808b)
---
 sys/dev/pci/pci_user.c | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/sys/dev/pci/pci_user.c b/sys/dev/pci/pci_user.c
index 9e3842acf889..54ddb5796cc8 100644
--- a/sys/dev/pci/pci_user.c
+++ b/sys/dev/pci/pci_user.c
@@ -855,7 +855,7 @@ pci_bar_mmap(device_t pcidev, struct pci_bar_mmap *pbm)
 	struct thread *td;
 	struct sglist *sg;
 	struct pci_map *pm;
-	vm_paddr_t membase;
+	rman_res_t membase;
 	vm_paddr_t pbase;
 	vm_size_t plen;
 	vm_offset_t addr;
@@ -878,7 +878,11 @@ pci_bar_mmap(device_t pcidev, struct pci_bar_mmap *pbm)
 		return (EBUSY); /* XXXKIB enable if _ACTIVATE */
 	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,
+	    pm->pm_value & PCIM_BAR_MEM_BASE, &membase);
+	if (error != 0)
+		return (error);
+
 	pbase = trunc_page(membase);
 	plen = round_page(membase + ((pci_addr_t)1 << pm->pm_size)) -
 	    pbase;