cdx: add sysfs for bus reset

Add sysfs interface reset to reset all the devices on the CDX bus.

Signed-off-by: Abhijit Gangurde <abhijit.gangurde@amd.com>
Link: https://lore.kernel.org/r/20231017160505.10640-7-abhijit.gangurde@amd.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
Abhijit Gangurde 2023-10-17 21:35:04 +05:30 committed by Greg Kroah-Hartman
parent e3cfd49cb9
commit 0174f58104
2 changed files with 26 additions and 8 deletions

View File

@ -45,10 +45,10 @@ What: /sys/bus/cdx/devices/.../reset
Date: March 2023
Contact: nipun.gupta@amd.com
Description:
Writing y/1/on to this file resets the CDX device.
On resetting the device, the corresponding driver is notified
twice, once before the device is being reset, and again after
the reset has been complete.
Writing y/1/on to this file resets the CDX device or all devices
on the bus. On resetting the device, the corresponding driver is
notified twice, once before the device is being reset, and again
after the reset has been complete.
For example::

View File

@ -110,6 +110,20 @@ int cdx_dev_reset(struct device *dev)
}
EXPORT_SYMBOL_GPL(cdx_dev_reset);
/**
* reset_cdx_device - Reset a CDX device
* @dev: CDX device
* @data: This is always passed as NULL, and is not used in this API,
* but is required here as the device_for_each_child() API expects
* the passed function to have this as an argument.
*
* Return: -errno on failure, 0 on success.
*/
static int reset_cdx_device(struct device *dev, void *data)
{
return cdx_dev_reset(dev);
}
/**
* cdx_unregister_device - Unregister a CDX device
* @dev: CDX device
@ -343,6 +357,7 @@ static DEVICE_ATTR_WO(remove);
static ssize_t reset_store(struct device *dev, struct device_attribute *attr,
const char *buf, size_t count)
{
struct cdx_device *cdx_dev = to_cdx_device(dev);
bool val;
int ret;
@ -352,11 +367,13 @@ static ssize_t reset_store(struct device *dev, struct device_attribute *attr,
if (!val)
return -EINVAL;
ret = cdx_dev_reset(dev);
if (ret)
return ret;
if (cdx_dev->is_bus)
/* Reset all the devices attached to cdx bus */
ret = device_for_each_child(dev, NULL, reset_cdx_device);
else
ret = cdx_dev_reset(dev);
return count;
return ret < 0 ? ret : count;
}
static DEVICE_ATTR_WO(reset);
@ -461,6 +478,7 @@ static const struct attribute_group cdx_dev_group = {
static struct attribute *cdx_bus_dev_attrs[] = {
&dev_attr_enable.attr,
&dev_attr_reset.attr,
NULL,
};