diff options
Diffstat (limited to 'drivers/gpu/msm/kgsl_pwrctrl.c')
-rw-r--r-- | drivers/gpu/msm/kgsl_pwrctrl.c | 47 |
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); |