mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
20be064ec8
commit
e4e050167f
|
@ -72,7 +72,9 @@ static int probe(struct pci_dev *pdev,
|
|||
const struct pci_device_id *id)
|
||||
{
|
||||
struct uio_pci_generic_dev *gdev;
|
||||
struct uio_mem *uiomem;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = pcim_enable_device(pdev);
|
||||
if (err) {
|
||||
|
@ -101,6 +103,36 @@ static int probe(struct pci_dev *pdev,
|
|||
"no support for interrupts?\n");
|
||||
}
|
||||
|
||||
uiomem = &gdev->info.mem[0];
|
||||
for (i = 0; i < MAX_UIO_MAPS; ++i) {
|
||||
struct resource *r = &pdev->resource[i];
|
||||
|
||||
if (r->flags != (IORESOURCE_SIZEALIGN | IORESOURCE_MEM))
|
||||
continue;
|
||||
|
||||
if (uiomem >= &gdev->info.mem[MAX_UIO_MAPS]) {
|
||||
dev_warn(
|
||||
&pdev->dev,
|
||||
"device has more than " __stringify(
|
||||
MAX_UIO_MAPS) " I/O memory resources.\n");
|
||||
break;
|
||||
}
|
||||
|
||||
uiomem->memtype = UIO_MEM_PHYS;
|
||||
uiomem->addr = r->start & PAGE_MASK;
|
||||
uiomem->offs = r->start & ~PAGE_MASK;
|
||||
uiomem->size =
|
||||
(uiomem->offs + resource_size(r) + PAGE_SIZE - 1) &
|
||||
PAGE_MASK;
|
||||
uiomem->name = r->name;
|
||||
++uiomem;
|
||||
}
|
||||
|
||||
while (uiomem < &gdev->info.mem[MAX_UIO_MAPS]) {
|
||||
uiomem->size = 0;
|
||||
++uiomem;
|
||||
}
|
||||
|
||||
return devm_uio_register_device(&pdev->dev, &gdev->info);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue