diff --git a/drivers/gpu/msm/governor_msm_adreno_tz.c b/drivers/gpu/msm/governor_msm_adreno_tz.c index 360ff0cc91d5..70dac21ebf6c 100644 --- a/drivers/gpu/msm/governor_msm_adreno_tz.c +++ b/drivers/gpu/msm/governor_msm_adreno_tz.c @@ -130,13 +130,42 @@ static ssize_t suspend_time_show(struct device *dev, return snprintf(buf, PAGE_SIZE, "%llu\n", time_diff); } +static ssize_t mod_percent_store(struct device *dev, + struct device_attribute *attr, + const char *buf, size_t count) +{ + int ret; + unsigned int val; + struct devfreq *devfreq = to_devfreq(dev); + struct devfreq_msm_adreno_tz_data *priv = devfreq->data; + + ret = kstrtou32(buf, 0, &val); + if (ret) + return ret; + + priv->mod_percent = clamp_t(u32, val, 10, 1000); + + return count; +} + +static ssize_t mod_percent_show(struct device *dev, + struct device_attribute *attr, char *buf) +{ + struct devfreq *devfreq = to_devfreq(dev); + struct devfreq_msm_adreno_tz_data *priv = devfreq->data; + + return scnprintf(buf, PAGE_SIZE, "%u\n", priv->mod_percent); +} + static DEVICE_ATTR_RO(gpu_load); static DEVICE_ATTR_RO(suspend_time); +static DEVICE_ATTR_RW(mod_percent); static const struct device_attribute *adreno_tz_attr_list[] = { &dev_attr_gpu_load, &dev_attr_suspend_time, + &dev_attr_mod_percent, NULL }; @@ -327,6 +356,7 @@ static int tz_get_target_freq(struct devfreq *devfreq, unsigned long *freq) struct devfreq_dev_status *stats = &devfreq->last_status; int val, level = 0; int context_count = 0; + u64 busy_time; /* keeps stats.private_data == NULL */ result = devfreq_update_stats(devfreq); @@ -337,6 +367,14 @@ static int tz_get_target_freq(struct devfreq *devfreq, unsigned long *freq) *freq = stats->current_frequency; priv->bin.total_time += stats->total_time; + + /* Update gpu busy time as per mod_percent */ + busy_time = stats->busy_time * priv->mod_percent; + do_div(busy_time, 100); + + /* busy_time should not go over total_time */ + stats->busy_time = min_t(u64, busy_time, stats->total_time); + priv->bin.busy_time += stats->busy_time; if (stats->private_data) diff --git a/drivers/gpu/msm/kgsl_pwrscale.c b/drivers/gpu/msm/kgsl_pwrscale.c index 0549ead0658c..c0ae1b035758 100644 --- a/drivers/gpu/msm/kgsl_pwrscale.c +++ b/drivers/gpu/msm/kgsl_pwrscale.c @@ -16,6 +16,7 @@ static struct devfreq_msm_adreno_tz_data adreno_tz_data = { .max = 350, .floating = true, }, + .mod_percent = 100, }; /** diff --git a/drivers/gpu/msm/msm_adreno_devfreq.h b/drivers/gpu/msm/msm_adreno_devfreq.h index 0c06f3523b84..465a960e16fd 100644 --- a/drivers/gpu/msm/msm_adreno_devfreq.h +++ b/drivers/gpu/msm/msm_adreno_devfreq.h @@ -1,6 +1,6 @@ /* SPDX-License-Identifier: GPL-2.0-only */ /* - * Copyright (c) 2016-2019, The Linux Foundation. All rights reserved. + * Copyright (c) 2016-2020, The Linux Foundation. All rights reserved. */ #ifndef MSM_ADRENO_DEVFREQ_H @@ -61,6 +61,8 @@ struct devfreq_msm_adreno_tz_data { bool is_64; bool disable_busy_time_burst; bool ctxt_aware_enable; + /* Multiplier to change gpu busy status */ + u32 mod_percent; }; struct msm_adreno_extended_profile {