Re: [PATCH v3 4/4] drm/msm/dsi: Enable widebus for DSI

From: Dmitry Baryshkov
Date: Wed Aug 02 2023 - 14:25:20 EST


On Wed, 2 Aug 2023 at 21:09, Jessica Zhang <quic_jesszhan@xxxxxxxxxxx> wrote:
>
> DSI 6G v2.5.x+ supports a data-bus widen mode that allows DSI to send
> 48 bits of compressed data instead of 24.
>
> Enable this mode whenever DSC is enabled for supported chipsets.
>
> Signed-off-by: Jessica Zhang <quic_jesszhan@xxxxxxxxxxx>
> ---
> drivers/gpu/drm/msm/dsi/dsi.c | 5 +++++
> drivers/gpu/drm/msm/dsi/dsi.h | 1 +
> drivers/gpu/drm/msm/dsi/dsi_host.c | 30 ++++++++++++++++++++++++++----
> 3 files changed, 32 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c
> index baab79ab6e74..4fa738dea680 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi.c
> @@ -17,6 +17,11 @@ struct drm_dsc_config *msm_dsi_get_dsc_config(struct msm_dsi *msm_dsi)
> return msm_dsi_host_get_dsc_config(msm_dsi->host);
> }
>
> +bool msm_dsi_is_widebus_enabled(struct msm_dsi *msm_dsi)
> +{
> + return msm_dsi_host_is_widebus_enabled(msm_dsi->host);
> +}

If this function is not provided at the time of the previous patch,
compilation will break. I'd suggest to provide a stub first and then
change it in this patch.

> +
> static int dsi_get_phy(struct msm_dsi *msm_dsi)
> {
> struct platform_device *pdev = msm_dsi->pdev;
> diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h
> index bd3763a5d723..a557d2c1aaff 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi.h
> +++ b/drivers/gpu/drm/msm/dsi/dsi.h
> @@ -134,6 +134,7 @@ int dsi_calc_clk_rate_6g(struct msm_dsi_host *msm_host, bool is_bonded_dsi);
> void msm_dsi_host_snapshot(struct msm_disp_state *disp_state, struct mipi_dsi_host *host);
> void msm_dsi_host_test_pattern_en(struct mipi_dsi_host *host);
> struct drm_dsc_config *msm_dsi_host_get_dsc_config(struct mipi_dsi_host *host);
> +bool msm_dsi_host_is_widebus_enabled(struct mipi_dsi_host *host);
>
> /* dsi phy */
> struct msm_dsi_phy;
> diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c
> index 645927214871..231b02e5ab6e 100644
> --- a/drivers/gpu/drm/msm/dsi/dsi_host.c
> +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c
> @@ -710,6 +710,14 @@ static void dsi_ctrl_disable(struct msm_dsi_host *msm_host)
> dsi_write(msm_host, REG_DSI_CTRL, 0);
> }
>
> +bool msm_dsi_host_is_widebus_enabled(struct mipi_dsi_host *host)
> +{
> + struct msm_dsi_host *msm_host = to_msm_dsi_host(host);
> +
> + return msm_host->dsc && (msm_host->cfg_hnd->major == MSM_DSI_VER_MAJOR_6G &&

Please add a line break after the first &&. Compare two following statements:

> + msm_host->cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V2_5_0);
> +}
> +
> static void dsi_ctrl_enable(struct msm_dsi_host *msm_host,
> struct msm_dsi_phy_shared_timings *phy_shared_timings, struct msm_dsi_phy *phy)
> {
> @@ -753,10 +761,16 @@ static void dsi_ctrl_enable(struct msm_dsi_host *msm_host,
> data |= DSI_CMD_CFG1_INSERT_DCS_COMMAND;
> dsi_write(msm_host, REG_DSI_CMD_CFG1, data);
>
> - if (msm_host->cfg_hnd->major == MSM_DSI_VER_MAJOR_6G &&
> - msm_host->cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V1_3) {
> + if (cfg_hnd->major == MSM_DSI_VER_MAJOR_6G) {
> data = dsi_read(msm_host, REG_DSI_CMD_MODE_MDP_CTRL2);
> - data |= DSI_CMD_MODE_MDP_CTRL2_BURST_MODE;
> +
> + if (cfg_hnd->minor >= MSM_DSI_6G_VER_MINOR_V1_3)
> + data |= DSI_CMD_MODE_MDP_CTRL2_BURST_MODE;
> +
> + /* TODO: Allow for video-mode support once tested/fixed */
> + if (msm_dsi_host_is_widebus_enabled(&msm_host->base))
> + data |= DSI_CMD_MODE_MDP_CTRL2_DATABUS_WIDEN;
> +
> dsi_write(msm_host, REG_DSI_CMD_MODE_MDP_CTRL2, data);
> }
> }
> @@ -894,6 +908,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
> u32 hdisplay = mode->hdisplay;
> u32 wc;
> int ret;
> + bool widebus_enabled = msm_dsi_host_is_widebus_enabled(&msm_host->base);
>
> DBG("");
>
> @@ -914,6 +929,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
>
> if (msm_host->dsc) {
> struct drm_dsc_config *dsc = msm_host->dsc;
> + u32 bytes_per_pclk;
>
> /* update dsc params with timing params */
> if (!dsc || !mode->hdisplay || !mode->vdisplay) {
> @@ -937,7 +953,13 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi)
> * pulse width same
> */
> h_total -= hdisplay;
> - hdisplay = DIV_ROUND_UP(msm_dsc_get_bytes_per_line(msm_host->dsc), 3);
> + if (widebus_enabled && !(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO))
> + bytes_per_pclk = 6;
> + else
> + bytes_per_pclk = 3;
> +
> + hdisplay = DIV_ROUND_UP(msm_dsc_get_bytes_per_line(msm_host->dsc), bytes_per_pclk);
> +
> h_total += hdisplay;
> ha_end = ha_start + hdisplay;
> }
>
> --
> 2.41.0
>


--
With best wishes
Dmitry