Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

uio: uio_pci_generic: add memory resource mappings

import memory resources from underlying pci device, thus allowing
userspace applications to memory map those resources.

without this change, current implementation, does not populate the
memory maps and are not shown under the corresponding sysfs uio entry:

root@apalis-imx8:~# echo "ad00 0122" > \
/sys/bus/pci/drivers/uio_pci_generic/new_id
[ 55.736433] uio_pci_generic 0000:01:00.0: enabling device (0000 -> 0002)
root@apalis-imx8:~# ls -lsrt /sys/class/uio/uio0/
0 -rw-r--r-- 1 root root 4096 Apr 27 18:52 uevent
0 -r--r--r-- 1 root root 4096 Apr 27 18:52 version
0 -r--r--r-- 1 root root 4096 Apr 27 18:52 suppliers
0 lrwxrwxrwx 1 root root 0 Apr 27 18:52 subsystem
-> ../../../../../../../../../class/uio
0 drwxr-xr-x 2 root root 0 Apr 27 18:52 power
0 -r--r--r-- 1 root root 4096 Apr 27 18:52 name
0 -r--r--r-- 1 root root 4096 Apr 27 18:52 event
0 lrwxrwxrwx 1 root root 0 Apr 27 18:52 device
-> ../../../0000:01:00.0
0 -r--r--r-- 1 root root 4096 Apr 27 18:52 dev
0 -r--r--r-- 1 root root 4096 Apr 27 18:52 consumers
root@apalis-imx8:~#

with the proposed changed, have following instead:
root@apalis-imx8:~# ls -lsrt /sys/class/uio/uio0/
0 -rw-r--r-- 1 root root 4096 Apr 27 19:06 uevent
0 -r--r--r-- 1 root root 4096 Apr 27 19:06 version
0 -r--r--r-- 1 root root 4096 Apr 27 19:06 suppliers
0 lrwxrwxrwx 1 root root 0 Apr 27 19:06 subsystem
-> ../../../../../../../../../class/uio
0 drwxr-xr-x 2 root root 0 Apr 27 19:06 power
0 -r--r--r-- 1 root root 4096 Apr 27 19:06 name
0 drwxr-xr-x 4 root root 0 Apr 27 19:06 maps
0 -r--r--r-- 1 root root 4096 Apr 27 19:06 event
0 lrwxrwxrwx 1 root root 0 Apr 27 19:06 device
-> ../../../0000:01:00.0
0 -r--r--r-- 1 root root 4096 Apr 27 19:06 dev
0 -r--r--r-- 1 root root 4096 Apr 27 19:06 consumers
root@apalis-imx8:~#

root@apalis-imx8:~# ls -lsrt /sys/class/uio/uio0/maps/
0 drwxr-xr-x 2 root root 0 Apr 27 19:07 map1
0 drwxr-xr-x 2 root root 0 Apr 27 19:07 map0
root@apalis-imx8:~#

root@apalis-imx8:~# cat /sys/class/uio/uio0/maps/map1/addr
0x0000000062000000
root@apalis-imx8:~#

root@apalis-imx8:~# cat /sys/class/uio/uio0/maps/map1/size
0x0000000000200000
root@apalis-imx8:~#

tested on AltaData ARINC 429 MiniPCIE module on imx8qm-apalis-ixora-v1.2

Signed-off-by: Firas Ashkar <firas.ashkar@savoirfairelinux.com>
Link: https://lore.kernel.org/r/20210427201046.4005820-1-firas.ashkar@savoirfairelinux.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

authored by

Firas Ashkar and committed by
Greg Kroah-Hartman
e4e05016 20be064e

+32
+32
drivers/uio/uio_pci_generic.c
··· 72 72 const struct pci_device_id *id) 73 73 { 74 74 struct uio_pci_generic_dev *gdev; 75 + struct uio_mem *uiomem; 75 76 int err; 77 + int i; 76 78 77 79 err = pcim_enable_device(pdev); 78 80 if (err) { ··· 101 99 } else { 102 100 dev_warn(&pdev->dev, "No IRQ assigned to device: " 103 101 "no support for interrupts?\n"); 102 + } 103 + 104 + uiomem = &gdev->info.mem[0]; 105 + for (i = 0; i < MAX_UIO_MAPS; ++i) { 106 + struct resource *r = &pdev->resource[i]; 107 + 108 + if (r->flags != (IORESOURCE_SIZEALIGN | IORESOURCE_MEM)) 109 + continue; 110 + 111 + if (uiomem >= &gdev->info.mem[MAX_UIO_MAPS]) { 112 + dev_warn( 113 + &pdev->dev, 114 + "device has more than " __stringify( 115 + MAX_UIO_MAPS) " I/O memory resources.\n"); 116 + break; 117 + } 118 + 119 + uiomem->memtype = UIO_MEM_PHYS; 120 + uiomem->addr = r->start & PAGE_MASK; 121 + uiomem->offs = r->start & ~PAGE_MASK; 122 + uiomem->size = 123 + (uiomem->offs + resource_size(r) + PAGE_SIZE - 1) & 124 + PAGE_MASK; 125 + uiomem->name = r->name; 126 + ++uiomem; 127 + } 128 + 129 + while (uiomem < &gdev->info.mem[MAX_UIO_MAPS]) { 130 + uiomem->size = 0; 131 + ++uiomem; 104 132 } 105 133 106 134 return devm_uio_register_device(&pdev->dev, &gdev->info);