Loading msm/sde/sde_encoder.c +7 −0 Original line number Diff line number Diff line Loading @@ -2317,8 +2317,13 @@ static void _sde_encoder_rc_cancel_delayed(struct sde_encoder_virt *sde_enc, static int _sde_encoder_rc_kickoff(struct drm_encoder *drm_enc, u32 sw_event, struct sde_encoder_virt *sde_enc, bool is_vid_mode) { struct msm_drm_private *priv; struct sde_kms *sde_kms; int ret = 0; priv = drm_enc->dev->dev_private; sde_kms = to_sde_kms(priv->kms); /* cancel delayed off work, if any */ _sde_encoder_rc_cancel_delayed(sde_enc, sw_event); Loading @@ -2342,6 +2347,7 @@ static int _sde_encoder_rc_kickoff(struct drm_encoder *drm_enc, if (is_vid_mode && sde_enc->rc_state == SDE_ENC_RC_STATE_IDLE) { _sde_encoder_irq_control(drm_enc, true); sde_kms_update_pm_qos_irq_request(sde_kms, true, false); } else { /* enable all the clks and resources */ ret = _sde_encoder_resource_control_helper(drm_enc, Loading Loading @@ -2655,6 +2661,7 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, if (is_vid_mode) { _sde_encoder_irq_control(drm_enc, false); sde_kms_update_pm_qos_irq_request(sde_kms, false, false); } else { /* disable all the clks and resources */ _sde_encoder_update_rsc_client(drm_enc, false); Loading msm/sde/sde_kms.c +35 −24 Original line number Diff line number Diff line Loading @@ -3199,8 +3199,17 @@ static void _sde_kms_set_lutdma_vbif_remap(struct sde_kms *sde_kms) sde_vbif_set_qos_remap(sde_kms, &qos_params); } static void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms, bool enable, bool skip_lock) { struct msm_drm_private *priv; priv = sde_kms->dev->dev_private; if (!skip_lock) mutex_lock(&priv->phandle.phandle_lock); if (enable) { struct pm_qos_request *req; u32 cpu_irq_latency; Loading @@ -3218,15 +3227,17 @@ static void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) pm_qos_add_request(req, PM_QOS_CPU_DMA_LATENCY, cpu_irq_latency); } } static void sde_kms_set_default_pm_qos_irq_request(struct sde_kms *sde_kms) { if (pm_qos_request_active(&sde_kms->pm_qos_irq_req)) } else if (!enable && pm_qos_request_active(&sde_kms->pm_qos_irq_req)) { pm_qos_update_request(&sde_kms->pm_qos_irq_req, PM_QOS_DEFAULT_VALUE); } sde_kms->pm_qos_irq_req_en = enable; if (!skip_lock) mutex_unlock(&priv->phandle.phandle_lock); } static void sde_kms_irq_affinity_notify( struct irq_affinity_notify *affinity_notify, const cpumask_t *mask) Loading @@ -3246,8 +3257,8 @@ static void sde_kms_irq_affinity_notify( sde_kms->irq_cpu_mask = *mask; // request vote with updated irq cpu mask if (sde_kms->irq_enabled) sde_kms_update_pm_qos_irq_request(sde_kms); if (sde_kms->pm_qos_irq_req_en) sde_kms_update_pm_qos_irq_request(sde_kms, true, true); mutex_unlock(&priv->phandle.phandle_lock); } Loading @@ -3272,9 +3283,9 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr) sde_kms_init_shared_hw(sde_kms); _sde_kms_set_lutdma_vbif_remap(sde_kms); sde_kms->first_kickoff = true; sde_kms_update_pm_qos_irq_request(sde_kms); sde_kms_update_pm_qos_irq_request(sde_kms, true, true); } else if (event_type == SDE_POWER_EVENT_PRE_DISABLE) { sde_kms_set_default_pm_qos_irq_request(sde_kms); sde_kms_update_pm_qos_irq_request(sde_kms, false, true); sde_irq_update(msm_kms, false); sde_kms->first_kickoff = false; } Loading msm/sde/sde_kms.h +10 −0 Original line number Diff line number Diff line Loading @@ -299,6 +299,7 @@ struct sde_kms { cpumask_t irq_cpu_mask; struct pm_qos_request pm_qos_irq_req; struct irq_affinity_notify affinity_notify; bool pm_qos_irq_req_en; }; /** Loading Loading @@ -657,4 +658,13 @@ void sde_kms_timeline_status(struct drm_device *dev); */ int sde_kms_handle_recovery(struct drm_encoder *encoder); /** * sde_kms_update_pm_qos_irq_request - Update Qos vote for CPU receiving * display IRQ * @sde_kms : pointer to sde_kms structure * @enable : indicates request to be enabled or disabled * @skip_lock : indicates if lock needs to be acquired */ void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms, bool enable, bool skip_lock); #endif /* __sde_kms_H__ */ Loading
msm/sde/sde_encoder.c +7 −0 Original line number Diff line number Diff line Loading @@ -2317,8 +2317,13 @@ static void _sde_encoder_rc_cancel_delayed(struct sde_encoder_virt *sde_enc, static int _sde_encoder_rc_kickoff(struct drm_encoder *drm_enc, u32 sw_event, struct sde_encoder_virt *sde_enc, bool is_vid_mode) { struct msm_drm_private *priv; struct sde_kms *sde_kms; int ret = 0; priv = drm_enc->dev->dev_private; sde_kms = to_sde_kms(priv->kms); /* cancel delayed off work, if any */ _sde_encoder_rc_cancel_delayed(sde_enc, sw_event); Loading @@ -2342,6 +2347,7 @@ static int _sde_encoder_rc_kickoff(struct drm_encoder *drm_enc, if (is_vid_mode && sde_enc->rc_state == SDE_ENC_RC_STATE_IDLE) { _sde_encoder_irq_control(drm_enc, true); sde_kms_update_pm_qos_irq_request(sde_kms, true, false); } else { /* enable all the clks and resources */ ret = _sde_encoder_resource_control_helper(drm_enc, Loading Loading @@ -2655,6 +2661,7 @@ static int _sde_encoder_rc_idle(struct drm_encoder *drm_enc, if (is_vid_mode) { _sde_encoder_irq_control(drm_enc, false); sde_kms_update_pm_qos_irq_request(sde_kms, false, false); } else { /* disable all the clks and resources */ _sde_encoder_update_rsc_client(drm_enc, false); Loading
msm/sde/sde_kms.c +35 −24 Original line number Diff line number Diff line Loading @@ -3199,8 +3199,17 @@ static void _sde_kms_set_lutdma_vbif_remap(struct sde_kms *sde_kms) sde_vbif_set_qos_remap(sde_kms, &qos_params); } static void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms, bool enable, bool skip_lock) { struct msm_drm_private *priv; priv = sde_kms->dev->dev_private; if (!skip_lock) mutex_lock(&priv->phandle.phandle_lock); if (enable) { struct pm_qos_request *req; u32 cpu_irq_latency; Loading @@ -3218,15 +3227,17 @@ static void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms) pm_qos_add_request(req, PM_QOS_CPU_DMA_LATENCY, cpu_irq_latency); } } static void sde_kms_set_default_pm_qos_irq_request(struct sde_kms *sde_kms) { if (pm_qos_request_active(&sde_kms->pm_qos_irq_req)) } else if (!enable && pm_qos_request_active(&sde_kms->pm_qos_irq_req)) { pm_qos_update_request(&sde_kms->pm_qos_irq_req, PM_QOS_DEFAULT_VALUE); } sde_kms->pm_qos_irq_req_en = enable; if (!skip_lock) mutex_unlock(&priv->phandle.phandle_lock); } static void sde_kms_irq_affinity_notify( struct irq_affinity_notify *affinity_notify, const cpumask_t *mask) Loading @@ -3246,8 +3257,8 @@ static void sde_kms_irq_affinity_notify( sde_kms->irq_cpu_mask = *mask; // request vote with updated irq cpu mask if (sde_kms->irq_enabled) sde_kms_update_pm_qos_irq_request(sde_kms); if (sde_kms->pm_qos_irq_req_en) sde_kms_update_pm_qos_irq_request(sde_kms, true, true); mutex_unlock(&priv->phandle.phandle_lock); } Loading @@ -3272,9 +3283,9 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr) sde_kms_init_shared_hw(sde_kms); _sde_kms_set_lutdma_vbif_remap(sde_kms); sde_kms->first_kickoff = true; sde_kms_update_pm_qos_irq_request(sde_kms); sde_kms_update_pm_qos_irq_request(sde_kms, true, true); } else if (event_type == SDE_POWER_EVENT_PRE_DISABLE) { sde_kms_set_default_pm_qos_irq_request(sde_kms); sde_kms_update_pm_qos_irq_request(sde_kms, false, true); sde_irq_update(msm_kms, false); sde_kms->first_kickoff = false; } Loading
msm/sde/sde_kms.h +10 −0 Original line number Diff line number Diff line Loading @@ -299,6 +299,7 @@ struct sde_kms { cpumask_t irq_cpu_mask; struct pm_qos_request pm_qos_irq_req; struct irq_affinity_notify affinity_notify; bool pm_qos_irq_req_en; }; /** Loading Loading @@ -657,4 +658,13 @@ void sde_kms_timeline_status(struct drm_device *dev); */ int sde_kms_handle_recovery(struct drm_encoder *encoder); /** * sde_kms_update_pm_qos_irq_request - Update Qos vote for CPU receiving * display IRQ * @sde_kms : pointer to sde_kms structure * @enable : indicates request to be enabled or disabled * @skip_lock : indicates if lock needs to be acquired */ void sde_kms_update_pm_qos_irq_request(struct sde_kms *sde_kms, bool enable, bool skip_lock); #endif /* __sde_kms_H__ */