Message ID | 1663161662-1598-3-git-send-email-xinlei.lee@mediatek.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | Add dpi output format control for MT8186 | expand |
Hi, Xinlei: On Wed, 2022-09-14 at 21:21 +0800, xinlei.lee@mediatek.com wrote: > From: Xinlei Lee <xinlei.lee@mediatek.com> > > Dpi output needs to adjust the output format to dual edge for MT8186. > The bridge ic on MT8186 uses the output format of RGB888_dual_edge. I think different sink ic may support different output format, so query the sink information to decide which outout format. > Due > to hardware changes, we need to modify the output format > corresponding > to the mmsys register. > > Co-developed-by: Jitao Shi <jitao.shi@mediatek.com> > Signed-off-by: Jitao Shi <jitao.shi@mediatek.com> > Signed-off-by: Xinlei Lee <xinlei.lee@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: Nís F. R. A. Prado <nfraprado@collabora.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 14 ++++++++++++++ > 1 file changed, 14 insertions(+) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index fb0b79704636..6e02f02f163c 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -14,6 +14,7 @@ > #include <linux/of_graph.h> > #include <linux/pinctrl/consumer.h> > #include <linux/platform_device.h> > +#include <linux/soc/mediatek/mtk-mmsys.h> > #include <linux/types.h> > > #include <video/videomode.h> > @@ -28,6 +29,7 @@ > #include "mtk_disp_drv.h" > #include "mtk_dpi_regs.h" > #include "mtk_drm_ddp_comp.h" > +#include "mtk_drm_drv.h" > > enum mtk_dpi_out_bit_num { > MTK_DPI_OUT_BIT_NUM_8BITS, > @@ -58,6 +60,11 @@ enum mtk_dpi_out_color_format { > MTK_DPI_COLOR_FORMAT_YCBCR_422 > }; > > +enum mtk_dpi_out_format_con { > + MTK_DPI_RGB888_DDR_CON, > + MTK_DPI_RGB565_SDR_CON > +}; > + > struct mtk_dpi { > struct drm_encoder encoder; > struct drm_bridge bridge; > @@ -80,6 +87,7 @@ struct mtk_dpi { > struct pinctrl_state *pins_dpi; > u32 output_fmt; > int refcount; > + struct device *mmsys_dev; > }; > > static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b) > @@ -133,6 +141,7 @@ struct mtk_dpi_yc_limit { > * @yuv422_en_bit: Enable bit of yuv422. > * @csc_enable_bit: Enable bit of CSC. > * @pixels_per_iter: Quantity of transferred pixels per iteration. > + * @edge_cfg_in_mmsys: If the edge configuration for DPI's output > needs to be set in MMSYS. > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -151,6 +160,7 @@ struct mtk_dpi_conf { > u32 yuv422_en_bit; > u32 csc_enable_bit; > u32 pixels_per_iter; > + bool edge_cfg_in_mmsys; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -447,6 +457,8 @@ static void mtk_dpi_dual_edge(struct mtk_dpi > *dpi) > mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, > dpi->output_fmt == > MEDIA_BUS_FMT_RGB888_2X12_LE ? > EDGE_SEL : 0, EDGE_SEL); > + if (dpi->conf->edge_cfg_in_mmsys) > + mtk_mmsys_ddp_dpi_fmt_config(dpi->mmsys_dev, > MTK_DPI_RGB888_DDR_CON); Why do you set a DPI driver defined value MTK_DPI_RGB888_DDR_CON into mmsys driver? I think you should set a value which mmsys driver understand. Regards, CK > } else { > mtk_dpi_mask(dpi, DPI_DDR_SETTING, DDR_EN | DDR_4PHASE, > 0); > } > @@ -776,8 +788,10 @@ static int mtk_dpi_bind(struct device *dev, > struct device *master, void *data) > { > struct mtk_dpi *dpi = dev_get_drvdata(dev); > struct drm_device *drm_dev = data; > + struct mtk_drm_private *priv = drm_dev->dev_private; > int ret; > > + dpi->mmsys_dev = priv->mmsys_dev; > ret = drm_simple_encoder_init(drm_dev, &dpi->encoder, > DRM_MODE_ENCODER_TMDS); > if (ret) {
On Wed, 2022-09-21 at 09:35 +0800, CK Hu wrote: > Hi, Xinlei: > > On Wed, 2022-09-14 at 21:21 +0800, xinlei.lee@mediatek.com wrote: > > From: Xinlei Lee <xinlei.lee@mediatek.com> > > > > Dpi output needs to adjust the output format to dual edge for > > MT8186. > > The bridge ic on MT8186 uses the output format of > > RGB888_dual_edge. > > I think different sink ic may support different output format, so > query > the sink information to decide which outout format. > > > Due > > to hardware changes, we need to modify the output format > > corresponding > > to the mmsys register. > > > > Co-developed-by: Jitao Shi <jitao.shi@mediatek.com> > > Signed-off-by: Jitao Shi <jitao.shi@mediatek.com> > > Signed-off-by: Xinlei Lee <xinlei.lee@mediatek.com> > > Reviewed-by: AngeloGioacchino Del Regno < > > angelogioacchino.delregno@collabora.com> > > Reviewed-by: Nís F. R. A. Prado <nfraprado@collabora.com> > > --- > > drivers/gpu/drm/mediatek/mtk_dpi.c | 14 ++++++++++++++ > > 1 file changed, 14 insertions(+) > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > > b/drivers/gpu/drm/mediatek/mtk_dpi.c > > index fb0b79704636..6e02f02f163c 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > > @@ -14,6 +14,7 @@ > > #include <linux/of_graph.h> > > #include <linux/pinctrl/consumer.h> > > #include <linux/platform_device.h> > > +#include <linux/soc/mediatek/mtk-mmsys.h> > > #include <linux/types.h> > > > > #include <video/videomode.h> > > @@ -28,6 +29,7 @@ > > #include "mtk_disp_drv.h" > > #include "mtk_dpi_regs.h" > > #include "mtk_drm_ddp_comp.h" > > +#include "mtk_drm_drv.h" > > > > enum mtk_dpi_out_bit_num { > > MTK_DPI_OUT_BIT_NUM_8BITS, > > @@ -58,6 +60,11 @@ enum mtk_dpi_out_color_format { > > MTK_DPI_COLOR_FORMAT_YCBCR_422 > > }; > > > > +enum mtk_dpi_out_format_con { > > + MTK_DPI_RGB888_DDR_CON, > > + MTK_DPI_RGB565_SDR_CON > > +}; > > + > > struct mtk_dpi { > > struct drm_encoder encoder; > > struct drm_bridge bridge; > > @@ -80,6 +87,7 @@ struct mtk_dpi { > > struct pinctrl_state *pins_dpi; > > u32 output_fmt; > > int refcount; > > + struct device *mmsys_dev; > > }; > > > > static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b) > > @@ -133,6 +141,7 @@ struct mtk_dpi_yc_limit { > > * @yuv422_en_bit: Enable bit of yuv422. > > * @csc_enable_bit: Enable bit of CSC. > > * @pixels_per_iter: Quantity of transferred pixels per iteration. > > + * @edge_cfg_in_mmsys: If the edge configuration for DPI's output > > needs to be set in MMSYS. > > */ > > struct mtk_dpi_conf { > > unsigned int (*cal_factor)(int clock); > > @@ -151,6 +160,7 @@ struct mtk_dpi_conf { > > u32 yuv422_en_bit; > > u32 csc_enable_bit; > > u32 pixels_per_iter; > > + bool edge_cfg_in_mmsys; > > }; > > > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > > u32 mask) > > @@ -447,6 +457,8 @@ static void mtk_dpi_dual_edge(struct mtk_dpi > > *dpi) > > mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, > > dpi->output_fmt == > > MEDIA_BUS_FMT_RGB888_2X12_LE ? > > EDGE_SEL : 0, EDGE_SEL); > > + if (dpi->conf->edge_cfg_in_mmsys) > > + mtk_mmsys_ddp_dpi_fmt_config(dpi->mmsys_dev, > > MTK_DPI_RGB888_DDR_CON); > > Why do you set a DPI driver defined value MTK_DPI_RGB888_DDR_CON into > mmsys driver? I think you should set a value which mmsys driver > understand. > > Regards, > CK > > > } else { > > mtk_dpi_mask(dpi, DPI_DDR_SETTING, DDR_EN | DDR_4PHASE, > > 0); > > } > > @@ -776,8 +788,10 @@ static int mtk_dpi_bind(struct device *dev, > > struct device *master, void *data) > > { > > struct mtk_dpi *dpi = dev_get_drvdata(dev); > > struct drm_device *drm_dev = data; > > + struct mtk_drm_private *priv = drm_dev->dev_private; > > int ret; > > > > + dpi->mmsys_dev = priv->mmsys_dev; > > ret = drm_simple_encoder_init(drm_dev, &dpi->encoder, > > DRM_MODE_ENCODER_TMDS); > > if (ret) { > > Hi CK: Thanks for your review. Yes, different sink ICs may support other output formats. The current DRM architecture supports retrieving the output formats of all bridges (implemented through .atomic_check & .atomic_get_output_bus_fmts & .atomic_get_input_bus_fmts in dpi). If no unified output format is found It will use the default format output of soc (MEDIA_BUS_FMT_RGB888_2X12_LE is used in mt8186). The difference between MT8186 and other ICs is that when modifying the output format, we need to modify the mmsys_base + 0x400 register to take effect. Therefore, if there are other format sink ICs (RGB888_DDR/RGB888_SDR) in the future, the sink IC needs to add the func implementation mentioned above needs to be added. And the drm architecture will select the appropriate format to change the dpi output. I will put the registers that control mmsys in mtk-mmsys.h in the next release. Best Regards! Xinlei
diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c b/drivers/gpu/drm/mediatek/mtk_dpi.c index fb0b79704636..6e02f02f163c 100644 --- a/drivers/gpu/drm/mediatek/mtk_dpi.c +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c @@ -14,6 +14,7 @@ #include <linux/of_graph.h> #include <linux/pinctrl/consumer.h> #include <linux/platform_device.h> +#include <linux/soc/mediatek/mtk-mmsys.h> #include <linux/types.h> #include <video/videomode.h> @@ -28,6 +29,7 @@ #include "mtk_disp_drv.h" #include "mtk_dpi_regs.h" #include "mtk_drm_ddp_comp.h" +#include "mtk_drm_drv.h" enum mtk_dpi_out_bit_num { MTK_DPI_OUT_BIT_NUM_8BITS, @@ -58,6 +60,11 @@ enum mtk_dpi_out_color_format { MTK_DPI_COLOR_FORMAT_YCBCR_422 }; +enum mtk_dpi_out_format_con { + MTK_DPI_RGB888_DDR_CON, + MTK_DPI_RGB565_SDR_CON +}; + struct mtk_dpi { struct drm_encoder encoder; struct drm_bridge bridge; @@ -80,6 +87,7 @@ struct mtk_dpi { struct pinctrl_state *pins_dpi; u32 output_fmt; int refcount; + struct device *mmsys_dev; }; static inline struct mtk_dpi *bridge_to_dpi(struct drm_bridge *b) @@ -133,6 +141,7 @@ struct mtk_dpi_yc_limit { * @yuv422_en_bit: Enable bit of yuv422. * @csc_enable_bit: Enable bit of CSC. * @pixels_per_iter: Quantity of transferred pixels per iteration. + * @edge_cfg_in_mmsys: If the edge configuration for DPI's output needs to be set in MMSYS. */ struct mtk_dpi_conf { unsigned int (*cal_factor)(int clock); @@ -151,6 +160,7 @@ struct mtk_dpi_conf { u32 yuv422_en_bit; u32 csc_enable_bit; u32 pixels_per_iter; + bool edge_cfg_in_mmsys; }; static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, u32 mask) @@ -447,6 +457,8 @@ static void mtk_dpi_dual_edge(struct mtk_dpi *dpi) mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, dpi->output_fmt == MEDIA_BUS_FMT_RGB888_2X12_LE ? EDGE_SEL : 0, EDGE_SEL); + if (dpi->conf->edge_cfg_in_mmsys) + mtk_mmsys_ddp_dpi_fmt_config(dpi->mmsys_dev, MTK_DPI_RGB888_DDR_CON); } else { mtk_dpi_mask(dpi, DPI_DDR_SETTING, DDR_EN | DDR_4PHASE, 0); } @@ -776,8 +788,10 @@ static int mtk_dpi_bind(struct device *dev, struct device *master, void *data) { struct mtk_dpi *dpi = dev_get_drvdata(dev); struct drm_device *drm_dev = data; + struct mtk_drm_private *priv = drm_dev->dev_private; int ret; + dpi->mmsys_dev = priv->mmsys_dev; ret = drm_simple_encoder_init(drm_dev, &dpi->encoder, DRM_MODE_ENCODER_TMDS); if (ret) {