[igt-dev] [PATCH i-g-t 2/3] lib/igt_device: add igt_map_bar_region
Chris Wilson
chris at chris-wilson.co.uk
Thu Apr 4 13:30:48 UTC 2019
Quoting Daniel Mrzyglod (2019-04-04 14:18:04)
> This function use sysfs to map particular mmio region.
>
> Signed-off-by: Daniel Mrzyglod <daniel.t.mrzyglod at intel.com>
> ---
> lib/igt_device.c | 41 +++++++++++++++++++++++++++++++++++++++++
> lib/igt_device.h | 1 +
> 2 files changed, 42 insertions(+)
>
> diff --git a/lib/igt_device.c b/lib/igt_device.c
> index d3934efb..805109e5 100644
> --- a/lib/igt_device.c
> +++ b/lib/igt_device.c
> @@ -220,3 +220,44 @@ struct pci_device *igt_device_get_pci_device(int fd)
>
> return pci_dev;
> }
> +
> +/**
> + * igt_device_map_pci_bar_region:
> + *
> + * @fd: the device
> + * @mmio_bar: bar to be mapped
> + * @mmio_size: bar size
> + *
> + * Returns:
> + * The pointer for mmapped bar
> + */
> +void *igt_device_map_pci_bar_region(int fd, int mmio_bar, int mmio_size)
> +{
> + struct igt_pci_addr pci_addr;
> + char filepath[4096];
> + int newfd;
> + void *igt_mmio = NULL;
> +
> + if (igt_device_get_pci_addr(fd, &pci_addr)) {
> + igt_warn("Unable to find device PCI address\n");
> + return NULL;
> + }
> +
> + sprintf(filepath, "/sys/devices/pci%.4x\:%.2x/%.4x\:%.2x\:%.2x.%.1x/resource%.1x",
Might as well use asprintf rather than a [4096]
Certainly snprintf is good habit (if irrelevant here).
> + pci_addr.domain,
> + pci_addr.bus,
> + pci_addr.domain,
> + pci_addr.bus,
> + pci_addr.device,
> + pci_addr.function,
> + mmio_bar);
> +
> +
Bonus
.
> + newfd = open(filepath, O_RDWR | O_SYNC);
> + igt_mmio = mmap(0, mmio_size, PROT_READ | PROT_WRITE, MAP_SHARED, newfd, 0);
Leaking newfd for fun and profit?
> +
> + igt_fail_on_f(igt_mmio == MAP_FAILED,
> + "Couldn't map MMIO region\n");
> +
> + return igt_mmio;
> +}
More information about the igt-dev
mailing list