xref: /openbmc/linux/tools/power/x86/intel-speed-select/isst-display.c (revision c900529f3d9161bfde5cca0754f83b4d3c3e0220)
13fb4f7cdSSrinivas Pandruvada // SPDX-License-Identifier: GPL-2.0
23fb4f7cdSSrinivas Pandruvada /*
33fb4f7cdSSrinivas Pandruvada  * Intel dynamic_speed_select -- Enumerate and control features
43fb4f7cdSSrinivas Pandruvada  * Copyright (c) 2019 Intel Corporation.
53fb4f7cdSSrinivas Pandruvada  */
63fb4f7cdSSrinivas Pandruvada 
73fb4f7cdSSrinivas Pandruvada #include "isst.h"
83fb4f7cdSSrinivas Pandruvada 
printcpulist(int str_len,char * str,int mask_size,cpu_set_t * cpu_mask)949aed155SPrarit Bhargava static void printcpulist(int str_len, char *str, int mask_size,
1049aed155SPrarit Bhargava 			 cpu_set_t *cpu_mask)
1149aed155SPrarit Bhargava {
1249aed155SPrarit Bhargava 	int i, first, curr_index, index;
1349aed155SPrarit Bhargava 
1449aed155SPrarit Bhargava 	if (!CPU_COUNT_S(mask_size, cpu_mask)) {
1549aed155SPrarit Bhargava 		snprintf(str, str_len, "none");
1649aed155SPrarit Bhargava 		return;
1749aed155SPrarit Bhargava 	}
1849aed155SPrarit Bhargava 
1949aed155SPrarit Bhargava 	curr_index = 0;
2049aed155SPrarit Bhargava 	first = 1;
2149aed155SPrarit Bhargava 	for (i = 0; i < get_topo_max_cpus(); ++i) {
2249aed155SPrarit Bhargava 		if (!CPU_ISSET_S(i, mask_size, cpu_mask))
2349aed155SPrarit Bhargava 			continue;
2449aed155SPrarit Bhargava 		if (!first) {
2549aed155SPrarit Bhargava 			index = snprintf(&str[curr_index],
2649aed155SPrarit Bhargava 					 str_len - curr_index, ",");
2749aed155SPrarit Bhargava 			curr_index += index;
282e70b710SSrinivas Pandruvada 			if (curr_index >= str_len)
292e70b710SSrinivas Pandruvada 				break;
3049aed155SPrarit Bhargava 		}
3149aed155SPrarit Bhargava 		index = snprintf(&str[curr_index], str_len - curr_index, "%d",
3249aed155SPrarit Bhargava 				 i);
3349aed155SPrarit Bhargava 		curr_index += index;
342e70b710SSrinivas Pandruvada 		if (curr_index >= str_len)
352e70b710SSrinivas Pandruvada 			break;
3649aed155SPrarit Bhargava 		first = 0;
3749aed155SPrarit Bhargava 	}
3849aed155SPrarit Bhargava }
3949aed155SPrarit Bhargava 
printcpumask(int str_len,char * str,int mask_size,cpu_set_t * cpu_mask)403fb4f7cdSSrinivas Pandruvada static void printcpumask(int str_len, char *str, int mask_size,
413fb4f7cdSSrinivas Pandruvada 			 cpu_set_t *cpu_mask)
423fb4f7cdSSrinivas Pandruvada {
433fb4f7cdSSrinivas Pandruvada 	int i, max_cpus = get_topo_max_cpus();
443fb4f7cdSSrinivas Pandruvada 	unsigned int *mask;
453fb4f7cdSSrinivas Pandruvada 	int size, index, curr_index;
463fb4f7cdSSrinivas Pandruvada 
473fb4f7cdSSrinivas Pandruvada 	size = max_cpus / (sizeof(unsigned int) * 8);
483fb4f7cdSSrinivas Pandruvada 	if (max_cpus % (sizeof(unsigned int) * 8))
493fb4f7cdSSrinivas Pandruvada 		size++;
503fb4f7cdSSrinivas Pandruvada 
513fb4f7cdSSrinivas Pandruvada 	mask = calloc(size, sizeof(unsigned int));
523fb4f7cdSSrinivas Pandruvada 	if (!mask)
533fb4f7cdSSrinivas Pandruvada 		return;
543fb4f7cdSSrinivas Pandruvada 
553fb4f7cdSSrinivas Pandruvada 	for (i = 0; i < max_cpus; ++i) {
563fb4f7cdSSrinivas Pandruvada 		int mask_index, bit_index;
573fb4f7cdSSrinivas Pandruvada 
583fb4f7cdSSrinivas Pandruvada 		if (!CPU_ISSET_S(i, mask_size, cpu_mask))
593fb4f7cdSSrinivas Pandruvada 			continue;
603fb4f7cdSSrinivas Pandruvada 
613fb4f7cdSSrinivas Pandruvada 		mask_index = i / (sizeof(unsigned int) * 8);
623fb4f7cdSSrinivas Pandruvada 		bit_index = i % (sizeof(unsigned int) * 8);
633fb4f7cdSSrinivas Pandruvada 		mask[mask_index] |= BIT(bit_index);
643fb4f7cdSSrinivas Pandruvada 	}
653fb4f7cdSSrinivas Pandruvada 
663fb4f7cdSSrinivas Pandruvada 	curr_index = 0;
673fb4f7cdSSrinivas Pandruvada 	for (i = size - 1; i >= 0; --i) {
683fb4f7cdSSrinivas Pandruvada 		index = snprintf(&str[curr_index], str_len - curr_index, "%08x",
693fb4f7cdSSrinivas Pandruvada 				 mask[i]);
703fb4f7cdSSrinivas Pandruvada 		curr_index += index;
712e70b710SSrinivas Pandruvada 		if (curr_index >= str_len)
722e70b710SSrinivas Pandruvada 			break;
733fb4f7cdSSrinivas Pandruvada 		if (i) {
743fb4f7cdSSrinivas Pandruvada 			strncat(&str[curr_index], ",", str_len - curr_index);
753fb4f7cdSSrinivas Pandruvada 			curr_index++;
763fb4f7cdSSrinivas Pandruvada 		}
772e70b710SSrinivas Pandruvada 		if (curr_index >= str_len)
782e70b710SSrinivas Pandruvada 			break;
793fb4f7cdSSrinivas Pandruvada 	}
803fb4f7cdSSrinivas Pandruvada 
813fb4f7cdSSrinivas Pandruvada 	free(mask);
823fb4f7cdSSrinivas Pandruvada }
833fb4f7cdSSrinivas Pandruvada 
format_and_print_txt(FILE * outf,int level,char * header,char * value)843fb4f7cdSSrinivas Pandruvada static void format_and_print_txt(FILE *outf, int level, char *header,
853fb4f7cdSSrinivas Pandruvada 				 char *value)
863fb4f7cdSSrinivas Pandruvada {
873fb4f7cdSSrinivas Pandruvada 	char *spaces = "  ";
883fb4f7cdSSrinivas Pandruvada 	static char delimiters[256];
893fb4f7cdSSrinivas Pandruvada 	int i, j = 0;
903fb4f7cdSSrinivas Pandruvada 
913fb4f7cdSSrinivas Pandruvada 	if (!level)
923fb4f7cdSSrinivas Pandruvada 		return;
933fb4f7cdSSrinivas Pandruvada 
943fb4f7cdSSrinivas Pandruvada 	if (level == 1) {
953fb4f7cdSSrinivas Pandruvada 		strcpy(delimiters, " ");
963fb4f7cdSSrinivas Pandruvada 	} else {
973fb4f7cdSSrinivas Pandruvada 		for (i = 0; i < level - 1; ++i)
983fb4f7cdSSrinivas Pandruvada 			j += snprintf(&delimiters[j], sizeof(delimiters) - j,
993fb4f7cdSSrinivas Pandruvada 				      "%s", spaces);
1003fb4f7cdSSrinivas Pandruvada 	}
1013fb4f7cdSSrinivas Pandruvada 
1023fb4f7cdSSrinivas Pandruvada 	if (header && value) {
1033fb4f7cdSSrinivas Pandruvada 		fprintf(outf, "%s", delimiters);
1043fb4f7cdSSrinivas Pandruvada 		fprintf(outf, "%s:%s\n", header, value);
1053fb4f7cdSSrinivas Pandruvada 	} else if (header) {
1063fb4f7cdSSrinivas Pandruvada 		fprintf(outf, "%s", delimiters);
1073fb4f7cdSSrinivas Pandruvada 		fprintf(outf, "%s\n", header);
1083fb4f7cdSSrinivas Pandruvada 	}
1093fb4f7cdSSrinivas Pandruvada }
1103fb4f7cdSSrinivas Pandruvada 
1113fb4f7cdSSrinivas Pandruvada static int last_level;
format_and_print(FILE * outf,int level,char * header,char * value)1123fb4f7cdSSrinivas Pandruvada static void format_and_print(FILE *outf, int level, char *header, char *value)
1133fb4f7cdSSrinivas Pandruvada {
1143fb4f7cdSSrinivas Pandruvada 	char *spaces = "  ";
1153fb4f7cdSSrinivas Pandruvada 	static char delimiters[256];
1163fb4f7cdSSrinivas Pandruvada 	int i;
1173fb4f7cdSSrinivas Pandruvada 
1183fb4f7cdSSrinivas Pandruvada 	if (!out_format_is_json()) {
1193fb4f7cdSSrinivas Pandruvada 		format_and_print_txt(outf, level, header, value);
1203fb4f7cdSSrinivas Pandruvada 		return;
1213fb4f7cdSSrinivas Pandruvada 	}
1223fb4f7cdSSrinivas Pandruvada 
1233fb4f7cdSSrinivas Pandruvada 	if (level == 0) {
1243fb4f7cdSSrinivas Pandruvada 		if (header)
1253fb4f7cdSSrinivas Pandruvada 			fprintf(outf, "{");
1263fb4f7cdSSrinivas Pandruvada 		else
1273fb4f7cdSSrinivas Pandruvada 			fprintf(outf, "\n}\n");
1283fb4f7cdSSrinivas Pandruvada 
1293fb4f7cdSSrinivas Pandruvada 	} else {
1303fb4f7cdSSrinivas Pandruvada 		int j = 0;
1313fb4f7cdSSrinivas Pandruvada 
1323fb4f7cdSSrinivas Pandruvada 		for (i = 0; i < level; ++i)
1333fb4f7cdSSrinivas Pandruvada 			j += snprintf(&delimiters[j], sizeof(delimiters) - j,
1343fb4f7cdSSrinivas Pandruvada 				      "%s", spaces);
1353fb4f7cdSSrinivas Pandruvada 
1363fb4f7cdSSrinivas Pandruvada 		if (last_level == level)
1373fb4f7cdSSrinivas Pandruvada 			fprintf(outf, ",\n");
1383fb4f7cdSSrinivas Pandruvada 
1393fb4f7cdSSrinivas Pandruvada 		if (value) {
1403fb4f7cdSSrinivas Pandruvada 			if (last_level != level)
1413fb4f7cdSSrinivas Pandruvada 				fprintf(outf, "\n");
1423fb4f7cdSSrinivas Pandruvada 
1433fb4f7cdSSrinivas Pandruvada 			fprintf(outf, "%s\"%s\": ", delimiters, header);
1443fb4f7cdSSrinivas Pandruvada 			fprintf(outf, "\"%s\"", value);
1453fb4f7cdSSrinivas Pandruvada 		} else {
1463fb4f7cdSSrinivas Pandruvada 			for (i = last_level - 1; i >= level; --i) {
1473fb4f7cdSSrinivas Pandruvada 				int k = 0;
1483fb4f7cdSSrinivas Pandruvada 
1493fb4f7cdSSrinivas Pandruvada 				for (j = i; j > 0; --j)
1503fb4f7cdSSrinivas Pandruvada 					k += snprintf(&delimiters[k],
1513fb4f7cdSSrinivas Pandruvada 						      sizeof(delimiters) - k,
1523fb4f7cdSSrinivas Pandruvada 						      "%s", spaces);
1533fb4f7cdSSrinivas Pandruvada 				if (i == level && header)
1543fb4f7cdSSrinivas Pandruvada 					fprintf(outf, "\n%s},", delimiters);
1553fb4f7cdSSrinivas Pandruvada 				else
1563fb4f7cdSSrinivas Pandruvada 					fprintf(outf, "\n%s}", delimiters);
1573fb4f7cdSSrinivas Pandruvada 			}
1583fb4f7cdSSrinivas Pandruvada 			if (abs(last_level - level) < 3)
1593fb4f7cdSSrinivas Pandruvada 				fprintf(outf, "\n");
1603fb4f7cdSSrinivas Pandruvada 			if (header)
1613fb4f7cdSSrinivas Pandruvada 				fprintf(outf, "%s\"%s\": {", delimiters,
1623fb4f7cdSSrinivas Pandruvada 					header);
1633fb4f7cdSSrinivas Pandruvada 		}
1643fb4f7cdSSrinivas Pandruvada 	}
1653fb4f7cdSSrinivas Pandruvada 
1663fb4f7cdSSrinivas Pandruvada 	last_level = level;
1673fb4f7cdSSrinivas Pandruvada }
1683fb4f7cdSSrinivas Pandruvada 
print_package_info(struct isst_id * id,FILE * outf)169850337ecSZhang Rui static int print_package_info(struct isst_id *id, FILE *outf)
1703fb4f7cdSSrinivas Pandruvada {
1713fb4f7cdSSrinivas Pandruvada 	char header[256];
17246de87e3SZhang Rui 	int level = 1;
1733fb4f7cdSSrinivas Pandruvada 
17474062363SSrinivas Pandruvada 	if (out_format_is_json()) {
17546de87e3SZhang Rui 		if (api_version() > 1)
17646de87e3SZhang Rui 			snprintf(header, sizeof(header), "package-%d:die-%d:powerdomain-%d:cpu-%d",
17746de87e3SZhang Rui 				 id->pkg, id->die, id->punit, id->cpu);
17846de87e3SZhang Rui 		else
17974062363SSrinivas Pandruvada 			snprintf(header, sizeof(header), "package-%d:die-%d:cpu-%d",
18056d64692SZhang Rui 				 id->pkg, id->die, id->cpu);
18146de87e3SZhang Rui 		format_and_print(outf, level, header, NULL);
18274062363SSrinivas Pandruvada 		return 1;
18374062363SSrinivas Pandruvada 	}
18456d64692SZhang Rui 	snprintf(header, sizeof(header), "package-%d", id->pkg);
18546de87e3SZhang Rui 	format_and_print(outf, level++, header, NULL);
18656d64692SZhang Rui 	snprintf(header, sizeof(header), "die-%d", id->die);
18746de87e3SZhang Rui 	format_and_print(outf, level++, header, NULL);
18846de87e3SZhang Rui 	if (api_version() > 1) {
18946de87e3SZhang Rui 		snprintf(header, sizeof(header), "powerdomain-%d", id->punit);
19046de87e3SZhang Rui 		format_and_print(outf, level++, header, NULL);
19146de87e3SZhang Rui 	}
192850337ecSZhang Rui 	snprintf(header, sizeof(header), "cpu-%d", id->cpu);
19346de87e3SZhang Rui 	format_and_print(outf, level, header, NULL);
19474062363SSrinivas Pandruvada 
19546de87e3SZhang Rui 	return level;
1963fb4f7cdSSrinivas Pandruvada }
1973fb4f7cdSSrinivas Pandruvada 
_isst_pbf_display_information(struct isst_id * id,FILE * outf,int level,struct isst_pbf_info * pbf_info,int disp_level)198850337ecSZhang Rui static void _isst_pbf_display_information(struct isst_id *id, FILE *outf, int level,
1993fb4f7cdSSrinivas Pandruvada 					  struct isst_pbf_info *pbf_info,
2003fb4f7cdSSrinivas Pandruvada 					  int disp_level)
2013fb4f7cdSSrinivas Pandruvada {
2023fb4f7cdSSrinivas Pandruvada 	char header[256];
2032e70b710SSrinivas Pandruvada 	char value[512];
2043fb4f7cdSSrinivas Pandruvada 
2053b0fe3baSSrinivas Pandruvada 	snprintf(header, sizeof(header), "speed-select-base-freq-properties");
2063fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, disp_level, header, NULL);
2073fb4f7cdSSrinivas Pandruvada 
208808088e4SPrarit Bhargava 	snprintf(header, sizeof(header), "high-priority-base-frequency(MHz)");
2093fb4f7cdSSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d",
21013b868f8SZhang Rui 		 pbf_info->p1_high * isst_get_disp_freq_multiplier());
2113fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, disp_level + 1, header, value);
2123fb4f7cdSSrinivas Pandruvada 
2133fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "high-priority-cpu-mask");
2143fb4f7cdSSrinivas Pandruvada 	printcpumask(sizeof(value), value, pbf_info->core_cpumask_size,
2153fb4f7cdSSrinivas Pandruvada 		     pbf_info->core_cpumask);
2163fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, disp_level + 1, header, value);
2173fb4f7cdSSrinivas Pandruvada 
21849aed155SPrarit Bhargava 	snprintf(header, sizeof(header), "high-priority-cpu-list");
21949aed155SPrarit Bhargava 	printcpulist(sizeof(value), value,
22049aed155SPrarit Bhargava 		     pbf_info->core_cpumask_size,
22149aed155SPrarit Bhargava 		     pbf_info->core_cpumask);
22249aed155SPrarit Bhargava 	format_and_print(outf, disp_level + 1, header, value);
22349aed155SPrarit Bhargava 
224808088e4SPrarit Bhargava 	snprintf(header, sizeof(header), "low-priority-base-frequency(MHz)");
2253fb4f7cdSSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d",
22613b868f8SZhang Rui 		 pbf_info->p1_low * isst_get_disp_freq_multiplier());
2273fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, disp_level + 1, header, value);
2283fb4f7cdSSrinivas Pandruvada 
229062e4aacSPrarit Bhargava 	if (is_clx_n_platform())
230062e4aacSPrarit Bhargava 		return;
231062e4aacSPrarit Bhargava 
2323fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "tjunction-temperature(C)");
2333fb4f7cdSSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
2343fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, disp_level + 1, header, value);
2353fb4f7cdSSrinivas Pandruvada 
2363fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "thermal-design-power(W)");
2373fb4f7cdSSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d", pbf_info->tdp);
2383fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, disp_level + 1, header, value);
2393fb4f7cdSSrinivas Pandruvada }
2403fb4f7cdSSrinivas Pandruvada 
_isst_fact_display_information(struct isst_id * id,FILE * outf,int level,int fact_bucket,int fact_avx,struct isst_fact_info * fact_info,int base_level)241850337ecSZhang Rui static void _isst_fact_display_information(struct isst_id *id, FILE *outf, int level,
2423fb4f7cdSSrinivas Pandruvada 					   int fact_bucket, int fact_avx,
2433fb4f7cdSSrinivas Pandruvada 					   struct isst_fact_info *fact_info,
2443fb4f7cdSSrinivas Pandruvada 					   int base_level)
2453fb4f7cdSSrinivas Pandruvada {
2463fb4f7cdSSrinivas Pandruvada 	struct isst_fact_bucket_info *bucket_info = fact_info->bucket_info;
24716c18920SZhang Rui 	int trl_max_levels = isst_get_trl_max_levels();
2483fb4f7cdSSrinivas Pandruvada 	char header[256];
2493fb4f7cdSSrinivas Pandruvada 	char value[256];
250a9fd6ae7SSrinivas Pandruvada 	int print = 0, j;
251a9fd6ae7SSrinivas Pandruvada 
252a9fd6ae7SSrinivas Pandruvada 	for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
253a9fd6ae7SSrinivas Pandruvada 		if (fact_bucket != 0xff && fact_bucket != j)
254a9fd6ae7SSrinivas Pandruvada 			continue;
255a9fd6ae7SSrinivas Pandruvada 
256b1e9b87bSZhang Rui 		/* core count must be valid for CPU power domain */
257b1e9b87bSZhang Rui 		if (!bucket_info[j].hp_cores && id->cpu >= 0)
258a9fd6ae7SSrinivas Pandruvada 			break;
259a9fd6ae7SSrinivas Pandruvada 
260a9fd6ae7SSrinivas Pandruvada 		print = 1;
261a9fd6ae7SSrinivas Pandruvada 	}
262a9fd6ae7SSrinivas Pandruvada 	if (!print) {
263a9fd6ae7SSrinivas Pandruvada 		fprintf(stderr, "Invalid bucket\n");
264a9fd6ae7SSrinivas Pandruvada 		return;
265a9fd6ae7SSrinivas Pandruvada 	}
2663fb4f7cdSSrinivas Pandruvada 
2673b0fe3baSSrinivas Pandruvada 	snprintf(header, sizeof(header), "speed-select-turbo-freq-properties");
2683fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, base_level, header, NULL);
2693fb4f7cdSSrinivas Pandruvada 	for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
27016c18920SZhang Rui 		int i;
27116c18920SZhang Rui 
2723fb4f7cdSSrinivas Pandruvada 		if (fact_bucket != 0xff && fact_bucket != j)
2733fb4f7cdSSrinivas Pandruvada 			continue;
2743fb4f7cdSSrinivas Pandruvada 
27516c18920SZhang Rui 		if (!bucket_info[j].hp_cores)
2763fb4f7cdSSrinivas Pandruvada 			break;
2773fb4f7cdSSrinivas Pandruvada 
2783fb4f7cdSSrinivas Pandruvada 		snprintf(header, sizeof(header), "bucket-%d", j);
2793fb4f7cdSSrinivas Pandruvada 		format_and_print(outf, base_level + 1, header, NULL);
2803fb4f7cdSSrinivas Pandruvada 
2813fb4f7cdSSrinivas Pandruvada 		snprintf(header, sizeof(header), "high-priority-cores-count");
2823fb4f7cdSSrinivas Pandruvada 		snprintf(value, sizeof(value), "%d",
28316c18920SZhang Rui 			 bucket_info[j].hp_cores);
2843fb4f7cdSSrinivas Pandruvada 		format_and_print(outf, base_level + 2, header, value);
28516c18920SZhang Rui 		for (i = 0; i < trl_max_levels; i++) {
2862c00056fSSrinivas Pandruvada 			if (!bucket_info[j].hp_ratios[i] || (fact_avx != 0xFF && !(fact_avx & (1 << i))))
28716c18920SZhang Rui 				continue;
2882c00056fSSrinivas Pandruvada 			if (i == 0 && api_version() == 1 && !is_emr_platform())
2893fb4f7cdSSrinivas Pandruvada 				snprintf(header, sizeof(header),
290808088e4SPrarit Bhargava 					"high-priority-max-frequency(MHz)");
29116c18920SZhang Rui 			else
2923fb4f7cdSSrinivas Pandruvada 				snprintf(header, sizeof(header),
29316c18920SZhang Rui 					"high-priority-max-%s-frequency(MHz)", isst_get_trl_level_name(i));
2943fb4f7cdSSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d",
29513b868f8SZhang Rui 				bucket_info[j].hp_ratios[i] * isst_get_disp_freq_multiplier());
2963fb4f7cdSSrinivas Pandruvada 			format_and_print(outf, base_level + 2, header, value);
2973fb4f7cdSSrinivas Pandruvada 		}
2983fb4f7cdSSrinivas Pandruvada 	}
2993fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header),
3003fb4f7cdSSrinivas Pandruvada 		 "speed-select-turbo-freq-clip-frequencies");
3013fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, base_level + 1, header, NULL);
30216c18920SZhang Rui 
30316c18920SZhang Rui 	for (j = 0; j < trl_max_levels; j++) {
3042c00056fSSrinivas Pandruvada 		if (!fact_info->lp_ratios[j])
3052c00056fSSrinivas Pandruvada 			continue;
3062c00056fSSrinivas Pandruvada 
30716c18920SZhang Rui 		/* No AVX level name for SSE to be consistent with previous formatting */
3082c00056fSSrinivas Pandruvada 		if (j == 0 && api_version() == 1 && !is_emr_platform())
309808088e4SPrarit Bhargava 			snprintf(header, sizeof(header), "low-priority-max-frequency(MHz)");
31016c18920SZhang Rui 		else
31116c18920SZhang Rui 			snprintf(header, sizeof(header), "low-priority-max-%s-frequency(MHz)",
31216c18920SZhang Rui 				isst_get_trl_level_name(j));
3133fb4f7cdSSrinivas Pandruvada 		snprintf(value, sizeof(value), "%d",
31413b868f8SZhang Rui 			 fact_info->lp_ratios[j] * isst_get_disp_freq_multiplier());
3153fb4f7cdSSrinivas Pandruvada 		format_and_print(outf, base_level + 2, header, value);
31616c18920SZhang Rui 	}
3173fb4f7cdSSrinivas Pandruvada }
3183fb4f7cdSSrinivas Pandruvada 
isst_ctdp_display_core_info(struct isst_id * id,FILE * outf,char * prefix,unsigned int val,char * str0,char * str1)319850337ecSZhang Rui void isst_ctdp_display_core_info(struct isst_id *id, FILE *outf, char *prefix,
3203d1a8579SSrinivas Pandruvada 				 unsigned int val, char *str0, char *str1)
321b3abfd77SSrinivas Pandruvada {
322b3abfd77SSrinivas Pandruvada 	char value[256];
32346de87e3SZhang Rui 	int level = print_package_info(id, outf);
324b3abfd77SSrinivas Pandruvada 
32546de87e3SZhang Rui 	level++;
326aa8b650bSPrarit Bhargava 
3273d1a8579SSrinivas Pandruvada 	if (str0 && !val)
3283d1a8579SSrinivas Pandruvada 		snprintf(value, sizeof(value), "%s", str0);
3293d1a8579SSrinivas Pandruvada 	else if (str1 && val)
3303d1a8579SSrinivas Pandruvada 		snprintf(value, sizeof(value), "%s", str1);
3313d1a8579SSrinivas Pandruvada 	else
332b3abfd77SSrinivas Pandruvada 		snprintf(value, sizeof(value), "%u", val);
333aa8b650bSPrarit Bhargava 	format_and_print(outf, level, prefix, value);
334b3abfd77SSrinivas Pandruvada 
335b3abfd77SSrinivas Pandruvada 	format_and_print(outf, 1, NULL, NULL);
336b3abfd77SSrinivas Pandruvada }
337b3abfd77SSrinivas Pandruvada 
isst_ctdp_display_information(struct isst_id * id,FILE * outf,int tdp_level,struct isst_pkg_ctdp * pkg_dev)338850337ecSZhang Rui void isst_ctdp_display_information(struct isst_id *id, FILE *outf, int tdp_level,
3393fb4f7cdSSrinivas Pandruvada 				   struct isst_pkg_ctdp *pkg_dev)
3403fb4f7cdSSrinivas Pandruvada {
3413fb4f7cdSSrinivas Pandruvada 	char header[256];
3422e70b710SSrinivas Pandruvada 	char value[512];
34374062363SSrinivas Pandruvada 	static int level;
3447c7e7c0dSZhang Rui 	int trl_max_levels = isst_get_trl_max_levels();
34574062363SSrinivas Pandruvada 	int i;
3463fb4f7cdSSrinivas Pandruvada 
34720183ccdSSrinivas Pandruvada 	if (pkg_dev->processed)
348850337ecSZhang Rui 		level = print_package_info(id, outf);
3493fb4f7cdSSrinivas Pandruvada 
3503fb4f7cdSSrinivas Pandruvada 	for (i = 0; i <= pkg_dev->levels; ++i) {
3513fb4f7cdSSrinivas Pandruvada 		struct isst_pkg_ctdp_level_info *ctdp_level;
3527c7e7c0dSZhang Rui 		int j, k;
3533fb4f7cdSSrinivas Pandruvada 
3543fb4f7cdSSrinivas Pandruvada 		ctdp_level = &pkg_dev->ctdp_level[i];
3553fb4f7cdSSrinivas Pandruvada 		if (!ctdp_level->processed)
3563fb4f7cdSSrinivas Pandruvada 			continue;
3573fb4f7cdSSrinivas Pandruvada 
3583fb4f7cdSSrinivas Pandruvada 		snprintf(header, sizeof(header), "perf-profile-level-%d",
3593fb4f7cdSSrinivas Pandruvada 			 ctdp_level->level);
36074062363SSrinivas Pandruvada 		format_and_print(outf, level + 1, header, NULL);
3613fb4f7cdSSrinivas Pandruvada 
362c7ff8ff3SZhang Rui 		if (id->cpu >= 0) {
3633fb4f7cdSSrinivas Pandruvada 			snprintf(header, sizeof(header), "cpu-count");
36430e0600eSZhang Rui 			j = get_cpu_count(id);
3653fb4f7cdSSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d", j);
36674062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
3673fb4f7cdSSrinivas Pandruvada 
368e44d7656SSrinivas Pandruvada 			j = CPU_COUNT_S(ctdp_level->core_cpumask_size,
369e44d7656SSrinivas Pandruvada 					ctdp_level->core_cpumask);
370e44d7656SSrinivas Pandruvada 			if (j) {
371e44d7656SSrinivas Pandruvada 				snprintf(header, sizeof(header), "enable-cpu-count");
372e44d7656SSrinivas Pandruvada 				snprintf(value, sizeof(value), "%d", j);
37374062363SSrinivas Pandruvada 				format_and_print(outf, level + 2, header, value);
374e44d7656SSrinivas Pandruvada 			}
375e44d7656SSrinivas Pandruvada 
3767af5a95bSSrinivas Pandruvada 			if (ctdp_level->core_cpumask_size) {
3773fb4f7cdSSrinivas Pandruvada 				snprintf(header, sizeof(header), "enable-cpu-mask");
3783fb4f7cdSSrinivas Pandruvada 				printcpumask(sizeof(value), value,
3793fb4f7cdSSrinivas Pandruvada 					     ctdp_level->core_cpumask_size,
3803fb4f7cdSSrinivas Pandruvada 					     ctdp_level->core_cpumask);
38174062363SSrinivas Pandruvada 				format_and_print(outf, level + 2, header, value);
3823fb4f7cdSSrinivas Pandruvada 
38349aed155SPrarit Bhargava 				snprintf(header, sizeof(header), "enable-cpu-list");
38449aed155SPrarit Bhargava 				printcpulist(sizeof(value), value,
38549aed155SPrarit Bhargava 					     ctdp_level->core_cpumask_size,
38649aed155SPrarit Bhargava 					     ctdp_level->core_cpumask);
38774062363SSrinivas Pandruvada 				format_and_print(outf, level + 2, header, value);
3887af5a95bSSrinivas Pandruvada 			}
389c7ff8ff3SZhang Rui 		}
39049aed155SPrarit Bhargava 
3913fb4f7cdSSrinivas Pandruvada 		snprintf(header, sizeof(header), "thermal-design-power-ratio");
3923fb4f7cdSSrinivas Pandruvada 		snprintf(value, sizeof(value), "%d", ctdp_level->tdp_ratio);
39374062363SSrinivas Pandruvada 		format_and_print(outf, level + 2, header, value);
3943fb4f7cdSSrinivas Pandruvada 
395808088e4SPrarit Bhargava 		snprintf(header, sizeof(header), "base-frequency(MHz)");
396263225c9SSrinivas Pandruvada 		if (!ctdp_level->sse_p1)
397263225c9SSrinivas Pandruvada 			ctdp_level->sse_p1 = ctdp_level->tdp_ratio;
3983fb4f7cdSSrinivas Pandruvada 		snprintf(value, sizeof(value), "%d",
39913b868f8SZhang Rui 			  ctdp_level->sse_p1 * isst_get_disp_freq_multiplier());
40074062363SSrinivas Pandruvada 		format_and_print(outf, level + 2, header, value);
4013fb4f7cdSSrinivas Pandruvada 
402263225c9SSrinivas Pandruvada 		if (ctdp_level->avx2_p1) {
403263225c9SSrinivas Pandruvada 			snprintf(header, sizeof(header), "base-frequency-avx2(MHz)");
404263225c9SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d",
40513b868f8SZhang Rui 				 ctdp_level->avx2_p1 * isst_get_disp_freq_multiplier());
40674062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
407263225c9SSrinivas Pandruvada 		}
408263225c9SSrinivas Pandruvada 
409263225c9SSrinivas Pandruvada 		if (ctdp_level->avx512_p1) {
410263225c9SSrinivas Pandruvada 			snprintf(header, sizeof(header), "base-frequency-avx512(MHz)");
411263225c9SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d",
41213b868f8SZhang Rui 				 ctdp_level->avx512_p1 * isst_get_disp_freq_multiplier());
41374062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
414263225c9SSrinivas Pandruvada 		}
415263225c9SSrinivas Pandruvada 
4160d5eea35SSrinivas Pandruvada 		if (ctdp_level->uncore_pm) {
417263225c9SSrinivas Pandruvada 			snprintf(header, sizeof(header), "uncore-frequency-min(MHz)");
418263225c9SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d",
41913b868f8SZhang Rui 				 ctdp_level->uncore_pm * isst_get_disp_freq_multiplier());
42074062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
421263225c9SSrinivas Pandruvada 		}
422263225c9SSrinivas Pandruvada 
423263225c9SSrinivas Pandruvada 		if (ctdp_level->uncore_p0) {
424263225c9SSrinivas Pandruvada 			snprintf(header, sizeof(header), "uncore-frequency-max(MHz)");
425263225c9SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d",
42613b868f8SZhang Rui 				 ctdp_level->uncore_p0 * isst_get_disp_freq_multiplier());
42774062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
428263225c9SSrinivas Pandruvada 		}
429263225c9SSrinivas Pandruvada 
430a835ff56SSrinivas Pandruvada 		if (ctdp_level->amx_p1) {
4315f319081SZhang Rui 			snprintf(header, sizeof(header), "base-frequency-amx(MHz)");
4325f319081SZhang Rui 			snprintf(value, sizeof(value), "%d",
4335f319081SZhang Rui 			ctdp_level->amx_p1 * isst_get_disp_freq_multiplier());
4345f319081SZhang Rui 			format_and_print(outf, level + 2, header, value);
4355f319081SZhang Rui 		}
4365f319081SZhang Rui 
4370d5eea35SSrinivas Pandruvada 		if (ctdp_level->uncore_p1) {
4380d5eea35SSrinivas Pandruvada 			snprintf(header, sizeof(header), "uncore-frequency-base(MHz)");
4390d5eea35SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d",
44013b868f8SZhang Rui 				 ctdp_level->uncore_p1 * isst_get_disp_freq_multiplier());
4410d5eea35SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
4420d5eea35SSrinivas Pandruvada 		}
4430d5eea35SSrinivas Pandruvada 
444263225c9SSrinivas Pandruvada 		if (ctdp_level->mem_freq) {
445*dde9293bSSrinivas Pandruvada 			snprintf(header, sizeof(header), "max-mem-frequency(MHz)");
446263225c9SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d",
447159f130fSSrinivas Pandruvada 				 ctdp_level->mem_freq);
44874062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
449263225c9SSrinivas Pandruvada 		}
450263225c9SSrinivas Pandruvada 
4515f319081SZhang Rui 		if (api_version() > 1) {
4525f319081SZhang Rui 			snprintf(header, sizeof(header), "cooling_type");
4535f319081SZhang Rui 			snprintf(value, sizeof(value), "%d",
4545f319081SZhang Rui 				ctdp_level->cooling_type);
4555f319081SZhang Rui 			format_and_print(outf, level + 2, header, value);
4565f319081SZhang Rui 		}
4575f319081SZhang Rui 
4583fb4f7cdSSrinivas Pandruvada 		snprintf(header, sizeof(header),
459dece22a2SPrarit Bhargava 			 "speed-select-turbo-freq");
460dece22a2SPrarit Bhargava 		if (ctdp_level->fact_support) {
461dece22a2SPrarit Bhargava 			if (ctdp_level->fact_enabled)
462dece22a2SPrarit Bhargava 				snprintf(value, sizeof(value), "enabled");
463dece22a2SPrarit Bhargava 			else
464dece22a2SPrarit Bhargava 				snprintf(value, sizeof(value), "disabled");
465dece22a2SPrarit Bhargava 		} else
466dece22a2SPrarit Bhargava 			snprintf(value, sizeof(value), "unsupported");
46774062363SSrinivas Pandruvada 		format_and_print(outf, level + 2, header, value);
4683fb4f7cdSSrinivas Pandruvada 
4693fb4f7cdSSrinivas Pandruvada 		snprintf(header, sizeof(header),
470dece22a2SPrarit Bhargava 			 "speed-select-base-freq");
471dece22a2SPrarit Bhargava 		if (ctdp_level->pbf_support) {
472dece22a2SPrarit Bhargava 			if (ctdp_level->pbf_enabled)
473dece22a2SPrarit Bhargava 				snprintf(value, sizeof(value), "enabled");
474dece22a2SPrarit Bhargava 			else
475dece22a2SPrarit Bhargava 				snprintf(value, sizeof(value), "disabled");
476dece22a2SPrarit Bhargava 		} else
477dece22a2SPrarit Bhargava 			snprintf(value, sizeof(value), "unsupported");
47874062363SSrinivas Pandruvada 		format_and_print(outf, level + 2, header, value);
4793fb4f7cdSSrinivas Pandruvada 
480645feeb2SSrinivas Pandruvada 		snprintf(header, sizeof(header),
481645feeb2SSrinivas Pandruvada 			 "speed-select-core-power");
482645feeb2SSrinivas Pandruvada 		if (ctdp_level->sst_cp_support) {
483645feeb2SSrinivas Pandruvada 			if (ctdp_level->sst_cp_enabled)
484645feeb2SSrinivas Pandruvada 				snprintf(value, sizeof(value), "enabled");
485645feeb2SSrinivas Pandruvada 			else
486645feeb2SSrinivas Pandruvada 				snprintf(value, sizeof(value), "disabled");
487645feeb2SSrinivas Pandruvada 		} else
488645feeb2SSrinivas Pandruvada 			snprintf(value, sizeof(value), "unsupported");
48974062363SSrinivas Pandruvada 		format_and_print(outf, level + 2, header, value);
490645feeb2SSrinivas Pandruvada 
491062e4aacSPrarit Bhargava 		if (is_clx_n_platform()) {
492062e4aacSPrarit Bhargava 			if (ctdp_level->pbf_support)
493850337ecSZhang Rui 				_isst_pbf_display_information(id, outf,
494062e4aacSPrarit Bhargava 							      tdp_level,
495062e4aacSPrarit Bhargava 							  &ctdp_level->pbf_info,
4964c35527aSPrarit Bhargava 							      level + 2);
497062e4aacSPrarit Bhargava 			continue;
498062e4aacSPrarit Bhargava 		}
499062e4aacSPrarit Bhargava 
5007af5a95bSSrinivas Pandruvada 		if (ctdp_level->pkg_tdp) {
5013fb4f7cdSSrinivas Pandruvada 			snprintf(header, sizeof(header), "thermal-design-power(W)");
5023fb4f7cdSSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d", ctdp_level->pkg_tdp);
50374062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
5047af5a95bSSrinivas Pandruvada 		}
5053fb4f7cdSSrinivas Pandruvada 
5067af5a95bSSrinivas Pandruvada 		if (ctdp_level->t_proc_hot) {
5073fb4f7cdSSrinivas Pandruvada 			snprintf(header, sizeof(header), "tjunction-max(C)");
5083fb4f7cdSSrinivas Pandruvada 			snprintf(value, sizeof(value), "%d", ctdp_level->t_proc_hot);
50974062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, value);
5107af5a95bSSrinivas Pandruvada 		}
5113fb4f7cdSSrinivas Pandruvada 
5127c7e7c0dSZhang Rui 		for (k = 0; k < trl_max_levels; k++) {
513c5a295caSZhang Rui 			if (!ctdp_level->trl_ratios[k][0])
514c5a295caSZhang Rui 				continue;
515c5a295caSZhang Rui 
5167c7e7c0dSZhang Rui 			snprintf(header, sizeof(header), "turbo-ratio-limits-%s", isst_get_trl_level_name(k));
51774062363SSrinivas Pandruvada 			format_and_print(outf, level + 2, header, NULL);
5187c7e7c0dSZhang Rui 
5193fb4f7cdSSrinivas Pandruvada 			for (j = 0; j < 8; ++j) {
5203fb4f7cdSSrinivas Pandruvada 				snprintf(header, sizeof(header), "bucket-%d", j);
52174062363SSrinivas Pandruvada 				format_and_print(outf, level + 3, header, NULL);
5223fb4f7cdSSrinivas Pandruvada 
5233fb4f7cdSSrinivas Pandruvada 				snprintf(header, sizeof(header), "core-count");
5243fb4f7cdSSrinivas Pandruvada 
5257c7e7c0dSZhang Rui 				snprintf(value, sizeof(value), "%llu", (ctdp_level->trl_cores >> (j * 8)) & 0xff);
52674062363SSrinivas Pandruvada 				format_and_print(outf, level + 4, header, value);
5273fb4f7cdSSrinivas Pandruvada 
5287af5a95bSSrinivas Pandruvada 				snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
52913b868f8SZhang Rui 				snprintf(value, sizeof(value), "%d", ctdp_level->trl_ratios[k][j] * isst_get_disp_freq_multiplier());
53074062363SSrinivas Pandruvada 				format_and_print(outf, level + 4, header, value);
5313fb4f7cdSSrinivas Pandruvada 			}
5327af5a95bSSrinivas Pandruvada 		}
5337af5a95bSSrinivas Pandruvada 
5343fb4f7cdSSrinivas Pandruvada 		if (ctdp_level->pbf_support)
535850337ecSZhang Rui 			_isst_pbf_display_information(id, outf, i,
5363fb4f7cdSSrinivas Pandruvada 						      &ctdp_level->pbf_info,
53774062363SSrinivas Pandruvada 						      level + 2);
5383fb4f7cdSSrinivas Pandruvada 		if (ctdp_level->fact_support)
539850337ecSZhang Rui 			_isst_fact_display_information(id, outf, i, 0xff, 0xff,
5403fb4f7cdSSrinivas Pandruvada 						       &ctdp_level->fact_info,
54174062363SSrinivas Pandruvada 						       level + 2);
5423fb4f7cdSSrinivas Pandruvada 	}
5433fb4f7cdSSrinivas Pandruvada 
5443fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, 1, NULL, NULL);
5453fb4f7cdSSrinivas Pandruvada }
5463fb4f7cdSSrinivas Pandruvada 
54787e115b3SSrinivas Pandruvada static int start;
isst_ctdp_display_information_start(FILE * outf)5483fb4f7cdSSrinivas Pandruvada void isst_ctdp_display_information_start(FILE *outf)
5493fb4f7cdSSrinivas Pandruvada {
5503fb4f7cdSSrinivas Pandruvada 	last_level = 0;
5513fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, 0, "start", NULL);
55287e115b3SSrinivas Pandruvada 	start = 1;
5533fb4f7cdSSrinivas Pandruvada }
5543fb4f7cdSSrinivas Pandruvada 
isst_ctdp_display_information_end(FILE * outf)5553fb4f7cdSSrinivas Pandruvada void isst_ctdp_display_information_end(FILE *outf)
5563fb4f7cdSSrinivas Pandruvada {
5573fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, 0, NULL, NULL);
55887e115b3SSrinivas Pandruvada 	start = 0;
5593fb4f7cdSSrinivas Pandruvada }
5603fb4f7cdSSrinivas Pandruvada 
isst_pbf_display_information(struct isst_id * id,FILE * outf,int level,struct isst_pbf_info * pbf_info)561850337ecSZhang Rui void isst_pbf_display_information(struct isst_id *id, FILE *outf, int level,
5623fb4f7cdSSrinivas Pandruvada 				  struct isst_pbf_info *pbf_info)
5633fb4f7cdSSrinivas Pandruvada {
56474062363SSrinivas Pandruvada 	int _level;
56574062363SSrinivas Pandruvada 
566850337ecSZhang Rui 	_level = print_package_info(id, outf);
567850337ecSZhang Rui 	_isst_pbf_display_information(id, outf, level, pbf_info, _level + 1);
5683fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, 1, NULL, NULL);
5693fb4f7cdSSrinivas Pandruvada }
5703fb4f7cdSSrinivas Pandruvada 
isst_fact_display_information(struct isst_id * id,FILE * outf,int level,int fact_bucket,int fact_avx,struct isst_fact_info * fact_info)571850337ecSZhang Rui void isst_fact_display_information(struct isst_id *id, FILE *outf, int level,
5723fb4f7cdSSrinivas Pandruvada 				   int fact_bucket, int fact_avx,
5733fb4f7cdSSrinivas Pandruvada 				   struct isst_fact_info *fact_info)
5743fb4f7cdSSrinivas Pandruvada {
57574062363SSrinivas Pandruvada 	int _level;
57674062363SSrinivas Pandruvada 
577850337ecSZhang Rui 	_level = print_package_info(id, outf);
578850337ecSZhang Rui 	_isst_fact_display_information(id, outf, level, fact_bucket, fact_avx,
57974062363SSrinivas Pandruvada 				       fact_info, _level + 1);
5803fb4f7cdSSrinivas Pandruvada 	format_and_print(outf, 1, NULL, NULL);
5813fb4f7cdSSrinivas Pandruvada }
5823fb4f7cdSSrinivas Pandruvada 
isst_clos_display_information(struct isst_id * id,FILE * outf,int clos,struct isst_clos_config * clos_config)583850337ecSZhang Rui void isst_clos_display_information(struct isst_id *id, FILE *outf, int clos,
5843fb4f7cdSSrinivas Pandruvada 				   struct isst_clos_config *clos_config)
5853fb4f7cdSSrinivas Pandruvada {
5863fb4f7cdSSrinivas Pandruvada 	char header[256];
5873fb4f7cdSSrinivas Pandruvada 	char value[256];
58874062363SSrinivas Pandruvada 	int level;
5893fb4f7cdSSrinivas Pandruvada 
590850337ecSZhang Rui 	level = print_package_info(id, outf);
5913fb4f7cdSSrinivas Pandruvada 
5923fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "core-power");
59374062363SSrinivas Pandruvada 	format_and_print(outf, level + 1, header, NULL);
5943fb4f7cdSSrinivas Pandruvada 
5953fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "clos");
5963fb4f7cdSSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d", clos);
59774062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
5983fb4f7cdSSrinivas Pandruvada 
5993fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "epp");
6003fb4f7cdSSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d", clos_config->epp);
60174062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
6023fb4f7cdSSrinivas Pandruvada 
6033fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "clos-proportional-priority");
6043fb4f7cdSSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d", clos_config->clos_prop_prio);
60574062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
6063fb4f7cdSSrinivas Pandruvada 
6073fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "clos-min");
60813b868f8SZhang Rui 	snprintf(value, sizeof(value), "%d MHz", clos_config->clos_min * isst_get_disp_freq_multiplier());
60974062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
6103fb4f7cdSSrinivas Pandruvada 
6113fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "clos-max");
612137ba3b1SZhang Rui 	if ((clos_config->clos_max * isst_get_disp_freq_multiplier()) == 25500)
613fe6fb216SSrinivas Pandruvada 		snprintf(value, sizeof(value), "Max Turbo frequency");
614fe6fb216SSrinivas Pandruvada 	else
61513b868f8SZhang Rui 		snprintf(value, sizeof(value), "%d MHz", clos_config->clos_max * isst_get_disp_freq_multiplier());
61674062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
6173fb4f7cdSSrinivas Pandruvada 
6183fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "clos-desired");
61913b868f8SZhang Rui 	snprintf(value, sizeof(value), "%d MHz", clos_config->clos_desired * isst_get_disp_freq_multiplier());
62074062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
6213fb4f7cdSSrinivas Pandruvada 
62274062363SSrinivas Pandruvada 	format_and_print(outf, level, NULL, NULL);
6233fb4f7cdSSrinivas Pandruvada }
6243fb4f7cdSSrinivas Pandruvada 
isst_clos_display_clos_information(struct isst_id * id,FILE * outf,int clos_enable,int type,int state,int cap)625850337ecSZhang Rui void isst_clos_display_clos_information(struct isst_id *id, FILE *outf,
626143ad322SSrinivas Pandruvada 					int clos_enable, int type,
627143ad322SSrinivas Pandruvada 					int state, int cap)
628188afed9SSrinivas Pandruvada {
629188afed9SSrinivas Pandruvada 	char header[256];
630188afed9SSrinivas Pandruvada 	char value[256];
63174062363SSrinivas Pandruvada 	int level;
632188afed9SSrinivas Pandruvada 
633850337ecSZhang Rui 	level = print_package_info(id, outf);
634188afed9SSrinivas Pandruvada 
635188afed9SSrinivas Pandruvada 	snprintf(header, sizeof(header), "core-power");
63674062363SSrinivas Pandruvada 	format_and_print(outf, level + 1, header, NULL);
637188afed9SSrinivas Pandruvada 
638143ad322SSrinivas Pandruvada 	snprintf(header, sizeof(header), "support-status");
639143ad322SSrinivas Pandruvada 	if (cap)
640143ad322SSrinivas Pandruvada 		snprintf(value, sizeof(value), "supported");
641143ad322SSrinivas Pandruvada 	else
642143ad322SSrinivas Pandruvada 		snprintf(value, sizeof(value), "unsupported");
64374062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
644143ad322SSrinivas Pandruvada 
645188afed9SSrinivas Pandruvada 	snprintf(header, sizeof(header), "enable-status");
646143ad322SSrinivas Pandruvada 	if (state)
647143ad322SSrinivas Pandruvada 		snprintf(value, sizeof(value), "enabled");
648143ad322SSrinivas Pandruvada 	else
649143ad322SSrinivas Pandruvada 		snprintf(value, sizeof(value), "disabled");
65074062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
651143ad322SSrinivas Pandruvada 
652143ad322SSrinivas Pandruvada 	snprintf(header, sizeof(header), "clos-enable-status");
6536320c9fbSSrinivas Pandruvada 	if (clos_enable)
6546320c9fbSSrinivas Pandruvada 		snprintf(value, sizeof(value), "enabled");
6556320c9fbSSrinivas Pandruvada 	else
6566320c9fbSSrinivas Pandruvada 		snprintf(value, sizeof(value), "disabled");
65774062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
658188afed9SSrinivas Pandruvada 
659188afed9SSrinivas Pandruvada 	snprintf(header, sizeof(header), "priority-type");
6606320c9fbSSrinivas Pandruvada 	if (type)
6616320c9fbSSrinivas Pandruvada 		snprintf(value, sizeof(value), "ordered");
6626320c9fbSSrinivas Pandruvada 	else
6636320c9fbSSrinivas Pandruvada 		snprintf(value, sizeof(value), "proportional");
66474062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
665188afed9SSrinivas Pandruvada 
66674062363SSrinivas Pandruvada 	format_and_print(outf, level, NULL, NULL);
667188afed9SSrinivas Pandruvada }
668188afed9SSrinivas Pandruvada 
isst_clos_display_assoc_information(struct isst_id * id,FILE * outf,int clos)669850337ecSZhang Rui void isst_clos_display_assoc_information(struct isst_id *id, FILE *outf, int clos)
670e118fbe3SSrinivas Pandruvada {
671e118fbe3SSrinivas Pandruvada 	char header[256];
672e118fbe3SSrinivas Pandruvada 	char value[256];
67374062363SSrinivas Pandruvada 	int level;
674e118fbe3SSrinivas Pandruvada 
675850337ecSZhang Rui 	level = print_package_info(id, outf);
676e118fbe3SSrinivas Pandruvada 
677e118fbe3SSrinivas Pandruvada 	snprintf(header, sizeof(header), "get-assoc");
67874062363SSrinivas Pandruvada 	format_and_print(outf, level + 1, header, NULL);
679e118fbe3SSrinivas Pandruvada 
680e118fbe3SSrinivas Pandruvada 	snprintf(header, sizeof(header), "clos");
681e118fbe3SSrinivas Pandruvada 	snprintf(value, sizeof(value), "%d", clos);
68274062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
683e118fbe3SSrinivas Pandruvada 
68474062363SSrinivas Pandruvada 	format_and_print(outf, level, NULL, NULL);
685e118fbe3SSrinivas Pandruvada }
686e118fbe3SSrinivas Pandruvada 
isst_display_result(struct isst_id * id,FILE * outf,char * feature,char * cmd,int result)687850337ecSZhang Rui void isst_display_result(struct isst_id *id, FILE *outf, char *feature, char *cmd,
6883fb4f7cdSSrinivas Pandruvada 			 int result)
6893fb4f7cdSSrinivas Pandruvada {
6903fb4f7cdSSrinivas Pandruvada 	char header[256];
6913fb4f7cdSSrinivas Pandruvada 	char value[256];
69274062363SSrinivas Pandruvada 	int level = 3;
6933fb4f7cdSSrinivas Pandruvada 
694850337ecSZhang Rui 	level = print_package_info(id, outf);
69574062363SSrinivas Pandruvada 
6963fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "%s", feature);
69774062363SSrinivas Pandruvada 	format_and_print(outf, level + 1, header, NULL);
6983fb4f7cdSSrinivas Pandruvada 	snprintf(header, sizeof(header), "%s", cmd);
699522586a9SPrarit Bhargava 	if (!result)
700522586a9SPrarit Bhargava 		snprintf(value, sizeof(value), "success");
701522586a9SPrarit Bhargava 	else
702522586a9SPrarit Bhargava 		snprintf(value, sizeof(value), "failed(error %d)", result);
70374062363SSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
7043fb4f7cdSSrinivas Pandruvada 
70574062363SSrinivas Pandruvada 	format_and_print(outf, level, NULL, NULL);
7063fb4f7cdSSrinivas Pandruvada }
70787e115b3SSrinivas Pandruvada 
isst_display_error_info_message(int error,char * msg,int arg_valid,int arg)70887e115b3SSrinivas Pandruvada void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg)
70987e115b3SSrinivas Pandruvada {
71087e115b3SSrinivas Pandruvada 	FILE *outf = get_output_file();
71187e115b3SSrinivas Pandruvada 	static int error_index;
71287e115b3SSrinivas Pandruvada 	char header[256];
71387e115b3SSrinivas Pandruvada 	char value[256];
71487e115b3SSrinivas Pandruvada 
71587e115b3SSrinivas Pandruvada 	if (!out_format_is_json()) {
71687e115b3SSrinivas Pandruvada 		if (arg_valid)
71787e115b3SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%s %d", msg, arg);
71887e115b3SSrinivas Pandruvada 		else
71987e115b3SSrinivas Pandruvada 			snprintf(value, sizeof(value), "%s", msg);
72087e115b3SSrinivas Pandruvada 
72187e115b3SSrinivas Pandruvada 		if (error)
72287e115b3SSrinivas Pandruvada 			fprintf(outf, "Error: %s\n", value);
72387e115b3SSrinivas Pandruvada 		else
72487e115b3SSrinivas Pandruvada 			fprintf(outf, "Information: %s\n", value);
72587e115b3SSrinivas Pandruvada 		return;
72687e115b3SSrinivas Pandruvada 	}
72787e115b3SSrinivas Pandruvada 
72887e115b3SSrinivas Pandruvada 	if (!start)
72987e115b3SSrinivas Pandruvada 		format_and_print(outf, 0, "start", NULL);
73087e115b3SSrinivas Pandruvada 
73187e115b3SSrinivas Pandruvada 	if (error)
73287e115b3SSrinivas Pandruvada 		snprintf(header, sizeof(header), "Error%d", error_index++);
73387e115b3SSrinivas Pandruvada 	else
73487e115b3SSrinivas Pandruvada 		snprintf(header, sizeof(header), "Information:%d", error_index++);
73587e115b3SSrinivas Pandruvada 	format_and_print(outf, 1, header, NULL);
73687e115b3SSrinivas Pandruvada 
73787e115b3SSrinivas Pandruvada 	snprintf(header, sizeof(header), "message");
73887e115b3SSrinivas Pandruvada 	if (arg_valid)
73987e115b3SSrinivas Pandruvada 		snprintf(value, sizeof(value), "%s %d", msg, arg);
74087e115b3SSrinivas Pandruvada 	else
74187e115b3SSrinivas Pandruvada 		snprintf(value, sizeof(value), "%s", msg);
74287e115b3SSrinivas Pandruvada 
74387e115b3SSrinivas Pandruvada 	format_and_print(outf, 2, header, value);
74487e115b3SSrinivas Pandruvada 	format_and_print(outf, 1, NULL, NULL);
74587e115b3SSrinivas Pandruvada 	if (!start)
74687e115b3SSrinivas Pandruvada 		format_and_print(outf, 0, NULL, NULL);
74787e115b3SSrinivas Pandruvada }
7482c7dc57eSSrinivas Pandruvada 
isst_trl_display_information(struct isst_id * id,FILE * outf,unsigned long long trl)749850337ecSZhang Rui void isst_trl_display_information(struct isst_id *id, FILE *outf, unsigned long long trl)
7502c7dc57eSSrinivas Pandruvada {
7512c7dc57eSSrinivas Pandruvada 	char header[256];
7522c7dc57eSSrinivas Pandruvada 	char value[256];
7532c7dc57eSSrinivas Pandruvada 	int level;
7542c7dc57eSSrinivas Pandruvada 
755850337ecSZhang Rui 	level = print_package_info(id, outf);
7562c7dc57eSSrinivas Pandruvada 
7572c7dc57eSSrinivas Pandruvada 	snprintf(header, sizeof(header), "get-trl");
7582c7dc57eSSrinivas Pandruvada 	format_and_print(outf, level + 1, header, NULL);
7592c7dc57eSSrinivas Pandruvada 
7602c7dc57eSSrinivas Pandruvada 	snprintf(header, sizeof(header), "trl");
7612c7dc57eSSrinivas Pandruvada 	snprintf(value, sizeof(value), "0x%llx", trl);
7622c7dc57eSSrinivas Pandruvada 	format_and_print(outf, level + 2, header, value);
7632c7dc57eSSrinivas Pandruvada 
7642c7dc57eSSrinivas Pandruvada 	format_and_print(outf, level, NULL, NULL);
7652c7dc57eSSrinivas Pandruvada }
766