From 4d788099d2509ddc4e625427cf11840cf8a4f0db Mon Sep 17 00:00:00 2001 From: Renchao Liu Date: Mon, 7 Aug 2023 17:10:21 +0800 Subject: [PATCH 1/5] disp: msm: sde: swap right mixer flag Change swaps right mixer flag when swapping mixer. Histogram IRQ is registered to unexpected mixer index if both mixers' right mixer flag set as false. Change-Id: I0243d70129dc0c3bff24cabc8877c626101acd83 Signed-off-by: Renchao Liu --- msm/sde/sde_crtc.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 09f9de70..16a80f4c 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -1584,8 +1584,9 @@ static void _sde_crtc_program_lm_output_roi(struct drm_crtc *crtc) lm_roi = &cstate->lm_roi[lm_idx]; hw_lm = sde_crtc->mixers[lm_idx].hw_lm; - if (!sde_crtc->mixers_swapped) - right_mixer = lm_idx % MAX_MIXERS_PER_LAYOUT; + right_mixer = lm_idx % MAX_MIXERS_PER_LAYOUT; + if (sde_crtc->mixers_swapped) + right_mixer = !right_mixer; if (lm_roi->w != hw_lm->cfg.out_width || lm_roi->h != hw_lm->cfg.out_height || From 2ecc30acded933b3021cdedfd0196ceb59d7b6ad Mon Sep 17 00:00:00 2001 From: Yojana Juadi Date: Tue, 1 Aug 2023 15:13:37 +0530 Subject: [PATCH 2/5] disp: msm: sde: add null check for pointer to drm_connector Check for null value before dereferencing pointer to drm_connector. Change-Id: I38845ccab521e6e5e9ad052df57b25eba6bae9c0 Signed-off-by: Yojana Juadi --- msm/sde/sde_encoder.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index def9e568..4b813b88 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -3385,8 +3385,8 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) } sde_enc = to_sde_encoder_virt(drm_enc); - if (!sde_enc->cur_master) { - SDE_ERROR("Invalid cur_master\n"); + if (!sde_enc->cur_master || !sde_enc->cur_master->connector) { + SDE_ERROR("Invalid params\n"); return; } sde_conn = to_sde_connector(sde_enc->cur_master->connector); @@ -3478,8 +3478,7 @@ static void sde_encoder_virt_disable(struct drm_encoder *drm_enc) sde_encoder_resource_control(drm_enc, SDE_ENC_RC_EVENT_STOP); /* reset connector topology name property */ - if (sde_enc->cur_master && sde_enc->cur_master->connector && - sde_enc->crtc && sde_enc->crtc->state->active_changed) { + if (sde_enc->crtc && sde_enc->crtc->state->active_changed) { ret = sde_rm_update_topology(&sde_kms->rm, sde_enc->cur_master->connector->state, NULL); if (ret) { From 2abcfa0acdc4221d369a970f75de0984ff58c8bb Mon Sep 17 00:00:00 2001 From: Mahadevan Date: Tue, 1 Aug 2023 10:14:59 +0530 Subject: [PATCH 3/5] disp: msm: sde: traverse the entire CTL list during splash_resource init This change fixes an issue, where in CTL_2 was programmed for secondary display and handoff was not done as the list traversal logic was restricting it. Change-Id: Icd945cfb3401ecc9c9c33059f5208a87979ada77 Signed-off-by: Yojana Signed-off-by: Mahadevan --- msm/sde/sde_rm.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/msm/sde/sde_rm.c b/msm/sde/sde_rm.c index 751ccedf..48206dc7 100644 --- a/msm/sde/sde_rm.c +++ b/msm/sde/sde_rm.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ @@ -2252,7 +2252,7 @@ int sde_rm_cont_splash_res_init(struct msm_drm_private *priv, struct sde_mdss_cfg *cat) { struct sde_rm_hw_iter iter_c; - int index = 0, ctl_top_cnt; + int index = 0, ctl_top_cnt, splash_disp_count = 0; struct sde_kms *sde_kms = NULL; struct sde_hw_mdp *hw_mdp; struct sde_splash_display *splash_display; @@ -2280,7 +2280,7 @@ int sde_rm_cont_splash_res_init(struct msm_drm_private *priv, sde_rm_init_hw_iter(&iter_c, 0, SDE_HW_BLK_CTL); while (_sde_rm_get_hw_locked(rm, &iter_c) - && (index < splash_data->num_splash_displays)) { + && (splash_disp_count < splash_data->num_splash_displays)) { struct sde_hw_ctl *ctl = to_sde_hw_ctl(iter_c.blk->hw); if (!ctl->ops.get_ctl_intf) { @@ -2290,7 +2290,8 @@ int sde_rm_cont_splash_res_init(struct msm_drm_private *priv, intf_sel = ctl->ops.get_ctl_intf(ctl); if (intf_sel) { - splash_display = &splash_data->splash_display[index]; + splash_display = + &splash_data->splash_display[index ? 1 : 0]; SDE_DEBUG("finding resources for display=%d ctl=%d\n", index, iter_c.blk->id - CTL_0); @@ -2299,6 +2300,7 @@ int sde_rm_cont_splash_res_init(struct msm_drm_private *priv, splash_display->cont_splash_enabled = true; splash_display->ctl_ids[splash_display->ctl_cnt++] = iter_c.blk->id; + splash_disp_count++; } index++; } From cf762ff2ee19678da609c700f35028ddd460b46c Mon Sep 17 00:00:00 2001 From: Yojana Juadi Date: Fri, 11 Aug 2023 11:05:36 +0530 Subject: [PATCH 4/5] disp: msm: sde: add mutex lock to protect wb_dev There is null pointer dereference seen due to concurrency of wb_get_modes from userspace and clearing of writeback modes in wb_reset. This change acquires mutex lock to provide exclusive access to wb_dev effectively preventing such concurrency issues. Change-Id: Idd38e38696c839f557b94aa9313761d4d7738902 Signed-off-by: Yojana Juadi --- msm/sde/sde_encoder_phys_wb.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/msm/sde/sde_encoder_phys_wb.c b/msm/sde/sde_encoder_phys_wb.c index 9e952e86..cc6db1c8 100644 --- a/msm/sde/sde_encoder_phys_wb.c +++ b/msm/sde/sde_encoder_phys_wb.c @@ -1949,12 +1949,14 @@ static void _sde_encoder_phys_wb_reset_state(struct sde_encoder_phys *phys_enc) phys_enc->hw_cdm = NULL; phys_enc->hw_ctl = NULL; phys_enc->in_clone_mode = false; - kfree(wb_dev->modes); - wb_dev->modes = NULL; - wb_dev->count_modes = 0; atomic_set(&phys_enc->pending_kickoff_cnt, 0); atomic_set(&phys_enc->pending_retire_fence_cnt, 0); atomic_set(&phys_enc->pending_ctl_start_cnt, 0); + mutex_lock(&wb_dev->wb_lock); + kfree(wb_dev->modes); + wb_dev->modes = NULL; + wb_dev->count_modes = 0; + mutex_unlock(&wb_dev->wb_lock); } static int _sde_encoder_phys_wb_wait_for_idle(struct sde_encoder_phys *phys_enc, bool force_wait) From c84b917f06267e77aa02bf0657674f81dd97c2a3 Mon Sep 17 00:00:00 2001 From: Mahadevan Date: Mon, 21 Aug 2023 22:33:59 +0530 Subject: [PATCH 5/5] disp: msm: limit reglog to user debug builds This change limits reglog feature by default to user debug builds only and provides debug option to selectively disable reglog for power and perf profiling if required. This change is needed as reglog is considerably heavy on commit thread execution. Change-Id: I781ae73cee09ce0fcddb6d2b3c847343c69f6c59 Signed-off-by: Prabhanjan Kandula Signed-off-by: Mahadevan --- msm/sde_dbg.c | 3 ++- msm/sde_dbg_evtlog.c | 9 +++++++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/msm/sde_dbg.c b/msm/sde_dbg.c index 704d611d..5aff679d 100644 --- a/msm/sde_dbg.c +++ b/msm/sde_dbg.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2009-2021, The Linux Foundation. All rights reserved. */ @@ -2522,6 +2522,7 @@ int sde_dbg_debugfs_register(struct device *dev) debugfs_create_file("recovery_reg", 0400, debugfs_root, NULL, &sde_recovery_reg_fops); debugfs_create_u32("enable", 0600, debugfs_root, &(sde_dbg_base.evtlog->enable)); + debugfs_create_u32("reglog_enable", 0600, debugfs_root, &(sde_dbg_base.reglog->enable)); debugfs_create_u32("panic", 0600, debugfs_root, &sde_dbg_base.panic_on_err); debugfs_create_u32("dump_mode", 0600, debugfs_root, &sde_dbg_base.dump_option); debugfs_create_u64("reg_dump_blk_mask", 0600, debugfs_root, &sde_dbg_base.dump_blk_mask); diff --git a/msm/sde_dbg_evtlog.c b/msm/sde_dbg_evtlog.c index ecd2fc52..62ced5a1 100644 --- a/msm/sde_dbg_evtlog.c +++ b/msm/sde_dbg_evtlog.c @@ -1,6 +1,6 @@ // SPDX-License-Identifier: GPL-2.0-only /* - * Copyright (c) 2021-2022 Qualcomm Innovation Center, Inc. All rights reserved. + * Copyright (c) 2021-2023 Qualcomm Innovation Center, Inc. All rights reserved. * Copyright (c) 2016-2021, The Linux Foundation. All rights reserved. */ @@ -100,7 +100,7 @@ void sde_reglog_log(u8 blk_id, u32 val, u32 addr) struct sde_dbg_reglog *reglog = sde_dbg_base_reglog; int index; - if (!reglog) + if (!reglog || !reglog->enable) return; index = abs(atomic64_inc_return(®log->curr) % SDE_REGLOG_ENTRY); @@ -250,6 +250,11 @@ struct sde_dbg_reglog *sde_reglog_init(void) return ERR_PTR(-ENOMEM); atomic64_set(®log->curr, 0); +#if IS_ENABLED(CONFIG_DEBUG_FS) + reglog->enable = true; +#else + reglog->enable = false; +#endif return reglog; }