Messages in this thread | | | Subject | Re: [PATCH v3 11/13] drm/msm/dsi: add mode valid callback for dsi_mgr | From | Dmitry Baryshkov <> | Date | Wed, 24 Nov 2021 23:33:32 +0300 |
| |
On 16/11/2021 09:22, Vinod Koul wrote: > Add a mode valid callback for dsi_mgr for checking mode being valid in > case of DSC. For DSC the height and width needs to be multiple of slice, > so we check that here > > Signed-off-by: Vinod Koul <vkoul@kernel.org>
Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
> --- > drivers/gpu/drm/msm/dsi/dsi.h | 2 ++ > drivers/gpu/drm/msm/dsi/dsi_host.c | 26 ++++++++++++++++++++++++++ > drivers/gpu/drm/msm/dsi/dsi_manager.c | 12 ++++++++++++ > 3 files changed, 40 insertions(+) > > diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h > index 569c8ff062ba..e7affab2fc1e 100644 > --- a/drivers/gpu/drm/msm/dsi/dsi.h > +++ b/drivers/gpu/drm/msm/dsi/dsi.h > @@ -115,6 +115,8 @@ int msm_dsi_host_power_on(struct mipi_dsi_host *host, > int msm_dsi_host_power_off(struct mipi_dsi_host *host); > int msm_dsi_host_set_display_mode(struct mipi_dsi_host *host, > const struct drm_display_mode *mode); > +enum drm_mode_status msm_dsi_host_check_dsc(struct mipi_dsi_host *host, > + const struct drm_display_mode *mode); > struct drm_panel *msm_dsi_host_get_panel(struct mipi_dsi_host *host); > unsigned long msm_dsi_host_get_mode_flags(struct mipi_dsi_host *host); > struct drm_bridge *msm_dsi_host_get_bridge(struct mipi_dsi_host *host); > diff --git a/drivers/gpu/drm/msm/dsi/dsi_host.c b/drivers/gpu/drm/msm/dsi/dsi_host.c > index 30c1e299aa52..31d385d8d834 100644 > --- a/drivers/gpu/drm/msm/dsi/dsi_host.c > +++ b/drivers/gpu/drm/msm/dsi/dsi_host.c > @@ -2588,6 +2588,32 @@ int msm_dsi_host_set_display_mode(struct mipi_dsi_host *host, > return 0; > } > > +enum drm_mode_status msm_dsi_host_check_dsc(struct mipi_dsi_host *host, > + const struct drm_display_mode *mode) > +{ > + struct msm_dsi_host *msm_host = to_msm_dsi_host(host); > + struct msm_display_dsc_config *dsc = msm_host->dsc; > + int pic_width = mode->hdisplay; > + int pic_height = mode->vdisplay; > + > + if (!msm_host->dsc) > + return MODE_OK; > + > + if (pic_width % dsc->drm->slice_width) { > + pr_err("DSI: pic_width %d has to be multiple of slice %d\n", > + pic_width, dsc->drm->slice_width); > + return MODE_H_ILLEGAL; > + } > + > + if (pic_height % dsc->drm->slice_height) { > + pr_err("DSI: pic_height %d has to be multiple of slice %d\n", > + pic_height, dsc->drm->slice_height); > + return MODE_V_ILLEGAL; > + } > + > + return MODE_OK; > +} > + > struct drm_panel *msm_dsi_host_get_panel(struct mipi_dsi_host *host) > { > return of_drm_find_panel(to_msm_dsi_host(host)->device_node); > diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c > index 20c4d650fd80..0ad8a53aaa0e 100644 > --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c > +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c > @@ -579,6 +579,17 @@ static void dsi_mgr_bridge_mode_set(struct drm_bridge *bridge, > msm_dsi_host_set_display_mode(other_dsi->host, adjusted_mode); > } > > +static enum drm_mode_status dsi_mgr_bridge_mode_valid(struct drm_bridge *bridge, > + const struct drm_display_info *info, > + const struct drm_display_mode *mode) > +{ > + int id = dsi_mgr_bridge_get_id(bridge); > + struct msm_dsi *msm_dsi = dsi_mgr_get_dsi(id); > + struct mipi_dsi_host *host = msm_dsi->host; > + > + return msm_dsi_host_check_dsc(host, mode); > +} > + > static const struct drm_connector_funcs dsi_mgr_connector_funcs = { > .detect = dsi_mgr_connector_detect, > .fill_modes = drm_helper_probe_single_connector_modes, > @@ -600,6 +611,7 @@ static const struct drm_bridge_funcs dsi_mgr_bridge_funcs = { > .disable = dsi_mgr_bridge_disable, > .post_disable = dsi_mgr_bridge_post_disable, > .mode_set = dsi_mgr_bridge_mode_set, > + .mode_valid = dsi_mgr_bridge_mode_valid, > }; > > /* initialize connector when we're connected to a drm_panel */ >
-- With best wishes Dmitry
| |