lkml.org 
[lkml]   [2015]   [Mar]   [6]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    /
    Date
    From
    SubjectRe: [PATCH 1/5] vfio-pci: Allow PCI IDs to be specified as module options
    On Wed, Mar 04, 2015 at 01:02:43PM -0700, Alex Williamson wrote:
    > This copies the same support from pci-stub for exactly the same
    > purpose, enabling a set of PCI IDs to be automatically added to the
    > driver's dynamic ID table at module load time. The code here is
    > pretty simple and both vfio-pci and pci-stub are fairly unique in
    > being meta drivers, capable of attaching to any device, so there's no
    > attempt made to generalize the code into pci-core.
    >
    > Signed-off-by: Alex Williamson <alex.williamson@redhat.com>
    > ---
    > drivers/vfio/pci/vfio_pci.c | 46 +++++++++++++++++++++++++++++++++++++++++++
    > 1 file changed, 46 insertions(+)
    >
    > diff --git a/drivers/vfio/pci/vfio_pci.c b/drivers/vfio/pci/vfio_pci.c
    > index f8a1863..b3bae4c 100644
    > --- a/drivers/vfio/pci/vfio_pci.c
    > +++ b/drivers/vfio/pci/vfio_pci.c
    > @@ -32,6 +32,10 @@
    > #define DRIVER_AUTHOR "Alex Williamson <alex.williamson@redhat.com>"
    > #define DRIVER_DESC "VFIO PCI - User Level meta-driver"
    >
    > +static char ids[1024] __initdata;
    > +module_param_string(ids, ids, sizeof(ids), 0);
    > +MODULE_PARM_DESC(ids, "Initial PCI IDs to add to the vfio driver, format is \"vendor:device[:subvendor[:subdevice[:class[:class_mask]]]]\" and multiple comma separated entries can be specified");
    > +
    > static bool nointxmask;
    > module_param_named(nointxmask, nointxmask, bool, S_IRUGO | S_IWUSR);
    > MODULE_PARM_DESC(nointxmask,
    > @@ -1034,6 +1038,46 @@ static void __exit vfio_pci_cleanup(void)
    > vfio_pci_uninit_perm_bits();
    > }
    >
    > +static void __init vfio_pci_fill_ids(void)
    > +{
    > + char *p, *id;
    > + int rc;
    > +
    > + /* no ids passed actually */
    > + if (ids[0] == '\0')
    > + return;
    > +
    > + /* add ids specified in the module parameter */
    > + p = ids;
    > + while ((id = strsep(&p, ","))) {
    > + unsigned int vendor, device, subvendor = PCI_ANY_ID,
    > + subdevice = PCI_ANY_ID, class = 0, class_mask = 0;
    > + int fields;
    > +
    > + if (!strlen(id))
    > + continue;
    > +
    > + fields = sscanf(id, "%x:%x:%x:%x:%x:%x",
    > + &vendor, &device, &subvendor, &subdevice,
    > + &class, &class_mask);
    > +
    > + if (fields < 2) {
    > + pr_warn("vfio-pci: invalid id string \"%s\"\n", id);
    > + continue;
    > + }
    > +
    > + pr_info("vfio-pci: add %04X:%04X sub=%04X:%04X cls=%08X/%08X\n",

    pci_setup_device() uses "[%04x:%04x] ... class %#08x". Maybe they should
    be the same, at least as far as using upper/lower case, spelling out
    "class", and "0x" prefix. Maybe there's other precedent that you're
    following and pci_setup_device() is not?

    > + vendor, device, subvendor, subdevice,
    > + class, class_mask);
    > +
    > + rc = pci_add_dynid(&vfio_pci_driver, vendor, device,
    > + subvendor, subdevice, class, class_mask, 0);
    > + if (rc)
    > + pr_warn("vfio-pci: failed to add dynamic id (%d)\n",
    > + rc);
    > + }
    > +}
    > +
    > static int __init vfio_pci_init(void)
    > {
    > int ret;
    > @@ -1053,6 +1097,8 @@ static int __init vfio_pci_init(void)
    > if (ret)
    > goto out_driver;
    >
    > + vfio_pci_fill_ids();
    > +
    > return 0;
    >
    > out_driver:
    >
    > --
    > To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
    > the body of a message to majordomo@vger.kernel.org
    > More majordomo info at http://vger.kernel.org/majordomo-info.html
    > Please read the FAQ at http://www.tux.org/lkml/


    \
     
     \ /
      Last update: 2015-03-06 23:21    [W:4.583 / U:0.012 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site