[RFC PATCH] drm/amdgpu: Refactor sysfs attr functions in AMDGPU for reusability

Christian König ckoenig.leichtzumerken at gmail.com
Fri May 24 14:40:02 UTC 2024


Am 23.05.24 um 11:18 schrieb Srinivasan Shanmugam:
> This commit refactors the sysfs attribute management functions
> (`amdgpu_device_attr_create`, `amdgpu_device_attr_remove`,
> `amdgpu_device_attr_create_groups`, `amdgpu_device_attr_remove_groups`)
> into `amdgpu_sysfs.c`, which were originally in `amdgpu_pm.c`. This
> change allows these functions to be reused by other modules like gfx,
> pm, etc.
>
> Additionally, the attribute update logic is now encapsulated in the
> `pm_update_sysfs_attr` function, which is located in amdgpu_pm.c. This
> function is specific to the pm module and is invoked by
> amdgpu_device_attr_create for each attribute before the attribute is
> created.
>
> The `amdgpu_device_attr_create_groups` function has also been updated to
> use `pm_update_syfs_attr`. This ensures that the attribute update logic
> is consistently applied to all attributes.
>
> This refactoring enhances the modularity and maintainability of the
> code. It also increases the reusability of the attribute management
> functions, allowing them to be used by multiple modules.
>
> Cc: Lijo Lazar <lijo.lazar at amd.com>
> Cc: Alex Deucher <alexander.deucher at amd.com>
> Cc: Christian König <christian.koenig at amd.com>
> Suggested-by: Alex Deucher <alexander.deucher at amd.com>
> Signed-off-by: Srinivasan Shanmugam <srinivasan.shanmugam at amd.com>

While at it you could fix some minor coding style nits. See below.

With that fixed the patch is Reviewed-by: Christian König 
<christian.koenig at amd.com>

> ---
>   drivers/gpu/drm/amd/amdgpu/Makefile       |   3 +-
>   drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.c | 112 ++++++++++++++++
>   drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.h |  99 ++++++++++++++
>   drivers/gpu/drm/amd/pm/amdgpu_pm.c        | 150 +++++++---------------
>   drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h    |  59 ---------
>   5 files changed, 256 insertions(+), 167 deletions(-)
>   create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.c
>   create mode 100644 drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.h
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/Makefile b/drivers/gpu/drm/amd/amdgpu/Makefile
> index 1f6b56ec99f6..8c782e26dfcb 100644
> --- a/drivers/gpu/drm/amd/amdgpu/Makefile
> +++ b/drivers/gpu/drm/amd/amdgpu/Makefile
> @@ -81,7 +81,8 @@ amdgpu-y += amdgpu_device.o amdgpu_doorbell_mgr.o amdgpu_kms.o \
>   	amdgpu_umc.o smu_v11_0_i2c.o amdgpu_fru_eeprom.o amdgpu_rap.o \
>   	amdgpu_fw_attestation.o amdgpu_securedisplay.o \
>   	amdgpu_eeprom.o amdgpu_mca.o amdgpu_psp_ta.o amdgpu_lsdma.o \
> -	amdgpu_ring_mux.o amdgpu_xcp.o amdgpu_seq64.o amdgpu_aca.o amdgpu_dev_coredump.o
> +	amdgpu_ring_mux.o amdgpu_xcp.o amdgpu_seq64.o amdgpu_aca.o amdgpu_dev_coredump.o \
> +	amdgpu_sysfs.o
>   
>   amdgpu-$(CONFIG_PROC_FS) += amdgpu_fdinfo.o
>   
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.c
> new file mode 100644
> index 000000000000..bbdf3e8966d5
> --- /dev/null
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.c
> @@ -0,0 +1,112 @@
> +// SPDX-License-Identifier: MIT
> +/*
> + * Copyright 2017 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + */
> +
> +#include "amdgpu.h"
> +#include "amdgpu_dpm.h"
> +#include "amdgpu_drv.h"
> +#include "amdgpu_reset.h"
> +#include "amdgpu_sysfs.h"
> +#include "atom.h"
> +#include <linux/pci.h>
> +#include <linux/hwmon.h>
> +#include <linux/hwmon-sysfs.h>
> +#include <linux/nospec.h>
> +#include <linux/pm_runtime.h>
> +#include <asm/processor.h>
> +
> +int amdgpu_sysfs_attr_create(struct amdgpu_device *adev,
> +			     struct amdgpu_device_attr *attr,
> +			     u32 mask, struct list_head *attr_list)
> +{
> +	int ret;
> +	struct amdgpu_device_attr_entry *attr_entry;
> +	struct device_attribute *dev_attr;
> +	const char *name;

Please declare ret last here.

> +
> +	if (!attr)
> +		return -EINVAL;
> +
> +	dev_attr = &attr->dev_attr;
> +	name = dev_attr->attr.name;
> +
> +	ret = device_create_file(adev->dev, dev_attr);
> +	if (ret) {
> +		dev_err(adev->dev, "failed to create device file %s, ret = %d\n",
> +			name, ret);
> +	}
> +
> +	attr_entry = kmalloc(sizeof(*attr_entry), GFP_KERNEL);
> +	if (!attr_entry)
> +		return -ENOMEM;
> +
> +	attr_entry->attr = attr;
> +	INIT_LIST_HEAD(&attr_entry->entry);
> +
> +	list_add_tail(&attr_entry->entry, attr_list);
> +
> +	return ret;
> +}
> +
> +int amdgpu_sysfs_attr_create_groups(struct amdgpu_device *adev,
> +				    struct amdgpu_device_attr *attrs,
> +				    u32 counts, u32 mask,
> +				    struct list_head *attr_list)
> +{
> +	int ret = 0;
> +	u32 i = 0;

Don't initialize local variables.

Regards,
Christian.

> +
> +	for (i = 0; i < counts; i++) {
> +		ret = amdgpu_sysfs_attr_create(adev, &attrs[i], mask, attr_list);
> +		if (ret)
> +			goto failed;
> +	}
> +
> +	return 0;
> +
> +failed:
> +	amdgpu_sysfs_attr_remove_groups(adev, attr_list);
> +
> +	return ret;
> +}
> +
> +void amdgpu_sysfs_attr_remove(struct amdgpu_device *adev, struct amdgpu_device_attr *attr)
> +{
> +	struct device_attribute *dev_attr = &attr->dev_attr;
> +
> +	device_remove_file(adev->dev, dev_attr);
> +}
> +
> +void amdgpu_sysfs_attr_remove_groups(struct amdgpu_device *adev,
> +				     struct list_head *attr_list)
> +{
> +	struct amdgpu_device_attr_entry *entry, *entry_tmp;
> +
> +	if (list_empty(attr_list))
> +		return;
> +
> +	list_for_each_entry_safe(entry, entry_tmp, attr_list, entry) {
> +		amdgpu_sysfs_attr_remove(adev, entry->attr);
> +		list_del(&entry->entry);
> +		kfree(entry);
> +	}
> +}
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.h
> new file mode 100644
> index 000000000000..ab2fa7070941
> --- /dev/null
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_sysfs.h
> @@ -0,0 +1,99 @@
> +/* SPDX-License-Identifier: MIT */
> +/*
> + * Copyright 2014 Advanced Micro Devices, Inc.
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
> + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
> + * OTHER DEALINGS IN THE SOFTWARE.
> + *
> + */
> +
> +#ifndef __AMDGPU_SYSFS_H__
> +#define __AMDGPU_SYSFS_H__
> +
> +#define to_amdgpu_device_attr(_dev_attr) \
> +	container_of(_dev_attr, struct amdgpu_device_attr, dev_attr)
> +
> +#define __AMDGPU_DEVICE_ATTR(_name, _mode, _show, _store, _flags, ...)	\
> +	{ .dev_attr = __ATTR(_name, _mode, _show, _store),		\
> +	  .flags = _flags,						\
> +	  ##__VA_ARGS__, }
> +
> +#define AMDGPU_DEVICE_ATTR(_name, _mode, _flags, ...)			\
> +	__AMDGPU_DEVICE_ATTR(_name, _mode,				\
> +			     amdgpu_get_##_name, amdgpu_set_##_name,	\
> +			     _flags, ##__VA_ARGS__)
> +
> +#define AMDGPU_DEVICE_ATTR_RW(_name, _flags, ...)			\
> +	AMDGPU_DEVICE_ATTR(_name, 0644,			\
> +			   _flags, ##__VA_ARGS__)
> +
> +#define AMDGPU_DEVICE_ATTR_RO(_name, _flags, ...)			\
> +	__AMDGPU_DEVICE_ATTR(_name, 0444,				\
> +			     amdgpu_get_##_name, NULL,			\
> +			     _flags, ##__VA_ARGS__)
> +
> +#define AMDGPU_DEVICE_ATTR_WO(_name, _flags, ...)			\
> +	__AMDGPU_DEVICE_ATTR(_name, 0200,				\
> +			     NULL, amdgpu_set_##_name,			\
> +			     _flags, ##__VA_ARGS__)
> +
> +struct cg_flag_name {
> +	u64 flag;
> +	const char *name;
> +};
> +
> +enum amdgpu_device_attr_flags {
> +	ATTR_FLAG_BASIC = (1 << 0),
> +	ATTR_FLAG_ONEVF = (1 << 16),
> +};
> +
> +#define ATTR_FLAG_TYPE_MASK	(0x0000ffff)
> +#define ATTR_FLAG_MODE_MASK	(0xffff0000)
> +#define ATTR_FLAG_MASK_ALL	(0xffffffff)
> +
> +enum amdgpu_device_attr_states {
> +	ATTR_STATE_UNSUPPORTED = 0,
> +	ATTR_STATE_SUPPORTED,
> +};
> +
> +struct amdgpu_device_attr {
> +	struct device_attribute dev_attr;
> +	enum amdgpu_device_attr_flags flags;
> +	int (*attr_update)(struct amdgpu_device *adev, struct amdgpu_device_attr *attr,
> +			   u32 mask, enum amdgpu_device_attr_states *states);
> +
> +};
> +
> +struct amdgpu_device_attr_entry {
> +	struct list_head entry;
> +	struct amdgpu_device_attr *attr;
> +};
> +
> +int amdgpu_sysfs_attr_create(struct amdgpu_device *adev,
> +			     struct amdgpu_device_attr *attr,
> +			     u32 mask, struct list_head *attr_list);
> +int amdgpu_sysfs_attr_create_groups(struct amdgpu_device *adev,
> +				    struct amdgpu_device_attr *attrs,
> +				    u32 counts,
> +				    u32 mask,
> +				    struct list_head *attr_list);
> +void amdgpu_sysfs_attr_remove_groups(struct amdgpu_device *adev,
> +				     struct list_head *attr_list);
> +void amdgpu_sysfs_attr_remove(struct amdgpu_device *adev,
> +			      struct amdgpu_device_attr *attr);
> +#endif
> diff --git a/drivers/gpu/drm/amd/pm/amdgpu_pm.c b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> index 57e449bc2379..c16748f5baff 100644
> --- a/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> +++ b/drivers/gpu/drm/amd/pm/amdgpu_pm.c
> @@ -28,6 +28,7 @@
>   #include "amdgpu_pm.h"
>   #include "amdgpu_reset.h"
>   #include "amdgpu_dpm.h"
> +#include "amdgpu_sysfs.h"
>   #include "atom.h"
>   #include <linux/pci.h>
>   #include <linux/hwmon.h>
> @@ -2368,7 +2369,7 @@ static ssize_t amdgpu_set_xgmi_plpd_policy(struct device *dev,
>   	return count;
>   }
>   
> -static struct amdgpu_device_attr amdgpu_device_attrs[] = {
> +static struct amdgpu_device_attr amdgpu_pm_device_attrs[] = {
>   	AMDGPU_DEVICE_ATTR_RW(power_dpm_state,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),
>   	AMDGPU_DEVICE_ATTR_RW(power_dpm_force_performance_level,	ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),
>   	AMDGPU_DEVICE_ATTR_RO(pp_num_states,				ATTR_FLAG_BASIC|ATTR_FLAG_ONEVF),
> @@ -2594,104 +2595,6 @@ static int default_attr_update(struct amdgpu_device *adev, struct amdgpu_device_
>   	return 0;
>   }
>   
> -
> -static int amdgpu_device_attr_create(struct amdgpu_device *adev,
> -				     struct amdgpu_device_attr *attr,
> -				     uint32_t mask, struct list_head *attr_list)
> -{
> -	int ret = 0;
> -	enum amdgpu_device_attr_states attr_states = ATTR_STATE_SUPPORTED;
> -	struct amdgpu_device_attr_entry *attr_entry;
> -	struct device_attribute *dev_attr;
> -	const char *name;
> -
> -	int (*attr_update)(struct amdgpu_device *adev, struct amdgpu_device_attr *attr,
> -			   uint32_t mask, enum amdgpu_device_attr_states *states) = default_attr_update;
> -
> -	if (!attr)
> -		return -EINVAL;
> -
> -	dev_attr = &attr->dev_attr;
> -	name = dev_attr->attr.name;
> -
> -	attr_update = attr->attr_update ? attr->attr_update : default_attr_update;
> -
> -	ret = attr_update(adev, attr, mask, &attr_states);
> -	if (ret) {
> -		dev_err(adev->dev, "failed to update device file %s, ret = %d\n",
> -			name, ret);
> -		return ret;
> -	}
> -
> -	if (attr_states == ATTR_STATE_UNSUPPORTED)
> -		return 0;
> -
> -	ret = device_create_file(adev->dev, dev_attr);
> -	if (ret) {
> -		dev_err(adev->dev, "failed to create device file %s, ret = %d\n",
> -			name, ret);
> -	}
> -
> -	attr_entry = kmalloc(sizeof(*attr_entry), GFP_KERNEL);
> -	if (!attr_entry)
> -		return -ENOMEM;
> -
> -	attr_entry->attr = attr;
> -	INIT_LIST_HEAD(&attr_entry->entry);
> -
> -	list_add_tail(&attr_entry->entry, attr_list);
> -
> -	return ret;
> -}
> -
> -static void amdgpu_device_attr_remove(struct amdgpu_device *adev, struct amdgpu_device_attr *attr)
> -{
> -	struct device_attribute *dev_attr = &attr->dev_attr;
> -
> -	device_remove_file(adev->dev, dev_attr);
> -}
> -
> -static void amdgpu_device_attr_remove_groups(struct amdgpu_device *adev,
> -					     struct list_head *attr_list);
> -
> -static int amdgpu_device_attr_create_groups(struct amdgpu_device *adev,
> -					    struct amdgpu_device_attr *attrs,
> -					    uint32_t counts,
> -					    uint32_t mask,
> -					    struct list_head *attr_list)
> -{
> -	int ret = 0;
> -	uint32_t i = 0;
> -
> -	for (i = 0; i < counts; i++) {
> -		ret = amdgpu_device_attr_create(adev, &attrs[i], mask, attr_list);
> -		if (ret)
> -			goto failed;
> -	}
> -
> -	return 0;
> -
> -failed:
> -	amdgpu_device_attr_remove_groups(adev, attr_list);
> -
> -	return ret;
> -}
> -
> -static void amdgpu_device_attr_remove_groups(struct amdgpu_device *adev,
> -					     struct list_head *attr_list)
> -{
> -	struct amdgpu_device_attr_entry *entry, *entry_tmp;
> -
> -	if (list_empty(attr_list))
> -		return ;
> -
> -	list_for_each_entry_safe(entry, entry_tmp, attr_list, entry) {
> -		amdgpu_device_attr_remove(adev, entry->attr);
> -		list_del(&entry->entry);
> -		kfree(entry);
> -	}
> -}
> -
>   static ssize_t amdgpu_hwmon_show_temp(struct device *dev,
>   				      struct device_attribute *attr,
>   				      char *buf)
> @@ -4520,11 +4423,36 @@ static int amdgpu_od_set_init(struct amdgpu_device *adev)
>   	return ret;
>   }
>   
> +static int pm_update_sysfs_attr(struct amdgpu_device *adev, struct amdgpu_device_attr *attr,
> +				u32 mask, enum amdgpu_device_attr_states *states)
> +{
> +	int ret;
> +	struct device_attribute *dev_attr = &attr->dev_attr;
> +	const char *name = dev_attr->attr.name;
> +
> +	int (*attr_update)(struct amdgpu_device *adev, struct amdgpu_device_attr *attr,
> +			   u32 mask, enum amdgpu_device_attr_states *states) = default_attr_update;
> +
> +	attr_update = attr->attr_update ? attr->attr_update : default_attr_update;
> +
> +	ret = attr_update(adev, attr, mask, states);
> +	if (ret) {
> +		dev_err(adev->dev, "failed to update device file %s, ret = %d\n",
> +			name, ret);
> +		return ret;
> +	}
> +
> +	if (*states == ATTR_STATE_UNSUPPORTED)
> +		return 0;
> +
> +	return ret;
> +}
> +
>   int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
>   {
>   	enum amdgpu_sriov_vf_mode mode;
>   	uint32_t mask = 0;
> -	int ret;
> +	int ret, i;
>   
>   	if (adev->pm.sysfs_initialized)
>   		return 0;
> @@ -4561,11 +4489,19 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
>   		break;
>   	}
>   
> -	ret = amdgpu_device_attr_create_groups(adev,
> -					       amdgpu_device_attrs,
> -					       ARRAY_SIZE(amdgpu_device_attrs),
> -					       mask,
> -					       &adev->pm.pm_attr_list);
> +	for (i = 0; i < ARRAY_SIZE(amdgpu_pm_device_attrs); i++) {
> +		enum amdgpu_device_attr_states attr_states = ATTR_STATE_SUPPORTED;
> +
> +		ret = pm_update_sysfs_attr(adev, &amdgpu_pm_device_attrs[i], mask, &attr_states);
> +		if (ret)
> +			return ret;
> +	}
> +
> +	ret = amdgpu_sysfs_attr_create_groups(adev,
> +					      amdgpu_pm_device_attrs,
> +					      ARRAY_SIZE(amdgpu_pm_device_attrs),
> +					      mask,
> +					      &adev->pm.pm_attr_list);
>   	if (ret)
>   		goto err_out0;
>   
> @@ -4580,7 +4516,7 @@ int amdgpu_pm_sysfs_init(struct amdgpu_device *adev)
>   	return 0;
>   
>   err_out1:
> -	amdgpu_device_attr_remove_groups(adev, &adev->pm.pm_attr_list);
> +	amdgpu_sysfs_attr_remove_groups(adev, &adev->pm.pm_attr_list);
>   err_out0:
>   	if (adev->pm.int_hwmon_dev)
>   		hwmon_device_unregister(adev->pm.int_hwmon_dev);
> @@ -4595,7 +4531,7 @@ void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev)
>   	if (adev->pm.int_hwmon_dev)
>   		hwmon_device_unregister(adev->pm.int_hwmon_dev);
>   
> -	amdgpu_device_attr_remove_groups(adev, &adev->pm.pm_attr_list);
> +	amdgpu_sysfs_attr_remove_groups(adev, &adev->pm.pm_attr_list);
>   }
>   
>   /*
> diff --git a/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h b/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h
> index 3810fedba609..093c39a5d715 100644
> --- a/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h
> +++ b/drivers/gpu/drm/amd/pm/inc/amdgpu_pm.h
> @@ -24,65 +24,6 @@
>   #ifndef __AMDGPU_PM_H__
>   #define __AMDGPU_PM_H__
>   
> -struct cg_flag_name {
> -	u64 flag;
> -	const char *name;
> -};
> -
> -enum amdgpu_device_attr_flags {
> -	ATTR_FLAG_BASIC = (1 << 0),
> -	ATTR_FLAG_ONEVF = (1 << 16),
> -};
> -
> -#define ATTR_FLAG_TYPE_MASK	(0x0000ffff)
> -#define ATTR_FLAG_MODE_MASK	(0xffff0000)
> -#define ATTR_FLAG_MASK_ALL	(0xffffffff)
> -
> -enum amdgpu_device_attr_states {
> -	ATTR_STATE_UNSUPPORTED = 0,
> -	ATTR_STATE_SUPPORTED,
> -};
> -
> -struct amdgpu_device_attr {
> -	struct device_attribute dev_attr;
> -	enum amdgpu_device_attr_flags flags;
> -	int (*attr_update)(struct amdgpu_device *adev, struct amdgpu_device_attr *attr,
> -			   uint32_t mask, enum amdgpu_device_attr_states *states);
> -
> -};
> -
> -struct amdgpu_device_attr_entry {
> -	struct list_head entry;
> -	struct amdgpu_device_attr *attr;
> -};
> -
> -#define to_amdgpu_device_attr(_dev_attr) \
> -	container_of(_dev_attr, struct amdgpu_device_attr, dev_attr)
> -
> -#define __AMDGPU_DEVICE_ATTR(_name, _mode, _show, _store, _flags, ...)	\
> -	{ .dev_attr = __ATTR(_name, _mode, _show, _store),		\
> -	  .flags = _flags,						\
> -	  ##__VA_ARGS__, }
> -
> -#define AMDGPU_DEVICE_ATTR(_name, _mode, _flags, ...)			\
> -	__AMDGPU_DEVICE_ATTR(_name, _mode,				\
> -			     amdgpu_get_##_name, amdgpu_set_##_name,	\
> -			     _flags, ##__VA_ARGS__)
> -
> -#define AMDGPU_DEVICE_ATTR_RW(_name, _flags, ...)			\
> -	AMDGPU_DEVICE_ATTR(_name, S_IRUGO | S_IWUSR,			\
> -			   _flags, ##__VA_ARGS__)
> -
> -#define AMDGPU_DEVICE_ATTR_RO(_name, _flags, ...)			\
> -	__AMDGPU_DEVICE_ATTR(_name, S_IRUGO,				\
> -			     amdgpu_get_##_name, NULL,			\
> -			     _flags, ##__VA_ARGS__)
> -
> -#define AMDGPU_DEVICE_ATTR_WO(_name, _flags, ...)			\
> -	__AMDGPU_DEVICE_ATTR(_name, 0200,				\
> -			     NULL, amdgpu_set_##_name,			\
> -			     _flags, ##__VA_ARGS__)
> -
>   int amdgpu_pm_sysfs_init(struct amdgpu_device *adev);
>   int amdgpu_pm_virt_sysfs_init(struct amdgpu_device *adev);
>   void amdgpu_pm_sysfs_fini(struct amdgpu_device *adev);



More information about the amd-gfx mailing list