[PATCH] drm/amd/amdgpu: Merge the smc/pcie/didt debugfs read/write methods
Christian König
ckoenig.leichtzumerken at gmail.com
Wed Apr 4 14:02:21 UTC 2018
Am 04.04.2018 um 15:35 schrieb Tom St Denis:
> Fold the read/write methods of the various register access
> debugfs entries into op functions.
>
> Signed-off-by: Tom St Denis <tom.stdenis at amd.com>
I would rather split out a dword helper. E.g. something like:
amdgpu_debugfs_regs_dword_op(struct file *f, char __user *buf, size_t
size, loff_t *pos,
int
(*op)(struct amdgpu_device *adev, char __user *buf))
{
...
}
And then you have op callbacks for PCIE, didt, SMC each in a read/write
variant.
Would save quite a bunch more of loc if I'm not completely mistaken.
Christian.
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c | 140 +++++++++++-----------------
> 1 file changed, 57 insertions(+), 83 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> index c98e59721444..b80e18469d25 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_debugfs.c
> @@ -177,8 +177,8 @@ static ssize_t amdgpu_debugfs_regs_write(struct file *f, const char __user *buf,
> return amdgpu_debugfs_process_reg_op(false, f, (char __user *)buf, size, pos);
> }
>
> -static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
> - size_t size, loff_t *pos)
> +static ssize_t amdgpu_debugfs_regs_pcie_op(bool read, struct file *f,
> + char __user *buf, size_t size, loff_t *pos)
> {
> struct amdgpu_device *adev = file_inode(f)->i_private;
> ssize_t result = 0;
> @@ -190,11 +190,18 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
> while (size) {
> uint32_t value;
>
> - value = RREG32_PCIE(*pos >> 2);
> - r = put_user(value, (uint32_t *)buf);
> - if (r)
> - return r;
> + if (read) {
> + value = RREG32_PCIE(*pos >> 2);
> + r = put_user(value, (uint32_t *)buf);
> + if (r)
> + return r;
> + } else {
> + r = get_user(value, (uint32_t *)buf);
> + if (r)
> + return r;
>
> + WREG32_PCIE(*pos >> 2, value);
> + }
> result += 4;
> buf += 4;
> *pos += 4;
> @@ -204,8 +211,20 @@ static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
> return result;
> }
>
> +static ssize_t amdgpu_debugfs_regs_pcie_read(struct file *f, char __user *buf,
> + size_t size, loff_t *pos)
> +{
> + return amdgpu_debugfs_regs_pcie_op(true, f, buf, size, pos);
> +}
> +
> static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user *buf,
> size_t size, loff_t *pos)
> +{
> + return amdgpu_debugfs_regs_pcie_op(false, f, (char __user *)buf, size, pos);
> +}
> +
> +static ssize_t amdgpu_debugfs_regs_didt_op(bool read, struct file *f,
> + char __user *buf, size_t size, loff_t *pos)
> {
> struct amdgpu_device *adev = file_inode(f)->i_private;
> ssize_t result = 0;
> @@ -217,12 +236,18 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user
> while (size) {
> uint32_t value;
>
> - r = get_user(value, (uint32_t *)buf);
> - if (r)
> - return r;
> -
> - WREG32_PCIE(*pos >> 2, value);
> + if (read) {
> + value = RREG32_DIDT(*pos >> 2);
> + r = put_user(value, (uint32_t *)buf);
> + if (r)
> + return r;
> + } else {
> + r = get_user(value, (uint32_t *)buf);
> + if (r)
> + return r;
>
> + WREG32_DIDT(*pos >> 2, value);
> + }
> result += 4;
> buf += 4;
> *pos += 4;
> @@ -235,32 +260,18 @@ static ssize_t amdgpu_debugfs_regs_pcie_write(struct file *f, const char __user
> static ssize_t amdgpu_debugfs_regs_didt_read(struct file *f, char __user *buf,
> size_t size, loff_t *pos)
> {
> - struct amdgpu_device *adev = file_inode(f)->i_private;
> - ssize_t result = 0;
> - int r;
> -
> - if (size & 0x3 || *pos & 0x3)
> - return -EINVAL;
> -
> - while (size) {
> - uint32_t value;
> -
> - value = RREG32_DIDT(*pos >> 2);
> - r = put_user(value, (uint32_t *)buf);
> - if (r)
> - return r;
> -
> - result += 4;
> - buf += 4;
> - *pos += 4;
> - size -= 4;
> - }
> -
> - return result;
> + return amdgpu_debugfs_regs_didt_op(true, f, buf, size, pos);
> }
>
> static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user *buf,
> size_t size, loff_t *pos)
> +{
> + return amdgpu_debugfs_regs_didt_op(false, f, (char __user *)buf, size, pos);
> +}
> +
> +static ssize_t amdgpu_debugfs_regs_smc_op(bool read,
> + struct file *f, char __user *buf,
> + size_t size, loff_t *pos)
> {
> struct amdgpu_device *adev = file_inode(f)->i_private;
> ssize_t result = 0;
> @@ -272,11 +283,17 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user
> while (size) {
> uint32_t value;
>
> - r = get_user(value, (uint32_t *)buf);
> - if (r)
> - return r;
> -
> - WREG32_DIDT(*pos >> 2, value);
> + if (read) {
> + value = RREG32_SMC(*pos);
> + r = put_user(value, (uint32_t *)buf);
> + if (r)
> + return r;
> + } else {
> + r = get_user(value, (uint32_t *)buf);
> + if (r)
> + return r;
> + WREG32_SMC(*pos, value);
> + }
>
> result += 4;
> buf += 4;
> @@ -290,56 +307,13 @@ static ssize_t amdgpu_debugfs_regs_didt_write(struct file *f, const char __user
> static ssize_t amdgpu_debugfs_regs_smc_read(struct file *f, char __user *buf,
> size_t size, loff_t *pos)
> {
> - struct amdgpu_device *adev = file_inode(f)->i_private;
> - ssize_t result = 0;
> - int r;
> -
> - if (size & 0x3 || *pos & 0x3)
> - return -EINVAL;
> -
> - while (size) {
> - uint32_t value;
> -
> - value = RREG32_SMC(*pos);
> - r = put_user(value, (uint32_t *)buf);
> - if (r)
> - return r;
> -
> - result += 4;
> - buf += 4;
> - *pos += 4;
> - size -= 4;
> - }
> -
> - return result;
> + return amdgpu_debugfs_regs_smc_op(true, f, buf, size, pos);
> }
>
> static ssize_t amdgpu_debugfs_regs_smc_write(struct file *f, const char __user *buf,
> size_t size, loff_t *pos)
> {
> - struct amdgpu_device *adev = file_inode(f)->i_private;
> - ssize_t result = 0;
> - int r;
> -
> - if (size & 0x3 || *pos & 0x3)
> - return -EINVAL;
> -
> - while (size) {
> - uint32_t value;
> -
> - r = get_user(value, (uint32_t *)buf);
> - if (r)
> - return r;
> -
> - WREG32_SMC(*pos, value);
> -
> - result += 4;
> - buf += 4;
> - *pos += 4;
> - size -= 4;
> - }
> -
> - return result;
> + return amdgpu_debugfs_regs_smc_op(false, f, (char __user *)buf, size, pos);
> }
>
> static ssize_t amdgpu_debugfs_gca_config_read(struct file *f, char __user *buf,
More information about the amd-gfx
mailing list