Commit 0174f581 authored by Abhijit Gangurde's avatar Abhijit Gangurde Committed by Greg Kroah-Hartman
Browse files

cdx: add sysfs for bus reset



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

Signed-off-by: default avatarAbhijit Gangurde <abhijit.gangurde@amd.com>
Link: https://lore.kernel.org/r/20231017160505.10640-7-abhijit.gangurde@amd.com


Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent e3cfd49c
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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::

+22 −4
Original line number Diff line number Diff line
@@ -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;

	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);
	if (ret)
		return ret;

	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,
};