The DPU DSI setup calls msm_dsi_is_bonded_dsi() and msm_dsi_is_master_dsi() on the concrete sub-block to decide whether to create an encoder (the slave of a bonded pair shares the master's) and whether to add a second tile.
Add two mandatory callbacks: is_bonded() and needs_encoder(). DSI implements them in terms of its internal bonded/master helpers (now declared privately in dsi.h); DP and HDMI are never bonded and always need their own encoder. The DPU backend uses the callbacks, dropping the last concrete msm_dsi_*() queries from its display setup. No functional change intended. Assisted-by: Claude:claude-opus-4-8 Signed-off-by: Dmitry Baryshkov <[email protected]> --- drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c | 8 ++++---- drivers/gpu/drm/msm/dp/dp_display.c | 12 ++++++++++++ drivers/gpu/drm/msm/dsi/dsi.c | 15 +++++++++++++++ drivers/gpu/drm/msm/dsi/dsi.h | 2 ++ drivers/gpu/drm/msm/hdmi/hdmi.c | 12 ++++++++++++ drivers/gpu/drm/msm/msm_drv.h | 17 +++++++---------- 6 files changed, 52 insertions(+), 14 deletions(-) diff --git a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c index 8dacde316033..2eeaef963e1a 100644 --- a/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c +++ b/drivers/gpu/drm/msm/disp/dpu1/dpu_kms.c @@ -603,18 +603,18 @@ static int _dpu_kms_initialize_dsi(struct drm_device *dev, if (!priv->kms->dsi[i]) continue; - if (msm_dsi_is_bonded_dsi(priv->kms->dsi[i]) && - !msm_dsi_is_master_dsi(priv->kms->dsi[i])) + display = msm_dsi_get_display(priv->kms->dsi[i]); + + if (!display->funcs->needs_encoder(display)) continue; memset(&info, 0, sizeof(info)); info.intf_type = INTF_DSI; info.h_tile_instance[info.num_of_h_tiles++] = i; - if (msm_dsi_is_bonded_dsi(priv->kms->dsi[i])) + if (display->funcs->is_bonded(display)) info.h_tile_instance[info.num_of_h_tiles++] = other; - display = msm_dsi_get_display(priv->kms->dsi[i]); info.is_cmd_mode = display->funcs->is_cmd_mode(display); rc = dpu_kms_dsi_set_te_source(&info, display); diff --git a/drivers/gpu/drm/msm/dp/dp_display.c b/drivers/gpu/drm/msm/dp/dp_display.c index 95810e3b01a7..914cf9dd0f21 100644 --- a/drivers/gpu/drm/msm/dp/dp_display.c +++ b/drivers/gpu/drm/msm/dp/dp_display.c @@ -1384,6 +1384,16 @@ static const char *msm_dp_display_get_te_source(struct msm_display *display) return NULL; } +static bool msm_dp_display_is_bonded(struct msm_display *display) +{ + return false; +} + +static bool msm_dp_display_needs_encoder(struct msm_display *display) +{ + return true; +} + static const struct msm_display_funcs msm_dp_display_funcs = { .modeset_init = msm_dp_modeset_init, .snapshot = msm_dp_snapshot, @@ -1392,6 +1402,8 @@ static const struct msm_display_funcs msm_dp_display_funcs = { .is_cmd_mode = msm_dp_display_is_cmd_mode, .get_dsc_config = msm_dp_display_get_dsc_config, .get_te_source = msm_dp_display_get_te_source, + .is_bonded = msm_dp_display_is_bonded, + .needs_encoder = msm_dp_display_needs_encoder, }; struct msm_display *msm_dp_get_display(struct msm_dp *msm_dp_display) diff --git a/drivers/gpu/drm/msm/dsi/dsi.c b/drivers/gpu/drm/msm/dsi/dsi.c index e07d1a964c7c..69e57ab47258 100644 --- a/drivers/gpu/drm/msm/dsi/dsi.c +++ b/drivers/gpu/drm/msm/dsi/dsi.c @@ -27,6 +27,19 @@ static const char *msm_dsi_get_te_source(struct msm_display *display) return msm_dsi->te_source; } +static bool msm_dsi_is_bonded(struct msm_display *display) +{ + return msm_dsi_is_bonded_dsi(container_of(display, struct msm_dsi, display)); +} + +static bool msm_dsi_needs_encoder(struct msm_display *display) +{ + struct msm_dsi *msm_dsi = container_of(display, struct msm_dsi, display); + + /* the slave of a bonded pair shares the master's encoder */ + return !(msm_dsi_is_bonded_dsi(msm_dsi) && !msm_dsi_is_master_dsi(msm_dsi)); +} + static bool msm_dsi_wide_bus_enabled(struct msm_display *display) { struct msm_dsi *msm_dsi = container_of(display, struct msm_dsi, display); @@ -302,6 +315,8 @@ static const struct msm_display_funcs msm_dsi_display_funcs = { .is_cmd_mode = msm_dsi_is_cmd_mode, .get_dsc_config = msm_dsi_get_dsc_config, .get_te_source = msm_dsi_get_te_source, + .is_bonded = msm_dsi_is_bonded, + .needs_encoder = msm_dsi_needs_encoder, }; struct msm_display *msm_dsi_get_display(struct msm_dsi *msm_dsi) diff --git a/drivers/gpu/drm/msm/dsi/dsi.h b/drivers/gpu/drm/msm/dsi/dsi.h index 1d1bda0682db..d594a7399f54 100644 --- a/drivers/gpu/drm/msm/dsi/dsi.h +++ b/drivers/gpu/drm/msm/dsi/dsi.h @@ -50,6 +50,8 @@ struct msm_dsi { }; /* dsi manager */ +bool msm_dsi_is_bonded_dsi(struct msm_dsi *msm_dsi); +bool msm_dsi_is_master_dsi(struct msm_dsi *msm_dsi); int msm_dsi_manager_connector_init(struct msm_dsi *msm_dsi, struct drm_encoder *encoder); int msm_dsi_manager_cmd_xfer(int id, const struct mipi_dsi_msg *msg); diff --git a/drivers/gpu/drm/msm/hdmi/hdmi.c b/drivers/gpu/drm/msm/hdmi/hdmi.c index 6e077747ebce..506a9856459e 100644 --- a/drivers/gpu/drm/msm/hdmi/hdmi.c +++ b/drivers/gpu/drm/msm/hdmi/hdmi.c @@ -254,6 +254,16 @@ static const char *msm_hdmi_get_te_source(struct msm_display *display) return NULL; } +static bool msm_hdmi_is_bonded(struct msm_display *display) +{ + return false; +} + +static bool msm_hdmi_needs_encoder(struct msm_display *display) +{ + return true; +} + static const struct msm_display_funcs msm_hdmi_display_funcs = { .modeset_init = msm_hdmi_modeset_init, .snapshot = msm_hdmi_snapshot, @@ -262,6 +272,8 @@ static const struct msm_display_funcs msm_hdmi_display_funcs = { .is_cmd_mode = msm_hdmi_is_cmd_mode, .get_dsc_config = msm_hdmi_get_dsc_config, .get_te_source = msm_hdmi_get_te_source, + .is_bonded = msm_hdmi_is_bonded, + .needs_encoder = msm_hdmi_needs_encoder, }; struct msm_display *msm_hdmi_get_display(struct hdmi *hdmi) diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h index 989b0a37d6aa..378d2cc80b66 100644 --- a/drivers/gpu/drm/msm/msm_drv.h +++ b/drivers/gpu/drm/msm/msm_drv.h @@ -289,6 +289,11 @@ struct msm_disp_state; * @is_cmd_mode: whether the sub-block runs in command mode; mandatory. * @get_dsc_config: return the DSC config for the sub-block, or NULL; mandatory. * @get_te_source: return the tear-check source name, or NULL; mandatory. + * @is_bonded: whether the sub-block is part of a bonded (tiled) pair; + * mandatory. + * @needs_encoder: whether the sub-block needs its own encoder created (false + * for e.g. the slave of a bonded pair, which shares the + * master's encoder); mandatory. */ struct msm_display_funcs { int (*modeset_init)(struct msm_display *display, struct drm_device *dev, @@ -301,6 +306,8 @@ struct msm_display_funcs { bool (*is_cmd_mode)(struct msm_display *display); struct drm_dsc_config *(*get_dsc_config)(struct msm_display *display); const char *(*get_te_source)(struct msm_display *display); + bool (*is_bonded)(struct msm_display *display); + bool (*needs_encoder)(struct msm_display *display); }; /** @@ -336,8 +343,6 @@ void dsi_dev_detach(struct platform_device *pdev); void __init msm_dsi_register(void); void __exit msm_dsi_unregister(void); struct msm_display *msm_dsi_get_display(struct msm_dsi *msm_dsi); -bool msm_dsi_is_bonded_dsi(struct msm_dsi *msm_dsi); -bool msm_dsi_is_master_dsi(struct msm_dsi *msm_dsi); #else static inline void __init msm_dsi_register(void) { @@ -349,14 +354,6 @@ static inline struct msm_display *msm_dsi_get_display(struct msm_dsi *msm_dsi) { return NULL; } -static inline bool msm_dsi_is_bonded_dsi(struct msm_dsi *msm_dsi) -{ - return false; -} -static inline bool msm_dsi_is_master_dsi(struct msm_dsi *msm_dsi) -{ - return false; -} #endif struct msm_dp; -- 2.47.3
