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

Commit 93a3d101 authored by Lloyd Atkinson's avatar Lloyd Atkinson Committed by Steve Cohen
Browse files

drm/msm/sde: move pm_qos vote to command mode only



Vote for pm_qos latency only when operating with a command mode
display panel.

Change-Id: I13b82aba1a06205998f76202c345b3f64d6576d7
Signed-off-by: default avatarLloyd Atkinson <latkinso@codeaurora.org>
parent 77d4ecae
Loading
Loading
Loading
Loading
+75 −0
Original line number Diff line number Diff line
@@ -246,6 +246,70 @@ struct sde_encoder_virt {

#define to_sde_encoder_virt(x) container_of(x, struct sde_encoder_virt, base)

static void _sde_encoder_pm_qos_add_request(struct drm_encoder *drm_enc)
{
	struct msm_drm_private *priv;
	struct sde_kms *sde_kms;
	struct pm_qos_request *req;
	u32 cpu_mask;
	u32 cpu_dma_latency;
	int cpu;

	if (!drm_enc->dev || !drm_enc->dev->dev_private) {
		SDE_ERROR("drm device invalid\n");
		return;
	}

	priv = drm_enc->dev->dev_private;
	if (!priv->kms) {
		SDE_ERROR("invalid kms\n");
		return;
	}

	sde_kms = to_sde_kms(priv->kms);
	if (!sde_kms || !sde_kms->catalog)
		return;

	cpu_mask = sde_kms->catalog->perf.cpu_mask;
	cpu_dma_latency = sde_kms->catalog->perf.cpu_dma_latency;
	if (!cpu_mask)
		return;

	req = &sde_kms->pm_qos_cpu_req;
	req->type = PM_QOS_REQ_AFFINE_CORES;
	cpumask_empty(&req->cpus_affine);
	for_each_possible_cpu(cpu) {
		if ((1 << cpu) & cpu_mask)
			cpumask_set_cpu(cpu, &req->cpus_affine);
	}
	pm_qos_add_request(req, PM_QOS_CPU_DMA_LATENCY, cpu_dma_latency);

	SDE_EVT32_VERBOSE(DRMID(drm_enc), cpu_mask, cpu_dma_latency);
}

static void _sde_encoder_pm_qos_remove_request(struct drm_encoder *drm_enc)
{
	struct msm_drm_private *priv;
	struct sde_kms *sde_kms;

	if (!drm_enc->dev || !drm_enc->dev->dev_private) {
		SDE_ERROR("drm device invalid\n");
		return;
	}

	priv = drm_enc->dev->dev_private;
	if (!priv->kms) {
		SDE_ERROR("invalid kms\n");
		return;
	}

	sde_kms = to_sde_kms(priv->kms);
	if (!sde_kms || !sde_kms->catalog || !sde_kms->catalog->perf.cpu_mask)
		return;

	pm_qos_remove_request(&sde_kms->pm_qos_cpu_req);
}

static struct drm_connector_state *_sde_encoder_get_conn_state(
		struct drm_encoder *drm_enc)
{
@@ -1677,11 +1741,16 @@ 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, is_primary;

	sde_enc = to_sde_encoder_virt(drm_enc);
	priv = drm_enc->dev->dev_private;
	sde_kms = to_sde_kms(priv->kms);

	is_cmd_mode = sde_enc->disp_info.capabilities &
			MSM_DISPLAY_CAP_CMD_MODE;
	is_primary = sde_enc->disp_info.is_primary;

	SDE_DEBUG_ENC(sde_enc, "enable:%d\n", enable);
	SDE_EVT32(DRMID(drm_enc), enable);

@@ -1713,7 +1782,13 @@ 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 && is_primary)
			_sde_encoder_pm_qos_add_request(drm_enc);

	} else {
		if (is_cmd_mode && is_primary)
			_sde_encoder_pm_qos_remove_request(drm_enc);

		/* disable all the irq */
		_sde_encoder_irq_control(drm_enc, false);

+0 −37
Original line number Diff line number Diff line
@@ -2246,41 +2246,6 @@ static int _sde_kms_mmu_init(struct sde_kms *sde_kms)
	return ret;
}

static void _sde_kms_pm_qos_add_request(struct sde_kms *sde_kms)
{
	struct pm_qos_request *req;
	u32 cpu_mask;
	u32 cpu_dma_latency;
	int cpu;

	if (!sde_kms || !sde_kms->catalog)
		return;

	cpu_mask = sde_kms->catalog->perf.cpu_mask;
	cpu_dma_latency = sde_kms->catalog->perf.cpu_dma_latency;
	if (!cpu_mask)
		return;

	req = &sde_kms->pm_qos_cpu_req;
	req->type = PM_QOS_REQ_AFFINE_CORES;
	cpumask_empty(&req->cpus_affine);
	for_each_possible_cpu(cpu) {
		if ((1 << cpu) & cpu_mask)
			cpumask_set_cpu(cpu, &req->cpus_affine);
	}
	pm_qos_add_request(req, PM_QOS_CPU_DMA_LATENCY, cpu_dma_latency);

	SDE_EVT32_VERBOSE(cpu_mask, cpu_dma_latency);
}

static void _sde_kms_pm_qos_remove_request(struct sde_kms *sde_kms)
{
	if (!sde_kms || !sde_kms->catalog || !sde_kms->catalog->perf.cpu_mask)
		return;

	pm_qos_remove_request(&sde_kms->pm_qos_cpu_req);
}

/* the caller api needs to turn on clock before calling this function */
static int _sde_kms_cont_splash_res_init(struct sde_kms *sde_kms)
{
@@ -2358,9 +2323,7 @@ static void sde_kms_handle_power_event(u32 event_type, void *usr)
	if (event_type == SDE_POWER_EVENT_POST_ENABLE) {
		sde_irq_update(msm_kms, true);
		sde_vbif_init_memtypes(sde_kms);
		_sde_kms_pm_qos_add_request(sde_kms);
	} else if (event_type == SDE_POWER_EVENT_PRE_DISABLE) {
		_sde_kms_pm_qos_remove_request(sde_kms);
		sde_irq_update(msm_kms, false);
	}
}