msm: kgsl: add api to limit gpu fmax
Existing api returns failure when requested frequency is larger than fmax supported. This creates problem to clients as they consider this as error case. This can be improved if api returns success when requested frequency is larger than fmax supported because requested limit frequency is larger than fmax device will never go beyond that at all and clients can execute normally. Change-Id: Id1077ca03019a61d7fd6fef8eccd605131b9c150 Signed-off-by: Pranav Patel <pranavp@codeaurora.org>
This commit is contained in:
parent
123887723b
commit
07e044960d
2 changed files with 37 additions and 1 deletions
|
@ -3283,6 +3283,41 @@ int kgsl_pwr_limits_set_freq(void *limit_ptr, unsigned int freq)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(kgsl_pwr_limits_set_freq);
|
EXPORT_SYMBOL(kgsl_pwr_limits_set_freq);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* kgsl_pwr_limits_set_gpu_fmax() - Set the requested limit for the
|
||||||
|
* client, if requested freq value is larger than fmax supported
|
||||||
|
* function returns with success.
|
||||||
|
* @limit_ptr: Client handle
|
||||||
|
* @freq: Client requested frequency
|
||||||
|
*
|
||||||
|
* Set the new limit for the client and adjust the clocks
|
||||||
|
*/
|
||||||
|
int kgsl_pwr_limits_set_gpu_fmax(void *limit_ptr, unsigned int freq)
|
||||||
|
{
|
||||||
|
struct kgsl_pwrctrl *pwr;
|
||||||
|
struct kgsl_pwr_limit *limit = limit_ptr;
|
||||||
|
int level;
|
||||||
|
|
||||||
|
if (IS_ERR_OR_NULL(limit))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
pwr = &limit->device->pwrctrl;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* When requested frequency is greater than fmax,
|
||||||
|
* requested limit is implicit, return success here.
|
||||||
|
*/
|
||||||
|
if (freq >= pwr->pwrlevels[0].gpu_freq)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
level = _get_nearest_pwrlevel(pwr, freq);
|
||||||
|
if (level < 0)
|
||||||
|
return -EINVAL;
|
||||||
|
_update_limits(limit, KGSL_PWR_SET_LIMIT, level);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(kgsl_pwr_limits_set_gpu_fmax);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kgsl_pwr_limits_set_default() - Set the default thermal limit for the client
|
* kgsl_pwr_limits_set_default() - Set the default thermal limit for the client
|
||||||
* @limit_ptr: Client handle
|
* @limit_ptr: Client handle
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
/* SPDX-License-Identifier: GPL-2.0 */
|
/* SPDX-License-Identifier: GPL-2.0 */
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
* Copyright (c) 2018, 2020 The Linux Foundation. All rights reserved.
|
||||||
*/
|
*/
|
||||||
#ifndef _MSM_KGSL_H
|
#ifndef _MSM_KGSL_H
|
||||||
#define _MSM_KGSL_H
|
#define _MSM_KGSL_H
|
||||||
|
@ -11,6 +11,7 @@
|
||||||
void *kgsl_pwr_limits_add(u32 id);
|
void *kgsl_pwr_limits_add(u32 id);
|
||||||
void kgsl_pwr_limits_del(void *limit);
|
void kgsl_pwr_limits_del(void *limit);
|
||||||
int kgsl_pwr_limits_set_freq(void *limit, unsigned int freq);
|
int kgsl_pwr_limits_set_freq(void *limit, unsigned int freq);
|
||||||
|
int kgsl_pwr_limits_set_gpu_fmax(void *limit, unsigned int freq);
|
||||||
void kgsl_pwr_limits_set_default(void *limit);
|
void kgsl_pwr_limits_set_default(void *limit);
|
||||||
unsigned int kgsl_pwr_limits_get_freq(u32 id);
|
unsigned int kgsl_pwr_limits_get_freq(u32 id);
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue