The bonded-DSI command path kept a file-scoped `static bool dsi_bonded_cmd_failed` next to the global manager instance, so bonded state was split across two storage classes. Move the flag into struct msm_dsi_manager (msm_dsim_glb) so the manager owns all of it and nothing mutable stays file-scoped. READ_ONCE/WRITE_ONCE use is unchanged, so behaviour is identical.
Signed-off-by: Qianhui Xu <[email protected]> --- drivers/gpu/drm/msm/dsi/dsi_manager.c | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/msm/dsi/dsi_manager.c b/drivers/gpu/drm/msm/dsi/dsi_manager.c index 559c07a8b9..93d636220b 100644 --- a/drivers/gpu/drm/msm/dsi/dsi_manager.c +++ b/drivers/gpu/drm/msm/dsi/dsi_manager.c @@ -30,6 +30,7 @@ struct msm_dsi_manager { bool is_bonded_dsi; bool is_sync_needed; bool is_sm8750; + bool bonded_cmd_failed; int master_dsi_link_id; }; @@ -37,8 +38,10 @@ static struct msm_dsi_manager msm_dsim_glb = { .master_dsi_link_id = -1, }; +/* Serialises bonded command transactions; the failure flag it guards lives in + * msm_dsim_glb so no bonded state is file-scoped. + */ static DEFINE_MUTEX(dsi_bonded_cmd_lock); -static bool dsi_bonded_cmd_failed; #define IS_BONDED_DSI() (msm_dsim_glb.is_bonded_dsi) #define IS_SYNC_NEEDED() (msm_dsim_glb.is_sync_needed) @@ -51,7 +54,8 @@ static bool dsi_mgr_uses_bonded_cmd(void) bool msm_dsi_manager_cmd_failed(void) { - return dsi_mgr_uses_bonded_cmd() && READ_ONCE(dsi_bonded_cmd_failed); + return dsi_mgr_uses_bonded_cmd() && + READ_ONCE(msm_dsim_glb.bonded_cmd_failed); } static inline struct msm_dsi *dsi_mgr_get_dsi(int id) @@ -374,7 +378,7 @@ static void dsi_mgr_bridge_enable(struct drm_bridge *bridge, if (!panel->prepared) { dev_err(&msm_dsi->pdev->dev, "panel is not prepared; refusing video enable\n"); - WRITE_ONCE(dsi_bonded_cmd_failed, true); + WRITE_ONCE(msm_dsim_glb.bonded_cmd_failed, true); return; } @@ -646,7 +650,7 @@ static int dsi_mgr_bonded_cmd_xfer(const struct mipi_dsi_msg *msg) ret = master_ret < 0 ? master_ret : slave_ret < 0 ? slave_ret : len; if (ret < 0) { /* Never reuse a packet buffer while either DMA engine is unresolved. */ - WRITE_ONCE(dsi_bonded_cmd_failed, true); + WRITE_ONCE(msm_dsim_glb.bonded_cmd_failed, true); dev_err(&master_dsi->pdev->dev, "bonded command DMA failed: master=%d peer=%d\n", master_ret, slave_ret); -- 2.53.0
