<html><body><p>
<pre>
Hi, Angelo:

On Wed, 2024-11-20 at 13:44 +0100, AngeloGioacchino Del Regno wrote:
> External email : Please do not click links or open attachments until you have verified the sender or the content.
>
>
> This IP includes a Pattern Generator which is useful for debugging
> and testing purposes: add the relevant register and bits to the
> mtk_dpi_regs.h header, and implement support for it in mtk_dpi.
>
> Adding this required to introduce a .debugfs_init() callback for
> the DPI bridge, which creates a "dpi_test_pattern" file in the
> directory of the appropriate connector.
>
> The pattern generator can generate various internal patterns and
> this submission includes support for:
> - 256 or 1024 shades of gray in a Vertical or Horizontal Pattern
> - Vertical Color Bars
> - Frame border
> - Dot Moire
>
> This generator also supports filling the entire screen with one
> custom color, but support for that is not included in this commit.
>
> Enabling and disabling this generator can be done by sending a
> string to the dpi_test_pattern debugfs file; the pattern is
> expected to be formatted as follows:
>
> <enable (1) or disable (0)> <pattern number>
>
> where the pattern number can be a number from 0 to 7, excluding 5.
>
> Of course 5 is excluded because that activates custom color fill
> which, again, is not supported in this commit.

Reviewed-by: CK Hu <ck.hu@mediatek.com>

>
> Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
> ---
> drivers/gpu/drm/mediatek/mtk_dpi.c | 107 ++++++++++++++++++++++++
> drivers/gpu/drm/mediatek/mtk_dpi_regs.h | 4 +
> 2 files changed, 111 insertions(+)
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c
> index 20a9d589fd75..c7143184e5de 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dpi.c
> +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c
> @@ -6,6 +6,7 @@
>
> #include <linux/clk.h>
> #include <linux/component.h>
> +#include <linux/debugfs.h>
> #include <linux/interrupt.h>
> #include <linux/kernel.h>
> #include <linux/media-bus-format.h>
> @@ -166,6 +167,18 @@ static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, u32 mask)
> writel(tmp, dpi->regs + offset);
> }
>
> +static void mtk_dpi_test_pattern_en(struct mtk_dpi *dpi, u8 type, bool enable)
> +{
> + u32 val;
> +
> + if (enable)
> + val = FIELD_PREP(DPI_PAT_SEL, type) | DPI_PAT_EN;
> + else
> + val = 0;
> +
> + mtk_dpi_mask(dpi, DPI_PATTERN0, val, DPI_PAT_SEL | DPI_PAT_EN);
> +}
> +
> static void mtk_dpi_sw_reset(struct mtk_dpi *dpi, bool reset)
> {
> mtk_dpi_mask(dpi, DPI_RET, reset ? RST : 0, RST);
> @@ -767,6 +780,99 @@ mtk_dpi_bridge_mode_valid(struct drm_bridge *bridge,
> return MODE_OK;
> }
>
> +static int mtk_dpi_debug_tp_show(struct seq_file *m, void *arg)
> +{
> + struct mtk_dpi *dpi = m->private;
> + bool en;
> + u32 val;
> +
> + if (!dpi)
> + return -EINVAL;
> +
> + val = readl(dpi->regs + DPI_PATTERN0);
> + en = val & DPI_PAT_EN;
> + val = FIELD_GET(DPI_PAT_SEL, val);
> +
> + seq_printf(m, "DPI Test Pattern: %s\n", en ? "Enabled" : "Disabled");
> +
> + if (en) {
> + seq_printf(m, "Internal pattern %d: ", val);
> + switch (val) {
> + case 0:
> + seq_puts(m, "256 Vertical Gray\n");
> + break;
> + case 1:
> + seq_puts(m, "1024 Vertical Gray\n");
> + break;
> + case 2:
> + seq_puts(m, "256 Horizontal Gray\n");
> + break;
> + case 3:
> + seq_puts(m, "1024 Horizontal Gray\n");
> + break;
> + case 4:
> + seq_puts(m, "Vertical Color bars\n");
> + break;
> + case 6:
> + seq_puts(m, "Frame border\n");
> + break;
> + case 7:
> + seq_puts(m, "Dot moire\n");
> + break;
> + default:
> + seq_puts(m, "Invalid selection\n");
> + break;
> + }
> + }
> +
> + return 0;
> +}
> +
> +static ssize_t mtk_dpi_debug_tp_write(struct file *file, const char __user *ubuf,
> + size_t len, loff_t *offp)
> +{
> + struct seq_file *m = file->private_data;
> + u32 en, type;
> + char buf[6];
> +
> + if (!m || !m->private || *offp || len > sizeof(buf) - 1)
> + return -EINVAL;
> +
> + memset(buf, 0, sizeof(buf));
> + if (copy_from_user(buf, ubuf, len))
> + return -EFAULT;
> +
> + if (sscanf(buf, "%u %u", &en, &type) != 2)
> + return -EINVAL;
> +
> + if (en < 0 || en > 1 || type < 0 || type > 7)
> + return -EINVAL;
> +
> + mtk_dpi_test_pattern_en((struct mtk_dpi *)m->private, type, en);
> + return len;
> +}
> +
> +static int mtk_dpi_debug_tp_open(struct inode *inode, struct file *file)
> +{
> + return single_open(file, mtk_dpi_debug_tp_show, inode->i_private);
> +}
> +
> +static const struct file_operations mtk_dpi_debug_tp_fops = {
> + .owner = THIS_MODULE,
> + .open = mtk_dpi_debug_tp_open,
> + .read = seq_read,
> + .write = mtk_dpi_debug_tp_write,
> + .llseek = seq_lseek,
> + .release = single_release,
> +};
> +
> +static void mtk_dpi_debugfs_init(struct drm_bridge *bridge, struct dentry *root)
> +{
> + struct mtk_dpi *dpi = bridge_to_dpi(bridge);
> +
> + debugfs_create_file("dpi_test_pattern", 0640, root, dpi, &mtk_dpi_debug_tp_fops);
> +}
> +
> static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
> .attach = mtk_dpi_bridge_attach,
> .mode_set = mtk_dpi_bridge_mode_set,
> @@ -779,6 +885,7 @@ static const struct drm_bridge_funcs mtk_dpi_bridge_funcs = {
> .atomic_duplicate_state = drm_atomic_helper_bridge_duplicate_state,
> .atomic_destroy_state = drm_atomic_helper_bridge_destroy_state,
> .atomic_reset = drm_atomic_helper_bridge_reset,
> + .debugfs_init = mtk_dpi_debugfs_init,
> };
>
> void mtk_dpi_start(struct device *dev)
> diff --git a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h
> index 62bd4931b344..a0b1d18bbbf7 100644
> --- a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h
> +++ b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h
> @@ -235,4 +235,8 @@
> #define MATRIX_SEL_RGB_TO_JPEG 0
> #define MATRIX_SEL_RGB_TO_BT601 2
>
> +#define DPI_PATTERN0 0xf00
> +#define DPI_PAT_EN BIT(0)
> +#define DPI_PAT_SEL GENMASK(6, 4)
> +
> #endif /* __MTK_DPI_REGS_H */
> --
> 2.47.0
>

</pre>
</p></body></html><!--type:text--><!--{--><pre>************* MEDIATEK Confidentiality Notice ********************
The information contained in this e-mail message (including any 
attachments) may be confidential, proprietary, privileged, or otherwise
exempt from disclosure under applicable laws. It is intended to be 
conveyed only to the designated recipient(s). Any use, dissemination, 
distribution, printing, retaining or copying of this e-mail (including its 
attachments) by unintended recipient(s) is strictly prohibited and may 
be unlawful. If you are not an intended recipient of this e-mail, or believe 
that you have received this e-mail in error, please notify the sender 
immediately (by replying to this e-mail), delete any and all copies of 
this e-mail (including any attachments) from your system, and do not
disclose the content of this e-mail to any other person. Thank you!
</pre><!--}-->