[PATCH] drm/amd/amdgpu: Merge the smc/pcie/didt debugfs read/write methods

Tom St Denis tstdenis at amd.com
Wed Apr 4 14:03:48 UTC 2018


Hi Christian,

I was thinking of merging the didt/smc/pcie ops into one themselves. 
I'll see what I can come up with without spending too much time on it.

Cheers,
Tom

On 04/04/2018 10:02 AM, Christian König wrote:
> 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