From 293f496db088f4a674f7246f64ca2968cfeab435 Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 30 Jan 2018 19:09:19 +0100 Subject: [PATCH 1/3] pci: add function to get currently loaded kernel driver --- fpga/include/villas/kernel/pci.h | 3 +++ fpga/lib/kernel/pci.c | 21 ++++++++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/fpga/include/villas/kernel/pci.h b/fpga/include/villas/kernel/pci.h index d784cedf8..db6beb0e6 100644 --- a/fpga/include/villas/kernel/pci.h +++ b/fpga/include/villas/kernel/pci.h @@ -57,6 +57,9 @@ int pci_device_compare(const struct pci_device *d, const struct pci_device *f); struct pci_device * pci_lookup_device(struct pci *p, struct pci_device *filter); +/** Get currently loaded driver for device */ +int pci_get_driver(struct pci_device *d, char *buf, size_t buflen); + /** Bind a new LKM to the PCI device */ int pci_attach_driver(struct pci_device *d, const char *driver); diff --git a/fpga/lib/kernel/pci.c b/fpga/lib/kernel/pci.c index 56a8c17bd..e4d6793ba 100644 --- a/fpga/lib/kernel/pci.c +++ b/fpga/lib/kernel/pci.c @@ -254,10 +254,29 @@ struct pci_device * pci_lookup_device(struct pci *p, struct pci_device *f) return list_search(&p->devices, (cmp_cb_t) pci_device_compare, (void *) f); } +int pci_get_driver(struct pci_device *d, char *buf, size_t buflen) +{ + int ret; + char sysfs[1024], syml[1024]; + + snprintf(sysfs, sizeof(sysfs), "%s/bus/pci/devices/%04x:%02x:%02x.%x/driver", SYSFS_PATH, + d->slot.domain, d->slot.bus, d->slot.device, d->slot.function); + + ret = readlink(sysfs, syml, sizeof(syml)); + if (ret < 0) + return ret; + + char *driver = basename(syml); + + strncpy(buf, driver, buflen); + + return 0; +} + int pci_attach_driver(struct pci_device *d, const char *driver) { FILE *f; - char fn[256]; + char fn[1024]; /* Add new ID to driver */ snprintf(fn, sizeof(fn), "%s/bus/pci/drivers/%s/new_id", SYSFS_PATH, driver); From 3047f5bb7a2b34646c6b587c83da13b84401803b Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 30 Jan 2018 19:09:56 +0100 Subject: [PATCH 2/3] vfio: only rebind pci device to VFIO driver if not already bound --- fpga/lib/kernel/vfio.c | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/fpga/lib/kernel/vfio.c b/fpga/lib/kernel/vfio.c index 018f42dcf..0c0de58d4 100644 --- a/fpga/lib/kernel/vfio.c +++ b/fpga/lib/kernel/vfio.c @@ -229,10 +229,13 @@ int vfio_pci_attach(struct vfio_device *d, struct vfio_container *c, struct pci_ if (kernel_module_load("vfio_pci")) error("Failed to load kernel driver: %s", "vfio_pci"); - /* Bind PCI card to vfio-pci driver*/ - ret = pci_attach_driver(pdev, "vfio-pci"); - if (ret) - error("Failed to attach device to driver"); + /* Bind PCI card to vfio-pci driver if not already bound */ + ret = pci_get_driver(pdev, name, sizeof(name)); + if (ret || strcmp(name, "vfio-pci")) { + ret = pci_attach_driver(pdev, "vfio-pci"); + if (ret) + error("Failed to attach device to driver"); + } /* Get IOMMU group of device */ int index = pci_get_iommu_group(pdev); From 4f86b98fdd7c6dda813b9f9380780a0b010c55df Mon Sep 17 00:00:00 2001 From: Steffen Vogel Date: Tue, 30 Jan 2018 19:15:45 +0100 Subject: [PATCH 3/3] add script to configure system for non-root access to FPGA --- fpga/scripts/non_root.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 fpga/scripts/non_root.sh diff --git a/fpga/scripts/non_root.sh b/fpga/scripts/non_root.sh new file mode 100644 index 000000000..22e4f941d --- /dev/null +++ b/fpga/scripts/non_root.sh @@ -0,0 +1,18 @@ +#!/bin/bash + +IOMMU_GROUP=24 +PCI_BDF="0000:03:00.0" + +modprobe vfio +modprobe vfio_pci + +echo "10ee 7022" > /sys/bus/pci/drivers/vfio-pci/new_id +echo ${PCI_BDF} > /sys/bus/pci/drivers/vfio-pci/bind + +groupadd -f fpga +usermod -G fpga -a svg + +chgrp fpga /dev/vfio/${IOMMU_GROUP} +chmod g+rw /dev/vfio/${IOMMU_GROUP} + +