dmaengine: idxd: create idxd_device sub-driver
authorDave Jiang <dave.jiang@intel.com>
Thu, 15 Jul 2021 18:44:24 +0000 (11:44 -0700)
committerVinod Koul <vkoul@kernel.org>
Wed, 21 Jul 2021 04:39:16 +0000 (10:09 +0530)
The original architecture of /sys/bus/dsa invented a scheme whereby a
single entry in the list of bus drivers, /sys/bus/drivers/dsa, handled
all device types and internally routed them to different drivers.
Those internal drivers were invisible to userspace. Now, as
/sys/bus/dsa wants to grow support for alternate drivers for a given
device, for example vfio-mdev instead of kernel-internal-dmaengine, a
proper bus device-driver model is needed. The first step in that process
is separating the existing omnibus/implicit "dsa" driver into proper
individual drivers registered on /sys/bus/dsa. Establish the idxd_drv
driver that control the enabling and disabling of the accelerator device.

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

index d5a0b6fff3b9c9f997a8e93c50a64b5edfc9aa35..12ae3f1639f1383cd2693d8fb00b33d06e1475c4 100644 (file)
@@ -1349,3 +1349,16 @@ void idxd_device_drv_remove(struct idxd_dev *idxd_dev)
        if (test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
                idxd_device_reset(idxd);
 }
+
+static enum idxd_dev_type dev_types[] = {
+       IDXD_DEV_DSA,
+       IDXD_DEV_IAX,
+       IDXD_DEV_NONE,
+};
+
+struct idxd_device_driver idxd_drv = {
+       .type = dev_types,
+       .probe = idxd_device_drv_probe,
+       .remove = idxd_device_drv_remove,
+       .name = "idxd",
+};
index 4bb5a65ec237c1b1cd49b0a60850367ee3e642f0..a356d227f755530a21f3acd7a488f8677833c374 100644 (file)
@@ -58,6 +58,7 @@ struct idxd_device_driver {
 };
 
 extern struct idxd_device_driver dsa_drv;
+extern struct idxd_device_driver idxd_drv;
 
 struct idxd_irq_entry {
        struct idxd_device *idxd;
@@ -501,6 +502,8 @@ void idxd_mask_msix_vector(struct idxd_device *idxd, int vec_id);
 void idxd_unmask_msix_vector(struct idxd_device *idxd, int vec_id);
 
 /* device control */
+int idxd_register_idxd_drv(void);
+void idxd_unregister_idxd_drv(void);
 int idxd_device_drv_probe(struct idxd_dev *idxd_dev);
 void idxd_device_drv_remove(struct idxd_dev *idxd_dev);
 int drv_enable_wq(struct idxd_wq *wq);
index 544ff7137292d49fef7dec8a105529317c96cab4..c19b03c17ab945ea35f64f3f304858b669ca1bd9 100644 (file)
@@ -840,6 +840,10 @@ static int __init idxd_init_module(void)
        if (err < 0)
                return err;
 
+       err = idxd_driver_register(&idxd_drv);
+       if (err < 0)
+               goto err_idxd_driver_register;
+
        err = idxd_driver_register(&dsa_drv);
        if (err < 0)
                goto err_dsa_driver_register;
@@ -859,6 +863,8 @@ err_pci_register:
 err_cdev_register:
        idxd_driver_unregister(&dsa_drv);
 err_dsa_driver_register:
+       idxd_driver_unregister(&idxd_drv);
+err_idxd_driver_register:
        idxd_unregister_bus_type();
        return err;
 }
@@ -866,6 +872,7 @@ module_init(idxd_init_module);
 
 static void __exit idxd_exit_module(void)
 {
+       idxd_driver_unregister(&idxd_drv);
        idxd_driver_unregister(&dsa_drv);
        pci_unregister_driver(&idxd_pci_driver);
        idxd_cdev_remove();