[PATCH] cpufreq: Add support to read boost frequencies

Alex Hung alex.hung at canonical.com
Wed Apr 4 16:54:35 UTC 2018


On 2018-04-04 01:55 AM, Shilpasri G Bhat wrote:
> POWER8+ and POWER9 have boost frequencies given by the cpufreq sysfs
> file 'scaling_boost_frequencies'. These frequencies are greater than
> the 'scaling_available_frequencies'. So re-compute the max frequency
> when boost frequencies are available and add the boost frequencies to
> the list of supported frequencies.
> 
> Signed-off-by: Shilpasri G Bhat <shilpa.bhat at linux.vnet.ibm.com>
> ---
>   src/cpu/cpufreq/cpufreq.c | 24 +++++++++++++++++++++---
>   src/cpu/maxfreq/maxfreq.c | 14 +++++++++++++-
>   2 files changed, 34 insertions(+), 4 deletions(-)
> 
> diff --git a/src/cpu/cpufreq/cpufreq.c b/src/cpu/cpufreq/cpufreq.c
> index 8bee1dd..6cd7014 100644
> --- a/src/cpu/cpufreq/cpufreq.c
> +++ b/src/cpu/cpufreq/cpufreq.c
> @@ -749,7 +749,7 @@ static int parse_cpu_info(fwts_framework *fw,
>   {
>   	char *end, path[PATH_MAX+1], *str, *tmp;
>   	struct stat statbuf;
> -	int rc;
> +	int rc, i = 0;
>   
>   	strcpy(cpu->sysfs_path, dir->d_name);
>   	cpu->idx = strtoul(cpu->sysfs_path + strlen("cpu"), &end, 10);
> @@ -783,8 +783,6 @@ static int parse_cpu_info(fwts_framework *fw,
>   
>   	/* cpu driver like intel_pstate has no scaling_available_frequencies */
>   	if (str != NULL) {
> -		int i = 0;
> -
>   		for (tmp = str; ; tmp = NULL) {
>   			char *tok = strtok(tmp, " ");
>   			if (!tok)
> @@ -800,6 +798,26 @@ static int parse_cpu_info(fwts_framework *fw,
>   
>   	free(str);
>   
> +	/* parse boost frequencies */
> +	cpu_mkpath(path, sizeof(path), cpu, "scaling_boost_frequencies");
> +	str = fwts_get(path);
> +
> +	if (str) {
> +		for (tmp = str; ; tmp = NULL) {
> +			char *tok = strtok(tmp, " ");
> +
> +			if (!tok)
> +				break;
> +			if (!isdigit(tok[0]))
> +				continue;
> +			cpu->freqs[i++].Hz = strtoull(tok, NULL, 10);
> +		}
> +		cpu->n_freqs = i;
> +		qsort(cpu->freqs, cpu->n_freqs, sizeof(cpu->freqs[0]),
> +		      cpu_freq_compare);
> +	}
> +
> +	free(str);
>   	return FWTS_OK;
>   }
>   
> diff --git a/src/cpu/maxfreq/maxfreq.c b/src/cpu/maxfreq/maxfreq.c
> index 4aab257..ff913a2 100644
> --- a/src/cpu/maxfreq/maxfreq.c
> +++ b/src/cpu/maxfreq/maxfreq.c
> @@ -131,7 +131,7 @@ static int maxfreq_test1(fwts_framework *fw)
>   	do {
>   		char path[PATH_MAX];
>   		char *data;
> -		double maxfreq, maxfreq_ghz, cpufreq_ghz;
> +		double maxfreq, maxfreq_ghz, cpufreq_ghz, boost_maxfreq;
>   		int cpunum;
>   
>   		entry = readdir(dir);
> @@ -148,6 +148,18 @@ static int maxfreq_test1(fwts_framework *fw)
>   		maxfreq = maxfreq_max(data);
>   		free(data);
>   
> +		snprintf(path, sizeof(path),
> +			CPU_FREQ_PATH "/%s/cpufreq/scaling_boost_frequencies",
> +			entry->d_name);
> +		data = fwts_get(path);
> +		if (data) {
> +			boost_maxfreq = maxfreq_max(data);
> +			free(data);
> +		}
> +
> +		if (maxfreq > boost_maxfreq)
> +			max_freq = boost_max_freq;

Compile errors because max_freq & boot_max_freq are declared. Should be 
maxfreq & boost_maxfreq instead?

After boost_maxfreq is used, compiler also warns "error: ‘boost_maxfreq’ 
may be used uninitialized in this function".


> +
>   		cpunum = atoi(entry->d_name + 3);
>   		if (maxfreq < 0.0) {
>   			fwts_failed(fw, LOG_LEVEL_MEDIUM,
> 


-- 
Cheers,
Alex Hung



More information about the fwts-devel mailing list