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

Commit 66a96fac authored by qctecmdr Service's avatar qctecmdr Service Committed by Gerrit - the friendly Code Review server
Browse files

Merge "drm/msm/sde: use pm_qos node for each display"

parents 8934697f 9cd0d37d
Loading
Loading
Loading
Loading
+20 −49
Original line number Diff line number Diff line
@@ -220,6 +220,7 @@ enum sde_enc_rc_states {
 * @recovery_events_enabled:	status of hw recovery feature enable by client
 * @elevated_ahb_vote:		increase AHB bus speed for the first frame
 *				after power collapse
 * @pm_qos_cpu_req:		pm_qos request for cpu frequency
 */
struct sde_encoder_virt {
	struct drm_encoder base;
@@ -275,77 +276,47 @@ struct sde_encoder_virt {

	bool recovery_events_enabled;
	bool elevated_ahb_vote;
	struct pm_qos_request pm_qos_cpu_req;
};

#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)
static void _sde_encoder_pm_qos_add_request(struct drm_encoder *drm_enc,
	struct sde_kms *sde_kms)
{
	struct msm_drm_private *priv;
	struct sde_kms *sde_kms;
	struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);
	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)
	if (!sde_kms->catalog || !sde_kms->catalog->perf.cpu_mask)
		return;

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

	if (atomic_inc_return(&sde_kms->pm_qos_counts) == 1) {
		req = &sde_kms->pm_qos_cpu_req;
	req = &sde_enc->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);
	}
	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)
static void _sde_encoder_pm_qos_remove_request(struct drm_encoder *drm_enc,
	struct sde_kms *sde_kms)
{
	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;
	}
	struct sde_encoder_virt *sde_enc = to_sde_encoder_virt(drm_enc);

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

	atomic_add_unless(&sde_kms->pm_qos_counts, -1, 0);
	if (atomic_read(&sde_kms->pm_qos_counts) == 0)
		pm_qos_remove_request(&sde_kms->pm_qos_cpu_req);
	pm_qos_remove_request(&sde_enc->pm_qos_cpu_req);
}

static struct drm_connector_state *_sde_encoder_get_conn_state(
@@ -2165,11 +2136,11 @@ static int _sde_encoder_resource_control_helper(struct drm_encoder *drm_enc,
		_sde_encoder_irq_control(drm_enc, true);

		if (is_cmd_mode)
			_sde_encoder_pm_qos_add_request(drm_enc);
			_sde_encoder_pm_qos_add_request(drm_enc, sde_kms);

	} else {
		if (is_cmd_mode)
			_sde_encoder_pm_qos_remove_request(drm_enc);
			_sde_encoder_pm_qos_remove_request(drm_enc, sde_kms);

		/* disable all the irq */
		_sde_encoder_irq_control(drm_enc, false);
+0 −1
Original line number Diff line number Diff line
@@ -3415,7 +3415,6 @@ static int sde_kms_hw_init(struct msm_kms *kms)
	mutex_init(&sde_kms->secure_transition_lock);
	atomic_set(&sde_kms->detach_sec_cb, 0);
	atomic_set(&sde_kms->detach_all_cb, 0);
	atomic_set(&sde_kms->pm_qos_counts, 0);

	/*
	 * Support format modifiers for compression etc.
+0 −2
Original line number Diff line number Diff line
@@ -224,8 +224,6 @@ struct sde_kms {

	struct msm_gem_address_space *aspace[MSM_SMMU_DOMAIN_MAX];
	struct sde_power_client *core_client;
	struct pm_qos_request pm_qos_cpu_req;
	atomic_t pm_qos_counts;

	struct sde_power_event *power_event;