|
@@ -149,31 +149,67 @@ void sde_encoder_uidle_enable(struct drm_encoder *drm_enc, bool enable)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void _sde_encoder_pm_qos_add_request(struct drm_encoder *drm_enc,
|
|
|
- struct sde_kms *sde_kms)
|
|
|
+static void _sde_encoder_pm_qos_add_request(struct drm_encoder *drm_enc)
|
|
|
{
|
|
|
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
|
|
|
+ struct msm_drm_private *priv;
|
|
|
+ struct sde_kms *sde_kms;
|
|
|
+ struct device *cpu_dev;
|
|
|
+ struct cpumask *cpu_mask = NULL;
|
|
|
+ int cpu = 0;
|
|
|
u32 cpu_dma_latency;
|
|
|
|
|
|
- if (!sde_kms->catalog)
|
|
|
+ priv = drm_enc->dev->dev_private;
|
|
|
+ sde_kms = to_sde_kms(priv->kms);
|
|
|
+
|
|
|
+ if (!sde_kms->catalog || !sde_kms->catalog->perf.cpu_mask)
|
|
|
return;
|
|
|
|
|
|
cpu_dma_latency = sde_kms->catalog->perf.cpu_dma_latency;
|
|
|
- pm_qos_add_request(&sde_enc->pm_qos_cpu_req,
|
|
|
- PM_QOS_CPU_DMA_LATENCY, cpu_dma_latency);
|
|
|
+ cpumask_clear(&sde_enc->valid_cpu_mask);
|
|
|
|
|
|
- SDE_EVT32_VERBOSE(DRMID(drm_enc), cpu_dma_latency);
|
|
|
+ if (sde_enc->mode_info.frame_rate > FPS60)
|
|
|
+ cpu_mask = to_cpumask(&sde_kms->catalog->perf.cpu_mask_perf);
|
|
|
+ if (!cpu_mask &&
|
|
|
+ sde_encoder_check_curr_mode(drm_enc,
|
|
|
+ MSM_DISPLAY_CMD_MODE))
|
|
|
+ cpu_mask = to_cpumask(&sde_kms->catalog->perf.cpu_mask);
|
|
|
+
|
|
|
+ if (!cpu_mask)
|
|
|
+ return;
|
|
|
+
|
|
|
+ for_each_cpu(cpu, cpu_mask) {
|
|
|
+ cpu_dev = get_cpu_device(cpu);
|
|
|
+ if (!cpu_dev) {
|
|
|
+ SDE_ERROR("%s: failed to get cpu%d device\n", __func__,
|
|
|
+ cpu);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ cpumask_set_cpu(cpu, &sde_enc->valid_cpu_mask);
|
|
|
+ dev_pm_qos_add_request(cpu_dev,
|
|
|
+ &sde_enc->pm_qos_cpu_req[cpu],
|
|
|
+ DEV_PM_QOS_RESUME_LATENCY, cpu_dma_latency);
|
|
|
+ SDE_EVT32_VERBOSE(DRMID(drm_enc), cpu_dma_latency, cpu);
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
-static void _sde_encoder_pm_qos_remove_request(struct drm_encoder *drm_enc,
|
|
|
- struct sde_kms *sde_kms)
|
|
|
+static void _sde_encoder_pm_qos_remove_request(struct drm_encoder *drm_enc)
|
|
|
{
|
|
|
struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
|
|
|
-
|
|
|
- if (!sde_kms->catalog)
|
|
|
- return;
|
|
|
-
|
|
|
- pm_qos_remove_request(&sde_enc->pm_qos_cpu_req);
|
|
|
+ struct device *cpu_dev;
|
|
|
+ int cpu = 0;
|
|
|
+
|
|
|
+ for_each_cpu(cpu, &sde_enc->valid_cpu_mask) {
|
|
|
+ cpu_dev = get_cpu_device(cpu);
|
|
|
+ if (!cpu_dev) {
|
|
|
+ SDE_ERROR("%s: failed to get cpu%d device\n", __func__,
|
|
|
+ cpu);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ dev_pm_qos_remove_request(&sde_enc->pm_qos_cpu_req[cpu]);
|
|
|
+ SDE_EVT32_VERBOSE(DRMID(drm_enc), cpu);
|
|
|
+ }
|
|
|
+ cpumask_clear(&sde_enc->valid_cpu_mask);
|
|
|
}
|
|
|
|
|
|
static bool _sde_encoder_is_autorefresh_enabled(
|
|
@@ -1382,16 +1418,12 @@ static int _sde_encoder_resource_control_helper(struct drm_encoder *drm_enc,
|
|
|
struct sde_kms *sde_kms;
|
|
|
struct sde_encoder_virt *sde_enc;
|
|
|
int rc;
|
|
|
- bool is_cmd_mode = false;
|
|
|
|
|
|
sde_enc = to_sde_encoder_virt(drm_enc);
|
|
|
sde_kms = sde_encoder_get_kms(drm_enc);
|
|
|
if (!sde_kms)
|
|
|
return -EINVAL;
|
|
|
|
|
|
- if (sde_encoder_check_curr_mode(drm_enc, MSM_DISPLAY_CMD_MODE))
|
|
|
- is_cmd_mode = true;
|
|
|
-
|
|
|
SDE_DEBUG_ENC(sde_enc, "enable:%d\n", enable);
|
|
|
SDE_EVT32(DRMID(drm_enc), enable);
|
|
|
|
|
@@ -1422,12 +1454,10 @@ static int _sde_encoder_resource_control_helper(struct drm_encoder *drm_enc,
|
|
|
/* enable all the irq */
|
|
|
_sde_encoder_irq_control(drm_enc, true);
|
|
|
|
|
|
- if (is_cmd_mode)
|
|
|
- _sde_encoder_pm_qos_add_request(drm_enc, sde_kms);
|
|
|
+ _sde_encoder_pm_qos_add_request(drm_enc);
|
|
|
|
|
|
} else {
|
|
|
- if (is_cmd_mode)
|
|
|
- _sde_encoder_pm_qos_remove_request(drm_enc, sde_kms);
|
|
|
+ _sde_encoder_pm_qos_remove_request(drm_enc);
|
|
|
|
|
|
/* disable all the irq */
|
|
|
_sde_encoder_irq_control(drm_enc, false);
|
|
@@ -1760,6 +1790,7 @@ static int _sde_encoder_rc_pre_modeset(struct drm_encoder *drm_enc,
|
|
|
SDE_ENC_RC_STATE_MODESET, SDE_EVTLOG_FUNC_CASE5);
|
|
|
|
|
|
sde_enc->rc_state = SDE_ENC_RC_STATE_MODESET;
|
|
|
+ _sde_encoder_pm_qos_remove_request(drm_enc);
|
|
|
|
|
|
end:
|
|
|
mutex_unlock(&sde_enc->rc_lock);
|
|
@@ -1798,6 +1829,7 @@ static int _sde_encoder_rc_post_modeset(struct drm_encoder *drm_enc,
|
|
|
SDE_ENC_RC_STATE_ON, SDE_EVTLOG_FUNC_CASE6);
|
|
|
|
|
|
sde_enc->rc_state = SDE_ENC_RC_STATE_ON;
|
|
|
+ _sde_encoder_pm_qos_add_request(drm_enc);
|
|
|
|
|
|
end:
|
|
|
mutex_unlock(&sde_enc->rc_lock);
|