[PATCH] drm/amd/display: Add debugfs entry for amdgpu_dm_visual_confirm
Christian König
ckoenig.leichtzumerken at gmail.com
Fri Mar 15 12:47:12 UTC 2019
Am 15.03.19 um 13:42 schrieb Nicholas Kazlauskas:
> [Why]
> DC provides a few visual confirmation debug options that can be
> dynamically changed at runtime to help debug surface programming issues
> but we don't have any way to access it from userspace.
>
> [How]
> Add the amdgpu_dm_visual_confirm debugfs entry.
> It accepts a string containing the DC visual confirm enum value.
Have you considered to use debugfs_create_u32 or debugfs_create_u16
instead of open coding this?
Christian.
>
> Cc: Leo Li <sunpeng.li at amd.com>
> Cc: Harry Wentland <harry.wentland at amd.com>
> Signed-off-by: Nicholas Kazlauskas <nicholas.kazlauskas at amd.com>
> ---
> .../amd/display/amdgpu_dm/amdgpu_dm_debugfs.c | 77 ++++++++++++++++++-
> 1 file changed, 75 insertions(+), 2 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> index 4a55cde027cf..1d6bfb84d7cf 100644
> --- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> +++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_debugfs.c
> @@ -803,6 +803,65 @@ static ssize_t dtn_log_write(
> return size;
> }
>
> +/*
> + * Reads the DC visual confirm debug option value into the given buffer.
> + * Example usage: cat /sys/kernel/debug/dri/0/amdgpu_dm_visual_confirm
> + */
> +static ssize_t visual_confirm_read(struct file *f, char __user *buf,
> + size_t size, loff_t *pos)
> +{
> + struct amdgpu_device *adev = file_inode(f)->i_private;
> + struct dc *dc = adev->dm.dc;
> + size_t to_copy = 0;
> + int len;
> + char tmp[16];
> +
> + if (!buf || !size)
> + return -EINVAL;
> +
> + len = snprintf(tmp, sizeof(tmp), "%d\n", dc->debug.visual_confirm);
> + if (len < 0 || len >= sizeof(tmp))
> + return -EINVAL;
> +
> + if (*pos >= len)
> + return 0;
> +
> + to_copy = len - *pos;
> + if (to_copy > size)
> + return 0;
> +
> + if (copy_to_user(buf, tmp + *pos, to_copy))
> + return -EFAULT;
> +
> + *pos += to_copy;
> +
> + return to_copy;
> +}
> +
> +/*
> + * Sets the DC visual confirm debug option from the given string.
> + * Example usage: echo 1 > /sys/kernel/debug/dri/0/amdgpu_visual_confirm
> + */
> +static ssize_t visual_confirm_write(struct file *f, const char __user *buf,
> + size_t size, loff_t *pos)
> +{
> + struct amdgpu_device *adev = file_inode(f)->i_private;
> + struct dc *dc = adev->dm.dc;
> + int ret;
> + u16 val;
> +
> + if (size == 0)
> + return 0;
> +
> + ret = kstrtou16_from_user(buf, size, 0, &val);
> + if (ret)
> + return ret;
> +
> + dc->debug.visual_confirm = val;
> +
> + return size;
> +}
> +
> /*
> * Backlight at this moment. Read only.
> * As written to display, taking ABM and backlight lut into account.
> @@ -850,7 +909,12 @@ int dtn_debugfs_init(struct amdgpu_device *adev)
> .write = dtn_log_write,
> .llseek = default_llseek
> };
> -
> + static const struct file_operations visual_confirm_fops = {
> + .owner = THIS_MODULE,
> + .read = visual_confirm_read,
> + .write = visual_confirm_write,
> + .llseek = default_llseek
> + };
> struct drm_minor *minor = adev->ddev->primary;
> struct dentry *ent, *root = minor->debugfs_root;
> int ret;
> @@ -867,5 +931,14 @@ int dtn_debugfs_init(struct amdgpu_device *adev)
> adev,
> &dtn_log_fops);
>
> - return PTR_ERR_OR_ZERO(ent);
> + if (IS_ERR(ent))
> + return PTR_ERR(ent);
> +
> + ent = debugfs_create_file("amdgpu_dm_visual_confirm", 0644, root, adev,
> + &visual_confirm_fops);
> +
> + if (IS_ERR(ent))
> + return PTR_ERR(ent);
> +
> + return 0;
> }
More information about the amd-gfx
mailing list