Skip to content

Commit

Permalink
cdx: Remove cdx controller list from cdx bus system
Browse files Browse the repository at this point in the history
Remove xarray list of cdx controller. Instead, use platform bus
to locate the cdx controller using compat string used by cdx
controller platform driver.
Also, use ida to allocate a unique id for the controller.

Signed-off-by: Abhijit Gangurde <abhijit.gangurde@amd.com>
Link: https://lore.kernel.org/r/20231017160505.10640-2-abhijit.gangurde@amd.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
abhijitG-xlnx authored and gregkh committed Oct 27, 2023
1 parent c40e665 commit 54b406e
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 14 deletions.
42 changes: 28 additions & 14 deletions drivers/cdx/cdx.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@
#include <linux/of_device.h>
#include <linux/slab.h>
#include <linux/mm.h>
#include <linux/xarray.h>
#include <linux/idr.h>
#include <linux/cdx/cdx_bus.h>
#include <linux/iommu.h>
#include <linux/dma-map-ops.h>
Expand All @@ -70,8 +70,10 @@
#define CDX_DEFAULT_DMA_MASK (~0ULL)
#define MAX_CDX_CONTROLLERS 16

/* CDX controllers registered with the CDX bus */
static DEFINE_XARRAY_ALLOC(cdx_controllers);
/* IDA for CDX controllers registered with the CDX bus */
static DEFINE_IDA(cdx_controller_ida);

static char *compat_node_name = "xlnx,versal-net-cdx";

/**
* cdx_dev_reset - Reset a CDX device
Expand Down Expand Up @@ -384,7 +386,8 @@ static ssize_t rescan_store(const struct bus_type *bus,
const char *buf, size_t count)
{
struct cdx_controller *cdx;
unsigned long index;
struct platform_device *pd;
struct device_node *np;
bool val;

if (kstrtobool(buf, &val) < 0)
Expand All @@ -397,12 +400,19 @@ static ssize_t rescan_store(const struct bus_type *bus,
cdx_unregister_devices(&cdx_bus_type);

/* Rescan all the devices */
xa_for_each(&cdx_controllers, index, cdx) {
int ret;
for_each_compatible_node(np, NULL, compat_node_name) {
if (!np)
return -EINVAL;

ret = cdx->ops->scan(cdx);
if (ret)
dev_err(cdx->dev, "cdx bus scanning failed\n");
pd = of_find_device_by_node(np);
if (!pd)
return -EINVAL;

cdx = platform_get_drvdata(pd);
if (cdx && cdx->controller_registered && cdx->ops->scan)
cdx->ops->scan(cdx);

put_device(&pd->dev);
}

return count;
Expand Down Expand Up @@ -520,17 +530,20 @@ int cdx_register_controller(struct cdx_controller *cdx)
{
int ret;

ret = xa_alloc(&cdx_controllers, &cdx->id, cdx,
XA_LIMIT(0, MAX_CDX_CONTROLLERS - 1), GFP_KERNEL);
if (ret) {
ret = ida_alloc_range(&cdx_controller_ida, 0, MAX_CDX_CONTROLLERS - 1, GFP_KERNEL);
if (ret < 0) {
dev_err(cdx->dev,
"No free index available. Maximum controllers already registered\n");
cdx->id = (u8)MAX_CDX_CONTROLLERS;
return ret;
}

cdx->id = ret;

/* Scan all the devices */
cdx->ops->scan(cdx);
if (cdx->ops->scan)
cdx->ops->scan(cdx);
cdx->controller_registered = true;

return 0;
}
Expand All @@ -541,8 +554,9 @@ void cdx_unregister_controller(struct cdx_controller *cdx)
if (cdx->id >= MAX_CDX_CONTROLLERS)
return;

cdx->controller_registered = false;
device_for_each_child(cdx->dev, NULL, cdx_unregister_device);
xa_erase(&cdx_controllers, cdx->id);
ida_free(&cdx_controller_ida, cdx->id);
}
EXPORT_SYMBOL_GPL(cdx_unregister_controller);

Expand Down
2 changes: 2 additions & 0 deletions include/linux/cdx/cdx_bus.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,12 +63,14 @@ struct cdx_ops {
* @dev: Linux device associated with the CDX controller.
* @priv: private data
* @id: Controller ID
* @controller_registered: controller registered with bus
* @ops: CDX controller ops
*/
struct cdx_controller {
struct device *dev;
void *priv;
u32 id;
bool controller_registered;
struct cdx_ops *ops;
};

Expand Down

0 comments on commit 54b406e

Please sign in to comment.