dmaengine: idxd: add type to driver in order to allow device matching
authorDave Jiang <dave.jiang@intel.com>
Thu, 15 Jul 2021 18:44:18 +0000 (11:44 -0700)
committerVinod Koul <vkoul@kernel.org>
Wed, 21 Jul 2021 04:39:16 +0000 (10:09 +0530)
Add an array of support device types to the idxd_device_driver
definition in order to enable simple matching of device type to a
given driver. The deprecated / omnibus dsa_drv driver specifies
IDXD_DEV_NONE as its only role is to service legacy userspace (old
accel-config) directed bind requests and route them to them the proper
driver. It need not attach to a device when the bus is autoprobed. The
accel-config tooling is being updated to drop its dependency on this
deprecated bind scheme.

Reviewed-by: Dan Willliams <dan.j.williams@intel.com>
Signed-off-by: Dave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/162637465882.744545.17456174666211577867.stgit@djiang5-desk3.ch.intel.com
Signed-off-by: Vinod Koul <vkoul@kernel.org>
drivers/dma/idxd/idxd.h
drivers/dma/idxd/init.c
drivers/dma/idxd/sysfs.c

index 7fc26b7..4bb5a65 100644 (file)
@@ -51,6 +51,7 @@ enum idxd_type {
 
 struct idxd_device_driver {
        const char *name;
+       enum idxd_dev_type *type;
        int (*probe)(struct idxd_dev *idxd_dev);
        void (*remove)(struct idxd_dev *idxd_dev);
        struct device_driver drv;
index 5b628e6..544ff71 100644 (file)
@@ -879,6 +879,11 @@ int __idxd_driver_register(struct idxd_device_driver *idxd_drv, struct module *o
 {
        struct device_driver *drv = &idxd_drv->drv;
 
+       if (!idxd_drv->type) {
+               pr_debug("driver type not set (%ps)\n", __builtin_return_address(0));
+               return -EINVAL;
+       }
+
        drv->name = idxd_drv->name;
        drv->bus = &dsa_bus_type;
        drv->owner = owner;
index 9f2d06c..8d48903 100644 (file)
@@ -19,9 +19,18 @@ static char *idxd_wq_type_names[] = {
 static int idxd_config_bus_match(struct device *dev,
                                 struct device_driver *drv)
 {
+       struct idxd_device_driver *idxd_drv =
+               container_of(drv, struct idxd_device_driver, drv);
        struct idxd_dev *idxd_dev = confdev_to_idxd_dev(dev);
+       int i = 0;
+
+       while (idxd_drv->type[i] != IDXD_DEV_NONE) {
+               if (idxd_dev->type == idxd_drv->type[i])
+                       return 1;
+               i++;
+       }
 
-       return (is_idxd_dev(idxd_dev) || is_idxd_wq_dev(idxd_dev));
+       return 0;
 }
 
 static int idxd_config_bus_probe(struct device *dev)
@@ -79,10 +88,15 @@ static void idxd_dsa_drv_remove(struct idxd_dev *idxd_dev)
        }
 }
 
+static enum idxd_dev_type dev_types[] = {
+       IDXD_DEV_NONE,
+};
+
 struct idxd_device_driver dsa_drv = {
        .name = "dsa",
        .probe = idxd_dsa_drv_probe,
        .remove = idxd_dsa_drv_remove,
+       .type = dev_types,
 };
 
 /* IDXD engine attributes */