summaryrefslogtreecommitdiff
path: root/drivers/gpu/msm/kgsl_pwrctrl.c
diff options
context:
space:
mode:
authorPrakash Kamliya <pkamliya@codeaurora.org>2016-01-22 10:59:20 +0530
committerDavid Keitel <dkeitel@codeaurora.org>2016-03-23 21:19:35 -0700
commitf087bb3d9ae69ccd2396929e397e9b7989eaeb6e (patch)
treedd45087629c85fc9b2b880fc70ea978bbec967fe /drivers/gpu/msm/kgsl_pwrctrl.c
parent9b63383c0ab6d0eb1b90921d3ac4060b644c4a73 (diff)
msm: kgsl: Avoid L2PC on masked CPUs
If any of the Graphics rendering threads are running on masked CPUs, avoid L2PC for some duration on that CPU. This reduces latency on CPU (latency mainly because of L2 cache flush) and helps on performance. This change uses pm_qos_update_request_timeout() API. Add l2pc-cpu-mask property in device tree to enable this. CRs-Fixed: 962598 Change-Id: If90090cd2c68ea7c07e269723931fef7201ef136 Signed-off-by: Prakash Kamliya <pkamliya@codeaurora.org>
Diffstat (limited to 'drivers/gpu/msm/kgsl_pwrctrl.c')
-rw-r--r--drivers/gpu/msm/kgsl_pwrctrl.c47
1 files changed, 46 insertions, 1 deletions
diff --git a/drivers/gpu/msm/kgsl_pwrctrl.c b/drivers/gpu/msm/kgsl_pwrctrl.c
index 671639be249a..b884acf067a6 100644
--- a/drivers/gpu/msm/kgsl_pwrctrl.c
+++ b/drivers/gpu/msm/kgsl_pwrctrl.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2015, The Linux Foundation. All rights reserved.
+/* Copyright (c) 2010-2016, The Linux Foundation. All rights reserved.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 and
@@ -53,6 +53,13 @@
#define DEFAULT_BUS_P 25
#define DEFAULT_BUS_DIV (100 / DEFAULT_BUS_P)
+/*
+ * The effective duration of qos request in usecs. After
+ * timeout, qos request is cancelled automatically.
+ * Kept 80ms default, inline with default GPU idle time.
+ */
+#define KGSL_L2PC_CPU_TIMEOUT (80 * 1000)
+
/* Order deeply matters here because reasons. New entries go on the end */
static const char * const clocks[] = {
"src_clk",
@@ -446,6 +453,33 @@ void kgsl_pwrctrl_set_constraint(struct kgsl_device *device,
}
EXPORT_SYMBOL(kgsl_pwrctrl_set_constraint);
+/**
+ * kgsl_pwrctrl_update_l2pc() - Update existing qos request
+ * @device: Pointer to the kgsl_device struct
+ *
+ * Updates an existing qos request to avoid L2PC on the
+ * CPUs (which are selected through dtsi) on which GPU
+ * thread is running. This would help for performance.
+ */
+void kgsl_pwrctrl_update_l2pc(struct kgsl_device *device)
+{
+ int cpu;
+
+ if (device->pwrctrl.l2pc_cpus_mask == 0)
+ return;
+
+ cpu = get_cpu();
+ put_cpu();
+
+ if ((1 << cpu) & device->pwrctrl.l2pc_cpus_mask) {
+ pm_qos_update_request_timeout(
+ &device->pwrctrl.l2pc_cpus_qos,
+ device->pwrctrl.pm_qos_active_latency,
+ KGSL_L2PC_CPU_TIMEOUT);
+ }
+}
+EXPORT_SYMBOL(kgsl_pwrctrl_update_l2pc);
+
static ssize_t kgsl_pwrctrl_thermal_pwrlevel_store(struct device *dev,
struct device_attribute *attr,
const char *buf, size_t count)
@@ -1716,6 +1750,9 @@ int kgsl_pwrctrl_init(struct kgsl_device *device)
&pwr->pm_qos_wakeup_latency))
pwr->pm_qos_wakeup_latency = 101;
+ kgsl_property_read_u32(device, "qcom,l2pc-cpu-mask",
+ &pwr->l2pc_cpus_mask);
+
pm_runtime_enable(&pdev->dev);
ocmem_bus_node = of_find_node_by_name(
@@ -2205,6 +2242,10 @@ _sleep(struct kgsl_device *device)
kgsl_pwrctrl_set_state(device, KGSL_STATE_SLEEP);
pm_qos_update_request(&device->pwrctrl.pm_qos_req_dma,
PM_QOS_DEFAULT_VALUE);
+ if (device->pwrctrl.l2pc_cpus_mask)
+ pm_qos_update_request(
+ &device->pwrctrl.l2pc_cpus_qos,
+ PM_QOS_DEFAULT_VALUE);
break;
case KGSL_STATE_SLUMBER:
break;
@@ -2252,6 +2293,10 @@ _slumber(struct kgsl_device *device)
kgsl_pwrctrl_set_state(device, KGSL_STATE_SLUMBER);
pm_qos_update_request(&device->pwrctrl.pm_qos_req_dma,
PM_QOS_DEFAULT_VALUE);
+ if (device->pwrctrl.l2pc_cpus_mask)
+ pm_qos_update_request(
+ &device->pwrctrl.l2pc_cpus_qos,
+ PM_QOS_DEFAULT_VALUE);
break;
case KGSL_STATE_SUSPEND:
complete_all(&device->hwaccess_gate);