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

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

Merge "disp: msm: sde: add pm QoS vote on CPU receiving display IRQ"

parents 40bdfd86 5889c359
Loading
Loading
Loading
Loading
+67 −2
Original line number Diff line number Diff line
/*
 * Copyright (c) 2014-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2014-2020, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -87,6 +87,8 @@ static const char * const iommu_ports[] = {
#define SDE_KMS_MODESET_LOCK_TIMEOUT_US 500
#define SDE_KMS_MODESET_LOCK_MAX_TRIALS 20

#define SDE_KMS_PM_QOS_CPU_DMA_LATENCY 300

/**
 * sdecustom - enable certain driver customizations for sde clients
 *	Enabling this modifies the standard DRM behavior slightly and assumes
@@ -3132,6 +3134,59 @@ 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)
{
	struct pm_qos_request *req;

	req = &sde_kms->pm_qos_irq_req;
	req->type = PM_QOS_REQ_AFFINE_CORES;
	req->cpus_affine = sde_kms->irq_cpu_mask;

	if (pm_qos_request_active(req))
		pm_qos_update_request(req, SDE_KMS_PM_QOS_CPU_DMA_LATENCY);
	else if (!cpumask_empty(&req->cpus_affine)) {
		/** If request is not active yet and mask is not empty
		 *  then it needs to be added initially
		 */
		pm_qos_add_request(req, PM_QOS_CPU_DMA_LATENCY,
					SDE_KMS_PM_QOS_CPU_DMA_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))
		pm_qos_update_request(&sde_kms->pm_qos_irq_req,
					PM_QOS_DEFAULT_VALUE);
}

static void sde_kms_irq_affinity_notify(
		struct irq_affinity_notify *affinity_notify,
		const cpumask_t *mask)
{
	struct msm_drm_private *priv;
	struct sde_kms *sde_kms = container_of(affinity_notify,
					struct sde_kms, affinity_notify);

	if (!sde_kms || !sde_kms->dev || !sde_kms->dev->dev_private)
		return;

	priv = sde_kms->dev->dev_private;

	mutex_lock(&priv->phandle.phandle_lock);

	// save irq cpu mask
	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);

	mutex_unlock(&priv->phandle.phandle_lock);
}

static void sde_kms_irq_affinity_release(struct kref *ref) {}

static void sde_kms_handle_power_event(u32 event_type, void *usr)
{
	struct sde_kms *sde_kms = usr;
@@ -3150,7 +3205,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);
	} else if (event_type == SDE_POWER_EVENT_PRE_DISABLE) {
		sde_kms_set_default_pm_qos_irq_request(sde_kms);
		sde_irq_update(msm_kms, false);
		sde_kms->first_kickoff = false;
	}
@@ -3585,7 +3642,7 @@ static int sde_kms_hw_init(struct msm_kms *kms)
	struct drm_device *dev;
	struct msm_drm_private *priv;
	struct platform_device *platformdev;
	int i, rc = -EINVAL;
	int i, irq_num, rc = -EINVAL;

	if (!kms) {
		SDE_ERROR("invalid kms\n");
@@ -3657,6 +3714,14 @@ static int sde_kms_hw_init(struct msm_kms *kms)

		pm_runtime_put_sync(sde_kms->dev->dev);
	}

	sde_kms->affinity_notify.notify = sde_kms_irq_affinity_notify;
	sde_kms->affinity_notify.release = sde_kms_irq_affinity_release;

	irq_num = platform_get_irq(to_platform_device(sde_kms->dev->dev), 0);
	SDE_DEBUG("Registering for notification of irq_num: %d\n", irq_num);
	irq_set_affinity_notifier(irq_num, &sde_kms->affinity_notify);

	return 0;

hw_init_err:
+5 −1
Original line number Diff line number Diff line
/*
 * Copyright (c) 2015-2019, The Linux Foundation. All rights reserved.
 * Copyright (c) 2015-2020, The Linux Foundation. All rights reserved.
 * Copyright (C) 2013 Red Hat
 * Author: Rob Clark <robdclark@gmail.com>
 *
@@ -292,6 +292,10 @@ struct sde_kms {

	bool first_kickoff;
	bool qdss_enabled;

	cpumask_t irq_cpu_mask;
	struct pm_qos_request pm_qos_irq_req;
	struct irq_affinity_notify affinity_notify;
};

struct vsync_info {