dmaengine: idxd: create idxd_device sub-driver
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>
This commit is contained in:
parent
5fee6567ec
commit
034b3290ba
@ -1349,3 +1349,16 @@ void idxd_device_drv_remove(struct idxd_dev *idxd_dev)
|
|||||||
if (test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
|
if (test_bit(IDXD_FLAG_CONFIGURABLE, &idxd->flags))
|
||||||
idxd_device_reset(idxd);
|
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",
|
||||||
|
};
|
||||||
|
@ -58,6 +58,7 @@ struct idxd_device_driver {
|
|||||||
};
|
};
|
||||||
|
|
||||||
extern struct idxd_device_driver dsa_drv;
|
extern struct idxd_device_driver dsa_drv;
|
||||||
|
extern struct idxd_device_driver idxd_drv;
|
||||||
|
|
||||||
struct idxd_irq_entry {
|
struct idxd_irq_entry {
|
||||||
struct idxd_device *idxd;
|
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);
|
void idxd_unmask_msix_vector(struct idxd_device *idxd, int vec_id);
|
||||||
|
|
||||||
/* device control */
|
/* device control */
|
||||||
|
int idxd_register_idxd_drv(void);
|
||||||
|
void idxd_unregister_idxd_drv(void);
|
||||||
int idxd_device_drv_probe(struct idxd_dev *idxd_dev);
|
int idxd_device_drv_probe(struct idxd_dev *idxd_dev);
|
||||||
void idxd_device_drv_remove(struct idxd_dev *idxd_dev);
|
void idxd_device_drv_remove(struct idxd_dev *idxd_dev);
|
||||||
int drv_enable_wq(struct idxd_wq *wq);
|
int drv_enable_wq(struct idxd_wq *wq);
|
||||||
|
@ -840,6 +840,10 @@ static int __init idxd_init_module(void)
|
|||||||
if (err < 0)
|
if (err < 0)
|
||||||
return err;
|
return err;
|
||||||
|
|
||||||
|
err = idxd_driver_register(&idxd_drv);
|
||||||
|
if (err < 0)
|
||||||
|
goto err_idxd_driver_register;
|
||||||
|
|
||||||
err = idxd_driver_register(&dsa_drv);
|
err = idxd_driver_register(&dsa_drv);
|
||||||
if (err < 0)
|
if (err < 0)
|
||||||
goto err_dsa_driver_register;
|
goto err_dsa_driver_register;
|
||||||
@ -859,6 +863,8 @@ err_pci_register:
|
|||||||
err_cdev_register:
|
err_cdev_register:
|
||||||
idxd_driver_unregister(&dsa_drv);
|
idxd_driver_unregister(&dsa_drv);
|
||||||
err_dsa_driver_register:
|
err_dsa_driver_register:
|
||||||
|
idxd_driver_unregister(&idxd_drv);
|
||||||
|
err_idxd_driver_register:
|
||||||
idxd_unregister_bus_type();
|
idxd_unregister_bus_type();
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
@ -866,6 +872,7 @@ module_init(idxd_init_module);
|
|||||||
|
|
||||||
static void __exit idxd_exit_module(void)
|
static void __exit idxd_exit_module(void)
|
||||||
{
|
{
|
||||||
|
idxd_driver_unregister(&idxd_drv);
|
||||||
idxd_driver_unregister(&dsa_drv);
|
idxd_driver_unregister(&dsa_drv);
|
||||||
pci_unregister_driver(&idxd_pci_driver);
|
pci_unregister_driver(&idxd_pci_driver);
|
||||||
idxd_cdev_remove();
|
idxd_cdev_remove();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user