Message ID | 20220701035845.16458-1-rex-bc.chen@mediatek.com |
---|---|
Headers | show |
Series | drm/mediatek: Add MT8195 dp_intf driver | expand |
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > This driver will support dp_intf and there are many configs between > dpi > and dp_intf. Therefore, we will add many configs in "struct > mtk_dpi_conf". > To let this structure more readable, we add this kernel doc. Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 +++++++++ > 1 file changed, 9 insertions(+) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index e61cd67b978f..f66a121ba0c9 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -118,6 +118,15 @@ struct mtk_dpi_yc_limit { > u16 c_bottom; > }; > > +/** > + * struct mtk_dpi_conf - Configuration of mediatek dpi. > + * @cal_factor: Callback function to calculate factor value. > + * @reg_h_fre_con: Register address of frequency control. > + * @max_clock_khz: Max clock frequency supported for this SoCs in > khz units. > + * @edge_sel_en: Enable of edge selection. > + * @output_fmts: Array of supported output formats. > + * @num_output_fmts: Quantity of supported output formats. > + */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > u32 reg_h_fre_con;
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > DPI is not support output format as YUV, but there is the setting of > configuring output YUV. Therefore, remove them in this patch. Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Fixes: 9e629c17aa8d ("drm/mediatek: Add DPI sub driver") > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 31 ++++++-------------------- > ---- > 1 file changed, 6 insertions(+), 25 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index f66a121ba0c9..3473ee18ad97 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -54,13 +54,7 @@ enum mtk_dpi_out_channel_swap { > }; > > enum mtk_dpi_out_color_format { > - MTK_DPI_COLOR_FORMAT_RGB, > - MTK_DPI_COLOR_FORMAT_RGB_FULL, > - MTK_DPI_COLOR_FORMAT_YCBCR_444, > - MTK_DPI_COLOR_FORMAT_YCBCR_422, > - MTK_DPI_COLOR_FORMAT_XV_YCC, > - MTK_DPI_COLOR_FORMAT_YCBCR_444_FULL, > - MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL > + MTK_DPI_COLOR_FORMAT_RGB > }; > > struct mtk_dpi { > @@ -373,24 +367,11 @@ static void mtk_dpi_config_disable_edge(struct > mtk_dpi *dpi) > static void mtk_dpi_config_color_format(struct mtk_dpi *dpi, > enum mtk_dpi_out_color_format > format) > { > - if ((format == MTK_DPI_COLOR_FORMAT_YCBCR_444) || > - (format == MTK_DPI_COLOR_FORMAT_YCBCR_444_FULL)) { > - mtk_dpi_config_yuv422_enable(dpi, false); > - mtk_dpi_config_csc_enable(dpi, true); > - mtk_dpi_config_swap_input(dpi, false); > - mtk_dpi_config_channel_swap(dpi, > MTK_DPI_OUT_CHANNEL_SWAP_BGR); > - } else if ((format == MTK_DPI_COLOR_FORMAT_YCBCR_422) || > - (format == MTK_DPI_COLOR_FORMAT_YCBCR_422_FULL)) { > - mtk_dpi_config_yuv422_enable(dpi, true); > - mtk_dpi_config_csc_enable(dpi, true); > - mtk_dpi_config_swap_input(dpi, true); > - mtk_dpi_config_channel_swap(dpi, > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > - } else { > - mtk_dpi_config_yuv422_enable(dpi, false); > - mtk_dpi_config_csc_enable(dpi, false); > - mtk_dpi_config_swap_input(dpi, false); > - mtk_dpi_config_channel_swap(dpi, > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > - } > + /* only support RGB888 */ > + mtk_dpi_config_yuv422_enable(dpi, false); > + mtk_dpi_config_csc_enable(dpi, false); > + mtk_dpi_config_swap_input(dpi, false); > + mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); > } > > static void mtk_dpi_dual_edge(struct mtk_dpi *dpi)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > For RGB colorimetry, CTA-861 support both limited and full range data > when receiving video with RGB color space. > We use drm_default_rgb_quant_range() to determine the correct > setting. Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 34 ++++++++++++++++++-------- > ---- > 1 file changed, 21 insertions(+), 13 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 3473ee18ad97..0855bbdfe4e1 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -238,16 +238,30 @@ static void mtk_dpi_config_fb_size(struct > mtk_dpi *dpi, u32 width, u32 height) > mtk_dpi_mask(dpi, DPI_SIZE, height << VSIZE, VSIZE_MASK); > } > > -static void mtk_dpi_config_channel_limit(struct mtk_dpi *dpi, > - struct mtk_dpi_yc_limit > *limit) > +static void mtk_dpi_config_channel_limit(struct mtk_dpi *dpi) > { > - mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit->y_bottom << Y_LIMINT_BOT, > + struct mtk_dpi_yc_limit limit; > + > + if (drm_default_rgb_quant_range(&dpi->mode) == > + HDMI_QUANTIZATION_RANGE_LIMITED) { > + limit.y_bottom = 0x10; > + limit.y_top = 0xfe0; > + limit.c_bottom = 0x10; > + limit.c_top = 0xfe0; > + } else { > + limit.y_bottom = 0; > + limit.y_top = 0xfff; > + limit.c_bottom = 0; > + limit.c_top = 0xfff; > + } > + > + mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit.y_bottom << Y_LIMINT_BOT, > Y_LIMINT_BOT_MASK); > - mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit->y_top << Y_LIMINT_TOP, > + mtk_dpi_mask(dpi, DPI_Y_LIMIT, limit.y_top << Y_LIMINT_TOP, > Y_LIMINT_TOP_MASK); > - mtk_dpi_mask(dpi, DPI_C_LIMIT, limit->c_bottom << C_LIMIT_BOT, > + mtk_dpi_mask(dpi, DPI_C_LIMIT, limit.c_bottom << C_LIMIT_BOT, > C_LIMIT_BOT_MASK); > - mtk_dpi_mask(dpi, DPI_C_LIMIT, limit->c_top << C_LIMIT_TOP, > + mtk_dpi_mask(dpi, DPI_C_LIMIT, limit.c_top << C_LIMIT_TOP, > C_LIMIT_TOP_MASK); > } > > @@ -439,7 +453,6 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi) > static int mtk_dpi_set_display_mode(struct mtk_dpi *dpi, > struct drm_display_mode *mode) > { > - struct mtk_dpi_yc_limit limit; > struct mtk_dpi_polarities dpi_pol; > struct mtk_dpi_sync_param hsync; > struct mtk_dpi_sync_param vsync_lodd = { 0 }; > @@ -474,11 +487,6 @@ static int mtk_dpi_set_display_mode(struct > mtk_dpi *dpi, > dev_dbg(dpi->dev, "Got PLL %lu Hz, pixel clock %lu Hz\n", > pll_rate, vm.pixelclock); > > - limit.c_bottom = 0x0010; > - limit.c_top = 0x0FE0; > - limit.y_bottom = 0x0010; > - limit.y_top = 0x0FE0; > - > dpi_pol.ck_pol = MTK_DPI_POLARITY_FALLING; > dpi_pol.de_pol = MTK_DPI_POLARITY_RISING; > dpi_pol.hsync_pol = vm.flags & DISPLAY_FLAGS_HSYNC_HIGH ? > @@ -526,7 +534,7 @@ static int mtk_dpi_set_display_mode(struct > mtk_dpi *dpi, > else > mtk_dpi_config_fb_size(dpi, vm.hactive, vm.vactive); > > - mtk_dpi_config_channel_limit(dpi, &limit); > + mtk_dpi_config_channel_limit(dpi); > mtk_dpi_config_bit_num(dpi, dpi->bit_num); > mtk_dpi_config_channel_swap(dpi, dpi->channel_swap); > mtk_dpi_config_yc_map(dpi, dpi->yc_map);
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Dp_intf does not support CK/DE polarity because the polarity > information > is not used for eDP and DP while dp_intf is only for eDP and DP. > Therefore, we add a bit of flexibility to support SoCs without CK/DE > pol > support. Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 23 ++++++++++++++++++----- > 1 file changed, 18 insertions(+), 5 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 0855bbdfe4e1..b89ad9f38396 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -120,6 +120,7 @@ struct mtk_dpi_yc_limit { > * @edge_sel_en: Enable of edge selection. > * @output_fmts: Array of supported output formats. > * @num_output_fmts: Quantity of supported output formats. > + * @is_ck_de_pol: Support CK/DE polarity. > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -128,6 +129,7 @@ struct mtk_dpi_conf { > bool edge_sel_en; > const u32 *output_fmts; > u32 num_output_fmts; > + bool is_ck_de_pol; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -213,13 +215,20 @@ static void mtk_dpi_config_pol(struct mtk_dpi > *dpi, > struct mtk_dpi_polarities *dpi_pol) > { > unsigned int pol; > + unsigned int mask; > > - pol = (dpi_pol->ck_pol == MTK_DPI_POLARITY_RISING ? 0 : CK_POL) > | > - (dpi_pol->de_pol == MTK_DPI_POLARITY_RISING ? 0 : DE_POL) > | > - (dpi_pol->hsync_pol == MTK_DPI_POLARITY_RISING ? 0 : > HSYNC_POL) | > + mask = HSYNC_POL | VSYNC_POL; > + pol = (dpi_pol->hsync_pol == MTK_DPI_POLARITY_RISING ? 0 : > HSYNC_POL) | > (dpi_pol->vsync_pol == MTK_DPI_POLARITY_RISING ? 0 : > VSYNC_POL); > - mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, pol, > - CK_POL | DE_POL | HSYNC_POL | VSYNC_POL); > + if (dpi->conf->is_ck_de_pol) { > + mask |= CK_POL | DE_POL; > + pol |= (dpi_pol->ck_pol == MTK_DPI_POLARITY_RISING ? > + 0 : CK_POL) | > + (dpi_pol->de_pol == MTK_DPI_POLARITY_RISING ? > + 0 : DE_POL); > + } > + > + mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, pol, mask); > } > > static void mtk_dpi_config_3d(struct mtk_dpi *dpi, bool en_3d) > @@ -794,6 +803,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .max_clock_khz = 300000, > .output_fmts = mt8173_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > + .is_ck_de_pol = true, > }; > > static const struct mtk_dpi_conf mt2701_conf = { > @@ -803,6 +813,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .max_clock_khz = 150000, > .output_fmts = mt8173_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > + .is_ck_de_pol = true, > }; > > static const struct mtk_dpi_conf mt8183_conf = { > @@ -811,6 +822,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .max_clock_khz = 100000, > .output_fmts = mt8183_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > + .is_ck_de_pol = true, > }; > > static const struct mtk_dpi_conf mt8192_conf = { > @@ -819,6 +831,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .max_clock_khz = 150000, > .output_fmts = mt8183_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > + .is_ck_de_pol = true, > }; > > static int mtk_dpi_probe(struct platform_device *pdev)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > The hardware design of dp_intf does not support input swap, so we add > a bit of flexibility to support SoCs without swap_input support. > We also add a warning message if the hardware is not supported and it > needs to swap input. Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index b89ad9f38396..ba871c347d15 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -121,6 +121,7 @@ struct mtk_dpi_yc_limit { > * @output_fmts: Array of supported output formats. > * @num_output_fmts: Quantity of supported output formats. > * @is_ck_de_pol: Support CK/DE polarity. > + * @swap_input_support: Support input swap function. > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -130,6 +131,7 @@ struct mtk_dpi_conf { > const u32 *output_fmts; > u32 num_output_fmts; > bool is_ck_de_pol; > + bool swap_input_support; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -393,7 +395,8 @@ static void mtk_dpi_config_color_format(struct > mtk_dpi *dpi, > /* only support RGB888 */ > mtk_dpi_config_yuv422_enable(dpi, false); > mtk_dpi_config_csc_enable(dpi, false); > - mtk_dpi_config_swap_input(dpi, false); > + if (dpi->conf->swap_input_support) > + mtk_dpi_config_swap_input(dpi, false); > mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); > } > > @@ -804,6 +807,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .output_fmts = mt8173_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > .is_ck_de_pol = true, > + .swap_input_support = true, > }; > > static const struct mtk_dpi_conf mt2701_conf = { > @@ -814,6 +818,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .output_fmts = mt8173_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > .is_ck_de_pol = true, > + .swap_input_support = true, > }; > > static const struct mtk_dpi_conf mt8183_conf = { > @@ -823,6 +828,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .output_fmts = mt8183_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > .is_ck_de_pol = true, > + .swap_input_support = true, > }; > > static const struct mtk_dpi_conf mt8192_conf = { > @@ -832,6 +838,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .output_fmts = mt8183_output_fmts, > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > .is_ck_de_pol = true, > + .swap_input_support = true, > }; > > static int mtk_dpi_probe(struct platform_device *pdev)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Add flexibility by moving the dimension mask to the SoC config Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 27 +++++++++++++++++---------- > 1 file changed, 17 insertions(+), 10 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index ba871c347d15..586527458064 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -122,6 +122,8 @@ struct mtk_dpi_yc_limit { > * @num_output_fmts: Quantity of supported output formats. > * @is_ck_de_pol: Support CK/DE polarity. > * @swap_input_support: Support input swap function. > + * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and > VSYNC_PORCH > + * (no shift). > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -132,6 +134,7 @@ struct mtk_dpi_conf { > u32 num_output_fmts; > bool is_ck_de_pol; > bool swap_input_support; > + u32 dimension_mask; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -160,30 +163,30 @@ static void mtk_dpi_disable(struct mtk_dpi > *dpi) > static void mtk_dpi_config_hsync(struct mtk_dpi *dpi, > struct mtk_dpi_sync_param *sync) > { > - mtk_dpi_mask(dpi, DPI_TGEN_HWIDTH, > - sync->sync_width << HPW, HPW_MASK); > - mtk_dpi_mask(dpi, DPI_TGEN_HPORCH, > - sync->back_porch << HBP, HBP_MASK); > + mtk_dpi_mask(dpi, DPI_TGEN_HWIDTH, sync->sync_width << HPW, > + dpi->conf->dimension_mask << HPW); > + mtk_dpi_mask(dpi, DPI_TGEN_HPORCH, sync->back_porch << HBP, > + dpi->conf->dimension_mask << HBP); > mtk_dpi_mask(dpi, DPI_TGEN_HPORCH, sync->front_porch << HFP, > - HFP_MASK); > + dpi->conf->dimension_mask << HFP); > } > > static void mtk_dpi_config_vsync(struct mtk_dpi *dpi, > struct mtk_dpi_sync_param *sync, > u32 width_addr, u32 porch_addr) > { > - mtk_dpi_mask(dpi, width_addr, > - sync->sync_width << VSYNC_WIDTH_SHIFT, > - VSYNC_WIDTH_MASK); > mtk_dpi_mask(dpi, width_addr, > sync->shift_half_line << VSYNC_HALF_LINE_SHIFT, > VSYNC_HALF_LINE_MASK); > + mtk_dpi_mask(dpi, width_addr, > + sync->sync_width << VSYNC_WIDTH_SHIFT, > + dpi->conf->dimension_mask << VSYNC_WIDTH_SHIFT); > mtk_dpi_mask(dpi, porch_addr, > sync->back_porch << VSYNC_BACK_PORCH_SHIFT, > - VSYNC_BACK_PORCH_MASK); > + dpi->conf->dimension_mask << > VSYNC_BACK_PORCH_SHIFT); > mtk_dpi_mask(dpi, porch_addr, > sync->front_porch << VSYNC_FRONT_PORCH_SHIFT, > - VSYNC_FRONT_PORCH_MASK); > + dpi->conf->dimension_mask << > VSYNC_FRONT_PORCH_SHIFT); > } > > static void mtk_dpi_config_vsync_lodd(struct mtk_dpi *dpi, > @@ -808,6 +811,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .dimension_mask = HPW_MASK, > }; > > static const struct mtk_dpi_conf mt2701_conf = { > @@ -819,6 +823,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .dimension_mask = HPW_MASK, > }; > > static const struct mtk_dpi_conf mt8183_conf = { > @@ -829,6 +834,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .dimension_mask = HPW_MASK, > }; > > static const struct mtk_dpi_conf mt8192_conf = { > @@ -839,6 +845,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .dimension_mask = HPW_MASK, > }; > > static int mtk_dpi_probe(struct platform_device *pdev)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Add flexibility by moving the hvsize mask to SoC specific config. Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 12 ++++++++++-- > 1 file changed, 10 insertions(+), 2 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 586527458064..11724432e2f2 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -124,6 +124,7 @@ struct mtk_dpi_yc_limit { > * @swap_input_support: Support input swap function. > * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and > VSYNC_PORCH > * (no shift). > + * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -135,6 +136,7 @@ struct mtk_dpi_conf { > bool is_ck_de_pol; > bool swap_input_support; > u32 dimension_mask; > + u32 hvsize_mask; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -248,8 +250,10 @@ static void mtk_dpi_config_interface(struct > mtk_dpi *dpi, bool inter) > > static void mtk_dpi_config_fb_size(struct mtk_dpi *dpi, u32 width, > u32 height) > { > - mtk_dpi_mask(dpi, DPI_SIZE, width << HSIZE, HSIZE_MASK); > - mtk_dpi_mask(dpi, DPI_SIZE, height << VSIZE, VSIZE_MASK); > + mtk_dpi_mask(dpi, DPI_SIZE, width << HSIZE, > + dpi->conf->hvsize_mask << HSIZE); > + mtk_dpi_mask(dpi, DPI_SIZE, height << VSIZE, > + dpi->conf->hvsize_mask << VSIZE); > } > > static void mtk_dpi_config_channel_limit(struct mtk_dpi *dpi) > @@ -812,6 +816,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .is_ck_de_pol = true, > .swap_input_support = true, > .dimension_mask = HPW_MASK, > + .hvsize_mask = HSIZE_MASK, > }; > > static const struct mtk_dpi_conf mt2701_conf = { > @@ -824,6 +829,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .is_ck_de_pol = true, > .swap_input_support = true, > .dimension_mask = HPW_MASK, > + .hvsize_mask = HSIZE_MASK, > }; > > static const struct mtk_dpi_conf mt8183_conf = { > @@ -835,6 +841,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .is_ck_de_pol = true, > .swap_input_support = true, > .dimension_mask = HPW_MASK, > + .hvsize_mask = HSIZE_MASK, > }; > > static const struct mtk_dpi_conf mt8192_conf = { > @@ -846,6 +853,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .is_ck_de_pol = true, > .swap_input_support = true, > .dimension_mask = HPW_MASK, > + .hvsize_mask = HSIZE_MASK, > }; > > static int mtk_dpi_probe(struct platform_device *pdev)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Add flexibility by moving the swap shift value to SoC specific > config. Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 10 +++++++++- > 1 file changed, 9 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 11724432e2f2..70a83a3c0570 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -125,6 +125,7 @@ struct mtk_dpi_yc_limit { > * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and > VSYNC_PORCH > * (no shift). > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > + * @channel_swap_shift: Shift value of channel swap. > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -137,6 +138,7 @@ struct mtk_dpi_conf { > bool swap_input_support; > u32 dimension_mask; > u32 hvsize_mask; > + u32 channel_swap_shift; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -367,7 +369,9 @@ static void mtk_dpi_config_channel_swap(struct > mtk_dpi *dpi, > break; > } > > - mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, val << CH_SWAP, > CH_SWAP_MASK); > + mtk_dpi_mask(dpi, DPI_OUTPUT_SETTING, > + val << dpi->conf->channel_swap_shift, > + CH_SWAP_MASK << dpi->conf->channel_swap_shift); > } > > static void mtk_dpi_config_yuv422_enable(struct mtk_dpi *dpi, bool > enable) > @@ -817,6 +821,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .swap_input_support = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > + .channel_swap_shift = CH_SWAP, > }; > > static const struct mtk_dpi_conf mt2701_conf = { > @@ -830,6 +835,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .swap_input_support = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > + .channel_swap_shift = CH_SWAP, > }; > > static const struct mtk_dpi_conf mt8183_conf = { > @@ -842,6 +848,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .swap_input_support = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > + .channel_swap_shift = CH_SWAP, > }; > > static const struct mtk_dpi_conf mt8192_conf = { > @@ -854,6 +861,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .swap_input_support = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > + .channel_swap_shift = CH_SWAP, > }; > > static int mtk_dpi_probe(struct platform_device *pdev)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Add flexibility by moving the yuv422 en bit to SoC specific config Applied to mediatek-drm-next [1], thanks. [1] https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next Regards, CK > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 70a83a3c0570..0b75a4ce8261 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -126,6 +126,7 @@ struct mtk_dpi_yc_limit { > * (no shift). > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > * @channel_swap_shift: Shift value of channel swap. > + * @yuv422_en_bit: Enable bit of yuv422. > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -139,6 +140,7 @@ struct mtk_dpi_conf { > u32 dimension_mask; > u32 hvsize_mask; > u32 channel_swap_shift; > + u32 yuv422_en_bit; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -376,7 +378,8 @@ static void mtk_dpi_config_channel_swap(struct > mtk_dpi *dpi, > > static void mtk_dpi_config_yuv422_enable(struct mtk_dpi *dpi, bool > enable) > { > - mtk_dpi_mask(dpi, DPI_CON, enable ? YUV422_EN : 0, YUV422_EN); > + mtk_dpi_mask(dpi, DPI_CON, enable ? dpi->conf->yuv422_en_bit : > 0, > + dpi->conf->yuv422_en_bit); > } > > static void mtk_dpi_config_csc_enable(struct mtk_dpi *dpi, bool > enable) > @@ -822,6 +825,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > + .yuv422_en_bit = YUV422_EN, > }; > > static const struct mtk_dpi_conf mt2701_conf = { > @@ -836,6 +840,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > + .yuv422_en_bit = YUV422_EN, > }; > > static const struct mtk_dpi_conf mt8183_conf = { > @@ -849,6 +854,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > + .yuv422_en_bit = YUV422_EN, > }; > > static const struct mtk_dpi_conf mt8192_conf = { > @@ -862,6 +868,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > + .yuv422_en_bit = YUV422_EN, > }; > > static int mtk_dpi_probe(struct platform_device *pdev)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Add flexibility by moving the csc_enable bit to SoC specific config Applied to mediatek-drm-next [1], thanks. [1] https://urldefense.com/v3/__https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next__;!!CTRNKA9wMg0ARbw!zWEwCacmscK6lKiUsSJg-EhOk-w28LbLdjhkF_xNfenUSrdS0RCxyNYy1_Rq5Q$ Regards, CK > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > Reviewed-by: Rex-BC Chen <rex-bc.chen@mediatek.com> > Reviewed-by: CK Hu <ck.hu@mediatek.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 9 ++++++++- > 1 file changed, 8 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 0b75a4ce8261..3085033becbd 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -127,6 +127,7 @@ struct mtk_dpi_yc_limit { > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > * @channel_swap_shift: Shift value of channel swap. > * @yuv422_en_bit: Enable bit of yuv422. > + * @csc_enable_bit: Enable bit of CSC. > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -141,6 +142,7 @@ struct mtk_dpi_conf { > u32 hvsize_mask; > u32 channel_swap_shift; > u32 yuv422_en_bit; > + u32 csc_enable_bit; > }; > > static void mtk_dpi_mask(struct mtk_dpi *dpi, u32 offset, u32 val, > u32 mask) > @@ -384,7 +386,8 @@ static void mtk_dpi_config_yuv422_enable(struct > mtk_dpi *dpi, bool enable) > > static void mtk_dpi_config_csc_enable(struct mtk_dpi *dpi, bool > enable) > { > - mtk_dpi_mask(dpi, DPI_CON, enable ? CSC_ENABLE : 0, > CSC_ENABLE); > + mtk_dpi_mask(dpi, DPI_CON, enable ? dpi->conf->csc_enable_bit : > 0, > + dpi->conf->csc_enable_bit); > } > > static void mtk_dpi_config_swap_input(struct mtk_dpi *dpi, bool > enable) > @@ -826,6 +829,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > .yuv422_en_bit = YUV422_EN, > + .csc_enable_bit = CSC_ENABLE, > }; > > static const struct mtk_dpi_conf mt2701_conf = { > @@ -841,6 +845,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > .yuv422_en_bit = YUV422_EN, > + .csc_enable_bit = CSC_ENABLE, > }; > > static const struct mtk_dpi_conf mt8183_conf = { > @@ -855,6 +860,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > .yuv422_en_bit = YUV422_EN, > + .csc_enable_bit = CSC_ENABLE, > }; > > static const struct mtk_dpi_conf mt8192_conf = { > @@ -869,6 +875,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > .yuv422_en_bit = YUV422_EN, > + .csc_enable_bit = CSC_ENABLE, > }; > > static int mtk_dpi_probe(struct platform_device *pdev)
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Enabling the dpi too early causes glitches on screen. > > Move the call to mtk_dpi_enable() at the end of the bridge_enable > callback to ensure everything is setup properly before enabling dpi. Applied to mediatek-drm-next [1], thanks. [1] https://urldefense.com/v3/__https://git.kernel.org/pub/scm/linux/kernel/git/chunkuang.hu/linux.git/log/?h=mediatek-drm-next__;!!CTRNKA9wMg0ARbw!zWEwCacmscK6lKiUsSJg-EhOk-w28LbLdjhkF_xNfenUSrdS0RCxyNYy1_Rq5Q$ Regards, CK > > Fixes: 9e629c17aa8d ("drm/mediatek: Add DPI sub driver") > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Tested-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index a65b85c4c8d5..be039474cf26 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -513,7 +513,6 @@ static int mtk_dpi_power_on(struct mtk_dpi *dpi) > if (dpi->pinctrl && dpi->pins_dpi) > pinctrl_select_state(dpi->pinctrl, dpi->pins_dpi); > > - mtk_dpi_enable(dpi); > return 0; > > err_pixel: > @@ -734,6 +733,7 @@ static void mtk_dpi_bridge_enable(struct > drm_bridge *bridge) > > mtk_dpi_power_on(dpi); > mtk_dpi_set_display_mode(dpi, &dpi->mode); > + mtk_dpi_enable(dpi); > } > > static enum drm_mode_status
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > Dp_intf supports YUV422 as output format. In MT8195 Chrome project, > YUV422 output format is used for 4K resolution. > > To support this, it is also needed to support color format transfer. > Color format transfer is a new feature for both dpi and dpintf of > MT8195. > > The input format could be RGB888 and output format for dp_intf should > be > YUV422. Therefore, we add a mtk_dpi_matrix_sel() helper to update the > DPI_MATRIX_SET register depending on the color format. > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 61 +++++++++++++++++++++ > ---- > drivers/gpu/drm/mediatek/mtk_dpi_regs.h | 6 +++ > 2 files changed, 59 insertions(+), 8 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 3085033becbd..0a604bf68b1b 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -54,7 +54,8 @@ enum mtk_dpi_out_channel_swap { > }; > > enum mtk_dpi_out_color_format { > - MTK_DPI_COLOR_FORMAT_RGB > + MTK_DPI_COLOR_FORMAT_RGB, > + MTK_DPI_COLOR_FORMAT_YCBCR_422 > }; > > struct mtk_dpi { > @@ -122,6 +123,7 @@ struct mtk_dpi_yc_limit { > * @num_output_fmts: Quantity of supported output formats. > * @is_ck_de_pol: Support CK/DE polarity. > * @swap_input_support: Support input swap function. > + * @color_fmt_trans_support: Enable color format transfer. > * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and > VSYNC_PORCH > * (no shift). > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > @@ -138,6 +140,7 @@ struct mtk_dpi_conf { > u32 num_output_fmts; > bool is_ck_de_pol; > bool swap_input_support; > + bool color_fmt_trans_support; > u32 dimension_mask; > u32 hvsize_mask; > u32 channel_swap_shift; > @@ -406,15 +409,54 @@ static void mtk_dpi_config_disable_edge(struct > mtk_dpi *dpi) > mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, 0, > EDGE_SEL_EN); > } > > +static void mtk_dpi_matrix_sel(struct mtk_dpi *dpi, > + enum mtk_dpi_out_color_format format) The format would only be MTK_DPI_COLOR_FORMAT_YCBCR_422, so drop the parameter format. > +{ > + u32 matrix_sel; > + > + if (!dpi->conf->color_fmt_trans_support) { Only YUV format would call this function, and I think YUV support would imply that color_fmt_trans_support is true. So drop color_fmt_trans_support. > + dev_info(dpi->dev, "matrix_sel is not supported.\n"); > + return; > + } > + > + switch (format) { > + case MTK_DPI_COLOR_FORMAT_YCBCR_422: > + /* > + * If height is smaller than 720, we need to use > RGB_TO_BT601 > + * to transfer to yuv422. Otherwise, we use > RGB_TO_JPEG. > + */ > + if (dpi->mode.hdisplay <= 720) > + matrix_sel = MATRIX_SEL_RGB_TO_BT601; > + else > + matrix_sel = MATRIX_SEL_RGB_TO_JPEG; > + break; > + default: > + matrix_sel = MATRIX_SEL_RGB_TO_JPEG; > + break; > + } > + mtk_dpi_mask(dpi, DPI_MATRIX_SET, matrix_sel, > INT_MATRIX_SEL_MASK); it seems that we could drop this function and write register as: mtk_dpi_mask(dpi, DPI_MATRIX_SET, dpi->mode.hdisplay <= 720 ? MATRIX_SEL_RGB_TO_BT601 : MATRIX_SEL_RGB_TO_JPEG, INT_MATRIX_SEL_MASK); > +} > + > static void mtk_dpi_config_color_format(struct mtk_dpi *dpi, > enum mtk_dpi_out_color_format > format) > { > - /* only support RGB888 */ > - mtk_dpi_config_yuv422_enable(dpi, false); > - mtk_dpi_config_csc_enable(dpi, false); > - if (dpi->conf->swap_input_support) > - mtk_dpi_config_swap_input(dpi, false); > - mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); > + if (format == MTK_DPI_COLOR_FORMAT_YCBCR_422) { > + mtk_dpi_config_yuv422_enable(dpi, true); > + mtk_dpi_config_csc_enable(dpi, true); > + mtk_dpi_matrix_sel(dpi, format); > + if (dpi->conf->swap_input_support) This would never be true because only MT8195 support MTK_DPI_COLOR_FORMAT_YCBCR_422 and swap_input_support of MT8195 is false. Regards, CK > + mtk_dpi_config_swap_input(dpi, true); > + else > + dev_warn(dpi->dev, > + "Failed to swap input, hw is not > supported.\n"); > + mtk_dpi_config_channel_swap(dpi, > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > + } else { > + mtk_dpi_config_yuv422_enable(dpi, false); > + mtk_dpi_config_csc_enable(dpi, false); > + if (dpi->conf->swap_input_support) > + mtk_dpi_config_swap_input(dpi, false); > + mtk_dpi_config_channel_swap(dpi, > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > + } > } > > static void mtk_dpi_dual_edge(struct mtk_dpi *dpi) > @@ -649,7 +691,10 @@ static int mtk_dpi_bridge_atomic_check(struct > drm_bridge *bridge, > dpi->bit_num = MTK_DPI_OUT_BIT_NUM_8BITS; > dpi->channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB; > dpi->yc_map = MTK_DPI_OUT_YC_MAP_RGB; > - dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB; > + if (out_bus_format == MEDIA_BUS_FMT_YUYV8_1X16) > + dpi->color_format = MTK_DPI_COLOR_FORMAT_YCBCR_422; > + else > + dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB; > > return 0; > } > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > index 3a02fabe1662..9ce300313f3e 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > +++ b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > @@ -217,4 +217,10 @@ > > #define EDGE_SEL_EN BIT(5) > #define H_FRE_2N BIT(25) > + > +#define DPI_MATRIX_SET 0xB4 > +#define INT_MATRIX_SEL_MASK GENMASK(4, 0) > +#define MATRIX_SEL_RGB_TO_JPEG 0 > +#define MATRIX_SEL_RGB_TO_BT601 2 > + > #endif /* __MTK_DPI_REGS_H */
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > MediaTek dpi supports direct connection to dpi panels while dp_intf > does not > support. Therefore, add a config "support_direct_pin" to control > this. Reviewed-by: CK Hu <ck.hu@mediatek.com> > > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 16 ++++++++++++---- > 1 file changed, 12 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index 0a604bf68b1b..a65b85c4c8d5 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -124,6 +124,7 @@ struct mtk_dpi_yc_limit { > * @is_ck_de_pol: Support CK/DE polarity. > * @swap_input_support: Support input swap function. > * @color_fmt_trans_support: Enable color format transfer. > + * @support_direct_pin: IP supports direct connection to dpi panels. > * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and > VSYNC_PORCH > * (no shift). > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > @@ -141,6 +142,7 @@ struct mtk_dpi_conf { > bool is_ck_de_pol; > bool swap_input_support; > bool color_fmt_trans_support; > + bool support_direct_pin; > u32 dimension_mask; > u32 hvsize_mask; > u32 channel_swap_shift; > @@ -608,11 +610,13 @@ static int mtk_dpi_set_display_mode(struct > mtk_dpi *dpi, > mtk_dpi_config_channel_limit(dpi); > mtk_dpi_config_bit_num(dpi, dpi->bit_num); > mtk_dpi_config_channel_swap(dpi, dpi->channel_swap); > - mtk_dpi_config_yc_map(dpi, dpi->yc_map); > mtk_dpi_config_color_format(dpi, dpi->color_format); > - mtk_dpi_config_2n_h_fre(dpi); > - mtk_dpi_dual_edge(dpi); > - mtk_dpi_config_disable_edge(dpi); > + if (dpi->conf->support_direct_pin) { > + mtk_dpi_config_yc_map(dpi, dpi->yc_map); > + mtk_dpi_config_2n_h_fre(dpi); > + mtk_dpi_dual_edge(dpi); > + mtk_dpi_config_disable_edge(dpi); > + } > mtk_dpi_sw_reset(dpi, false); > > return 0; > @@ -870,6 +874,7 @@ static const struct mtk_dpi_conf mt8173_conf = { > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .support_direct_pin = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > @@ -886,6 +891,7 @@ static const struct mtk_dpi_conf mt2701_conf = { > .num_output_fmts = ARRAY_SIZE(mt8173_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .support_direct_pin = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > @@ -901,6 +907,7 @@ static const struct mtk_dpi_conf mt8183_conf = { > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .support_direct_pin = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP, > @@ -916,6 +923,7 @@ static const struct mtk_dpi_conf mt8192_conf = { > .num_output_fmts = ARRAY_SIZE(mt8183_output_fmts), > .is_ck_de_pol = true, > .swap_input_support = true, > + .support_direct_pin = true, > .dimension_mask = HPW_MASK, > .hvsize_mask = HSIZE_MASK, > .channel_swap_shift = CH_SWAP,
Hi, Bo-Chen: On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > From: Guillaume Ranquet <granquet@baylibre.com> > > Dpintf is the displayport interface hardware unit. This unit is > similar > to dpi and can reuse most of the code. > > This patch adds support for mt8195-dpintf to this dpi driver. Main > differences are: > - 4 pixels for one iteration for dp_intf while dpi is 1 pixel for > one > iteration. Therefore, we add a new config "pixels_per_iter" to > control > quantity of transferred pixels per iteration. > - Input of dp_intf is two pixels per iteration, so we add a new > config > "input_2pixel" to control this. > - Some register contents differ slightly between the two components. > To > work around this I added register bits/masks with a DPINTF_ prefix > and use them where different. > > Based on a separate driver for dpintf created by > Jitao shi <jitao.shi@mediatek.com>. > > Signed-off-by: Markus Schneider-Pargmann <msp@baylibre.com> > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > Reviewed-by: AngeloGioacchino Del Regno < > angelogioacchino.delregno@collabora.com> > --- > drivers/gpu/drm/mediatek/mtk_dpi.c | 65 > ++++++++++++++++++++- > drivers/gpu/drm/mediatek/mtk_dpi_regs.h | 12 ++++ > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.c | 4 ++ > drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h | 1 + > drivers/gpu/drm/mediatek/mtk_drm_drv.c | 3 + > 5 files changed, 82 insertions(+), 3 deletions(-) > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > b/drivers/gpu/drm/mediatek/mtk_dpi.c > index be039474cf26..1072e94d2f2f 100644 > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > @@ -125,12 +125,15 @@ struct mtk_dpi_yc_limit { > * @swap_input_support: Support input swap function. > * @color_fmt_trans_support: Enable color format transfer. > * @support_direct_pin: IP supports direct connection to dpi panels. > + * @input_2pixel: Input pixel of dp_intf is 2 pixel per round, so > enable this > + * config to enable this feature. > * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and > VSYNC_PORCH > * (no shift). > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > * @channel_swap_shift: Shift value of channel swap. > * @yuv422_en_bit: Enable bit of yuv422. > * @csc_enable_bit: Enable bit of CSC. > + * @pixels_per_iter: Quantity of transferred pixels per iteration. > */ > struct mtk_dpi_conf { > unsigned int (*cal_factor)(int clock); > @@ -143,11 +146,13 @@ struct mtk_dpi_conf { > bool swap_input_support; > bool color_fmt_trans_support; > bool support_direct_pin; > + bool input_2pixel; Separate input_2pixel to an independent patch. > u32 dimension_mask; > u32 hvsize_mask; > u32 channel_swap_shift; > u32 yuv422_en_bit; > u32 csc_enable_bit; > + u32 pixels_per_iter; Separate pixels_per_iter to an independent patch. Regards, CK > }; > >
On Tue, 2022-07-05 at 13:21 +0800, CK Hu wrote: > Hi, Bo-Chen: > > On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > > Dp_intf supports YUV422 as output format. In MT8195 Chrome project, > > YUV422 output format is used for 4K resolution. > > > > To support this, it is also needed to support color format > > transfer. > > Color format transfer is a new feature for both dpi and dpintf of > > MT8195. > > > > The input format could be RGB888 and output format for dp_intf > > should > > be > > YUV422. Therefore, we add a mtk_dpi_matrix_sel() helper to update > > the > > DPI_MATRIX_SET register depending on the color format. > > > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > > Reviewed-by: AngeloGioacchino Del Regno < > > angelogioacchino.delregno@collabora.com> > > --- > > drivers/gpu/drm/mediatek/mtk_dpi.c | 61 +++++++++++++++++++++ > > ---- > > drivers/gpu/drm/mediatek/mtk_dpi_regs.h | 6 +++ > > 2 files changed, 59 insertions(+), 8 deletions(-) > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > > b/drivers/gpu/drm/mediatek/mtk_dpi.c > > index 3085033becbd..0a604bf68b1b 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > > @@ -54,7 +54,8 @@ enum mtk_dpi_out_channel_swap { > > }; > > > > enum mtk_dpi_out_color_format { > > - MTK_DPI_COLOR_FORMAT_RGB > > + MTK_DPI_COLOR_FORMAT_RGB, > > + MTK_DPI_COLOR_FORMAT_YCBCR_422 > > }; > > > > struct mtk_dpi { > > @@ -122,6 +123,7 @@ struct mtk_dpi_yc_limit { > > * @num_output_fmts: Quantity of supported output formats. > > * @is_ck_de_pol: Support CK/DE polarity. > > * @swap_input_support: Support input swap function. > > + * @color_fmt_trans_support: Enable color format transfer. > > * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH and > > VSYNC_PORCH > > * (no shift). > > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > > @@ -138,6 +140,7 @@ struct mtk_dpi_conf { > > u32 num_output_fmts; > > bool is_ck_de_pol; > > bool swap_input_support; > > + bool color_fmt_trans_support; > > u32 dimension_mask; > > u32 hvsize_mask; > > u32 channel_swap_shift; > > @@ -406,15 +409,54 @@ static void > > mtk_dpi_config_disable_edge(struct > > mtk_dpi *dpi) > > mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, 0, > > EDGE_SEL_EN); > > } > > > > +static void mtk_dpi_matrix_sel(struct mtk_dpi *dpi, > > + enum mtk_dpi_out_color_format format) > > The format would only be MTK_DPI_COLOR_FORMAT_YCBCR_422, so drop the > parameter format. > > > +{ > > + u32 matrix_sel; > > + > > + if (!dpi->conf->color_fmt_trans_support) { > > Only YUV format would call this function, and I think YUV support > would > imply that color_fmt_trans_support is true. So drop > color_fmt_trans_support. > > > + dev_info(dpi->dev, "matrix_sel is not supported.\n"); > > + return; > > + } > > + > > + switch (format) { > > + case MTK_DPI_COLOR_FORMAT_YCBCR_422: > > + /* > > + * If height is smaller than 720, we need to use > > RGB_TO_BT601 > > + * to transfer to yuv422. Otherwise, we use > > RGB_TO_JPEG. > > + */ > > + if (dpi->mode.hdisplay <= 720) > > + matrix_sel = MATRIX_SEL_RGB_TO_BT601; > > + else > > + matrix_sel = MATRIX_SEL_RGB_TO_JPEG; > > + break; > > + default: > > + matrix_sel = MATRIX_SEL_RGB_TO_JPEG; > > + break; > > + } > > + mtk_dpi_mask(dpi, DPI_MATRIX_SET, matrix_sel, > > INT_MATRIX_SEL_MASK); > > it seems that we could drop this function and write register as: > > mtk_dpi_mask(dpi, DPI_MATRIX_SET, dpi->mode.hdisplay <= 720 > ? MATRIX_SEL_RGB_TO_BT601 : MATRIX_SEL_RGB_TO_JPEG, > INT_MATRIX_SEL_MASK); > Hello CK, ok, I will drop this function and config. > > +} > > + > > static void mtk_dpi_config_color_format(struct mtk_dpi *dpi, > > enum mtk_dpi_out_color_format > > format) > > { > > - /* only support RGB888 */ > > - mtk_dpi_config_yuv422_enable(dpi, false); > > - mtk_dpi_config_csc_enable(dpi, false); > > - if (dpi->conf->swap_input_support) > > - mtk_dpi_config_swap_input(dpi, false); > > - mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); > > + if (format == MTK_DPI_COLOR_FORMAT_YCBCR_422) { > > + mtk_dpi_config_yuv422_enable(dpi, true); > > + mtk_dpi_config_csc_enable(dpi, true); > > + mtk_dpi_matrix_sel(dpi, format); > > + if (dpi->conf->swap_input_support) > > This would never be true because only MT8195 support > MTK_DPI_COLOR_FORMAT_YCBCR_422 and swap_input_support of MT8195 is > false. > I think for mt8195, it should be support output format yuv422 and rgb888. please refer to [16/16] +static const u32 mt8195_output_fmts[] = { + MEDIA_BUS_FMT_RGB888_1X24, + MEDIA_BUS_FMT_YUYV8_1X16, +}; BRs, Bo-Chen > Regards, > CK > > > + mtk_dpi_config_swap_input(dpi, true); > > + else > > + dev_warn(dpi->dev, > > + "Failed to swap input, hw is not > > supported.\n"); > > + mtk_dpi_config_channel_swap(dpi, > > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > > + } else { > > + mtk_dpi_config_yuv422_enable(dpi, false); > > + mtk_dpi_config_csc_enable(dpi, false); > > + if (dpi->conf->swap_input_support) > > + mtk_dpi_config_swap_input(dpi, false); > > + mtk_dpi_config_channel_swap(dpi, > > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > > + } > > } > > > > static void mtk_dpi_dual_edge(struct mtk_dpi *dpi) > > @@ -649,7 +691,10 @@ static int mtk_dpi_bridge_atomic_check(struct > > drm_bridge *bridge, > > dpi->bit_num = MTK_DPI_OUT_BIT_NUM_8BITS; > > dpi->channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB; > > dpi->yc_map = MTK_DPI_OUT_YC_MAP_RGB; > > - dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB; > > + if (out_bus_format == MEDIA_BUS_FMT_YUYV8_1X16) > > + dpi->color_format = MTK_DPI_COLOR_FORMAT_YCBCR_422; > > + else > > + dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB; > > > > return 0; > > } > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > index 3a02fabe1662..9ce300313f3e 100644 > > --- a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > @@ -217,4 +217,10 @@ > > > > #define EDGE_SEL_EN BIT(5) > > #define H_FRE_2N BIT(25) > > + > > +#define DPI_MATRIX_SET 0xB4 > > +#define INT_MATRIX_SEL_MASK GENMASK(4, 0) > > +#define MATRIX_SEL_RGB_TO_JPEG 0 > > +#define MATRIX_SEL_RGB_TO_BT601 2 > > + > > #endif /* __MTK_DPI_REGS_H */ > >
On Tue, 2022-07-05 at 16:39 +0800, Rex-BC Chen wrote: > On Tue, 2022-07-05 at 13:21 +0800, CK Hu wrote: > > Hi, Bo-Chen: > > > > On Fri, 2022-07-01 at 11:58 +0800, Bo-Chen Chen wrote: > > > Dp_intf supports YUV422 as output format. In MT8195 Chrome > > > project, > > > YUV422 output format is used for 4K resolution. > > > > > > To support this, it is also needed to support color format > > > transfer. > > > Color format transfer is a new feature for both dpi and dpintf of > > > MT8195. > > > > > > The input format could be RGB888 and output format for dp_intf > > > should > > > be > > > YUV422. Therefore, we add a mtk_dpi_matrix_sel() helper to update > > > the > > > DPI_MATRIX_SET register depending on the color format. > > > > > > Signed-off-by: Guillaume Ranquet <granquet@baylibre.com> > > > Signed-off-by: Bo-Chen Chen <rex-bc.chen@mediatek.com> > > > Reviewed-by: AngeloGioacchino Del Regno < > > > angelogioacchino.delregno@collabora.com> > > > --- > > > drivers/gpu/drm/mediatek/mtk_dpi.c | 61 > > > +++++++++++++++++++++ > > > ---- > > > drivers/gpu/drm/mediatek/mtk_dpi_regs.h | 6 +++ > > > 2 files changed, 59 insertions(+), 8 deletions(-) > > > > > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi.c > > > b/drivers/gpu/drm/mediatek/mtk_dpi.c > > > index 3085033becbd..0a604bf68b1b 100644 > > > --- a/drivers/gpu/drm/mediatek/mtk_dpi.c > > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi.c > > > @@ -54,7 +54,8 @@ enum mtk_dpi_out_channel_swap { > > > }; > > > > > > enum mtk_dpi_out_color_format { > > > - MTK_DPI_COLOR_FORMAT_RGB > > > + MTK_DPI_COLOR_FORMAT_RGB, > > > + MTK_DPI_COLOR_FORMAT_YCBCR_422 > > > }; > > > > > > struct mtk_dpi { > > > @@ -122,6 +123,7 @@ struct mtk_dpi_yc_limit { > > > * @num_output_fmts: Quantity of supported output formats. > > > * @is_ck_de_pol: Support CK/DE polarity. > > > * @swap_input_support: Support input swap function. > > > + * @color_fmt_trans_support: Enable color format transfer. > > > * @dimension_mask: Mask used for HWIDTH, HPORCH, VSYNC_WIDTH > > > and > > > VSYNC_PORCH > > > * (no shift). > > > * @hvsize_mask: Mask of HSIZE and VSIZE mask (no shift). > > > @@ -138,6 +140,7 @@ struct mtk_dpi_conf { > > > u32 num_output_fmts; > > > bool is_ck_de_pol; > > > bool swap_input_support; > > > + bool color_fmt_trans_support; > > > u32 dimension_mask; > > > u32 hvsize_mask; > > > u32 channel_swap_shift; > > > @@ -406,15 +409,54 @@ static void > > > mtk_dpi_config_disable_edge(struct > > > mtk_dpi *dpi) > > > mtk_dpi_mask(dpi, dpi->conf->reg_h_fre_con, 0, > > > EDGE_SEL_EN); > > > } > > > > > > +static void mtk_dpi_matrix_sel(struct mtk_dpi *dpi, > > > + enum mtk_dpi_out_color_format format) > > > > The format would only be MTK_DPI_COLOR_FORMAT_YCBCR_422, so drop > > the > > parameter format. > > > > > +{ > > > + u32 matrix_sel; > > > + > > > + if (!dpi->conf->color_fmt_trans_support) { > > > > Only YUV format would call this function, and I think YUV support > > would > > imply that color_fmt_trans_support is true. So drop > > color_fmt_trans_support. > > > > > + dev_info(dpi->dev, "matrix_sel is not supported.\n"); > > > + return; > > > + } > > > + > > > + switch (format) { > > > + case MTK_DPI_COLOR_FORMAT_YCBCR_422: > > > + /* > > > + * If height is smaller than 720, we need to use > > > RGB_TO_BT601 > > > + * to transfer to yuv422. Otherwise, we use > > > RGB_TO_JPEG. > > > + */ > > > + if (dpi->mode.hdisplay <= 720) > > > + matrix_sel = MATRIX_SEL_RGB_TO_BT601; > > > + else > > > + matrix_sel = MATRIX_SEL_RGB_TO_JPEG; > > > + break; > > > + default: > > > + matrix_sel = MATRIX_SEL_RGB_TO_JPEG; > > > + break; > > > + } > > > + mtk_dpi_mask(dpi, DPI_MATRIX_SET, matrix_sel, > > > INT_MATRIX_SEL_MASK); > > > > it seems that we could drop this function and write register as: > > > > mtk_dpi_mask(dpi, DPI_MATRIX_SET, dpi->mode.hdisplay <= 720 > > ? MATRIX_SEL_RGB_TO_BT601 : MATRIX_SEL_RGB_TO_JPEG, > > INT_MATRIX_SEL_MASK); > > > > Hello CK, > > ok, I will drop this function and config. > > > > +} > > > + > > > static void mtk_dpi_config_color_format(struct mtk_dpi *dpi, > > > enum mtk_dpi_out_color_format > > > format) > > > { > > > - /* only support RGB888 */ > > > - mtk_dpi_config_yuv422_enable(dpi, false); > > > - mtk_dpi_config_csc_enable(dpi, false); > > > - if (dpi->conf->swap_input_support) > > > - mtk_dpi_config_swap_input(dpi, false); > > > - mtk_dpi_config_channel_swap(dpi, MTK_DPI_OUT_CHANNEL_SWAP_RGB); > > > + if (format == MTK_DPI_COLOR_FORMAT_YCBCR_422) { > > > + mtk_dpi_config_yuv422_enable(dpi, true); > > > + mtk_dpi_config_csc_enable(dpi, true); > > > + mtk_dpi_matrix_sel(dpi, format); > > > + if (dpi->conf->swap_input_support) > > > > This would never be true because only MT8195 support > > MTK_DPI_COLOR_FORMAT_YCBCR_422 and swap_input_support of MT8195 is > > false. > > > > I think for mt8195, it should be support output format yuv422 and > rgb888. > > please refer to [16/16] > > +static const u32 mt8195_output_fmts[] = { > + MEDIA_BUS_FMT_RGB888_1X24, > + MEDIA_BUS_FMT_YUYV8_1X16, > +}; > > BRs, > Bo-Chen Hello CK, Sorry, I misunderstand your comments. ok, I will drop this. BRs, Bo-Chen > > Regards, > > CK > > > > > + mtk_dpi_config_swap_input(dpi, true); > > > + else > > > + dev_warn(dpi->dev, > > > + "Failed to swap input, hw is not > > > supported.\n"); > > > + mtk_dpi_config_channel_swap(dpi, > > > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > > > + } else { > > > + mtk_dpi_config_yuv422_enable(dpi, false); > > > + mtk_dpi_config_csc_enable(dpi, false); > > > + if (dpi->conf->swap_input_support) > > > + mtk_dpi_config_swap_input(dpi, false); > > > + mtk_dpi_config_channel_swap(dpi, > > > MTK_DPI_OUT_CHANNEL_SWAP_RGB); > > > + } > > > } > > > > > > static void mtk_dpi_dual_edge(struct mtk_dpi *dpi) > > > @@ -649,7 +691,10 @@ static int > > > mtk_dpi_bridge_atomic_check(struct > > > drm_bridge *bridge, > > > dpi->bit_num = MTK_DPI_OUT_BIT_NUM_8BITS; > > > dpi->channel_swap = MTK_DPI_OUT_CHANNEL_SWAP_RGB; > > > dpi->yc_map = MTK_DPI_OUT_YC_MAP_RGB; > > > - dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB; > > > + if (out_bus_format == MEDIA_BUS_FMT_YUYV8_1X16) > > > + dpi->color_format = MTK_DPI_COLOR_FORMAT_YCBCR_422; > > > + else > > > + dpi->color_format = MTK_DPI_COLOR_FORMAT_RGB; > > > > > > return 0; > > > } > > > diff --git a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > > b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > > index 3a02fabe1662..9ce300313f3e 100644 > > > --- a/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > > +++ b/drivers/gpu/drm/mediatek/mtk_dpi_regs.h > > > @@ -217,4 +217,10 @@ > > > > > > #define EDGE_SEL_EN BIT(5) > > > #define H_FRE_2N BIT(25) > > > + > > > +#define DPI_MATRIX_SET 0xB4 > > > +#define INT_MATRIX_SEL_MASK GENMASK(4, 0) > > > +#define MATRIX_SEL_RGB_TO_JPEG 0 > > > +#define MATRIX_SEL_RGB_TO_BT601 2 > > > + > > > #endif /* __MTK_DPI_REGS_H */ > > > > > >