From 2c2a06abbaabea638ac4049954d85ab7f2eb5d23 Mon Sep 17 00:00:00 2001 From: Narendra Muppalla Date: Mon, 13 Jul 2020 14:54:27 -0700 Subject: [PATCH] disp: msm: sde: reconfigure misr based on user input In current SDE driver when misr is enabled, for each commit in encoder kickoff stage misr is configured for both lm and interface misr blks. This can clear misr data before client could collect misr. This change avoids misr data clear and configures misr based on user input. Change-Id: I85fc19c78afc6d01346219250c82f2ada824eb0d Signed-off-by: Narendra Muppalla --- msm/sde/sde_crtc.c | 5 +++++ msm/sde/sde_crtc.h | 2 ++ msm/sde/sde_encoder.c | 5 +++++ msm/sde/sde_encoder.h | 2 ++ 4 files changed, 14 insertions(+) diff --git a/msm/sde/sde_crtc.c b/msm/sde/sde_crtc.c index 932c931d46..cf4b0f9d60 100644 --- a/msm/sde/sde_crtc.c +++ b/msm/sde/sde_crtc.c @@ -5662,6 +5662,9 @@ void sde_crtc_misr_setup(struct drm_crtc *crtc, bool enable, u32 frame_count) } sde_crtc = to_sde_crtc(crtc); + if (!sde_crtc->misr_reconfigure) + return; + sde_crtc->misr_enable_sui = enable; sde_crtc->misr_frame_count = frame_count; for (i = 0; i < sde_crtc->num_mixers; ++i) { @@ -5671,6 +5674,7 @@ void sde_crtc_misr_setup(struct drm_crtc *crtc, bool enable, u32 frame_count) m->hw_lm->ops.setup_misr(m->hw_lm, enable, frame_count); } + sde_crtc->misr_reconfigure = false; } void sde_crtc_get_misr_info(struct drm_crtc *crtc, @@ -5896,6 +5900,7 @@ static ssize_t _sde_crtc_misr_setup(struct file *file, return rc; sde_crtc->misr_enable_debugfs = enable; + sde_crtc->misr_reconfigure = true; sde_crtc_misr_setup(crtc, enable, frame_count); pm_runtime_put_sync(crtc->dev->dev); diff --git a/msm/sde/sde_crtc.h b/msm/sde/sde_crtc.h index 339900deb5..525490ad22 100644 --- a/msm/sde/sde_crtc.h +++ b/msm/sde/sde_crtc.h @@ -267,6 +267,7 @@ struct sde_crtc_misr_info { * for secure cases. * @misr_enable_debugfs : boolean entry indicates misr enable/disable status * from debugfs. + * @misr_reconfigure : boolean entry indicates misr reconfigure status * @misr_frame_count : misr frame count provided by client * @misr_data : store misr data before turning off the clocks. * @idle_notify_work: delayed worker to notify idle timeout to user space @@ -341,6 +342,7 @@ struct sde_crtc { spinlock_t event_lock; bool misr_enable_sui; bool misr_enable_debugfs; + bool misr_reconfigure; u32 misr_frame_count; struct kthread_delayed_work idle_notify_work; diff --git a/msm/sde/sde_encoder.c b/msm/sde/sde_encoder.c index 3aaba7b1bc..0d1d5ac47c 100644 --- a/msm/sde/sde_encoder.c +++ b/msm/sde/sde_encoder.c @@ -1484,6 +1484,9 @@ static void sde_encoder_misr_configure(struct drm_encoder *drm_enc, } sde_enc = to_sde_encoder_virt(drm_enc); + if (!sde_enc->misr_reconfigure) + return; + for (i = 0; i < sde_enc->num_phys_encs; i++) { struct sde_encoder_phys *phys = sde_enc->phys_encs[i]; @@ -1492,6 +1495,7 @@ static void sde_encoder_misr_configure(struct drm_encoder *drm_enc, phys->ops.setup_misr(phys, enable, frame_count); } + sde_enc->misr_reconfigure = false; } static void sde_encoder_input_event_handler(struct input_handle *handle, @@ -4273,6 +4277,7 @@ static ssize_t _sde_encoder_misr_setup(struct file *file, return rc; sde_enc->misr_enable = enable; + sde_enc->misr_reconfigure = true; sde_enc->misr_frame_count = frame_count; sde_encoder_misr_configure(&sde_enc->base, enable, frame_count); pm_runtime_put_sync(drm_enc->dev->dev); diff --git a/msm/sde/sde_encoder.h b/msm/sde/sde_encoder.h index e7b3924d43..c87c7a71c7 100644 --- a/msm/sde/sde_encoder.h +++ b/msm/sde/sde_encoder.h @@ -159,6 +159,7 @@ struct sde_encoder_ops { * @rsc_state_init: boolean to indicate rsc config init * @disp_info: local copy of msm_display_info struct * @misr_enable: misr enable/disable status + * @misr_reconfigure: boolean entry indicates misr reconfigure status * @misr_frame_count: misr frame count before start capturing the data * @idle_pc_enabled: indicate if idle power collapse is enabled * currently. This can be controlled by user-mode @@ -226,6 +227,7 @@ struct sde_encoder_virt { bool rsc_state_init; struct msm_display_info disp_info; bool misr_enable; + bool misr_reconfigure; u32 misr_frame_count; bool idle_pc_enabled;