1// SPDX-License-Identifier: GPL-2.0
2/*
3 * Intel dynamic_speed_select -- Enumerate and control features
4 * Copyright (c) 2019 Intel Corporation.
5 */
6
7#include "isst.h"
8
9static void printcpulist(int str_len, char *str, int mask_size,
10			 cpu_set_t *cpu_mask)
11{
12	int i, first, curr_index, index;
13
14	if (!CPU_COUNT_S(mask_size, cpu_mask)) {
15		snprintf(str, str_len, "none");
16		return;
17	}
18
19	curr_index = 0;
20	first = 1;
21	for (i = 0; i < get_topo_max_cpus(); ++i) {
22		if (!CPU_ISSET_S(i, mask_size, cpu_mask))
23			continue;
24		if (!first) {
25			index = snprintf(&str[curr_index],
26					 str_len - curr_index, ",");
27			curr_index += index;
28			if (curr_index >= str_len)
29				break;
30		}
31		index = snprintf(&str[curr_index], str_len - curr_index, "%d",
32				 i);
33		curr_index += index;
34		if (curr_index >= str_len)
35			break;
36		first = 0;
37	}
38}
39
40static void printcpumask(int str_len, char *str, int mask_size,
41			 cpu_set_t *cpu_mask)
42{
43	int i, max_cpus = get_topo_max_cpus();
44	unsigned int *mask;
45	int size, index, curr_index;
46
47	size = max_cpus / (sizeof(unsigned int) * 8);
48	if (max_cpus % (sizeof(unsigned int) * 8))
49		size++;
50
51	mask = calloc(size, sizeof(unsigned int));
52	if (!mask)
53		return;
54
55	for (i = 0; i < max_cpus; ++i) {
56		int mask_index, bit_index;
57
58		if (!CPU_ISSET_S(i, mask_size, cpu_mask))
59			continue;
60
61		mask_index = i / (sizeof(unsigned int) * 8);
62		bit_index = i % (sizeof(unsigned int) * 8);
63		mask[mask_index] |= BIT(bit_index);
64	}
65
66	curr_index = 0;
67	for (i = size - 1; i >= 0; --i) {
68		index = snprintf(&str[curr_index], str_len - curr_index, "%08x",
69				 mask[i]);
70		curr_index += index;
71		if (curr_index >= str_len)
72			break;
73		if (i) {
74			strncat(&str[curr_index], ",", str_len - curr_index);
75			curr_index++;
76		}
77		if (curr_index >= str_len)
78			break;
79	}
80
81	free(mask);
82}
83
84static void format_and_print_txt(FILE *outf, int level, char *header,
85				 char *value)
86{
87	char *spaces = "  ";
88	static char delimiters[256];
89	int i, j = 0;
90
91	if (!level)
92		return;
93
94	if (level == 1) {
95		strcpy(delimiters, " ");
96	} else {
97		for (i = 0; i < level - 1; ++i)
98			j += snprintf(&delimiters[j], sizeof(delimiters) - j,
99				      "%s", spaces);
100	}
101
102	if (header && value) {
103		fprintf(outf, "%s", delimiters);
104		fprintf(outf, "%s:%s\n", header, value);
105	} else if (header) {
106		fprintf(outf, "%s", delimiters);
107		fprintf(outf, "%s\n", header);
108	}
109}
110
111static int last_level;
112static void format_and_print(FILE *outf, int level, char *header, char *value)
113{
114	char *spaces = "  ";
115	static char delimiters[256];
116	int i;
117
118	if (!out_format_is_json()) {
119		format_and_print_txt(outf, level, header, value);
120		return;
121	}
122
123	if (level == 0) {
124		if (header)
125			fprintf(outf, "{");
126		else
127			fprintf(outf, "\n}\n");
128
129	} else {
130		int j = 0;
131
132		for (i = 0; i < level; ++i)
133			j += snprintf(&delimiters[j], sizeof(delimiters) - j,
134				      "%s", spaces);
135
136		if (last_level == level)
137			fprintf(outf, ",\n");
138
139		if (value) {
140			if (last_level != level)
141				fprintf(outf, "\n");
142
143			fprintf(outf, "%s\"%s\": ", delimiters, header);
144			fprintf(outf, "\"%s\"", value);
145		} else {
146			for (i = last_level - 1; i >= level; --i) {
147				int k = 0;
148
149				for (j = i; j > 0; --j)
150					k += snprintf(&delimiters[k],
151						      sizeof(delimiters) - k,
152						      "%s", spaces);
153				if (i == level && header)
154					fprintf(outf, "\n%s},", delimiters);
155				else
156					fprintf(outf, "\n%s}", delimiters);
157			}
158			if (abs(last_level - level) < 3)
159				fprintf(outf, "\n");
160			if (header)
161				fprintf(outf, "%s\"%s\": {", delimiters,
162					header);
163		}
164	}
165
166	last_level = level;
167}
168
169static int print_package_info(struct isst_id *id, FILE *outf)
170{
171	char header[256];
172	int level = 1;
173
174	if (out_format_is_json()) {
175		if (api_version() > 1) {
176			if (id->cpu < 0)
177				snprintf(header, sizeof(header),
178					 "package-%d:die-%d:powerdomain-%d:cpu-None",
179					 id->pkg, id->die, id->punit);
180			else
181				snprintf(header, sizeof(header),
182					 "package-%d:die-%d:powerdomain-%d:cpu-%d",
183					 id->pkg, id->die, id->punit, id->cpu);
184		} else {
185			snprintf(header, sizeof(header), "package-%d:die-%d:cpu-%d",
186				 id->pkg, id->die, id->cpu);
187		}
188		format_and_print(outf, level, header, NULL);
189		return 1;
190	}
191	snprintf(header, sizeof(header), "package-%d", id->pkg);
192	format_and_print(outf, level++, header, NULL);
193	snprintf(header, sizeof(header), "die-%d", id->die);
194	format_and_print(outf, level++, header, NULL);
195	if (api_version() > 1) {
196		snprintf(header, sizeof(header), "powerdomain-%d", id->punit);
197		format_and_print(outf, level++, header, NULL);
198	}
199
200	if (id->cpu < 0)
201		snprintf(header, sizeof(header), "cpu-None");
202	else
203		snprintf(header, sizeof(header), "cpu-%d", id->cpu);
204
205	format_and_print(outf, level, header, NULL);
206
207	return level;
208}
209
210static void _isst_pbf_display_information(struct isst_id *id, FILE *outf, int level,
211					  struct isst_pbf_info *pbf_info,
212					  int disp_level)
213{
214	static char header[256];
215	static char value[1024];
216
217	snprintf(header, sizeof(header), "speed-select-base-freq-properties");
218	format_and_print(outf, disp_level, header, NULL);
219
220	snprintf(header, sizeof(header), "high-priority-base-frequency(MHz)");
221	snprintf(value, sizeof(value), "%d",
222		 pbf_info->p1_high * isst_get_disp_freq_multiplier());
223	format_and_print(outf, disp_level + 1, header, value);
224
225	snprintf(header, sizeof(header), "high-priority-cpu-mask");
226	printcpumask(sizeof(value), value, pbf_info->core_cpumask_size,
227		     pbf_info->core_cpumask);
228	format_and_print(outf, disp_level + 1, header, value);
229
230	snprintf(header, sizeof(header), "high-priority-cpu-list");
231	printcpulist(sizeof(value), value,
232		     pbf_info->core_cpumask_size,
233		     pbf_info->core_cpumask);
234	format_and_print(outf, disp_level + 1, header, value);
235
236	snprintf(header, sizeof(header), "low-priority-base-frequency(MHz)");
237	snprintf(value, sizeof(value), "%d",
238		 pbf_info->p1_low * isst_get_disp_freq_multiplier());
239	format_and_print(outf, disp_level + 1, header, value);
240
241	if (is_clx_n_platform())
242		return;
243
244	snprintf(header, sizeof(header), "tjunction-temperature(C)");
245	snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
246	format_and_print(outf, disp_level + 1, header, value);
247
248	snprintf(header, sizeof(header), "thermal-design-power(W)");
249	snprintf(value, sizeof(value), "%d", pbf_info->tdp);
250	format_and_print(outf, disp_level + 1, header, value);
251}
252
253static void _isst_fact_display_information(struct isst_id *id, FILE *outf, int level,
254					   int fact_bucket, int fact_avx,
255					   struct isst_fact_info *fact_info,
256					   int base_level)
257{
258	struct isst_fact_bucket_info *bucket_info = fact_info->bucket_info;
259	int trl_max_levels = isst_get_trl_max_levels();
260	char header[256];
261	char value[256];
262	int print = 0, j;
263
264	for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
265		if (fact_bucket != 0xff && fact_bucket != j)
266			continue;
267
268		/* core count must be valid for CPU power domain */
269		if (!bucket_info[j].hp_cores && id->cpu >= 0)
270			break;
271
272		print = 1;
273	}
274	if (!print) {
275		fprintf(stderr, "Invalid bucket\n");
276		return;
277	}
278
279	snprintf(header, sizeof(header), "speed-select-turbo-freq-properties");
280	format_and_print(outf, base_level, header, NULL);
281	for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
282		int i;
283
284		if (fact_bucket != 0xff && fact_bucket != j)
285			continue;
286
287		if (!bucket_info[j].hp_cores)
288			break;
289
290		snprintf(header, sizeof(header), "bucket-%d", j);
291		format_and_print(outf, base_level + 1, header, NULL);
292
293		snprintf(header, sizeof(header), "high-priority-cores-count");
294		snprintf(value, sizeof(value), "%d",
295			 bucket_info[j].hp_cores);
296		format_and_print(outf, base_level + 2, header, value);
297		for (i = 0; i < trl_max_levels; i++) {
298			if (!bucket_info[j].hp_ratios[i] || (fact_avx != 0xFF && !(fact_avx & (1 << i))))
299				continue;
300			if (i == 0 && api_version() == 1 && !is_emr_platform())
301				snprintf(header, sizeof(header),
302					"high-priority-max-frequency(MHz)");
303			else
304				snprintf(header, sizeof(header),
305					"high-priority-max-%s-frequency(MHz)", isst_get_trl_level_name(i));
306			snprintf(value, sizeof(value), "%d",
307				bucket_info[j].hp_ratios[i] * isst_get_disp_freq_multiplier());
308			format_and_print(outf, base_level + 2, header, value);
309		}
310	}
311	snprintf(header, sizeof(header),
312		 "speed-select-turbo-freq-clip-frequencies");
313	format_and_print(outf, base_level + 1, header, NULL);
314
315	for (j = 0; j < trl_max_levels; j++) {
316		if (!fact_info->lp_ratios[j])
317			continue;
318
319		/* No AVX level name for SSE to be consistent with previous formatting */
320		if (j == 0 && api_version() == 1 && !is_emr_platform())
321			snprintf(header, sizeof(header), "low-priority-max-frequency(MHz)");
322		else
323			snprintf(header, sizeof(header), "low-priority-max-%s-frequency(MHz)",
324				isst_get_trl_level_name(j));
325		snprintf(value, sizeof(value), "%d",
326			 fact_info->lp_ratios[j] * isst_get_disp_freq_multiplier());
327		format_and_print(outf, base_level + 2, header, value);
328	}
329}
330
331void isst_ctdp_display_core_info(struct isst_id *id, FILE *outf, char *prefix,
332				 unsigned int val, char *str0, char *str1)
333{
334	char value[256];
335	int level = print_package_info(id, outf);
336
337	level++;
338
339	if (str0 && !val)
340		snprintf(value, sizeof(value), "%s", str0);
341	else if (str1 && val)
342		snprintf(value, sizeof(value), "%s", str1);
343	else
344		snprintf(value, sizeof(value), "%u", val);
345	format_and_print(outf, level, prefix, value);
346
347	format_and_print(outf, 1, NULL, NULL);
348}
349
350void isst_ctdp_display_information(struct isst_id *id, FILE *outf, int tdp_level,
351				   struct isst_pkg_ctdp *pkg_dev)
352{
353	static char header[256];
354	static char value[1024];
355	static int level;
356	int trl_max_levels = isst_get_trl_max_levels();
357	int i;
358
359	if (pkg_dev->processed)
360		level = print_package_info(id, outf);
361
362	for (i = 0; i <= pkg_dev->levels; ++i) {
363		struct isst_pkg_ctdp_level_info *ctdp_level;
364		int j, k;
365
366		ctdp_level = &pkg_dev->ctdp_level[i];
367		if (!ctdp_level->processed)
368			continue;
369
370		snprintf(header, sizeof(header), "perf-profile-level-%d",
371			 ctdp_level->level);
372		format_and_print(outf, level + 1, header, NULL);
373
374		if (id->cpu >= 0) {
375			snprintf(header, sizeof(header), "cpu-count");
376			j = get_cpu_count(id);
377			snprintf(value, sizeof(value), "%d", j);
378			format_and_print(outf, level + 2, header, value);
379
380			j = CPU_COUNT_S(ctdp_level->core_cpumask_size,
381					ctdp_level->core_cpumask);
382			if (j) {
383				snprintf(header, sizeof(header), "enable-cpu-count");
384				snprintf(value, sizeof(value), "%d", j);
385				format_and_print(outf, level + 2, header, value);
386			}
387
388			if (ctdp_level->core_cpumask_size) {
389				snprintf(header, sizeof(header), "enable-cpu-mask");
390				printcpumask(sizeof(value), value,
391					     ctdp_level->core_cpumask_size,
392					     ctdp_level->core_cpumask);
393				format_and_print(outf, level + 2, header, value);
394
395				snprintf(header, sizeof(header), "enable-cpu-list");
396				printcpulist(sizeof(value), value,
397					     ctdp_level->core_cpumask_size,
398					     ctdp_level->core_cpumask);
399				format_and_print(outf, level + 2, header, value);
400			}
401		}
402
403		snprintf(header, sizeof(header), "thermal-design-power-ratio");
404		snprintf(value, sizeof(value), "%d", ctdp_level->tdp_ratio);
405		format_and_print(outf, level + 2, header, value);
406
407		snprintf(header, sizeof(header), "base-frequency(MHz)");
408		if (!ctdp_level->sse_p1)
409			ctdp_level->sse_p1 = ctdp_level->tdp_ratio;
410		snprintf(value, sizeof(value), "%d",
411			  ctdp_level->sse_p1 * isst_get_disp_freq_multiplier());
412		format_and_print(outf, level + 2, header, value);
413
414		if (ctdp_level->avx2_p1) {
415			snprintf(header, sizeof(header), "base-frequency-avx2(MHz)");
416			snprintf(value, sizeof(value), "%d",
417				 ctdp_level->avx2_p1 * isst_get_disp_freq_multiplier());
418			format_and_print(outf, level + 2, header, value);
419		}
420
421		if (ctdp_level->avx512_p1) {
422			snprintf(header, sizeof(header), "base-frequency-avx512(MHz)");
423			snprintf(value, sizeof(value), "%d",
424				 ctdp_level->avx512_p1 * isst_get_disp_freq_multiplier());
425			format_and_print(outf, level + 2, header, value);
426		}
427
428		if (ctdp_level->uncore_pm) {
429			snprintf(header, sizeof(header), "uncore-frequency-min(MHz)");
430			snprintf(value, sizeof(value), "%d",
431				 ctdp_level->uncore_pm * isst_get_disp_freq_multiplier());
432			format_and_print(outf, level + 2, header, value);
433		}
434
435		if (ctdp_level->uncore_p0) {
436			snprintf(header, sizeof(header), "uncore-frequency-max(MHz)");
437			snprintf(value, sizeof(value), "%d",
438				 ctdp_level->uncore_p0 * isst_get_disp_freq_multiplier());
439			format_and_print(outf, level + 2, header, value);
440		}
441
442		if (ctdp_level->amx_p1) {
443			snprintf(header, sizeof(header), "base-frequency-amx(MHz)");
444			snprintf(value, sizeof(value), "%d",
445			ctdp_level->amx_p1 * isst_get_disp_freq_multiplier());
446			format_and_print(outf, level + 2, header, value);
447		}
448
449		if (ctdp_level->uncore_p1) {
450			snprintf(header, sizeof(header), "uncore-frequency-base(MHz)");
451			snprintf(value, sizeof(value), "%d",
452				 ctdp_level->uncore_p1 * isst_get_disp_freq_multiplier());
453			format_and_print(outf, level + 2, header, value);
454		}
455
456		if (ctdp_level->mem_freq) {
457			snprintf(header, sizeof(header), "max-mem-frequency(MHz)");
458			snprintf(value, sizeof(value), "%d",
459				 ctdp_level->mem_freq);
460			format_and_print(outf, level + 2, header, value);
461		}
462
463		if (api_version() > 1) {
464			snprintf(header, sizeof(header), "cooling_type");
465			snprintf(value, sizeof(value), "%d",
466				ctdp_level->cooling_type);
467			format_and_print(outf, level + 2, header, value);
468		}
469
470		snprintf(header, sizeof(header),
471			 "speed-select-turbo-freq");
472		if (ctdp_level->fact_support) {
473			if (ctdp_level->fact_enabled)
474				snprintf(value, sizeof(value), "enabled");
475			else
476				snprintf(value, sizeof(value), "disabled");
477		} else
478			snprintf(value, sizeof(value), "unsupported");
479		format_and_print(outf, level + 2, header, value);
480
481		snprintf(header, sizeof(header),
482			 "speed-select-base-freq");
483		if (ctdp_level->pbf_support) {
484			if (ctdp_level->pbf_enabled)
485				snprintf(value, sizeof(value), "enabled");
486			else
487				snprintf(value, sizeof(value), "disabled");
488		} else
489			snprintf(value, sizeof(value), "unsupported");
490		format_and_print(outf, level + 2, header, value);
491
492		snprintf(header, sizeof(header),
493			 "speed-select-core-power");
494		if (ctdp_level->sst_cp_support) {
495			if (ctdp_level->sst_cp_enabled)
496				snprintf(value, sizeof(value), "enabled");
497			else
498				snprintf(value, sizeof(value), "disabled");
499		} else
500			snprintf(value, sizeof(value), "unsupported");
501		format_and_print(outf, level + 2, header, value);
502
503		if (is_clx_n_platform()) {
504			if (ctdp_level->pbf_support)
505				_isst_pbf_display_information(id, outf,
506							      tdp_level,
507							  &ctdp_level->pbf_info,
508							      level + 2);
509			continue;
510		}
511
512		if (ctdp_level->pkg_tdp) {
513			snprintf(header, sizeof(header), "thermal-design-power(W)");
514			snprintf(value, sizeof(value), "%d", ctdp_level->pkg_tdp);
515			format_and_print(outf, level + 2, header, value);
516		}
517
518		if (ctdp_level->t_proc_hot) {
519			snprintf(header, sizeof(header), "tjunction-max(C)");
520			snprintf(value, sizeof(value), "%d", ctdp_level->t_proc_hot);
521			format_and_print(outf, level + 2, header, value);
522		}
523
524		for (k = 0; k < trl_max_levels; k++) {
525			if (!ctdp_level->trl_ratios[k][0])
526				continue;
527
528			snprintf(header, sizeof(header), "turbo-ratio-limits-%s", isst_get_trl_level_name(k));
529			format_and_print(outf, level + 2, header, NULL);
530
531			for (j = 0; j < 8; ++j) {
532				snprintf(header, sizeof(header), "bucket-%d", j);
533				format_and_print(outf, level + 3, header, NULL);
534
535				snprintf(header, sizeof(header), "core-count");
536
537				snprintf(value, sizeof(value), "%llu", (ctdp_level->trl_cores >> (j * 8)) & 0xff);
538				format_and_print(outf, level + 4, header, value);
539
540				snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
541				snprintf(value, sizeof(value), "%d", ctdp_level->trl_ratios[k][j] * isst_get_disp_freq_multiplier());
542				format_and_print(outf, level + 4, header, value);
543			}
544		}
545
546		if (ctdp_level->pbf_support)
547			_isst_pbf_display_information(id, outf, i,
548						      &ctdp_level->pbf_info,
549						      level + 2);
550		if (ctdp_level->fact_support)
551			_isst_fact_display_information(id, outf, i, 0xff, 0xff,
552						       &ctdp_level->fact_info,
553						       level + 2);
554	}
555
556	format_and_print(outf, 1, NULL, NULL);
557}
558
559static int start;
560void isst_ctdp_display_information_start(FILE *outf)
561{
562	last_level = 0;
563	format_and_print(outf, 0, "start", NULL);
564	start = 1;
565}
566
567void isst_ctdp_display_information_end(FILE *outf)
568{
569	format_and_print(outf, 0, NULL, NULL);
570	start = 0;
571}
572
573void isst_pbf_display_information(struct isst_id *id, FILE *outf, int level,
574				  struct isst_pbf_info *pbf_info)
575{
576	int _level;
577
578	_level = print_package_info(id, outf);
579	_isst_pbf_display_information(id, outf, level, pbf_info, _level + 1);
580	format_and_print(outf, 1, NULL, NULL);
581}
582
583void isst_fact_display_information(struct isst_id *id, FILE *outf, int level,
584				   int fact_bucket, int fact_avx,
585				   struct isst_fact_info *fact_info)
586{
587	int _level;
588
589	_level = print_package_info(id, outf);
590	_isst_fact_display_information(id, outf, level, fact_bucket, fact_avx,
591				       fact_info, _level + 1);
592	format_and_print(outf, 1, NULL, NULL);
593}
594
595void isst_clos_display_information(struct isst_id *id, FILE *outf, int clos,
596				   struct isst_clos_config *clos_config)
597{
598	char header[256];
599	char value[256];
600	int level;
601
602	level = print_package_info(id, outf);
603
604	snprintf(header, sizeof(header), "core-power");
605	format_and_print(outf, level + 1, header, NULL);
606
607	snprintf(header, sizeof(header), "clos");
608	snprintf(value, sizeof(value), "%d", clos);
609	format_and_print(outf, level + 2, header, value);
610
611	snprintf(header, sizeof(header), "epp");
612	snprintf(value, sizeof(value), "%d", clos_config->epp);
613	format_and_print(outf, level + 2, header, value);
614
615	snprintf(header, sizeof(header), "clos-proportional-priority");
616	snprintf(value, sizeof(value), "%d", clos_config->clos_prop_prio);
617	format_and_print(outf, level + 2, header, value);
618
619	snprintf(header, sizeof(header), "clos-min");
620	snprintf(value, sizeof(value), "%d MHz", clos_config->clos_min * isst_get_disp_freq_multiplier());
621	format_and_print(outf, level + 2, header, value);
622
623	snprintf(header, sizeof(header), "clos-max");
624	if ((clos_config->clos_max * isst_get_disp_freq_multiplier()) == 25500)
625		snprintf(value, sizeof(value), "Max Turbo frequency");
626	else
627		snprintf(value, sizeof(value), "%d MHz", clos_config->clos_max * isst_get_disp_freq_multiplier());
628	format_and_print(outf, level + 2, header, value);
629
630	snprintf(header, sizeof(header), "clos-desired");
631	snprintf(value, sizeof(value), "%d MHz", clos_config->clos_desired * isst_get_disp_freq_multiplier());
632	format_and_print(outf, level + 2, header, value);
633
634	format_and_print(outf, level, NULL, NULL);
635}
636
637void isst_clos_display_clos_information(struct isst_id *id, FILE *outf,
638					int clos_enable, int type,
639					int state, int cap)
640{
641	char header[256];
642	char value[256];
643	int level;
644
645	level = print_package_info(id, outf);
646
647	snprintf(header, sizeof(header), "core-power");
648	format_and_print(outf, level + 1, header, NULL);
649
650	snprintf(header, sizeof(header), "support-status");
651	if (cap)
652		snprintf(value, sizeof(value), "supported");
653	else
654		snprintf(value, sizeof(value), "unsupported");
655	format_and_print(outf, level + 2, header, value);
656
657	snprintf(header, sizeof(header), "enable-status");
658	if (state)
659		snprintf(value, sizeof(value), "enabled");
660	else
661		snprintf(value, sizeof(value), "disabled");
662	format_and_print(outf, level + 2, header, value);
663
664	snprintf(header, sizeof(header), "clos-enable-status");
665	if (clos_enable)
666		snprintf(value, sizeof(value), "enabled");
667	else
668		snprintf(value, sizeof(value), "disabled");
669	format_and_print(outf, level + 2, header, value);
670
671	snprintf(header, sizeof(header), "priority-type");
672	if (type)
673		snprintf(value, sizeof(value), "ordered");
674	else
675		snprintf(value, sizeof(value), "proportional");
676	format_and_print(outf, level + 2, header, value);
677
678	format_and_print(outf, level, NULL, NULL);
679}
680
681void isst_clos_display_assoc_information(struct isst_id *id, FILE *outf, int clos)
682{
683	char header[256];
684	char value[256];
685	int level;
686
687	level = print_package_info(id, outf);
688
689	snprintf(header, sizeof(header), "get-assoc");
690	format_and_print(outf, level + 1, header, NULL);
691
692	snprintf(header, sizeof(header), "clos");
693	snprintf(value, sizeof(value), "%d", clos);
694	format_and_print(outf, level + 2, header, value);
695
696	format_and_print(outf, level, NULL, NULL);
697}
698
699void isst_display_result(struct isst_id *id, FILE *outf, char *feature, char *cmd,
700			 int result)
701{
702	char header[256];
703	char value[256];
704	int level = 3;
705
706	level = print_package_info(id, outf);
707
708	snprintf(header, sizeof(header), "%s", feature);
709	format_and_print(outf, level + 1, header, NULL);
710	snprintf(header, sizeof(header), "%s", cmd);
711	if (!result)
712		snprintf(value, sizeof(value), "success");
713	else
714		snprintf(value, sizeof(value), "failed(error %d)", result);
715	format_and_print(outf, level + 2, header, value);
716
717	format_and_print(outf, level, NULL, NULL);
718}
719
720void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg)
721{
722	FILE *outf = get_output_file();
723	static int error_index;
724	char header[256];
725	char value[256];
726
727	if (!out_format_is_json()) {
728		if (arg_valid)
729			snprintf(value, sizeof(value), "%s %d", msg, arg);
730		else
731			snprintf(value, sizeof(value), "%s", msg);
732
733		if (error)
734			fprintf(outf, "Error: %s\n", value);
735		else
736			fprintf(outf, "Information: %s\n", value);
737		return;
738	}
739
740	if (!start)
741		format_and_print(outf, 0, "start", NULL);
742
743	if (error)
744		snprintf(header, sizeof(header), "Error%d", error_index++);
745	else
746		snprintf(header, sizeof(header), "Information:%d", error_index++);
747	format_and_print(outf, 1, header, NULL);
748
749	snprintf(header, sizeof(header), "message");
750	if (arg_valid)
751		snprintf(value, sizeof(value), "%s %d", msg, arg);
752	else
753		snprintf(value, sizeof(value), "%s", msg);
754
755	format_and_print(outf, 2, header, value);
756	format_and_print(outf, 1, NULL, NULL);
757	if (!start)
758		format_and_print(outf, 0, NULL, NULL);
759}
760
761void isst_trl_display_information(struct isst_id *id, FILE *outf, unsigned long long trl)
762{
763	char header[256];
764	char value[256];
765	int level;
766
767	level = print_package_info(id, outf);
768
769	snprintf(header, sizeof(header), "get-trl");
770	format_and_print(outf, level + 1, header, NULL);
771
772	snprintf(header, sizeof(header), "trl");
773	snprintf(value, sizeof(value), "0x%llx", trl);
774	format_and_print(outf, level + 2, header, value);
775
776	format_and_print(outf, level, NULL, NULL);
777}
778