Преглед изворни кода

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 <[email protected]>
Narendra Muppalla пре 5 година
родитељ
комит
2c2a06abba
4 измењених фајлова са 14 додато и 0 уклоњено
  1. 5 0
      msm/sde/sde_crtc.c
  2. 2 0
      msm/sde/sde_crtc.h
  3. 5 0
      msm/sde/sde_encoder.c
  4. 2 0
      msm/sde/sde_encoder.h

+ 5 - 0
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);
 

+ 2 - 0
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;
 

+ 5 - 0
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);

+ 2 - 0
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;