Message ID | 20240125193834.7065-5-quic_parellan@quicinc.com (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | Add support for CDM over DP | expand |
On 25/01/2024 21:38, Paloma Arellano wrote: > Wide bus is not supported when the mode is YUV420 in DP. In preparation > for changing the DPU programming to reflect this, the value and > assignment location of wide_bus_en for the DP submodules must be > changed. Move it from boot time in dp_init_sub_modules() to run time in > dp_display_mode_set. > > Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> > --- > drivers/gpu/drm/msm/dp/dp_display.c | 17 +++++++++++++---- > drivers/gpu/drm/msm/dp/dp_panel.h | 1 + > 2 files changed, 14 insertions(+), 4 deletions(-) > > diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c > index 9df2a8b21021e..ddac55f45a722 100644 > --- a/drivers/gpu/drm/msm/dp/dp_display.c > +++ b/drivers/gpu/drm/msm/dp/dp_display.c > @@ -784,10 +784,6 @@ static int dp_init_sub_modules(struct dp_display_private *dp) > goto error_ctrl; > } > > - /* populate wide_bus_supported to different layers */ > - dp->ctrl->wide_bus_en = dp->wide_bus_supported; > - dp->catalog->wide_bus_en = dp->wide_bus_supported; > - > return rc; > > error_ctrl: > @@ -808,6 +804,7 @@ static int dp_display_set_mode(struct msm_dp *dp_display, > drm_mode_copy(&dp->panel->dp_mode.drm_mode, &mode->drm_mode); > dp->panel->dp_mode.bpp = mode->bpp; > dp->panel->dp_mode.capabilities = mode->capabilities; > + dp->panel->dp_mode.out_fmt_is_yuv_420 = mode->out_fmt_is_yuv_420; Why do we need it in dp_panel too? > dp_panel_init_panel_info(dp->panel); > return 0; > } > @@ -1402,6 +1399,9 @@ bool msm_dp_wide_bus_available(const struct msm_dp *dp_display) > > dp = container_of(dp_display, struct dp_display_private, dp_display); > > + if (dp->dp_mode.out_fmt_is_yuv_420) > + return false; > + > return dp->wide_bus_supported; > } > > @@ -1615,6 +1615,15 @@ void dp_bridge_mode_set(struct drm_bridge *drm_bridge, > > dp_display->dp_mode.h_active_low = > !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC); > + > + dp_display->dp_mode.out_fmt_is_yuv_420 = > + drm_mode_is_420_only(&dp->connector->display_info, adjusted_mode); > + > + /* populate wide_bus_support to different layers */ > + dp_display->ctrl->wide_bus_en = > + dp_display->dp_mode.out_fmt_is_yuv_420 ? false : dp_display->wide_bus_supported; > + dp_display->catalog->wide_bus_en = > + dp_display->dp_mode.out_fmt_is_yuv_420 ? false : dp_display->wide_bus_supported; > } > > void dp_bridge_hpd_enable(struct drm_bridge *bridge) > diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h b/drivers/gpu/drm/msm/dp/dp_panel.h > index a0dfc579c5f9f..6ec68be9f2366 100644 > --- a/drivers/gpu/drm/msm/dp/dp_panel.h > +++ b/drivers/gpu/drm/msm/dp/dp_panel.h > @@ -19,6 +19,7 @@ struct dp_display_mode { > u32 bpp; > u32 h_active_low; > u32 v_active_low; > + bool out_fmt_is_yuv_420; > }; > > struct dp_panel_in {
On 1/25/2024 1:20 PM, Dmitry Baryshkov wrote: > On 25/01/2024 21:38, Paloma Arellano wrote: >> Wide bus is not supported when the mode is YUV420 in DP. In preparation >> for changing the DPU programming to reflect this, the value and >> assignment location of wide_bus_en for the DP submodules must be >> changed. Move it from boot time in dp_init_sub_modules() to run time in >> dp_display_mode_set. >> >> Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> >> --- >> drivers/gpu/drm/msm/dp/dp_display.c | 17 +++++++++++++---- >> drivers/gpu/drm/msm/dp/dp_panel.h | 1 + >> 2 files changed, 14 insertions(+), 4 deletions(-) >> >> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c >> b/drivers/gpu/drm/msm/dp/dp_display.c >> index 9df2a8b21021e..ddac55f45a722 100644 >> --- a/drivers/gpu/drm/msm/dp/dp_display.c >> +++ b/drivers/gpu/drm/msm/dp/dp_display.c >> @@ -784,10 +784,6 @@ static int dp_init_sub_modules(struct >> dp_display_private *dp) >> goto error_ctrl; >> } >> - /* populate wide_bus_supported to different layers */ >> - dp->ctrl->wide_bus_en = dp->wide_bus_supported; >> - dp->catalog->wide_bus_en = dp->wide_bus_supported; >> - >> return rc; >> error_ctrl: >> @@ -808,6 +804,7 @@ static int dp_display_set_mode(struct msm_dp >> *dp_display, >> drm_mode_copy(&dp->panel->dp_mode.drm_mode, &mode->drm_mode); >> dp->panel->dp_mode.bpp = mode->bpp; >> dp->panel->dp_mode.capabilities = mode->capabilities; >> + dp->panel->dp_mode.out_fmt_is_yuv_420 = mode->out_fmt_is_yuv_420; > > Why do we need it in dp_panel too? Not sure if you saw in the other later patches, but I use the out_fmt_is_yuv_420 derived from dp_panel throughout dp_ctrl.c and dp_panel.c > >> dp_panel_init_panel_info(dp->panel); >> return 0; >> } >> @@ -1402,6 +1399,9 @@ bool msm_dp_wide_bus_available(const struct >> msm_dp *dp_display) >> dp = container_of(dp_display, struct dp_display_private, >> dp_display); >> + if (dp->dp_mode.out_fmt_is_yuv_420) >> + return false; >> + >> return dp->wide_bus_supported; >> } >> @@ -1615,6 +1615,15 @@ void dp_bridge_mode_set(struct drm_bridge >> *drm_bridge, >> dp_display->dp_mode.h_active_low = >> !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC); >> + >> + dp_display->dp_mode.out_fmt_is_yuv_420 = >> + drm_mode_is_420_only(&dp->connector->display_info, adjusted_mode); >> + >> + /* populate wide_bus_support to different layers */ >> + dp_display->ctrl->wide_bus_en = >> + dp_display->dp_mode.out_fmt_is_yuv_420 ? false : >> dp_display->wide_bus_supported; >> + dp_display->catalog->wide_bus_en = >> + dp_display->dp_mode.out_fmt_is_yuv_420 ? false : >> dp_display->wide_bus_supported; >> } >> void dp_bridge_hpd_enable(struct drm_bridge *bridge) >> diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h >> b/drivers/gpu/drm/msm/dp/dp_panel.h >> index a0dfc579c5f9f..6ec68be9f2366 100644 >> --- a/drivers/gpu/drm/msm/dp/dp_panel.h >> +++ b/drivers/gpu/drm/msm/dp/dp_panel.h >> @@ -19,6 +19,7 @@ struct dp_display_mode { >> u32 bpp; >> u32 h_active_low; >> u32 v_active_low; >> + bool out_fmt_is_yuv_420; >> }; >> struct dp_panel_in { >
On Sat, 27 Jan 2024 at 02:48, Paloma Arellano <quic_parellan@quicinc.com> wrote: > > > On 1/25/2024 1:20 PM, Dmitry Baryshkov wrote: > > On 25/01/2024 21:38, Paloma Arellano wrote: > >> Wide bus is not supported when the mode is YUV420 in DP. In preparation > >> for changing the DPU programming to reflect this, the value and > >> assignment location of wide_bus_en for the DP submodules must be > >> changed. Move it from boot time in dp_init_sub_modules() to run time in > >> dp_display_mode_set. > >> > >> Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> > >> --- > >> drivers/gpu/drm/msm/dp/dp_display.c | 17 +++++++++++++---- > >> drivers/gpu/drm/msm/dp/dp_panel.h | 1 + > >> 2 files changed, 14 insertions(+), 4 deletions(-) > >> > >> diff --git a/drivers/gpu/drm/msm/dp/dp_display.c > >> b/drivers/gpu/drm/msm/dp/dp_display.c > >> index 9df2a8b21021e..ddac55f45a722 100644 > >> --- a/drivers/gpu/drm/msm/dp/dp_display.c > >> +++ b/drivers/gpu/drm/msm/dp/dp_display.c > >> @@ -784,10 +784,6 @@ static int dp_init_sub_modules(struct > >> dp_display_private *dp) > >> goto error_ctrl; > >> } > >> - /* populate wide_bus_supported to different layers */ > >> - dp->ctrl->wide_bus_en = dp->wide_bus_supported; > >> - dp->catalog->wide_bus_en = dp->wide_bus_supported; > >> - > >> return rc; > >> error_ctrl: > >> @@ -808,6 +804,7 @@ static int dp_display_set_mode(struct msm_dp > >> *dp_display, > >> drm_mode_copy(&dp->panel->dp_mode.drm_mode, &mode->drm_mode); > >> dp->panel->dp_mode.bpp = mode->bpp; > >> dp->panel->dp_mode.capabilities = mode->capabilities; > >> + dp->panel->dp_mode.out_fmt_is_yuv_420 = mode->out_fmt_is_yuv_420; > > > > Why do we need it in dp_panel too? > Not sure if you saw in the other later patches, but I use the > out_fmt_is_yuv_420 derived from dp_panel throughout dp_ctrl.c and dp_panel.c Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > > > >> dp_panel_init_panel_info(dp->panel); > >> return 0; > >> }
diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index 9df2a8b21021e..ddac55f45a722 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -784,10 +784,6 @@ static int dp_init_sub_modules(struct dp_display_private *dp) goto error_ctrl; } - /* populate wide_bus_supported to different layers */ - dp->ctrl->wide_bus_en = dp->wide_bus_supported; - dp->catalog->wide_bus_en = dp->wide_bus_supported; - return rc; error_ctrl: @@ -808,6 +804,7 @@ static int dp_display_set_mode(struct msm_dp *dp_display, drm_mode_copy(&dp->panel->dp_mode.drm_mode, &mode->drm_mode); dp->panel->dp_mode.bpp = mode->bpp; dp->panel->dp_mode.capabilities = mode->capabilities; + dp->panel->dp_mode.out_fmt_is_yuv_420 = mode->out_fmt_is_yuv_420; dp_panel_init_panel_info(dp->panel); return 0; } @@ -1402,6 +1399,9 @@ bool msm_dp_wide_bus_available(const struct msm_dp *dp_display) dp = container_of(dp_display, struct dp_display_private, dp_display); + if (dp->dp_mode.out_fmt_is_yuv_420) + return false; + return dp->wide_bus_supported; } @@ -1615,6 +1615,15 @@ void dp_bridge_mode_set(struct drm_bridge *drm_bridge, dp_display->dp_mode.h_active_low = !!(dp_display->dp_mode.drm_mode.flags & DRM_MODE_FLAG_NHSYNC); + + dp_display->dp_mode.out_fmt_is_yuv_420 = + drm_mode_is_420_only(&dp->connector->display_info, adjusted_mode); + + /* populate wide_bus_support to different layers */ + dp_display->ctrl->wide_bus_en = + dp_display->dp_mode.out_fmt_is_yuv_420 ? false : dp_display->wide_bus_supported; + dp_display->catalog->wide_bus_en = + dp_display->dp_mode.out_fmt_is_yuv_420 ? false : dp_display->wide_bus_supported; } void dp_bridge_hpd_enable(struct drm_bridge *bridge) diff --git a/drivers/gpu/drm/msm/dp/dp_panel.h b/drivers/gpu/drm/msm/dp/dp_panel.h index a0dfc579c5f9f..6ec68be9f2366 100644 --- a/drivers/gpu/drm/msm/dp/dp_panel.h +++ b/drivers/gpu/drm/msm/dp/dp_panel.h @@ -19,6 +19,7 @@ struct dp_display_mode { u32 bpp; u32 h_active_low; u32 v_active_low; + bool out_fmt_is_yuv_420; }; struct dp_panel_in {
Wide bus is not supported when the mode is YUV420 in DP. In preparation for changing the DPU programming to reflect this, the value and assignment location of wide_bus_en for the DP submodules must be changed. Move it from boot time in dp_init_sub_modules() to run time in dp_display_mode_set. Signed-off-by: Paloma Arellano <quic_parellan@quicinc.com> --- drivers/gpu/drm/msm/dp/dp_display.c | 17 +++++++++++++---- drivers/gpu/drm/msm/dp/dp_panel.h | 1 + 2 files changed, 14 insertions(+), 4 deletions(-)