<pre>
Hi, Hsiao-chien:

On Mon, 2023-10-16 at 18:40 +0800, Hsiao Chien Sung wrote:
> Padding is a new display module on MT8188, it provides ability
> to add pixels to width and height of a layer with specified colors.
>
> Due to hardware design, Mixer in VDOSYS1 requires width of a layer
> to be 2-pixel-align, or 4-pixel-align when ETHDR is enabled,
> we need Padding to deal with odd width.

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

>
> Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
> ---
> drivers/gpu/drm/mediatek/Makefile | 3 +-
> drivers/gpu/drm/mediatek/mtk_disp_drv.h | 4 +
> drivers/gpu/drm/mediatek/mtk_drm_drv.c | 1 +
> drivers/gpu/drm/mediatek/mtk_drm_drv.h | 2 +-
> drivers/gpu/drm/mediatek/mtk_padding.c | 160
> ++++++++++++++++++++++++
> 5 files changed, 168 insertions(+), 2 deletions(-)
> create mode 100644 drivers/gpu/drm/mediatek/mtk_padding.c
>
> diff --git a/drivers/gpu/drm/mediatek/Makefile
> b/drivers/gpu/drm/mediatek/Makefile
> index d4d193f60271..5e4436403b8d 100644
> --- a/drivers/gpu/drm/mediatek/Makefile
> +++ b/drivers/gpu/drm/mediatek/Makefile
> @@ -16,7 +16,8 @@ mediatek-drm-y := mtk_disp_aal.o \
> mtk_dsi.o \
> mtk_dpi.o \
> mtk_ethdr.o \
> - mtk_mdp_rdma.o
> + mtk_mdp_rdma.o \
> + mtk_padding.o
>
> obj-$(CONFIG_DRM_MEDIATEK) += mediatek-drm.o
>
> diff --git a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> index bf06ccb65652..e2b602037ac3 100644
> --- a/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_disp_drv.h
> @@ -159,4 +159,8 @@ void mtk_mdp_rdma_config(struct device *dev,
> struct mtk_mdp_rdma_cfg *cfg,
> const u32 *mtk_mdp_rdma_get_formats(struct device *dev);
> size_t mtk_mdp_rdma_get_num_formats(struct device *dev);
>
> +int mtk_padding_clk_enable(struct device *dev);
> +void mtk_padding_clk_disable(struct device *dev);
> +void mtk_padding_start(struct device *dev);
> +void mtk_padding_stop(struct device *dev);
> #endif
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> index cdce165c092e..62e6e9785443 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.c
> @@ -1025,6 +1025,7 @@ static struct platform_driver * const
> mtk_drm_drivers[] = {
> &mtk_dsi_driver,
> &mtk_ethdr_driver,
> &mtk_mdp_rdma_driver,
> +&mtk_padding_driver,
> };
>
> static int __init mtk_drm_init(void)
> diff --git a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> index 8dca68ea1b94..d2efd715699f 100644
> --- a/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> +++ b/drivers/gpu/drm/mediatek/mtk_drm_drv.h
> @@ -72,5 +72,5 @@ extern struct platform_driver mtk_dpi_driver;
> extern struct platform_driver mtk_dsi_driver;
> extern struct platform_driver mtk_ethdr_driver;
> extern struct platform_driver mtk_mdp_rdma_driver;
> -
> +extern struct platform_driver mtk_padding_driver;
> #endif /* MTK_DRM_DRV_H */
> diff --git a/drivers/gpu/drm/mediatek/mtk_padding.c
> b/drivers/gpu/drm/mediatek/mtk_padding.c
> new file mode 100644
> index 000000000000..fa2e7fc9c7bd
> --- /dev/null
> +++ b/drivers/gpu/drm/mediatek/mtk_padding.c
> @@ -0,0 +1,160 @@
> +// SPDX-License-Identifier: GPL-2.0-only
> +/*
> + * Copyright (c) 2023 MediaTek Inc.
> + */
> +
> +#include <linux/clk.h>
> +#include <linux/component.h>
> +#include <linux/module.h>
> +#include <linux/of_device.h>
> +#include <linux/platform_device.h>
> +#include <linux/pm_runtime.h>
> +#include <linux/soc/mediatek/mtk-cmdq.h>
> +
> +#include "mtk_disp_drv.h"
> +#include "mtk_drm_crtc.h"
> +#include "mtk_drm_ddp_comp.h"
> +
> +#define PADDING_CONTROL_REG0x00
> +#define PADDING_BYPASSBIT(0)
> +#define PADDING_ENABLEBIT(1)
> +#define PADDING_PIC_SIZE_REG0x04
> +#define PADDING_H_REG0x08 /* horizontal */
> +#define PADDING_V_REG0x0c /* vertical */
> +#define PADDING_COLOR_REG0x10
> +
> +/**
> + * struct mtk_padding - basic information of Padding
> + * @clk: Clock of the module
> + * @reg: Virtual address of the Padding for CPU to access
> + * @cmdq_reg: CMDQ setting of the Padding
> + *
> + * Every Padding should have different clock source, register base,
> and
> + * CMDQ settings, we stored these differences all together.
> + */
> +struct mtk_padding {
> +struct clk*clk;
> +void __iomem*reg;
> +struct cmdq_client_regcmdq_reg;
> +};
> +
> +int mtk_padding_clk_enable(struct device *dev)
> +{
> +struct mtk_padding *padding = dev_get_drvdata(dev);
> +
> +return clk_prepare_enable(padding->clk);
> +}
> +
> +void mtk_padding_clk_disable(struct device *dev)
> +{
> +struct mtk_padding *padding = dev_get_drvdata(dev);
> +
> +clk_disable_unprepare(padding->clk);
> +}
> +
> +void mtk_padding_start(struct device *dev)
> +{
> +struct mtk_padding *padding = dev_get_drvdata(dev);
> +
> +writel(PADDING_ENABLE | PADDING_BYPASS,
> + padding->reg + PADDING_CONTROL_REG);
> +
> +/*
> + * notice that even the padding is in bypass mode,
> + * all the settings must be cleared to 0 or
> + * undefined behaviors could happen
> + */
> +writel(0, padding->reg + PADDING_PIC_SIZE_REG);
> +writel(0, padding->reg + PADDING_H_REG);
> +writel(0, padding->reg + PADDING_V_REG);
> +writel(0, padding->reg + PADDING_COLOR_REG);
> +}
> +
> +void mtk_padding_stop(struct device *dev)
> +{
> +struct mtk_padding *padding = dev_get_drvdata(dev);
> +
> +writel(0, padding->reg + PADDING_CONTROL_REG);
> +}
> +
> +static int mtk_padding_bind(struct device *dev, struct device
> *master, void *data)
> +{
> +return 0;
> +}
> +
> +static void mtk_padding_unbind(struct device *dev, struct device
> *master, void *data)
> +{
> +}
> +
> +static const struct component_ops mtk_padding_component_ops = {
> +.bind= mtk_padding_bind,
> +.unbind = mtk_padding_unbind,
> +};
> +
> +static int mtk_padding_probe(struct platform_device *pdev)
> +{
> +struct device *dev = &pdev->dev;
> +struct mtk_padding *priv;
> +struct resource *res;
> +int ret;
> +
> +priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
> +if (!priv)
> +return -ENOMEM;
> +
> +priv->clk = devm_clk_get(dev, NULL);
> +if (IS_ERR(priv->clk)) {
> +dev_err(dev, "failed to get clk\n");
> +return PTR_ERR(priv->clk);
> +}
> +
> +priv->reg = devm_platform_get_and_ioremap_resource(pdev, 0,
> &res);
> +if (IS_ERR(priv->reg)) {
> +dev_err(dev, "failed to do ioremap\n");
> +return PTR_ERR(priv->reg);
> +}
> +
> +#if IS_REACHABLE(CONFIG_MTK_CMDQ)
> +ret = cmdq_dev_get_client_reg(dev, &priv->cmdq_reg, 0);
> +if (ret) {
> +dev_err(dev, "failed to get gce client reg\n");
> +return ret;
> +}
> +#endif
> +
> +platform_set_drvdata(pdev, priv);
> +
> +ret = devm_pm_runtime_enable(dev);
> +if (ret)
> +return ret;
> +
> +ret = component_add(dev, &mtk_padding_component_ops);
> +if (ret) {
> +pm_runtime_disable(dev);
> +return dev_err_probe(dev, ret, "failed to add
> component\n");
> +}
> +
> +return 0;
> +}
> +
> +static int mtk_padding_remove(struct platform_device *pdev)
> +{
> +component_del(&pdev->dev, &mtk_padding_component_ops);
> +return 0;
> +}
> +
> +static const struct of_device_id mtk_padding_driver_dt_match[] = {
> +{ .compatible = "mediatek,mt8188-padding" },
> +{ /* sentinel */ }
> +};
> +MODULE_DEVICE_TABLE(of, mtk_padding_driver_dt_match);
> +
> +struct platform_driver mtk_padding_driver = {
> +.probe= mtk_padding_probe,
> +.remove= mtk_padding_remove,
> +.driver= {
> +.name= "mediatek-padding",
> +.owner= THIS_MODULE,
> +.of_match_table = mtk_padding_driver_dt_match,
> +},
> +};

</pre><!--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><!--}-->