diff mbox series

[11/11] drm/msm/dpu: rip out debugfs support from dpu_plane

Message ID 20210930140002.308628-12-dmitry.baryshkov@linaro.org (mailing list archive)
State Not Applicable
Headers show
Series drm/msm/dpu: cleanup plane state | expand

Commit Message

Dmitry Baryshkov Sept. 30, 2021, 2 p.m. UTC
In preparations of virtualizing the dpu_plane rip out debugfs support
from dpu_plane (as it is mostly used to expose plane's pipe registers).
Also move disable_danger file to danger/ debugfs subdir where it belongs.

Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
---
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c   | 123 ++++++++--------
 drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h   |  69 ---------
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 171 +---------------------
 drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h |   6 +
 4 files changed, 69 insertions(+), 300 deletions(-)

Comments

Abhinav Kumar Oct. 21, 2021, 11:53 p.m. UTC | #1
On 2021-09-30 07:00, Dmitry Baryshkov wrote:
> In preparations of virtualizing the dpu_plane rip out debugfs support
> from dpu_plane (as it is mostly used to expose plane's pipe registers).
> Also move disable_danger file to danger/ debugfs subdir where it 
> belongs.
> 
> Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>

I am yet to review the second part of the virtual plane series to 
understand why this removal
is necessary so I might be missing something.

The plane's debugfs holds useful information to check a few things 
rightaway.

So if there is some misconfiguration or corruption in addition to the 
plane state,
this is good to check.

localhost /sys/kernel/debug/dri/1/plane35 # cat src_blk
[4000] 03000556 00000000 00000000 03000556
[4010] 00000000 00414000 00000000 0040e000
[4020] 00000000 00001600 00000080 00000000
[4030] 800236ff 03010002 80000001 00000000
[4040] 00000000 00000030 000c0087 00000707
[4050] 00000000 00000000 00000000 00000000
[4060] 0000ffff 00000000 00000000 00000001
[4070] 00000000 44556677 00112233 00000000
[4080] 00000000 00000000 00000000 00000000
[4090] 00000000 00000000 00000000 00000000
[40a0] 00000000 00414000 00000000 0040e000
[40b0] 00000000 00000000 00000000 00000000
[40c0] 00000000 00000000 00000000 00000000
[40d0] 0003f820 00000000 00000000 00000000
[40e0] 0003e2c4 00000000 00000000 00000000
[40f0] 000f000f 00010330 02e402e4 00000000
[4100] 00000000 00000000 03000556 00000000
[4110] 00000000 00000000 03000556 00000000
[4120] 00000000 00000000 03000556 00000000
[4130] 00000000 0000000f 00000000 0000000f
[4140] 00000000 00000000 00000000 00000000

So I would like to keep this functionality unless there is some 
compelling reason
to remove this.

BTW, are you going to submit the second half as a new series now that 
most
of the first one has been reviewed?

> ---
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c   | 123 ++++++++--------
>  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h   |  69 ---------
>  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 171 +---------------------
>  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h |   6 +
>  4 files changed, 69 insertions(+), 300 deletions(-)
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> index ae48f41821cf..fe33273cdf57 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> @@ -101,84 +101,85 @@ static int dpu_debugfs_safe_stats_show(struct
> seq_file *s, void *v)
>  }
>  DEFINE_SHOW_ATTRIBUTE(dpu_debugfs_safe_stats);
> 
> -static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
> -		struct dentry *parent)
> +static ssize_t _dpu_plane_danger_read(struct file *file,
> +			char __user *buff, size_t count, loff_t *ppos)
>  {
> -	struct dentry *entry = debugfs_create_dir("danger", parent);
> +	struct dpu_kms *kms = file->private_data;
> +	int len;
> +	char buf[40];
> 
> -	debugfs_create_file("danger_status", 0600, entry,
> -			dpu_kms, &dpu_debugfs_danger_stats_fops);
> -	debugfs_create_file("safe_status", 0600, entry,
> -			dpu_kms, &dpu_debugfs_safe_stats_fops);
> +	len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
> +
> +	return simple_read_from_buffer(buff, count, ppos, buf, len);
>  }
> 
> -static int _dpu_debugfs_show_regset32(struct seq_file *s, void *data)
> +static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool 
> enable)
>  {
> -	struct dpu_debugfs_regset32 *regset = s->private;
> -	struct dpu_kms *dpu_kms = regset->dpu_kms;
> -	void __iomem *base;
> -	uint32_t i, addr;
> -
> -	if (!dpu_kms->mmio)
> -		return 0;
> -
> -	base = dpu_kms->mmio + regset->offset;
> -
> -	/* insert padding spaces, if needed */
> -	if (regset->offset & 0xF) {
> -		seq_printf(s, "[%x]", regset->offset & ~0xF);
> -		for (i = 0; i < (regset->offset & 0xF); i += 4)
> -			seq_puts(s, "         ");
> -	}
> -
> -	pm_runtime_get_sync(&dpu_kms->pdev->dev);
> -
> -	/* main register output */
> -	for (i = 0; i < regset->blk_len; i += 4) {
> -		addr = regset->offset + i;
> -		if ((addr & 0xF) == 0x0)
> -			seq_printf(s, i ? "\n[%x]" : "[%x]", addr);
> -		seq_printf(s, " %08x", readl_relaxed(base + i));
> +	struct drm_plane *plane;
> +
> +	drm_for_each_plane(plane, kms->dev) {
> +		if (plane->fb && plane->state) {
> +			dpu_plane_danger_signal_ctrl(plane, enable);
> +			DPU_DEBUG("plane:%d img:%dx%d ",
> +				plane->base.id, plane->fb->width,
> +				plane->fb->height);
> +			DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
> +				plane->state->src_x >> 16,
> +				plane->state->src_y >> 16,
> +				plane->state->src_w >> 16,
> +				plane->state->src_h >> 16,
> +				plane->state->crtc_x, plane->state->crtc_y,
> +				plane->state->crtc_w, plane->state->crtc_h);
> +		} else {
> +			DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
> +		}
>  	}
> -	seq_puts(s, "\n");
> -	pm_runtime_put_sync(&dpu_kms->pdev->dev);
> -
> -	return 0;
>  }
> 
> -static int dpu_debugfs_open_regset32(struct inode *inode,
> -		struct file *file)
> +static ssize_t _dpu_plane_danger_write(struct file *file,
> +		    const char __user *user_buf, size_t count, loff_t *ppos)
>  {
> -	return single_open(file, _dpu_debugfs_show_regset32, 
> inode->i_private);
> -}
> +	struct dpu_kms *kms = file->private_data;
> +	int disable_panic;
> +	int ret;
> 
> -static const struct file_operations dpu_fops_regset32 = {
> -	.open =		dpu_debugfs_open_regset32,
> -	.read =		seq_read,
> -	.llseek =	seq_lseek,
> -	.release =	single_release,
> -};
> +	ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
> +	if (ret)
> +		return ret;
> 
> -void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
> -		uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms)
> -{
> -	if (regset) {
> -		regset->offset = offset;
> -		regset->blk_len = length;
> -		regset->dpu_kms = dpu_kms;
> +	if (disable_panic) {
> +		/* Disable panic signal for all active pipes */
> +		DPU_DEBUG("Disabling danger:\n");
> +		_dpu_plane_set_danger_state(kms, false);
> +		kms->has_danger_ctrl = false;
> +	} else {
> +		/* Enable panic signal for all active pipes */
> +		DPU_DEBUG("Enabling danger:\n");
> +		kms->has_danger_ctrl = true;
> +		_dpu_plane_set_danger_state(kms, true);
>  	}
> +
> +	return count;
>  }
> 
> -void dpu_debugfs_create_regset32(const char *name, umode_t mode,
> -		void *parent, struct dpu_debugfs_regset32 *regset)
> +static const struct file_operations dpu_plane_danger_enable = {
> +	.open = simple_open,
> +	.read = _dpu_plane_danger_read,
> +	.write = _dpu_plane_danger_write,
> +};
> +
> +static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
> +		struct dentry *parent)
>  {
> -	if (!name || !regset || !regset->dpu_kms || !regset->blk_len)
> -		return;
> +	struct dentry *entry = debugfs_create_dir("danger", parent);
> 
> -	/* make sure offset is a multiple of 4 */
> -	regset->offset = round_down(regset->offset, 4);
> +	debugfs_create_file("danger_status", 0600, entry,
> +			dpu_kms, &dpu_debugfs_danger_stats_fops);
> +	debugfs_create_file("safe_status", 0600, entry,
> +			dpu_kms, &dpu_debugfs_safe_stats_fops);
> +	debugfs_create_file("disable_danger", 0600, entry,
> +			dpu_kms, &dpu_plane_danger_enable);
> 
> -	debugfs_create_file(name, mode, parent, regset, &dpu_fops_regset32);
>  }
> 
>  static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor 
> *minor)
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> index 323a6bce9e64..ab65c817eb42 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> @@ -166,75 +166,6 @@ struct dpu_global_state
>  struct dpu_global_state
>  	*__must_check dpu_kms_get_global_state(struct drm_atomic_state *s);
> 
> -/**
> - * Debugfs functions - extra helper functions for debugfs support
> - *
> - * Main debugfs documentation is located at,
> - *
> - * Documentation/filesystems/debugfs.rst
> - *
> - * @dpu_debugfs_setup_regset32: Initialize data for 
> dpu_debugfs_create_regset32
> - * @dpu_debugfs_create_regset32: Create 32-bit register dump file
> - * @dpu_debugfs_get_root: Get root dentry for DPU_KMS's debugfs node
> - */
> -
> -/**
> - * Companion structure for dpu_debugfs_create_regset32. Do not 
> initialize the
> - * members of this structure explicitly; use
> dpu_debugfs_setup_regset32 instead.
> - */
> -struct dpu_debugfs_regset32 {
> -	uint32_t offset;
> -	uint32_t blk_len;
> -	struct dpu_kms *dpu_kms;
> -};
> -
> -/**
> - * dpu_debugfs_setup_regset32 - Initialize register block definition
> for debugfs
> - * This function is meant to initialize dpu_debugfs_regset32 
> structures for use
> - * with dpu_debugfs_create_regset32.
> - * @regset: opaque register definition structure
> - * @offset: sub-block offset
> - * @length: sub-block length, in bytes
> - * @dpu_kms: pointer to dpu kms structure
> - */
> -void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
> -		uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms);
> -
> -/**
> - * dpu_debugfs_create_regset32 - Create register read back file for 
> debugfs
> - *
> - * This function is almost identical to the standard 
> debugfs_create_regset32()
> - * function, with the main difference being that a list of register
> - * names/offsets do not need to be provided. The 'read' function 
> simply outputs
> - * sequential register values over a specified range.
> - *
> - * Similar to the related debugfs_create_regset32 API, the structure 
> pointed to
> - * by regset needs to persist for the lifetime of the created file. 
> The calling
> - * code is responsible for initialization/management of this 
> structure.
> - *
> - * The structure pointed to by regset is meant to be opaque. Please 
> use
> - * dpu_debugfs_setup_regset32 to initialize it.
> - *
> - * @name:   File name within debugfs
> - * @mode:   File mode within debugfs
> - * @parent: Parent directory entry within debugfs, can be NULL
> - * @regset: Pointer to persistent register block definition
> - */
> -void dpu_debugfs_create_regset32(const char *name, umode_t mode,
> -		void *parent, struct dpu_debugfs_regset32 *regset);
> -
> -/**
> - * dpu_debugfs_get_root - Return root directory entry for KMS's 
> debugfs
> - *
> - * The return value should be passed as the 'parent' argument to 
> subsequent
> - * debugfs create calls.
> - *
> - * @dpu_kms: Pointer to DPU's KMS structure
> - *
> - * Return: dentry pointer for DPU's debugfs location
> - */
> -void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms);
> -
>  /**
>   * DPU info management functions
>   * These functions/definitions allow for building up a 'dpu_info' 
> structure
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> index d8018e664925..42bcde1ddd0f 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> @@ -108,13 +108,6 @@ struct dpu_plane {
>  	bool is_virtual;
>  	struct list_head mplane_list;
>  	struct dpu_mdss_cfg *catalog;
> -
> -	/* debugfs related stuff */
> -	struct dentry *debugfs_root;
> -	struct dpu_debugfs_regset32 debugfs_src;
> -	struct dpu_debugfs_regset32 debugfs_scaler;
> -	struct dpu_debugfs_regset32 debugfs_csc;
> -	bool debugfs_default_scale;
>  };
> 
>  static const uint64_t supported_format_modifiers[] = {
> @@ -1343,7 +1336,7 @@ static void dpu_plane_reset(struct drm_plane 
> *plane)
>  }
> 
>  #ifdef CONFIG_DEBUG_FS
> -static void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool 
> enable)
> +void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool 
> enable)
>  {
>  	struct dpu_plane *pdpu = to_dpu_plane(plane);
>  	struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);
> @@ -1355,168 +1348,8 @@ static void
> dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
>  	_dpu_plane_set_qos_ctrl(plane, enable, DPU_PLANE_QOS_PANIC_CTRL);
>  	pm_runtime_put_sync(&dpu_kms->pdev->dev);
>  }
> -
> -static ssize_t _dpu_plane_danger_read(struct file *file,
> -			char __user *buff, size_t count, loff_t *ppos)
> -{
> -	struct dpu_kms *kms = file->private_data;
> -	int len;
> -	char buf[40];
> -
> -	len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
> -
> -	return simple_read_from_buffer(buff, count, ppos, buf, len);
> -}
> -
> -static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool 
> enable)
> -{
> -	struct drm_plane *plane;
> -
> -	drm_for_each_plane(plane, kms->dev) {
> -		if (plane->fb && plane->state) {
> -			dpu_plane_danger_signal_ctrl(plane, enable);
> -			DPU_DEBUG("plane:%d img:%dx%d ",
> -				plane->base.id, plane->fb->width,
> -				plane->fb->height);
> -			DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
> -				plane->state->src_x >> 16,
> -				plane->state->src_y >> 16,
> -				plane->state->src_w >> 16,
> -				plane->state->src_h >> 16,
> -				plane->state->crtc_x, plane->state->crtc_y,
> -				plane->state->crtc_w, plane->state->crtc_h);
> -		} else {
> -			DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
> -		}
> -	}
> -}
> -
> -static ssize_t _dpu_plane_danger_write(struct file *file,
> -		    const char __user *user_buf, size_t count, loff_t *ppos)
> -{
> -	struct dpu_kms *kms = file->private_data;
> -	int disable_panic;
> -	int ret;
> -
> -	ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
> -	if (ret)
> -		return ret;
> -
> -	if (disable_panic) {
> -		/* Disable panic signal for all active pipes */
> -		DPU_DEBUG("Disabling danger:\n");
> -		_dpu_plane_set_danger_state(kms, false);
> -		kms->has_danger_ctrl = false;
> -	} else {
> -		/* Enable panic signal for all active pipes */
> -		DPU_DEBUG("Enabling danger:\n");
> -		kms->has_danger_ctrl = true;
> -		_dpu_plane_set_danger_state(kms, true);
> -	}
> -
> -	return count;
> -}
> -
> -static const struct file_operations dpu_plane_danger_enable = {
> -	.open = simple_open,
> -	.read = _dpu_plane_danger_read,
> -	.write = _dpu_plane_danger_write,
> -};
> -
> -static int _dpu_plane_init_debugfs(struct drm_plane *plane)
> -{
> -	struct dpu_plane *pdpu = to_dpu_plane(plane);
> -	struct dpu_kms *kms = _dpu_plane_get_kms(plane);
> -	const struct dpu_sspp_cfg *cfg = pdpu->pipe_hw->cap;
> -	const struct dpu_sspp_sub_blks *sblk = cfg->sblk;
> -
> -	/* create overall sub-directory for the pipe */
> -	pdpu->debugfs_root =
> -		debugfs_create_dir(plane->name,
> -				plane->dev->primary->debugfs_root);
> -
> -	/* don't error check these */
> -	debugfs_create_xul("features", 0600,
> -			pdpu->debugfs_root, (unsigned long 
> *)&pdpu->pipe_hw->cap->features);
> -
> -	/* add register dump support */
> -	dpu_debugfs_setup_regset32(&pdpu->debugfs_src,
> -			sblk->src_blk.base + cfg->base,
> -			sblk->src_blk.len,
> -			kms);
> -	dpu_debugfs_create_regset32("src_blk", 0400,
> -			pdpu->debugfs_root, &pdpu->debugfs_src);
> -
> -	if (cfg->features & BIT(DPU_SSPP_SCALER_QSEED3) ||
> -			cfg->features & BIT(DPU_SSPP_SCALER_QSEED3LITE) ||
> -			cfg->features & BIT(DPU_SSPP_SCALER_QSEED2) ||
> -			cfg->features & BIT(DPU_SSPP_SCALER_QSEED4)) {
> -		dpu_debugfs_setup_regset32(&pdpu->debugfs_scaler,
> -				sblk->scaler_blk.base + cfg->base,
> -				sblk->scaler_blk.len,
> -				kms);
> -		dpu_debugfs_create_regset32("scaler_blk", 0400,
> -				pdpu->debugfs_root,
> -				&pdpu->debugfs_scaler);
> -		debugfs_create_bool("default_scaling",
> -				0600,
> -				pdpu->debugfs_root,
> -				&pdpu->debugfs_default_scale);
> -	}
> -
> -	if (cfg->features & BIT(DPU_SSPP_CSC) ||
> -			cfg->features & BIT(DPU_SSPP_CSC_10BIT)) {
> -		dpu_debugfs_setup_regset32(&pdpu->debugfs_csc,
> -				sblk->csc_blk.base + cfg->base,
> -				sblk->csc_blk.len,
> -				kms);
> -		dpu_debugfs_create_regset32("csc_blk", 0400,
> -				pdpu->debugfs_root, &pdpu->debugfs_csc);
> -	}
> -
> -	debugfs_create_u32("xin_id",
> -			0400,
> -			pdpu->debugfs_root,
> -			(u32 *) &cfg->xin_id);
> -	debugfs_create_u32("clk_ctrl",
> -			0400,
> -			pdpu->debugfs_root,
> -			(u32 *) &cfg->clk_ctrl);
> -	debugfs_create_x32("creq_vblank",
> -			0600,
> -			pdpu->debugfs_root,
> -			(u32 *) &sblk->creq_vblank);
> -	debugfs_create_x32("danger_vblank",
> -			0600,
> -			pdpu->debugfs_root,
> -			(u32 *) &sblk->danger_vblank);
> -
> -	debugfs_create_file("disable_danger",
> -			0600,
> -			pdpu->debugfs_root,
> -			kms, &dpu_plane_danger_enable);
> -
> -	return 0;
> -}
> -#else
> -static int _dpu_plane_init_debugfs(struct drm_plane *plane)
> -{
> -	return 0;
> -}
>  #endif
> 
> -static int dpu_plane_late_register(struct drm_plane *plane)
> -{
> -	return _dpu_plane_init_debugfs(plane);
> -}
> -
> -static void dpu_plane_early_unregister(struct drm_plane *plane)
> -{
> -	struct dpu_plane *pdpu = to_dpu_plane(plane);
> -
> -	debugfs_remove_recursive(pdpu->debugfs_root);
> -}
> -
>  static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
>  		uint32_t format, uint64_t modifier)
>  {
> @@ -1541,8 +1374,6 @@ static const struct drm_plane_funcs 
> dpu_plane_funcs = {
>  		.reset = dpu_plane_reset,
>  		.atomic_duplicate_state = dpu_plane_duplicate_state,
>  		.atomic_destroy_state = dpu_plane_destroy_state,
> -		.late_register = dpu_plane_late_register,
> -		.early_unregister = dpu_plane_early_unregister,
>  		.format_mod_supported = dpu_plane_format_mod_supported,
>  };
> 
> diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> index 1ee5ca5fcdf7..9d51dad5c6a5 100644
> --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> @@ -126,4 +126,10 @@ void dpu_plane_clear_multirect(const struct
> drm_plane_state *drm_state);
>  int dpu_plane_color_fill(struct drm_plane *plane,
>  		uint32_t color, uint32_t alpha);
> 
> +#ifdef CONFIG_DEBUG_FS
> +void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool 
> enable);
> +#else
> +static inline void dpu_plane_danger_signal_ctrl(struct drm_plane
> *plane, bool enable) {}
> +#endif
> +
>  #endif /* _DPU_PLANE_H_ */
Dmitry Baryshkov Oct. 22, 2021, 11:35 a.m. UTC | #2
Hi,

On Fri, 22 Oct 2021 at 02:53, <abhinavk@codeaurora.org> wrote:
>
> On 2021-09-30 07:00, Dmitry Baryshkov wrote:
> > In preparations of virtualizing the dpu_plane rip out debugfs support
> > from dpu_plane (as it is mostly used to expose plane's pipe registers).
> > Also move disable_danger file to danger/ debugfs subdir where it
> > belongs.
> >
> > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
>
> I am yet to review the second part of the virtual plane series to
> understand why this removal
> is necessary so I might be missing something.

See below

>
> The plane's debugfs holds useful information to check a few things
> rightaway.
>
> So if there is some misconfiguration or corruption in addition to the
> plane state,
> this is good to check.
>
> localhost /sys/kernel/debug/dri/1/plane35 # cat src_blk
> [4000] 03000556 00000000 00000000 03000556
> [4010] 00000000 00414000 00000000 0040e000
> [4020] 00000000 00001600 00000080 00000000
> [4030] 800236ff 03010002 80000001 00000000
> [4040] 00000000 00000030 000c0087 00000707
> [4050] 00000000 00000000 00000000 00000000
> [4060] 0000ffff 00000000 00000000 00000001
> [4070] 00000000 44556677 00112233 00000000
> [4080] 00000000 00000000 00000000 00000000
> [4090] 00000000 00000000 00000000 00000000
> [40a0] 00000000 00414000 00000000 0040e000
> [40b0] 00000000 00000000 00000000 00000000
> [40c0] 00000000 00000000 00000000 00000000
> [40d0] 0003f820 00000000 00000000 00000000
> [40e0] 0003e2c4 00000000 00000000 00000000
> [40f0] 000f000f 00010330 02e402e4 00000000
> [4100] 00000000 00000000 03000556 00000000
> [4110] 00000000 00000000 03000556 00000000
> [4120] 00000000 00000000 03000556 00000000
> [4130] 00000000 0000000f 00000000 0000000f
> [4140] 00000000 00000000 00000000 00000000
>
> So I would like to keep this functionality unless there is some
> compelling reason
> to remove this.

Ok, I'll take a look if I can keep it or rework somehow.
The problem is that if you have the plane is virtual, there is no
strong plane <-> sspp mapping. Consider wide planes, where you'd have
two SSPPs per single plane.

I think it would make sense to move src_blk to global namespace (as
ssppN_src) and then add a file giving plane -> sspp relationship.

>
> BTW, are you going to submit the second half as a new series now that
> most
> of the first one has been reviewed?
>
> > ---
> >  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c   | 123 ++++++++--------
> >  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h   |  69 ---------
> >  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 171 +---------------------
> >  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h |   6 +
> >  4 files changed, 69 insertions(+), 300 deletions(-)
> >
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > index ae48f41821cf..fe33273cdf57 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > @@ -101,84 +101,85 @@ static int dpu_debugfs_safe_stats_show(struct
> > seq_file *s, void *v)
> >  }
> >  DEFINE_SHOW_ATTRIBUTE(dpu_debugfs_safe_stats);
> >
> > -static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
> > -             struct dentry *parent)
> > +static ssize_t _dpu_plane_danger_read(struct file *file,
> > +                     char __user *buff, size_t count, loff_t *ppos)
> >  {
> > -     struct dentry *entry = debugfs_create_dir("danger", parent);
> > +     struct dpu_kms *kms = file->private_data;
> > +     int len;
> > +     char buf[40];
> >
> > -     debugfs_create_file("danger_status", 0600, entry,
> > -                     dpu_kms, &dpu_debugfs_danger_stats_fops);
> > -     debugfs_create_file("safe_status", 0600, entry,
> > -                     dpu_kms, &dpu_debugfs_safe_stats_fops);
> > +     len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
> > +
> > +     return simple_read_from_buffer(buff, count, ppos, buf, len);
> >  }
> >
> > -static int _dpu_debugfs_show_regset32(struct seq_file *s, void *data)
> > +static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool
> > enable)
> >  {
> > -     struct dpu_debugfs_regset32 *regset = s->private;
> > -     struct dpu_kms *dpu_kms = regset->dpu_kms;
> > -     void __iomem *base;
> > -     uint32_t i, addr;
> > -
> > -     if (!dpu_kms->mmio)
> > -             return 0;
> > -
> > -     base = dpu_kms->mmio + regset->offset;
> > -
> > -     /* insert padding spaces, if needed */
> > -     if (regset->offset & 0xF) {
> > -             seq_printf(s, "[%x]", regset->offset & ~0xF);
> > -             for (i = 0; i < (regset->offset & 0xF); i += 4)
> > -                     seq_puts(s, "         ");
> > -     }
> > -
> > -     pm_runtime_get_sync(&dpu_kms->pdev->dev);
> > -
> > -     /* main register output */
> > -     for (i = 0; i < regset->blk_len; i += 4) {
> > -             addr = regset->offset + i;
> > -             if ((addr & 0xF) == 0x0)
> > -                     seq_printf(s, i ? "\n[%x]" : "[%x]", addr);
> > -             seq_printf(s, " %08x", readl_relaxed(base + i));
> > +     struct drm_plane *plane;
> > +
> > +     drm_for_each_plane(plane, kms->dev) {
> > +             if (plane->fb && plane->state) {
> > +                     dpu_plane_danger_signal_ctrl(plane, enable);
> > +                     DPU_DEBUG("plane:%d img:%dx%d ",
> > +                             plane->base.id, plane->fb->width,
> > +                             plane->fb->height);
> > +                     DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
> > +                             plane->state->src_x >> 16,
> > +                             plane->state->src_y >> 16,
> > +                             plane->state->src_w >> 16,
> > +                             plane->state->src_h >> 16,
> > +                             plane->state->crtc_x, plane->state->crtc_y,
> > +                             plane->state->crtc_w, plane->state->crtc_h);
> > +             } else {
> > +                     DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
> > +             }
> >       }
> > -     seq_puts(s, "\n");
> > -     pm_runtime_put_sync(&dpu_kms->pdev->dev);
> > -
> > -     return 0;
> >  }
> >
> > -static int dpu_debugfs_open_regset32(struct inode *inode,
> > -             struct file *file)
> > +static ssize_t _dpu_plane_danger_write(struct file *file,
> > +                 const char __user *user_buf, size_t count, loff_t *ppos)
> >  {
> > -     return single_open(file, _dpu_debugfs_show_regset32,
> > inode->i_private);
> > -}
> > +     struct dpu_kms *kms = file->private_data;
> > +     int disable_panic;
> > +     int ret;
> >
> > -static const struct file_operations dpu_fops_regset32 = {
> > -     .open =         dpu_debugfs_open_regset32,
> > -     .read =         seq_read,
> > -     .llseek =       seq_lseek,
> > -     .release =      single_release,
> > -};
> > +     ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
> > +     if (ret)
> > +             return ret;
> >
> > -void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
> > -             uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms)
> > -{
> > -     if (regset) {
> > -             regset->offset = offset;
> > -             regset->blk_len = length;
> > -             regset->dpu_kms = dpu_kms;
> > +     if (disable_panic) {
> > +             /* Disable panic signal for all active pipes */
> > +             DPU_DEBUG("Disabling danger:\n");
> > +             _dpu_plane_set_danger_state(kms, false);
> > +             kms->has_danger_ctrl = false;
> > +     } else {
> > +             /* Enable panic signal for all active pipes */
> > +             DPU_DEBUG("Enabling danger:\n");
> > +             kms->has_danger_ctrl = true;
> > +             _dpu_plane_set_danger_state(kms, true);
> >       }
> > +
> > +     return count;
> >  }
> >
> > -void dpu_debugfs_create_regset32(const char *name, umode_t mode,
> > -             void *parent, struct dpu_debugfs_regset32 *regset)
> > +static const struct file_operations dpu_plane_danger_enable = {
> > +     .open = simple_open,
> > +     .read = _dpu_plane_danger_read,
> > +     .write = _dpu_plane_danger_write,
> > +};
> > +
> > +static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
> > +             struct dentry *parent)
> >  {
> > -     if (!name || !regset || !regset->dpu_kms || !regset->blk_len)
> > -             return;
> > +     struct dentry *entry = debugfs_create_dir("danger", parent);
> >
> > -     /* make sure offset is a multiple of 4 */
> > -     regset->offset = round_down(regset->offset, 4);
> > +     debugfs_create_file("danger_status", 0600, entry,
> > +                     dpu_kms, &dpu_debugfs_danger_stats_fops);
> > +     debugfs_create_file("safe_status", 0600, entry,
> > +                     dpu_kms, &dpu_debugfs_safe_stats_fops);
> > +     debugfs_create_file("disable_danger", 0600, entry,
> > +                     dpu_kms, &dpu_plane_danger_enable);
> >
> > -     debugfs_create_file(name, mode, parent, regset, &dpu_fops_regset32);
> >  }
> >
> >  static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor
> > *minor)
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > index 323a6bce9e64..ab65c817eb42 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > @@ -166,75 +166,6 @@ struct dpu_global_state
> >  struct dpu_global_state
> >       *__must_check dpu_kms_get_global_state(struct drm_atomic_state *s);
> >
> > -/**
> > - * Debugfs functions - extra helper functions for debugfs support
> > - *
> > - * Main debugfs documentation is located at,
> > - *
> > - * Documentation/filesystems/debugfs.rst
> > - *
> > - * @dpu_debugfs_setup_regset32: Initialize data for
> > dpu_debugfs_create_regset32
> > - * @dpu_debugfs_create_regset32: Create 32-bit register dump file
> > - * @dpu_debugfs_get_root: Get root dentry for DPU_KMS's debugfs node
> > - */
> > -
> > -/**
> > - * Companion structure for dpu_debugfs_create_regset32. Do not
> > initialize the
> > - * members of this structure explicitly; use
> > dpu_debugfs_setup_regset32 instead.
> > - */
> > -struct dpu_debugfs_regset32 {
> > -     uint32_t offset;
> > -     uint32_t blk_len;
> > -     struct dpu_kms *dpu_kms;
> > -};
> > -
> > -/**
> > - * dpu_debugfs_setup_regset32 - Initialize register block definition
> > for debugfs
> > - * This function is meant to initialize dpu_debugfs_regset32
> > structures for use
> > - * with dpu_debugfs_create_regset32.
> > - * @regset: opaque register definition structure
> > - * @offset: sub-block offset
> > - * @length: sub-block length, in bytes
> > - * @dpu_kms: pointer to dpu kms structure
> > - */
> > -void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
> > -             uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms);
> > -
> > -/**
> > - * dpu_debugfs_create_regset32 - Create register read back file for
> > debugfs
> > - *
> > - * This function is almost identical to the standard
> > debugfs_create_regset32()
> > - * function, with the main difference being that a list of register
> > - * names/offsets do not need to be provided. The 'read' function
> > simply outputs
> > - * sequential register values over a specified range.
> > - *
> > - * Similar to the related debugfs_create_regset32 API, the structure
> > pointed to
> > - * by regset needs to persist for the lifetime of the created file.
> > The calling
> > - * code is responsible for initialization/management of this
> > structure.
> > - *
> > - * The structure pointed to by regset is meant to be opaque. Please
> > use
> > - * dpu_debugfs_setup_regset32 to initialize it.
> > - *
> > - * @name:   File name within debugfs
> > - * @mode:   File mode within debugfs
> > - * @parent: Parent directory entry within debugfs, can be NULL
> > - * @regset: Pointer to persistent register block definition
> > - */
> > -void dpu_debugfs_create_regset32(const char *name, umode_t mode,
> > -             void *parent, struct dpu_debugfs_regset32 *regset);
> > -
> > -/**
> > - * dpu_debugfs_get_root - Return root directory entry for KMS's
> > debugfs
> > - *
> > - * The return value should be passed as the 'parent' argument to
> > subsequent
> > - * debugfs create calls.
> > - *
> > - * @dpu_kms: Pointer to DPU's KMS structure
> > - *
> > - * Return: dentry pointer for DPU's debugfs location
> > - */
> > -void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms);
> > -
> >  /**
> >   * DPU info management functions
> >   * These functions/definitions allow for building up a 'dpu_info'
> > structure
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > index d8018e664925..42bcde1ddd0f 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > @@ -108,13 +108,6 @@ struct dpu_plane {
> >       bool is_virtual;
> >       struct list_head mplane_list;
> >       struct dpu_mdss_cfg *catalog;
> > -
> > -     /* debugfs related stuff */
> > -     struct dentry *debugfs_root;
> > -     struct dpu_debugfs_regset32 debugfs_src;
> > -     struct dpu_debugfs_regset32 debugfs_scaler;
> > -     struct dpu_debugfs_regset32 debugfs_csc;
> > -     bool debugfs_default_scale;
> >  };
> >
> >  static const uint64_t supported_format_modifiers[] = {
> > @@ -1343,7 +1336,7 @@ static void dpu_plane_reset(struct drm_plane
> > *plane)
> >  }
> >
> >  #ifdef CONFIG_DEBUG_FS
> > -static void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool
> > enable)
> > +void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool
> > enable)
> >  {
> >       struct dpu_plane *pdpu = to_dpu_plane(plane);
> >       struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);
> > @@ -1355,168 +1348,8 @@ static void
> > dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
> >       _dpu_plane_set_qos_ctrl(plane, enable, DPU_PLANE_QOS_PANIC_CTRL);
> >       pm_runtime_put_sync(&dpu_kms->pdev->dev);
> >  }
> > -
> > -static ssize_t _dpu_plane_danger_read(struct file *file,
> > -                     char __user *buff, size_t count, loff_t *ppos)
> > -{
> > -     struct dpu_kms *kms = file->private_data;
> > -     int len;
> > -     char buf[40];
> > -
> > -     len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
> > -
> > -     return simple_read_from_buffer(buff, count, ppos, buf, len);
> > -}
> > -
> > -static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool
> > enable)
> > -{
> > -     struct drm_plane *plane;
> > -
> > -     drm_for_each_plane(plane, kms->dev) {
> > -             if (plane->fb && plane->state) {
> > -                     dpu_plane_danger_signal_ctrl(plane, enable);
> > -                     DPU_DEBUG("plane:%d img:%dx%d ",
> > -                             plane->base.id, plane->fb->width,
> > -                             plane->fb->height);
> > -                     DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
> > -                             plane->state->src_x >> 16,
> > -                             plane->state->src_y >> 16,
> > -                             plane->state->src_w >> 16,
> > -                             plane->state->src_h >> 16,
> > -                             plane->state->crtc_x, plane->state->crtc_y,
> > -                             plane->state->crtc_w, plane->state->crtc_h);
> > -             } else {
> > -                     DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
> > -             }
> > -     }
> > -}
> > -
> > -static ssize_t _dpu_plane_danger_write(struct file *file,
> > -                 const char __user *user_buf, size_t count, loff_t *ppos)
> > -{
> > -     struct dpu_kms *kms = file->private_data;
> > -     int disable_panic;
> > -     int ret;
> > -
> > -     ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
> > -     if (ret)
> > -             return ret;
> > -
> > -     if (disable_panic) {
> > -             /* Disable panic signal for all active pipes */
> > -             DPU_DEBUG("Disabling danger:\n");
> > -             _dpu_plane_set_danger_state(kms, false);
> > -             kms->has_danger_ctrl = false;
> > -     } else {
> > -             /* Enable panic signal for all active pipes */
> > -             DPU_DEBUG("Enabling danger:\n");
> > -             kms->has_danger_ctrl = true;
> > -             _dpu_plane_set_danger_state(kms, true);
> > -     }
> > -
> > -     return count;
> > -}
> > -
> > -static const struct file_operations dpu_plane_danger_enable = {
> > -     .open = simple_open,
> > -     .read = _dpu_plane_danger_read,
> > -     .write = _dpu_plane_danger_write,
> > -};
> > -
> > -static int _dpu_plane_init_debugfs(struct drm_plane *plane)
> > -{
> > -     struct dpu_plane *pdpu = to_dpu_plane(plane);
> > -     struct dpu_kms *kms = _dpu_plane_get_kms(plane);
> > -     const struct dpu_sspp_cfg *cfg = pdpu->pipe_hw->cap;
> > -     const struct dpu_sspp_sub_blks *sblk = cfg->sblk;
> > -
> > -     /* create overall sub-directory for the pipe */
> > -     pdpu->debugfs_root =
> > -             debugfs_create_dir(plane->name,
> > -                             plane->dev->primary->debugfs_root);
> > -
> > -     /* don't error check these */
> > -     debugfs_create_xul("features", 0600,
> > -                     pdpu->debugfs_root, (unsigned long
> > *)&pdpu->pipe_hw->cap->features);
> > -
> > -     /* add register dump support */
> > -     dpu_debugfs_setup_regset32(&pdpu->debugfs_src,
> > -                     sblk->src_blk.base + cfg->base,
> > -                     sblk->src_blk.len,
> > -                     kms);
> > -     dpu_debugfs_create_regset32("src_blk", 0400,
> > -                     pdpu->debugfs_root, &pdpu->debugfs_src);
> > -
> > -     if (cfg->features & BIT(DPU_SSPP_SCALER_QSEED3) ||
> > -                     cfg->features & BIT(DPU_SSPP_SCALER_QSEED3LITE) ||
> > -                     cfg->features & BIT(DPU_SSPP_SCALER_QSEED2) ||
> > -                     cfg->features & BIT(DPU_SSPP_SCALER_QSEED4)) {
> > -             dpu_debugfs_setup_regset32(&pdpu->debugfs_scaler,
> > -                             sblk->scaler_blk.base + cfg->base,
> > -                             sblk->scaler_blk.len,
> > -                             kms);
> > -             dpu_debugfs_create_regset32("scaler_blk", 0400,
> > -                             pdpu->debugfs_root,
> > -                             &pdpu->debugfs_scaler);
> > -             debugfs_create_bool("default_scaling",
> > -                             0600,
> > -                             pdpu->debugfs_root,
> > -                             &pdpu->debugfs_default_scale);
> > -     }
> > -
> > -     if (cfg->features & BIT(DPU_SSPP_CSC) ||
> > -                     cfg->features & BIT(DPU_SSPP_CSC_10BIT)) {
> > -             dpu_debugfs_setup_regset32(&pdpu->debugfs_csc,
> > -                             sblk->csc_blk.base + cfg->base,
> > -                             sblk->csc_blk.len,
> > -                             kms);
> > -             dpu_debugfs_create_regset32("csc_blk", 0400,
> > -                             pdpu->debugfs_root, &pdpu->debugfs_csc);
> > -     }
> > -
> > -     debugfs_create_u32("xin_id",
> > -                     0400,
> > -                     pdpu->debugfs_root,
> > -                     (u32 *) &cfg->xin_id);
> > -     debugfs_create_u32("clk_ctrl",
> > -                     0400,
> > -                     pdpu->debugfs_root,
> > -                     (u32 *) &cfg->clk_ctrl);
> > -     debugfs_create_x32("creq_vblank",
> > -                     0600,
> > -                     pdpu->debugfs_root,
> > -                     (u32 *) &sblk->creq_vblank);
> > -     debugfs_create_x32("danger_vblank",
> > -                     0600,
> > -                     pdpu->debugfs_root,
> > -                     (u32 *) &sblk->danger_vblank);
> > -
> > -     debugfs_create_file("disable_danger",
> > -                     0600,
> > -                     pdpu->debugfs_root,
> > -                     kms, &dpu_plane_danger_enable);
> > -
> > -     return 0;
> > -}
> > -#else
> > -static int _dpu_plane_init_debugfs(struct drm_plane *plane)
> > -{
> > -     return 0;
> > -}
> >  #endif
> >
> > -static int dpu_plane_late_register(struct drm_plane *plane)
> > -{
> > -     return _dpu_plane_init_debugfs(plane);
> > -}
> > -
> > -static void dpu_plane_early_unregister(struct drm_plane *plane)
> > -{
> > -     struct dpu_plane *pdpu = to_dpu_plane(plane);
> > -
> > -     debugfs_remove_recursive(pdpu->debugfs_root);
> > -}
> > -
> >  static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
> >               uint32_t format, uint64_t modifier)
> >  {
> > @@ -1541,8 +1374,6 @@ static const struct drm_plane_funcs
> > dpu_plane_funcs = {
> >               .reset = dpu_plane_reset,
> >               .atomic_duplicate_state = dpu_plane_duplicate_state,
> >               .atomic_destroy_state = dpu_plane_destroy_state,
> > -             .late_register = dpu_plane_late_register,
> > -             .early_unregister = dpu_plane_early_unregister,
> >               .format_mod_supported = dpu_plane_format_mod_supported,
> >  };
> >
> > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > index 1ee5ca5fcdf7..9d51dad5c6a5 100644
> > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > @@ -126,4 +126,10 @@ void dpu_plane_clear_multirect(const struct
> > drm_plane_state *drm_state);
> >  int dpu_plane_color_fill(struct drm_plane *plane,
> >               uint32_t color, uint32_t alpha);
> >
> > +#ifdef CONFIG_DEBUG_FS
> > +void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool
> > enable);
> > +#else
> > +static inline void dpu_plane_danger_signal_ctrl(struct drm_plane
> > *plane, bool enable) {}
> > +#endif
> > +
> >  #endif /* _DPU_PLANE_H_ */
Rob Clark Nov. 18, 2021, 9:43 p.m. UTC | #3
On Fri, Oct 22, 2021 at 4:35 AM Dmitry Baryshkov
<dmitry.baryshkov@linaro.org> wrote:
>
> Hi,
>
> On Fri, 22 Oct 2021 at 02:53, <abhinavk@codeaurora.org> wrote:
> >
> > On 2021-09-30 07:00, Dmitry Baryshkov wrote:
> > > In preparations of virtualizing the dpu_plane rip out debugfs support
> > > from dpu_plane (as it is mostly used to expose plane's pipe registers).
> > > Also move disable_danger file to danger/ debugfs subdir where it
> > > belongs.
> > >
> > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> >
> > I am yet to review the second part of the virtual plane series to
> > understand why this removal
> > is necessary so I might be missing something.
>
> See below
>
> >
> > The plane's debugfs holds useful information to check a few things
> > rightaway.
> >
> > So if there is some misconfiguration or corruption in addition to the
> > plane state,
> > this is good to check.
> >
> > localhost /sys/kernel/debug/dri/1/plane35 # cat src_blk
> > [4000] 03000556 00000000 00000000 03000556
> > [4010] 00000000 00414000 00000000 0040e000
> > [4020] 00000000 00001600 00000080 00000000
> > [4030] 800236ff 03010002 80000001 00000000
> > [4040] 00000000 00000030 000c0087 00000707
> > [4050] 00000000 00000000 00000000 00000000
> > [4060] 0000ffff 00000000 00000000 00000001
> > [4070] 00000000 44556677 00112233 00000000
> > [4080] 00000000 00000000 00000000 00000000
> > [4090] 00000000 00000000 00000000 00000000
> > [40a0] 00000000 00414000 00000000 0040e000
> > [40b0] 00000000 00000000 00000000 00000000
> > [40c0] 00000000 00000000 00000000 00000000
> > [40d0] 0003f820 00000000 00000000 00000000
> > [40e0] 0003e2c4 00000000 00000000 00000000
> > [40f0] 000f000f 00010330 02e402e4 00000000
> > [4100] 00000000 00000000 03000556 00000000
> > [4110] 00000000 00000000 03000556 00000000
> > [4120] 00000000 00000000 03000556 00000000
> > [4130] 00000000 0000000f 00000000 0000000f
> > [4140] 00000000 00000000 00000000 00000000
> >
> > So I would like to keep this functionality unless there is some
> > compelling reason
> > to remove this.
>
> Ok, I'll take a look if I can keep it or rework somehow.
> The problem is that if you have the plane is virtual, there is no
> strong plane <-> sspp mapping. Consider wide planes, where you'd have
> two SSPPs per single plane.
>
> I think it would make sense to move src_blk to global namespace (as
> ssppN_src) and then add a file giving plane -> sspp relationship.

+1 for moving to per sspp debugfs files, decoupled from plane..

Also, we should implement atomic_print_state() so that we can see the
plane->sspp mapping in $debugfs/dri/N/state

BR,
-R

> >
> > BTW, are you going to submit the second half as a new series now that
> > most
> > of the first one has been reviewed?
> >
> > > ---
> > >  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c   | 123 ++++++++--------
> > >  drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h   |  69 ---------
> > >  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c | 171 +---------------------
> > >  drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h |   6 +
> > >  4 files changed, 69 insertions(+), 300 deletions(-)
> > >
> > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > > index ae48f41821cf..fe33273cdf57 100644
> > > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
> > > @@ -101,84 +101,85 @@ static int dpu_debugfs_safe_stats_show(struct
> > > seq_file *s, void *v)
> > >  }
> > >  DEFINE_SHOW_ATTRIBUTE(dpu_debugfs_safe_stats);
> > >
> > > -static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
> > > -             struct dentry *parent)
> > > +static ssize_t _dpu_plane_danger_read(struct file *file,
> > > +                     char __user *buff, size_t count, loff_t *ppos)
> > >  {
> > > -     struct dentry *entry = debugfs_create_dir("danger", parent);
> > > +     struct dpu_kms *kms = file->private_data;
> > > +     int len;
> > > +     char buf[40];
> > >
> > > -     debugfs_create_file("danger_status", 0600, entry,
> > > -                     dpu_kms, &dpu_debugfs_danger_stats_fops);
> > > -     debugfs_create_file("safe_status", 0600, entry,
> > > -                     dpu_kms, &dpu_debugfs_safe_stats_fops);
> > > +     len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
> > > +
> > > +     return simple_read_from_buffer(buff, count, ppos, buf, len);
> > >  }
> > >
> > > -static int _dpu_debugfs_show_regset32(struct seq_file *s, void *data)
> > > +static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool
> > > enable)
> > >  {
> > > -     struct dpu_debugfs_regset32 *regset = s->private;
> > > -     struct dpu_kms *dpu_kms = regset->dpu_kms;
> > > -     void __iomem *base;
> > > -     uint32_t i, addr;
> > > -
> > > -     if (!dpu_kms->mmio)
> > > -             return 0;
> > > -
> > > -     base = dpu_kms->mmio + regset->offset;
> > > -
> > > -     /* insert padding spaces, if needed */
> > > -     if (regset->offset & 0xF) {
> > > -             seq_printf(s, "[%x]", regset->offset & ~0xF);
> > > -             for (i = 0; i < (regset->offset & 0xF); i += 4)
> > > -                     seq_puts(s, "         ");
> > > -     }
> > > -
> > > -     pm_runtime_get_sync(&dpu_kms->pdev->dev);
> > > -
> > > -     /* main register output */
> > > -     for (i = 0; i < regset->blk_len; i += 4) {
> > > -             addr = regset->offset + i;
> > > -             if ((addr & 0xF) == 0x0)
> > > -                     seq_printf(s, i ? "\n[%x]" : "[%x]", addr);
> > > -             seq_printf(s, " %08x", readl_relaxed(base + i));
> > > +     struct drm_plane *plane;
> > > +
> > > +     drm_for_each_plane(plane, kms->dev) {
> > > +             if (plane->fb && plane->state) {
> > > +                     dpu_plane_danger_signal_ctrl(plane, enable);
> > > +                     DPU_DEBUG("plane:%d img:%dx%d ",
> > > +                             plane->base.id, plane->fb->width,
> > > +                             plane->fb->height);
> > > +                     DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
> > > +                             plane->state->src_x >> 16,
> > > +                             plane->state->src_y >> 16,
> > > +                             plane->state->src_w >> 16,
> > > +                             plane->state->src_h >> 16,
> > > +                             plane->state->crtc_x, plane->state->crtc_y,
> > > +                             plane->state->crtc_w, plane->state->crtc_h);
> > > +             } else {
> > > +                     DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
> > > +             }
> > >       }
> > > -     seq_puts(s, "\n");
> > > -     pm_runtime_put_sync(&dpu_kms->pdev->dev);
> > > -
> > > -     return 0;
> > >  }
> > >
> > > -static int dpu_debugfs_open_regset32(struct inode *inode,
> > > -             struct file *file)
> > > +static ssize_t _dpu_plane_danger_write(struct file *file,
> > > +                 const char __user *user_buf, size_t count, loff_t *ppos)
> > >  {
> > > -     return single_open(file, _dpu_debugfs_show_regset32,
> > > inode->i_private);
> > > -}
> > > +     struct dpu_kms *kms = file->private_data;
> > > +     int disable_panic;
> > > +     int ret;
> > >
> > > -static const struct file_operations dpu_fops_regset32 = {
> > > -     .open =         dpu_debugfs_open_regset32,
> > > -     .read =         seq_read,
> > > -     .llseek =       seq_lseek,
> > > -     .release =      single_release,
> > > -};
> > > +     ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
> > > +     if (ret)
> > > +             return ret;
> > >
> > > -void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
> > > -             uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms)
> > > -{
> > > -     if (regset) {
> > > -             regset->offset = offset;
> > > -             regset->blk_len = length;
> > > -             regset->dpu_kms = dpu_kms;
> > > +     if (disable_panic) {
> > > +             /* Disable panic signal for all active pipes */
> > > +             DPU_DEBUG("Disabling danger:\n");
> > > +             _dpu_plane_set_danger_state(kms, false);
> > > +             kms->has_danger_ctrl = false;
> > > +     } else {
> > > +             /* Enable panic signal for all active pipes */
> > > +             DPU_DEBUG("Enabling danger:\n");
> > > +             kms->has_danger_ctrl = true;
> > > +             _dpu_plane_set_danger_state(kms, true);
> > >       }
> > > +
> > > +     return count;
> > >  }
> > >
> > > -void dpu_debugfs_create_regset32(const char *name, umode_t mode,
> > > -             void *parent, struct dpu_debugfs_regset32 *regset)
> > > +static const struct file_operations dpu_plane_danger_enable = {
> > > +     .open = simple_open,
> > > +     .read = _dpu_plane_danger_read,
> > > +     .write = _dpu_plane_danger_write,
> > > +};
> > > +
> > > +static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
> > > +             struct dentry *parent)
> > >  {
> > > -     if (!name || !regset || !regset->dpu_kms || !regset->blk_len)
> > > -             return;
> > > +     struct dentry *entry = debugfs_create_dir("danger", parent);
> > >
> > > -     /* make sure offset is a multiple of 4 */
> > > -     regset->offset = round_down(regset->offset, 4);
> > > +     debugfs_create_file("danger_status", 0600, entry,
> > > +                     dpu_kms, &dpu_debugfs_danger_stats_fops);
> > > +     debugfs_create_file("safe_status", 0600, entry,
> > > +                     dpu_kms, &dpu_debugfs_safe_stats_fops);
> > > +     debugfs_create_file("disable_danger", 0600, entry,
> > > +                     dpu_kms, &dpu_plane_danger_enable);
> > >
> > > -     debugfs_create_file(name, mode, parent, regset, &dpu_fops_regset32);
> > >  }
> > >
> > >  static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor
> > > *minor)
> > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > > b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > > index 323a6bce9e64..ab65c817eb42 100644
> > > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
> > > @@ -166,75 +166,6 @@ struct dpu_global_state
> > >  struct dpu_global_state
> > >       *__must_check dpu_kms_get_global_state(struct drm_atomic_state *s);
> > >
> > > -/**
> > > - * Debugfs functions - extra helper functions for debugfs support
> > > - *
> > > - * Main debugfs documentation is located at,
> > > - *
> > > - * Documentation/filesystems/debugfs.rst
> > > - *
> > > - * @dpu_debugfs_setup_regset32: Initialize data for
> > > dpu_debugfs_create_regset32
> > > - * @dpu_debugfs_create_regset32: Create 32-bit register dump file
> > > - * @dpu_debugfs_get_root: Get root dentry for DPU_KMS's debugfs node
> > > - */
> > > -
> > > -/**
> > > - * Companion structure for dpu_debugfs_create_regset32. Do not
> > > initialize the
> > > - * members of this structure explicitly; use
> > > dpu_debugfs_setup_regset32 instead.
> > > - */
> > > -struct dpu_debugfs_regset32 {
> > > -     uint32_t offset;
> > > -     uint32_t blk_len;
> > > -     struct dpu_kms *dpu_kms;
> > > -};
> > > -
> > > -/**
> > > - * dpu_debugfs_setup_regset32 - Initialize register block definition
> > > for debugfs
> > > - * This function is meant to initialize dpu_debugfs_regset32
> > > structures for use
> > > - * with dpu_debugfs_create_regset32.
> > > - * @regset: opaque register definition structure
> > > - * @offset: sub-block offset
> > > - * @length: sub-block length, in bytes
> > > - * @dpu_kms: pointer to dpu kms structure
> > > - */
> > > -void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
> > > -             uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms);
> > > -
> > > -/**
> > > - * dpu_debugfs_create_regset32 - Create register read back file for
> > > debugfs
> > > - *
> > > - * This function is almost identical to the standard
> > > debugfs_create_regset32()
> > > - * function, with the main difference being that a list of register
> > > - * names/offsets do not need to be provided. The 'read' function
> > > simply outputs
> > > - * sequential register values over a specified range.
> > > - *
> > > - * Similar to the related debugfs_create_regset32 API, the structure
> > > pointed to
> > > - * by regset needs to persist for the lifetime of the created file.
> > > The calling
> > > - * code is responsible for initialization/management of this
> > > structure.
> > > - *
> > > - * The structure pointed to by regset is meant to be opaque. Please
> > > use
> > > - * dpu_debugfs_setup_regset32 to initialize it.
> > > - *
> > > - * @name:   File name within debugfs
> > > - * @mode:   File mode within debugfs
> > > - * @parent: Parent directory entry within debugfs, can be NULL
> > > - * @regset: Pointer to persistent register block definition
> > > - */
> > > -void dpu_debugfs_create_regset32(const char *name, umode_t mode,
> > > -             void *parent, struct dpu_debugfs_regset32 *regset);
> > > -
> > > -/**
> > > - * dpu_debugfs_get_root - Return root directory entry for KMS's
> > > debugfs
> > > - *
> > > - * The return value should be passed as the 'parent' argument to
> > > subsequent
> > > - * debugfs create calls.
> > > - *
> > > - * @dpu_kms: Pointer to DPU's KMS structure
> > > - *
> > > - * Return: dentry pointer for DPU's debugfs location
> > > - */
> > > -void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms);
> > > -
> > >  /**
> > >   * DPU info management functions
> > >   * These functions/definitions allow for building up a 'dpu_info'
> > > structure
> > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > > b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > > index d8018e664925..42bcde1ddd0f 100644
> > > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
> > > @@ -108,13 +108,6 @@ struct dpu_plane {
> > >       bool is_virtual;
> > >       struct list_head mplane_list;
> > >       struct dpu_mdss_cfg *catalog;
> > > -
> > > -     /* debugfs related stuff */
> > > -     struct dentry *debugfs_root;
> > > -     struct dpu_debugfs_regset32 debugfs_src;
> > > -     struct dpu_debugfs_regset32 debugfs_scaler;
> > > -     struct dpu_debugfs_regset32 debugfs_csc;
> > > -     bool debugfs_default_scale;
> > >  };
> > >
> > >  static const uint64_t supported_format_modifiers[] = {
> > > @@ -1343,7 +1336,7 @@ static void dpu_plane_reset(struct drm_plane
> > > *plane)
> > >  }
> > >
> > >  #ifdef CONFIG_DEBUG_FS
> > > -static void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool
> > > enable)
> > > +void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool
> > > enable)
> > >  {
> > >       struct dpu_plane *pdpu = to_dpu_plane(plane);
> > >       struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);
> > > @@ -1355,168 +1348,8 @@ static void
> > > dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
> > >       _dpu_plane_set_qos_ctrl(plane, enable, DPU_PLANE_QOS_PANIC_CTRL);
> > >       pm_runtime_put_sync(&dpu_kms->pdev->dev);
> > >  }
> > > -
> > > -static ssize_t _dpu_plane_danger_read(struct file *file,
> > > -                     char __user *buff, size_t count, loff_t *ppos)
> > > -{
> > > -     struct dpu_kms *kms = file->private_data;
> > > -     int len;
> > > -     char buf[40];
> > > -
> > > -     len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
> > > -
> > > -     return simple_read_from_buffer(buff, count, ppos, buf, len);
> > > -}
> > > -
> > > -static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool
> > > enable)
> > > -{
> > > -     struct drm_plane *plane;
> > > -
> > > -     drm_for_each_plane(plane, kms->dev) {
> > > -             if (plane->fb && plane->state) {
> > > -                     dpu_plane_danger_signal_ctrl(plane, enable);
> > > -                     DPU_DEBUG("plane:%d img:%dx%d ",
> > > -                             plane->base.id, plane->fb->width,
> > > -                             plane->fb->height);
> > > -                     DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
> > > -                             plane->state->src_x >> 16,
> > > -                             plane->state->src_y >> 16,
> > > -                             plane->state->src_w >> 16,
> > > -                             plane->state->src_h >> 16,
> > > -                             plane->state->crtc_x, plane->state->crtc_y,
> > > -                             plane->state->crtc_w, plane->state->crtc_h);
> > > -             } else {
> > > -                     DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
> > > -             }
> > > -     }
> > > -}
> > > -
> > > -static ssize_t _dpu_plane_danger_write(struct file *file,
> > > -                 const char __user *user_buf, size_t count, loff_t *ppos)
> > > -{
> > > -     struct dpu_kms *kms = file->private_data;
> > > -     int disable_panic;
> > > -     int ret;
> > > -
> > > -     ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
> > > -     if (ret)
> > > -             return ret;
> > > -
> > > -     if (disable_panic) {
> > > -             /* Disable panic signal for all active pipes */
> > > -             DPU_DEBUG("Disabling danger:\n");
> > > -             _dpu_plane_set_danger_state(kms, false);
> > > -             kms->has_danger_ctrl = false;
> > > -     } else {
> > > -             /* Enable panic signal for all active pipes */
> > > -             DPU_DEBUG("Enabling danger:\n");
> > > -             kms->has_danger_ctrl = true;
> > > -             _dpu_plane_set_danger_state(kms, true);
> > > -     }
> > > -
> > > -     return count;
> > > -}
> > > -
> > > -static const struct file_operations dpu_plane_danger_enable = {
> > > -     .open = simple_open,
> > > -     .read = _dpu_plane_danger_read,
> > > -     .write = _dpu_plane_danger_write,
> > > -};
> > > -
> > > -static int _dpu_plane_init_debugfs(struct drm_plane *plane)
> > > -{
> > > -     struct dpu_plane *pdpu = to_dpu_plane(plane);
> > > -     struct dpu_kms *kms = _dpu_plane_get_kms(plane);
> > > -     const struct dpu_sspp_cfg *cfg = pdpu->pipe_hw->cap;
> > > -     const struct dpu_sspp_sub_blks *sblk = cfg->sblk;
> > > -
> > > -     /* create overall sub-directory for the pipe */
> > > -     pdpu->debugfs_root =
> > > -             debugfs_create_dir(plane->name,
> > > -                             plane->dev->primary->debugfs_root);
> > > -
> > > -     /* don't error check these */
> > > -     debugfs_create_xul("features", 0600,
> > > -                     pdpu->debugfs_root, (unsigned long
> > > *)&pdpu->pipe_hw->cap->features);
> > > -
> > > -     /* add register dump support */
> > > -     dpu_debugfs_setup_regset32(&pdpu->debugfs_src,
> > > -                     sblk->src_blk.base + cfg->base,
> > > -                     sblk->src_blk.len,
> > > -                     kms);
> > > -     dpu_debugfs_create_regset32("src_blk", 0400,
> > > -                     pdpu->debugfs_root, &pdpu->debugfs_src);
> > > -
> > > -     if (cfg->features & BIT(DPU_SSPP_SCALER_QSEED3) ||
> > > -                     cfg->features & BIT(DPU_SSPP_SCALER_QSEED3LITE) ||
> > > -                     cfg->features & BIT(DPU_SSPP_SCALER_QSEED2) ||
> > > -                     cfg->features & BIT(DPU_SSPP_SCALER_QSEED4)) {
> > > -             dpu_debugfs_setup_regset32(&pdpu->debugfs_scaler,
> > > -                             sblk->scaler_blk.base + cfg->base,
> > > -                             sblk->scaler_blk.len,
> > > -                             kms);
> > > -             dpu_debugfs_create_regset32("scaler_blk", 0400,
> > > -                             pdpu->debugfs_root,
> > > -                             &pdpu->debugfs_scaler);
> > > -             debugfs_create_bool("default_scaling",
> > > -                             0600,
> > > -                             pdpu->debugfs_root,
> > > -                             &pdpu->debugfs_default_scale);
> > > -     }
> > > -
> > > -     if (cfg->features & BIT(DPU_SSPP_CSC) ||
> > > -                     cfg->features & BIT(DPU_SSPP_CSC_10BIT)) {
> > > -             dpu_debugfs_setup_regset32(&pdpu->debugfs_csc,
> > > -                             sblk->csc_blk.base + cfg->base,
> > > -                             sblk->csc_blk.len,
> > > -                             kms);
> > > -             dpu_debugfs_create_regset32("csc_blk", 0400,
> > > -                             pdpu->debugfs_root, &pdpu->debugfs_csc);
> > > -     }
> > > -
> > > -     debugfs_create_u32("xin_id",
> > > -                     0400,
> > > -                     pdpu->debugfs_root,
> > > -                     (u32 *) &cfg->xin_id);
> > > -     debugfs_create_u32("clk_ctrl",
> > > -                     0400,
> > > -                     pdpu->debugfs_root,
> > > -                     (u32 *) &cfg->clk_ctrl);
> > > -     debugfs_create_x32("creq_vblank",
> > > -                     0600,
> > > -                     pdpu->debugfs_root,
> > > -                     (u32 *) &sblk->creq_vblank);
> > > -     debugfs_create_x32("danger_vblank",
> > > -                     0600,
> > > -                     pdpu->debugfs_root,
> > > -                     (u32 *) &sblk->danger_vblank);
> > > -
> > > -     debugfs_create_file("disable_danger",
> > > -                     0600,
> > > -                     pdpu->debugfs_root,
> > > -                     kms, &dpu_plane_danger_enable);
> > > -
> > > -     return 0;
> > > -}
> > > -#else
> > > -static int _dpu_plane_init_debugfs(struct drm_plane *plane)
> > > -{
> > > -     return 0;
> > > -}
> > >  #endif
> > >
> > > -static int dpu_plane_late_register(struct drm_plane *plane)
> > > -{
> > > -     return _dpu_plane_init_debugfs(plane);
> > > -}
> > > -
> > > -static void dpu_plane_early_unregister(struct drm_plane *plane)
> > > -{
> > > -     struct dpu_plane *pdpu = to_dpu_plane(plane);
> > > -
> > > -     debugfs_remove_recursive(pdpu->debugfs_root);
> > > -}
> > > -
> > >  static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
> > >               uint32_t format, uint64_t modifier)
> > >  {
> > > @@ -1541,8 +1374,6 @@ static const struct drm_plane_funcs
> > > dpu_plane_funcs = {
> > >               .reset = dpu_plane_reset,
> > >               .atomic_duplicate_state = dpu_plane_duplicate_state,
> > >               .atomic_destroy_state = dpu_plane_destroy_state,
> > > -             .late_register = dpu_plane_late_register,
> > > -             .early_unregister = dpu_plane_early_unregister,
> > >               .format_mod_supported = dpu_plane_format_mod_supported,
> > >  };
> > >
> > > diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > > b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > > index 1ee5ca5fcdf7..9d51dad5c6a5 100644
> > > --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > > +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
> > > @@ -126,4 +126,10 @@ void dpu_plane_clear_multirect(const struct
> > > drm_plane_state *drm_state);
> > >  int dpu_plane_color_fill(struct drm_plane *plane,
> > >               uint32_t color, uint32_t alpha);
> > >
> > > +#ifdef CONFIG_DEBUG_FS
> > > +void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool
> > > enable);
> > > +#else
> > > +static inline void dpu_plane_danger_signal_ctrl(struct drm_plane
> > > *plane, bool enable) {}
> > > +#endif
> > > +
> > >  #endif /* _DPU_PLANE_H_ */
>
>
>
> --
> With best wishes
> Dmitry
diff mbox series

Patch

diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
index ae48f41821cf..fe33273cdf57 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c
@@ -101,84 +101,85 @@  static int dpu_debugfs_safe_stats_show(struct seq_file *s, void *v)
 }
 DEFINE_SHOW_ATTRIBUTE(dpu_debugfs_safe_stats);
 
-static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
-		struct dentry *parent)
+static ssize_t _dpu_plane_danger_read(struct file *file,
+			char __user *buff, size_t count, loff_t *ppos)
 {
-	struct dentry *entry = debugfs_create_dir("danger", parent);
+	struct dpu_kms *kms = file->private_data;
+	int len;
+	char buf[40];
 
-	debugfs_create_file("danger_status", 0600, entry,
-			dpu_kms, &dpu_debugfs_danger_stats_fops);
-	debugfs_create_file("safe_status", 0600, entry,
-			dpu_kms, &dpu_debugfs_safe_stats_fops);
+	len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
+
+	return simple_read_from_buffer(buff, count, ppos, buf, len);
 }
 
-static int _dpu_debugfs_show_regset32(struct seq_file *s, void *data)
+static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool enable)
 {
-	struct dpu_debugfs_regset32 *regset = s->private;
-	struct dpu_kms *dpu_kms = regset->dpu_kms;
-	void __iomem *base;
-	uint32_t i, addr;
-
-	if (!dpu_kms->mmio)
-		return 0;
-
-	base = dpu_kms->mmio + regset->offset;
-
-	/* insert padding spaces, if needed */
-	if (regset->offset & 0xF) {
-		seq_printf(s, "[%x]", regset->offset & ~0xF);
-		for (i = 0; i < (regset->offset & 0xF); i += 4)
-			seq_puts(s, "         ");
-	}
-
-	pm_runtime_get_sync(&dpu_kms->pdev->dev);
-
-	/* main register output */
-	for (i = 0; i < regset->blk_len; i += 4) {
-		addr = regset->offset + i;
-		if ((addr & 0xF) == 0x0)
-			seq_printf(s, i ? "\n[%x]" : "[%x]", addr);
-		seq_printf(s, " %08x", readl_relaxed(base + i));
+	struct drm_plane *plane;
+
+	drm_for_each_plane(plane, kms->dev) {
+		if (plane->fb && plane->state) {
+			dpu_plane_danger_signal_ctrl(plane, enable);
+			DPU_DEBUG("plane:%d img:%dx%d ",
+				plane->base.id, plane->fb->width,
+				plane->fb->height);
+			DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
+				plane->state->src_x >> 16,
+				plane->state->src_y >> 16,
+				plane->state->src_w >> 16,
+				plane->state->src_h >> 16,
+				plane->state->crtc_x, plane->state->crtc_y,
+				plane->state->crtc_w, plane->state->crtc_h);
+		} else {
+			DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
+		}
 	}
-	seq_puts(s, "\n");
-	pm_runtime_put_sync(&dpu_kms->pdev->dev);
-
-	return 0;
 }
 
-static int dpu_debugfs_open_regset32(struct inode *inode,
-		struct file *file)
+static ssize_t _dpu_plane_danger_write(struct file *file,
+		    const char __user *user_buf, size_t count, loff_t *ppos)
 {
-	return single_open(file, _dpu_debugfs_show_regset32, inode->i_private);
-}
+	struct dpu_kms *kms = file->private_data;
+	int disable_panic;
+	int ret;
 
-static const struct file_operations dpu_fops_regset32 = {
-	.open =		dpu_debugfs_open_regset32,
-	.read =		seq_read,
-	.llseek =	seq_lseek,
-	.release =	single_release,
-};
+	ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
+	if (ret)
+		return ret;
 
-void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
-		uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms)
-{
-	if (regset) {
-		regset->offset = offset;
-		regset->blk_len = length;
-		regset->dpu_kms = dpu_kms;
+	if (disable_panic) {
+		/* Disable panic signal for all active pipes */
+		DPU_DEBUG("Disabling danger:\n");
+		_dpu_plane_set_danger_state(kms, false);
+		kms->has_danger_ctrl = false;
+	} else {
+		/* Enable panic signal for all active pipes */
+		DPU_DEBUG("Enabling danger:\n");
+		kms->has_danger_ctrl = true;
+		_dpu_plane_set_danger_state(kms, true);
 	}
+
+	return count;
 }
 
-void dpu_debugfs_create_regset32(const char *name, umode_t mode,
-		void *parent, struct dpu_debugfs_regset32 *regset)
+static const struct file_operations dpu_plane_danger_enable = {
+	.open = simple_open,
+	.read = _dpu_plane_danger_read,
+	.write = _dpu_plane_danger_write,
+};
+
+static void dpu_debugfs_danger_init(struct dpu_kms *dpu_kms,
+		struct dentry *parent)
 {
-	if (!name || !regset || !regset->dpu_kms || !regset->blk_len)
-		return;
+	struct dentry *entry = debugfs_create_dir("danger", parent);
 
-	/* make sure offset is a multiple of 4 */
-	regset->offset = round_down(regset->offset, 4);
+	debugfs_create_file("danger_status", 0600, entry,
+			dpu_kms, &dpu_debugfs_danger_stats_fops);
+	debugfs_create_file("safe_status", 0600, entry,
+			dpu_kms, &dpu_debugfs_safe_stats_fops);
+	debugfs_create_file("disable_danger", 0600, entry,
+			dpu_kms, &dpu_plane_danger_enable);
 
-	debugfs_create_file(name, mode, parent, regset, &dpu_fops_regset32);
 }
 
 static int dpu_kms_debugfs_init(struct msm_kms *kms, struct drm_minor *minor)
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
index 323a6bce9e64..ab65c817eb42 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.h
@@ -166,75 +166,6 @@  struct dpu_global_state
 struct dpu_global_state
 	*__must_check dpu_kms_get_global_state(struct drm_atomic_state *s);
 
-/**
- * Debugfs functions - extra helper functions for debugfs support
- *
- * Main debugfs documentation is located at,
- *
- * Documentation/filesystems/debugfs.rst
- *
- * @dpu_debugfs_setup_regset32: Initialize data for dpu_debugfs_create_regset32
- * @dpu_debugfs_create_regset32: Create 32-bit register dump file
- * @dpu_debugfs_get_root: Get root dentry for DPU_KMS's debugfs node
- */
-
-/**
- * Companion structure for dpu_debugfs_create_regset32. Do not initialize the
- * members of this structure explicitly; use dpu_debugfs_setup_regset32 instead.
- */
-struct dpu_debugfs_regset32 {
-	uint32_t offset;
-	uint32_t blk_len;
-	struct dpu_kms *dpu_kms;
-};
-
-/**
- * dpu_debugfs_setup_regset32 - Initialize register block definition for debugfs
- * This function is meant to initialize dpu_debugfs_regset32 structures for use
- * with dpu_debugfs_create_regset32.
- * @regset: opaque register definition structure
- * @offset: sub-block offset
- * @length: sub-block length, in bytes
- * @dpu_kms: pointer to dpu kms structure
- */
-void dpu_debugfs_setup_regset32(struct dpu_debugfs_regset32 *regset,
-		uint32_t offset, uint32_t length, struct dpu_kms *dpu_kms);
-
-/**
- * dpu_debugfs_create_regset32 - Create register read back file for debugfs
- *
- * This function is almost identical to the standard debugfs_create_regset32()
- * function, with the main difference being that a list of register
- * names/offsets do not need to be provided. The 'read' function simply outputs
- * sequential register values over a specified range.
- *
- * Similar to the related debugfs_create_regset32 API, the structure pointed to
- * by regset needs to persist for the lifetime of the created file. The calling
- * code is responsible for initialization/management of this structure.
- *
- * The structure pointed to by regset is meant to be opaque. Please use
- * dpu_debugfs_setup_regset32 to initialize it.
- *
- * @name:   File name within debugfs
- * @mode:   File mode within debugfs
- * @parent: Parent directory entry within debugfs, can be NULL
- * @regset: Pointer to persistent register block definition
- */
-void dpu_debugfs_create_regset32(const char *name, umode_t mode,
-		void *parent, struct dpu_debugfs_regset32 *regset);
-
-/**
- * dpu_debugfs_get_root - Return root directory entry for KMS's debugfs
- *
- * The return value should be passed as the 'parent' argument to subsequent
- * debugfs create calls.
- *
- * @dpu_kms: Pointer to DPU's KMS structure
- *
- * Return: dentry pointer for DPU's debugfs location
- */
-void *dpu_debugfs_get_root(struct dpu_kms *dpu_kms);
-
 /**
  * DPU info management functions
  * These functions/definitions allow for building up a 'dpu_info' structure
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
index d8018e664925..42bcde1ddd0f 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.c
@@ -108,13 +108,6 @@  struct dpu_plane {
 	bool is_virtual;
 	struct list_head mplane_list;
 	struct dpu_mdss_cfg *catalog;
-
-	/* debugfs related stuff */
-	struct dentry *debugfs_root;
-	struct dpu_debugfs_regset32 debugfs_src;
-	struct dpu_debugfs_regset32 debugfs_scaler;
-	struct dpu_debugfs_regset32 debugfs_csc;
-	bool debugfs_default_scale;
 };
 
 static const uint64_t supported_format_modifiers[] = {
@@ -1343,7 +1336,7 @@  static void dpu_plane_reset(struct drm_plane *plane)
 }
 
 #ifdef CONFIG_DEBUG_FS
-static void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
+void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
 {
 	struct dpu_plane *pdpu = to_dpu_plane(plane);
 	struct dpu_kms *dpu_kms = _dpu_plane_get_kms(plane);
@@ -1355,168 +1348,8 @@  static void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable)
 	_dpu_plane_set_qos_ctrl(plane, enable, DPU_PLANE_QOS_PANIC_CTRL);
 	pm_runtime_put_sync(&dpu_kms->pdev->dev);
 }
-
-static ssize_t _dpu_plane_danger_read(struct file *file,
-			char __user *buff, size_t count, loff_t *ppos)
-{
-	struct dpu_kms *kms = file->private_data;
-	int len;
-	char buf[40];
-
-	len = scnprintf(buf, sizeof(buf), "%d\n", !kms->has_danger_ctrl);
-
-	return simple_read_from_buffer(buff, count, ppos, buf, len);
-}
-
-static void _dpu_plane_set_danger_state(struct dpu_kms *kms, bool enable)
-{
-	struct drm_plane *plane;
-
-	drm_for_each_plane(plane, kms->dev) {
-		if (plane->fb && plane->state) {
-			dpu_plane_danger_signal_ctrl(plane, enable);
-			DPU_DEBUG("plane:%d img:%dx%d ",
-				plane->base.id, plane->fb->width,
-				plane->fb->height);
-			DPU_DEBUG("src[%d,%d,%d,%d] dst[%d,%d,%d,%d]\n",
-				plane->state->src_x >> 16,
-				plane->state->src_y >> 16,
-				plane->state->src_w >> 16,
-				plane->state->src_h >> 16,
-				plane->state->crtc_x, plane->state->crtc_y,
-				plane->state->crtc_w, plane->state->crtc_h);
-		} else {
-			DPU_DEBUG("Inactive plane:%d\n", plane->base.id);
-		}
-	}
-}
-
-static ssize_t _dpu_plane_danger_write(struct file *file,
-		    const char __user *user_buf, size_t count, loff_t *ppos)
-{
-	struct dpu_kms *kms = file->private_data;
-	int disable_panic;
-	int ret;
-
-	ret = kstrtouint_from_user(user_buf, count, 0, &disable_panic);
-	if (ret)
-		return ret;
-
-	if (disable_panic) {
-		/* Disable panic signal for all active pipes */
-		DPU_DEBUG("Disabling danger:\n");
-		_dpu_plane_set_danger_state(kms, false);
-		kms->has_danger_ctrl = false;
-	} else {
-		/* Enable panic signal for all active pipes */
-		DPU_DEBUG("Enabling danger:\n");
-		kms->has_danger_ctrl = true;
-		_dpu_plane_set_danger_state(kms, true);
-	}
-
-	return count;
-}
-
-static const struct file_operations dpu_plane_danger_enable = {
-	.open = simple_open,
-	.read = _dpu_plane_danger_read,
-	.write = _dpu_plane_danger_write,
-};
-
-static int _dpu_plane_init_debugfs(struct drm_plane *plane)
-{
-	struct dpu_plane *pdpu = to_dpu_plane(plane);
-	struct dpu_kms *kms = _dpu_plane_get_kms(plane);
-	const struct dpu_sspp_cfg *cfg = pdpu->pipe_hw->cap;
-	const struct dpu_sspp_sub_blks *sblk = cfg->sblk;
-
-	/* create overall sub-directory for the pipe */
-	pdpu->debugfs_root =
-		debugfs_create_dir(plane->name,
-				plane->dev->primary->debugfs_root);
-
-	/* don't error check these */
-	debugfs_create_xul("features", 0600,
-			pdpu->debugfs_root, (unsigned long *)&pdpu->pipe_hw->cap->features);
-
-	/* add register dump support */
-	dpu_debugfs_setup_regset32(&pdpu->debugfs_src,
-			sblk->src_blk.base + cfg->base,
-			sblk->src_blk.len,
-			kms);
-	dpu_debugfs_create_regset32("src_blk", 0400,
-			pdpu->debugfs_root, &pdpu->debugfs_src);
-
-	if (cfg->features & BIT(DPU_SSPP_SCALER_QSEED3) ||
-			cfg->features & BIT(DPU_SSPP_SCALER_QSEED3LITE) ||
-			cfg->features & BIT(DPU_SSPP_SCALER_QSEED2) ||
-			cfg->features & BIT(DPU_SSPP_SCALER_QSEED4)) {
-		dpu_debugfs_setup_regset32(&pdpu->debugfs_scaler,
-				sblk->scaler_blk.base + cfg->base,
-				sblk->scaler_blk.len,
-				kms);
-		dpu_debugfs_create_regset32("scaler_blk", 0400,
-				pdpu->debugfs_root,
-				&pdpu->debugfs_scaler);
-		debugfs_create_bool("default_scaling",
-				0600,
-				pdpu->debugfs_root,
-				&pdpu->debugfs_default_scale);
-	}
-
-	if (cfg->features & BIT(DPU_SSPP_CSC) ||
-			cfg->features & BIT(DPU_SSPP_CSC_10BIT)) {
-		dpu_debugfs_setup_regset32(&pdpu->debugfs_csc,
-				sblk->csc_blk.base + cfg->base,
-				sblk->csc_blk.len,
-				kms);
-		dpu_debugfs_create_regset32("csc_blk", 0400,
-				pdpu->debugfs_root, &pdpu->debugfs_csc);
-	}
-
-	debugfs_create_u32("xin_id",
-			0400,
-			pdpu->debugfs_root,
-			(u32 *) &cfg->xin_id);
-	debugfs_create_u32("clk_ctrl",
-			0400,
-			pdpu->debugfs_root,
-			(u32 *) &cfg->clk_ctrl);
-	debugfs_create_x32("creq_vblank",
-			0600,
-			pdpu->debugfs_root,
-			(u32 *) &sblk->creq_vblank);
-	debugfs_create_x32("danger_vblank",
-			0600,
-			pdpu->debugfs_root,
-			(u32 *) &sblk->danger_vblank);
-
-	debugfs_create_file("disable_danger",
-			0600,
-			pdpu->debugfs_root,
-			kms, &dpu_plane_danger_enable);
-
-	return 0;
-}
-#else
-static int _dpu_plane_init_debugfs(struct drm_plane *plane)
-{
-	return 0;
-}
 #endif
 
-static int dpu_plane_late_register(struct drm_plane *plane)
-{
-	return _dpu_plane_init_debugfs(plane);
-}
-
-static void dpu_plane_early_unregister(struct drm_plane *plane)
-{
-	struct dpu_plane *pdpu = to_dpu_plane(plane);
-
-	debugfs_remove_recursive(pdpu->debugfs_root);
-}
-
 static bool dpu_plane_format_mod_supported(struct drm_plane *plane,
 		uint32_t format, uint64_t modifier)
 {
@@ -1541,8 +1374,6 @@  static const struct drm_plane_funcs dpu_plane_funcs = {
 		.reset = dpu_plane_reset,
 		.atomic_duplicate_state = dpu_plane_duplicate_state,
 		.atomic_destroy_state = dpu_plane_destroy_state,
-		.late_register = dpu_plane_late_register,
-		.early_unregister = dpu_plane_early_unregister,
 		.format_mod_supported = dpu_plane_format_mod_supported,
 };
 
diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
index 1ee5ca5fcdf7..9d51dad5c6a5 100644
--- a/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
+++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_plane.h
@@ -126,4 +126,10 @@  void dpu_plane_clear_multirect(const struct drm_plane_state *drm_state);
 int dpu_plane_color_fill(struct drm_plane *plane,
 		uint32_t color, uint32_t alpha);
 
+#ifdef CONFIG_DEBUG_FS
+void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable);
+#else
+static inline void dpu_plane_danger_signal_ctrl(struct drm_plane *plane, bool enable) {}
+#endif
+
 #endif /* _DPU_PLANE_H_ */