Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8d4b4043 authored by qctecmdr's avatar qctecmdr Committed by Gerrit - the friendly Code Review server
Browse files

Merge "disp: msm: sde: modify Qos vote for irq latency during idle cases"

parents e54eff08 cbcb6cb3
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -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);

@@ -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,
@@ -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);
+35 −24
Original line number Diff line number Diff line
@@ -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;

@@ -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)
@@ -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);
}
@@ -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;
	}
+10 −0
Original line number Diff line number Diff line
@@ -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;
};

/**
@@ -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__ */