Commit 4b73e4eb authored by Dave Jiang's avatar Dave Jiang Committed by Vinod Koul
Browse files

dmaengine: idxd: iax bus removal



There is no need to have an additional bus for the IAX device. The removal
of IAX will change user ABI as /sys/bus/iax will no longer exist.
The iax device will be moved to the dsa bus. The device id for dsa and
iax will now be combined rather than unique for each device type in order
to accommodate the iax devices. This is in preparation for fixing the
sub-driver code for idxd. There's no hardware deployment for Sapphire
Rapids platform yet, which means that users have no reason to have
developed scripts against this ABI. There is some exposure to
released versions of accel-config, but those are being fixed up and
an accel-config upgrade is reasonable to get IAX support. As far as
accel-config is concerned IAX support starts when these devices appear
under /sys/bus/dsa, and old accel-config just assumes that an empty /
missing /sys/bus/iax just means a lack of platform support.

Fixes: f25b4638 ("dmaengine: idxd: add IAX configuration support in the IDXD driver")
Suggested-by: default avatarDan Williams <dan.j.williams@intel.com>
Signed-off-by: default avatarDave Jiang <dave.jiang@intel.com>
Link: https://lore.kernel.org/r/161852988298.2203940.4529909758034944428.stgit@djiang5-desk3.ch.intel.com


Signed-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 04922b74
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -268,7 +268,7 @@ int idxd_wq_add_cdev(struct idxd_wq *wq)


	device_initialize(dev);
	device_initialize(dev);
	dev->parent = &wq->conf_dev;
	dev->parent = &wq->conf_dev;
	dev->bus = idxd_get_bus_type(idxd);
	dev->bus = &dsa_bus_type;
	dev->type = &idxd_cdev_device_type;
	dev->type = &idxd_cdev_device_type;
	dev->devt = MKDEV(MAJOR(cdev_ctx->devt), minor);
	dev->devt = MKDEV(MAJOR(cdev_ctx->devt), minor);


+1 −2
Original line number Original line Diff line number Diff line
@@ -257,6 +257,7 @@ extern struct bus_type dsa_bus_type;
extern struct bus_type iax_bus_type;
extern struct bus_type iax_bus_type;


extern bool support_enqcmd;
extern bool support_enqcmd;
extern struct ida idxd_ida;
extern struct device_type dsa_device_type;
extern struct device_type dsa_device_type;
extern struct device_type iax_device_type;
extern struct device_type iax_device_type;
extern struct device_type idxd_wq_device_type;
extern struct device_type idxd_wq_device_type;
@@ -346,7 +347,6 @@ static inline int idxd_wq_refcount(struct idxd_wq *wq)
	return wq->client_count;
	return wq->client_count;
};
};


struct ida *idxd_ida(struct idxd_device *idxd);
const char *idxd_get_dev_name(struct idxd_device *idxd);
const char *idxd_get_dev_name(struct idxd_device *idxd);
int idxd_register_bus_type(void);
int idxd_register_bus_type(void);
void idxd_unregister_bus_type(void);
void idxd_unregister_bus_type(void);
@@ -354,7 +354,6 @@ int idxd_register_devices(struct idxd_device *idxd);
void idxd_unregister_devices(struct idxd_device *idxd);
void idxd_unregister_devices(struct idxd_device *idxd);
int idxd_register_driver(void);
int idxd_register_driver(void);
void idxd_unregister_driver(void);
void idxd_unregister_driver(void);
struct bus_type *idxd_get_bus_type(struct idxd_device *idxd);
struct device_type *idxd_get_device_type(struct idxd_device *idxd);
struct device_type *idxd_get_device_type(struct idxd_device *idxd);


/* device interrupt control */
/* device interrupt control */
+6 −15
Original line number Original line Diff line number Diff line
@@ -33,8 +33,7 @@ MODULE_PARM_DESC(sva, "Toggle SVA support on/off");
#define DRV_NAME "idxd"
#define DRV_NAME "idxd"


bool support_enqcmd;
bool support_enqcmd;

DEFINE_IDA(idxd_ida);
static struct ida idxd_idas[IDXD_TYPE_MAX];


static struct pci_device_id idxd_pci_tbl[] = {
static struct pci_device_id idxd_pci_tbl[] = {
	/* DSA ver 1.0 platforms */
	/* DSA ver 1.0 platforms */
@@ -51,11 +50,6 @@ static char *idxd_name[] = {
	"iax"
	"iax"
};
};


struct ida *idxd_ida(struct idxd_device *idxd)
{
	return &idxd_idas[idxd->type];
}

const char *idxd_get_dev_name(struct idxd_device *idxd)
const char *idxd_get_dev_name(struct idxd_device *idxd)
{
{
	return idxd_name[idxd->type];
	return idxd_name[idxd->type];
@@ -167,7 +161,7 @@ static int idxd_setup_wqs(struct idxd_device *idxd)
		wq->idxd = idxd;
		wq->idxd = idxd;
		device_initialize(&wq->conf_dev);
		device_initialize(&wq->conf_dev);
		wq->conf_dev.parent = &idxd->conf_dev;
		wq->conf_dev.parent = &idxd->conf_dev;
		wq->conf_dev.bus = idxd_get_bus_type(idxd);
		wq->conf_dev.bus = &dsa_bus_type;
		wq->conf_dev.type = &idxd_wq_device_type;
		wq->conf_dev.type = &idxd_wq_device_type;
		rc = dev_set_name(&wq->conf_dev, "wq%d.%d", idxd->id, wq->id);
		rc = dev_set_name(&wq->conf_dev, "wq%d.%d", idxd->id, wq->id);
		if (rc < 0) {
		if (rc < 0) {
@@ -258,7 +252,7 @@ static int idxd_setup_groups(struct idxd_device *idxd)
		group->idxd = idxd;
		group->idxd = idxd;
		device_initialize(&group->conf_dev);
		device_initialize(&group->conf_dev);
		group->conf_dev.parent = &idxd->conf_dev;
		group->conf_dev.parent = &idxd->conf_dev;
		group->conf_dev.bus = idxd_get_bus_type(idxd);
		group->conf_dev.bus = &dsa_bus_type;
		group->conf_dev.type = &idxd_group_device_type;
		group->conf_dev.type = &idxd_group_device_type;
		rc = dev_set_name(&group->conf_dev, "group%d.%d", idxd->id, group->id);
		rc = dev_set_name(&group->conf_dev, "group%d.%d", idxd->id, group->id);
		if (rc < 0) {
		if (rc < 0) {
@@ -409,13 +403,13 @@ static struct idxd_device *idxd_alloc(struct pci_dev *pdev)


	idxd->pdev = pdev;
	idxd->pdev = pdev;
	idxd_set_type(idxd);
	idxd_set_type(idxd);
	idxd->id = ida_alloc(idxd_ida(idxd), GFP_KERNEL);
	idxd->id = ida_alloc(&idxd_ida, GFP_KERNEL);
	if (idxd->id < 0)
	if (idxd->id < 0)
		return NULL;
		return NULL;


	device_initialize(&idxd->conf_dev);
	device_initialize(&idxd->conf_dev);
	idxd->conf_dev.parent = dev;
	idxd->conf_dev.parent = dev;
	idxd->conf_dev.bus = idxd_get_bus_type(idxd);
	idxd->conf_dev.bus = &dsa_bus_type;
	idxd->conf_dev.type = idxd_get_device_type(idxd);
	idxd->conf_dev.type = idxd_get_device_type(idxd);
	rc = dev_set_name(&idxd->conf_dev, "%s%d", idxd_get_dev_name(idxd), idxd->id);
	rc = dev_set_name(&idxd->conf_dev, "%s%d", idxd_get_dev_name(idxd), idxd->id);
	if (rc < 0) {
	if (rc < 0) {
@@ -669,7 +663,7 @@ static struct pci_driver idxd_pci_driver = {


static int __init idxd_init_module(void)
static int __init idxd_init_module(void)
{
{
	int err, i;
	int err;


	/*
	/*
	 * If the CPU does not support MOVDIR64B or ENQCMDS, there's no point in
	 * If the CPU does not support MOVDIR64B or ENQCMDS, there's no point in
@@ -685,9 +679,6 @@ static int __init idxd_init_module(void)
	else
	else
		support_enqcmd = true;
		support_enqcmd = true;


	for (i = 0; i < IDXD_TYPE_MAX; i++)
		ida_init(&idxd_idas[i]);

	err = idxd_register_bus_type();
	err = idxd_register_bus_type();
	if (err < 0)
	if (err < 0)
		return err;
		return err;
+5 −69
Original line number Original line Diff line number Diff line
@@ -301,19 +301,6 @@ struct bus_type dsa_bus_type = {
	.shutdown = idxd_config_bus_shutdown,
	.shutdown = idxd_config_bus_shutdown,
};
};


struct bus_type iax_bus_type = {
	.name = "iax",
	.match = idxd_config_bus_match,
	.probe = idxd_config_bus_probe,
	.remove = idxd_config_bus_remove,
	.shutdown = idxd_config_bus_shutdown,
};

static struct bus_type *idxd_bus_types[] = {
	&dsa_bus_type,
	&iax_bus_type
};

static struct idxd_device_driver dsa_drv = {
static struct idxd_device_driver dsa_drv = {
	.drv = {
	.drv = {
		.name = "dsa",
		.name = "dsa",
@@ -323,25 +310,6 @@ static struct idxd_device_driver dsa_drv = {
	},
	},
};
};


static struct idxd_device_driver iax_drv = {
	.drv = {
		.name = "iax",
		.bus = &iax_bus_type,
		.owner = THIS_MODULE,
		.mod_name = KBUILD_MODNAME,
	},
};

static struct idxd_device_driver *idxd_drvs[] = {
	&dsa_drv,
	&iax_drv
};

struct bus_type *idxd_get_bus_type(struct idxd_device *idxd)
{
	return idxd_bus_types[idxd->type];
}

struct device_type *idxd_get_device_type(struct idxd_device *idxd)
struct device_type *idxd_get_device_type(struct idxd_device *idxd)
{
{
	if (idxd->type == IDXD_TYPE_DSA)
	if (idxd->type == IDXD_TYPE_DSA)
@@ -355,28 +323,12 @@ struct device_type *idxd_get_device_type(struct idxd_device *idxd)
/* IDXD generic driver setup */
/* IDXD generic driver setup */
int idxd_register_driver(void)
int idxd_register_driver(void)
{
{
	int i, rc;
	return driver_register(&dsa_drv.drv);

	for (i = 0; i < IDXD_TYPE_MAX; i++) {
		rc = driver_register(&idxd_drvs[i]->drv);
		if (rc < 0)
			goto drv_fail;
	}

	return 0;

drv_fail:
	while (--i >= 0)
		driver_unregister(&idxd_drvs[i]->drv);
	return rc;
}
}


void idxd_unregister_driver(void)
void idxd_unregister_driver(void)
{
{
	int i;
	driver_unregister(&dsa_drv.drv);

	for (i = 0; i < IDXD_TYPE_MAX; i++)
		driver_unregister(&idxd_drvs[i]->drv);
}
}


/* IDXD engine attributes */
/* IDXD engine attributes */
@@ -1637,7 +1589,7 @@ static void idxd_conf_device_release(struct device *dev)
	kfree(idxd->wqs);
	kfree(idxd->wqs);
	kfree(idxd->engines);
	kfree(idxd->engines);
	kfree(idxd->irq_entries);
	kfree(idxd->irq_entries);
	ida_free(idxd_ida(idxd), idxd->id);
	ida_free(&idxd_ida, idxd->id);
	kfree(idxd);
	kfree(idxd);
}
}


@@ -1792,26 +1744,10 @@ void idxd_unregister_devices(struct idxd_device *idxd)


int idxd_register_bus_type(void)
int idxd_register_bus_type(void)
{
{
	int i, rc;
	return bus_register(&dsa_bus_type);

	for (i = 0; i < IDXD_TYPE_MAX; i++) {
		rc = bus_register(idxd_bus_types[i]);
		if (rc < 0)
			goto bus_err;
	}

	return 0;

bus_err:
	while (--i >= 0)
		bus_unregister(idxd_bus_types[i]);
	return rc;
}
}


void idxd_unregister_bus_type(void)
void idxd_unregister_bus_type(void)
{
{
	int i;
	bus_unregister(&dsa_bus_type);

	for (i = 0; i < IDXD_TYPE_MAX; i++)
		bus_unregister(idxd_bus_types[i]);
}
}