cdx: Remove cdx controller list from cdx bus system
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>
This commit is contained in:
parent
c40e665390
commit
54b406e10f
@ -60,7 +60,7 @@
|
|||||||
#include <linux/of_device.h>
|
#include <linux/of_device.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/xarray.h>
|
#include <linux/idr.h>
|
||||||
#include <linux/cdx/cdx_bus.h>
|
#include <linux/cdx/cdx_bus.h>
|
||||||
#include <linux/iommu.h>
|
#include <linux/iommu.h>
|
||||||
#include <linux/dma-map-ops.h>
|
#include <linux/dma-map-ops.h>
|
||||||
@ -70,8 +70,10 @@
|
|||||||
#define CDX_DEFAULT_DMA_MASK (~0ULL)
|
#define CDX_DEFAULT_DMA_MASK (~0ULL)
|
||||||
#define MAX_CDX_CONTROLLERS 16
|
#define MAX_CDX_CONTROLLERS 16
|
||||||
|
|
||||||
/* CDX controllers registered with the CDX bus */
|
/* IDA for CDX controllers registered with the CDX bus */
|
||||||
static DEFINE_XARRAY_ALLOC(cdx_controllers);
|
static DEFINE_IDA(cdx_controller_ida);
|
||||||
|
|
||||||
|
static char *compat_node_name = "xlnx,versal-net-cdx";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cdx_dev_reset - Reset a CDX device
|
* cdx_dev_reset - Reset a CDX device
|
||||||
@ -384,7 +386,8 @@ static ssize_t rescan_store(const struct bus_type *bus,
|
|||||||
const char *buf, size_t count)
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
struct cdx_controller *cdx;
|
struct cdx_controller *cdx;
|
||||||
unsigned long index;
|
struct platform_device *pd;
|
||||||
|
struct device_node *np;
|
||||||
bool val;
|
bool val;
|
||||||
|
|
||||||
if (kstrtobool(buf, &val) < 0)
|
if (kstrtobool(buf, &val) < 0)
|
||||||
@ -397,12 +400,19 @@ static ssize_t rescan_store(const struct bus_type *bus,
|
|||||||
cdx_unregister_devices(&cdx_bus_type);
|
cdx_unregister_devices(&cdx_bus_type);
|
||||||
|
|
||||||
/* Rescan all the devices */
|
/* Rescan all the devices */
|
||||||
xa_for_each(&cdx_controllers, index, cdx) {
|
for_each_compatible_node(np, NULL, compat_node_name) {
|
||||||
int ret;
|
if (!np)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
ret = cdx->ops->scan(cdx);
|
pd = of_find_device_by_node(np);
|
||||||
if (ret)
|
if (!pd)
|
||||||
dev_err(cdx->dev, "cdx bus scanning failed\n");
|
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;
|
return count;
|
||||||
@ -520,17 +530,20 @@ int cdx_register_controller(struct cdx_controller *cdx)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = xa_alloc(&cdx_controllers, &cdx->id, cdx,
|
ret = ida_alloc_range(&cdx_controller_ida, 0, MAX_CDX_CONTROLLERS - 1, GFP_KERNEL);
|
||||||
XA_LIMIT(0, MAX_CDX_CONTROLLERS - 1), GFP_KERNEL);
|
if (ret < 0) {
|
||||||
if (ret) {
|
|
||||||
dev_err(cdx->dev,
|
dev_err(cdx->dev,
|
||||||
"No free index available. Maximum controllers already registered\n");
|
"No free index available. Maximum controllers already registered\n");
|
||||||
cdx->id = (u8)MAX_CDX_CONTROLLERS;
|
cdx->id = (u8)MAX_CDX_CONTROLLERS;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cdx->id = ret;
|
||||||
|
|
||||||
/* Scan all the devices */
|
/* Scan all the devices */
|
||||||
|
if (cdx->ops->scan)
|
||||||
cdx->ops->scan(cdx);
|
cdx->ops->scan(cdx);
|
||||||
|
cdx->controller_registered = true;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -541,8 +554,9 @@ void cdx_unregister_controller(struct cdx_controller *cdx)
|
|||||||
if (cdx->id >= MAX_CDX_CONTROLLERS)
|
if (cdx->id >= MAX_CDX_CONTROLLERS)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
cdx->controller_registered = false;
|
||||||
device_for_each_child(cdx->dev, NULL, cdx_unregister_device);
|
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);
|
EXPORT_SYMBOL_GPL(cdx_unregister_controller);
|
||||||
|
|
||||||
|
@ -63,12 +63,14 @@ struct cdx_ops {
|
|||||||
* @dev: Linux device associated with the CDX controller.
|
* @dev: Linux device associated with the CDX controller.
|
||||||
* @priv: private data
|
* @priv: private data
|
||||||
* @id: Controller ID
|
* @id: Controller ID
|
||||||
|
* @controller_registered: controller registered with bus
|
||||||
* @ops: CDX controller ops
|
* @ops: CDX controller ops
|
||||||
*/
|
*/
|
||||||
struct cdx_controller {
|
struct cdx_controller {
|
||||||
struct device *dev;
|
struct device *dev;
|
||||||
void *priv;
|
void *priv;
|
||||||
u32 id;
|
u32 id;
|
||||||
|
bool controller_registered;
|
||||||
struct cdx_ops *ops;
|
struct cdx_ops *ops;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user