1 // SPDX-License-Identifier: GPL-2.0
3 * Intel dynamic_speed_select -- Enumerate and control features
4 * Copyright (c) 2019 Intel Corporation.
9 static void printcpulist(int str_len, char *str, int mask_size,
12 int i, first, curr_index, index;
14 if (!CPU_COUNT_S(mask_size, cpu_mask)) {
15 snprintf(str, str_len, "none");
21 for (i = 0; i < get_topo_max_cpus(); ++i) {
22 if (!CPU_ISSET_S(i, mask_size, cpu_mask))
25 index = snprintf(&str[curr_index],
26 str_len - curr_index, ",");
28 if (curr_index >= str_len)
31 index = snprintf(&str[curr_index], str_len - curr_index, "%d",
34 if (curr_index >= str_len)
40 static void printcpumask(int str_len, char *str, int mask_size,
43 int i, max_cpus = get_topo_max_cpus();
45 int size, index, curr_index;
47 size = max_cpus / (sizeof(unsigned int) * 8);
48 if (max_cpus % (sizeof(unsigned int) * 8))
51 mask = calloc(size, sizeof(unsigned int));
55 for (i = 0; i < max_cpus; ++i) {
56 int mask_index, bit_index;
58 if (!CPU_ISSET_S(i, mask_size, cpu_mask))
61 mask_index = i / (sizeof(unsigned int) * 8);
62 bit_index = i % (sizeof(unsigned int) * 8);
63 mask[mask_index] |= BIT(bit_index);
67 for (i = size - 1; i >= 0; --i) {
68 index = snprintf(&str[curr_index], str_len - curr_index, "%08x",
71 if (curr_index >= str_len)
74 strncat(&str[curr_index], ",", str_len - curr_index);
77 if (curr_index >= str_len)
84 static void format_and_print_txt(FILE *outf, int level, char *header,
88 static char delimiters[256];
95 strcpy(delimiters, " ");
97 for (i = 0; i < level - 1; ++i)
98 j += snprintf(&delimiters[j], sizeof(delimiters) - j,
102 if (header && value) {
103 fprintf(outf, "%s", delimiters);
104 fprintf(outf, "%s:%s\n", header, value);
106 fprintf(outf, "%s", delimiters);
107 fprintf(outf, "%s\n", header);
111 static int last_level;
112 static void format_and_print(FILE *outf, int level, char *header, char *value)
115 static char delimiters[256];
118 if (!out_format_is_json()) {
119 format_and_print_txt(outf, level, header, value);
127 fprintf(outf, "\n}\n");
132 for (i = 0; i < level; ++i)
133 j += snprintf(&delimiters[j], sizeof(delimiters) - j,
136 if (last_level == level)
137 fprintf(outf, ",\n");
140 if (last_level != level)
143 fprintf(outf, "%s\"%s\": ", delimiters, header);
144 fprintf(outf, "\"%s\"", value);
146 for (i = last_level - 1; i >= level; --i) {
149 for (j = i; j > 0; --j)
150 k += snprintf(&delimiters[k],
151 sizeof(delimiters) - k,
153 if (i == level && header)
154 fprintf(outf, "\n%s},", delimiters);
156 fprintf(outf, "\n%s}", delimiters);
158 if (abs(last_level - level) < 3)
161 fprintf(outf, "%s\"%s\": {", delimiters,
169 static int print_package_info(struct isst_id *id, FILE *outf)
173 if (out_format_is_json()) {
174 snprintf(header, sizeof(header), "package-%d:die-%d:cpu-%d",
175 id->pkg, id->die, id->cpu);
176 format_and_print(outf, 1, header, NULL);
179 snprintf(header, sizeof(header), "package-%d", id->pkg);
180 format_and_print(outf, 1, header, NULL);
181 snprintf(header, sizeof(header), "die-%d", id->die);
182 format_and_print(outf, 2, header, NULL);
183 snprintf(header, sizeof(header), "cpu-%d", id->cpu);
184 format_and_print(outf, 3, header, NULL);
189 static void _isst_pbf_display_information(struct isst_id *id, FILE *outf, int level,
190 struct isst_pbf_info *pbf_info,
196 snprintf(header, sizeof(header), "speed-select-base-freq-properties");
197 format_and_print(outf, disp_level, header, NULL);
199 snprintf(header, sizeof(header), "high-priority-base-frequency(MHz)");
200 snprintf(value, sizeof(value), "%d",
201 pbf_info->p1_high * DISP_FREQ_MULTIPLIER);
202 format_and_print(outf, disp_level + 1, header, value);
204 snprintf(header, sizeof(header), "high-priority-cpu-mask");
205 printcpumask(sizeof(value), value, pbf_info->core_cpumask_size,
206 pbf_info->core_cpumask);
207 format_and_print(outf, disp_level + 1, header, value);
209 snprintf(header, sizeof(header), "high-priority-cpu-list");
210 printcpulist(sizeof(value), value,
211 pbf_info->core_cpumask_size,
212 pbf_info->core_cpumask);
213 format_and_print(outf, disp_level + 1, header, value);
215 snprintf(header, sizeof(header), "low-priority-base-frequency(MHz)");
216 snprintf(value, sizeof(value), "%d",
217 pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
218 format_and_print(outf, disp_level + 1, header, value);
220 if (is_clx_n_platform())
223 snprintf(header, sizeof(header), "tjunction-temperature(C)");
224 snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
225 format_and_print(outf, disp_level + 1, header, value);
227 snprintf(header, sizeof(header), "thermal-design-power(W)");
228 snprintf(value, sizeof(value), "%d", pbf_info->tdp);
229 format_and_print(outf, disp_level + 1, header, value);
232 static void _isst_fact_display_information(struct isst_id *id, FILE *outf, int level,
233 int fact_bucket, int fact_avx,
234 struct isst_fact_info *fact_info,
237 struct isst_fact_bucket_info *bucket_info = fact_info->bucket_info;
242 for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
243 if (fact_bucket != 0xff && fact_bucket != j)
246 if (!bucket_info[j].high_priority_cores_count)
252 fprintf(stderr, "Invalid bucket\n");
256 snprintf(header, sizeof(header), "speed-select-turbo-freq-properties");
257 format_and_print(outf, base_level, header, NULL);
258 for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
259 if (fact_bucket != 0xff && fact_bucket != j)
262 if (!bucket_info[j].high_priority_cores_count)
265 snprintf(header, sizeof(header), "bucket-%d", j);
266 format_and_print(outf, base_level + 1, header, NULL);
268 snprintf(header, sizeof(header), "high-priority-cores-count");
269 snprintf(value, sizeof(value), "%d",
270 bucket_info[j].high_priority_cores_count);
271 format_and_print(outf, base_level + 2, header, value);
273 if (fact_avx & 0x01) {
274 snprintf(header, sizeof(header),
275 "high-priority-max-frequency(MHz)");
276 snprintf(value, sizeof(value), "%d",
277 bucket_info[j].sse_trl * DISP_FREQ_MULTIPLIER);
278 format_and_print(outf, base_level + 2, header, value);
281 if (fact_avx & 0x02) {
282 snprintf(header, sizeof(header),
283 "high-priority-max-avx2-frequency(MHz)");
284 snprintf(value, sizeof(value), "%d",
285 bucket_info[j].avx_trl * DISP_FREQ_MULTIPLIER);
286 format_and_print(outf, base_level + 2, header, value);
289 if (fact_avx & 0x04) {
290 snprintf(header, sizeof(header),
291 "high-priority-max-avx512-frequency(MHz)");
292 snprintf(value, sizeof(value), "%d",
293 bucket_info[j].avx512_trl *
294 DISP_FREQ_MULTIPLIER);
295 format_and_print(outf, base_level + 2, header, value);
298 snprintf(header, sizeof(header),
299 "speed-select-turbo-freq-clip-frequencies");
300 format_and_print(outf, base_level + 1, header, NULL);
301 snprintf(header, sizeof(header), "low-priority-max-frequency(MHz)");
302 snprintf(value, sizeof(value), "%d",
303 fact_info->lp_clipping_ratio_license_sse *
304 DISP_FREQ_MULTIPLIER);
305 format_and_print(outf, base_level + 2, header, value);
306 snprintf(header, sizeof(header),
307 "low-priority-max-avx2-frequency(MHz)");
308 snprintf(value, sizeof(value), "%d",
309 fact_info->lp_clipping_ratio_license_avx2 *
310 DISP_FREQ_MULTIPLIER);
311 format_and_print(outf, base_level + 2, header, value);
312 snprintf(header, sizeof(header),
313 "low-priority-max-avx512-frequency(MHz)");
314 snprintf(value, sizeof(value), "%d",
315 fact_info->lp_clipping_ratio_license_avx512 *
316 DISP_FREQ_MULTIPLIER);
317 format_and_print(outf, base_level + 2, header, value);
320 void isst_ctdp_display_core_info(struct isst_id *id, FILE *outf, char *prefix,
321 unsigned int val, char *str0, char *str1)
327 if (out_format_is_json()) {
328 snprintf(header, sizeof(header), "package-%d:die-%d:cpu-%d",
329 id->pkg, id->die, id->cpu);
330 format_and_print(outf, level++, header, NULL);
332 snprintf(header, sizeof(header), "package-%d", id->pkg);
333 format_and_print(outf, level++, header, NULL);
334 snprintf(header, sizeof(header), "die-%d", id->die);
335 format_and_print(outf, level++, header, NULL);
336 snprintf(header, sizeof(header), "cpu-%d", id->cpu);
337 format_and_print(outf, level++, header, NULL);
341 snprintf(value, sizeof(value), "%s", str0);
342 else if (str1 && val)
343 snprintf(value, sizeof(value), "%s", str1);
345 snprintf(value, sizeof(value), "%u", val);
346 format_and_print(outf, level, prefix, value);
348 format_and_print(outf, 1, NULL, NULL);
351 void isst_ctdp_display_information(struct isst_id *id, FILE *outf, int tdp_level,
352 struct isst_pkg_ctdp *pkg_dev)
359 if (pkg_dev->processed)
360 level = print_package_info(id, outf);
362 for (i = 0; i <= pkg_dev->levels; ++i) {
363 struct isst_pkg_ctdp_level_info *ctdp_level;
366 ctdp_level = &pkg_dev->ctdp_level[i];
367 if (!ctdp_level->processed)
370 snprintf(header, sizeof(header), "perf-profile-level-%d",
372 format_and_print(outf, level + 1, header, NULL);
374 snprintf(header, sizeof(header), "cpu-count");
375 j = get_cpu_count(id);
376 snprintf(value, sizeof(value), "%d", j);
377 format_and_print(outf, level + 2, header, value);
379 j = CPU_COUNT_S(ctdp_level->core_cpumask_size,
380 ctdp_level->core_cpumask);
382 snprintf(header, sizeof(header), "enable-cpu-count");
383 snprintf(value, sizeof(value), "%d", j);
384 format_and_print(outf, level + 2, header, value);
387 if (ctdp_level->core_cpumask_size) {
388 snprintf(header, sizeof(header), "enable-cpu-mask");
389 printcpumask(sizeof(value), value,
390 ctdp_level->core_cpumask_size,
391 ctdp_level->core_cpumask);
392 format_and_print(outf, level + 2, header, value);
394 snprintf(header, sizeof(header), "enable-cpu-list");
395 printcpulist(sizeof(value), value,
396 ctdp_level->core_cpumask_size,
397 ctdp_level->core_cpumask);
398 format_and_print(outf, level + 2, header, value);
401 snprintf(header, sizeof(header), "thermal-design-power-ratio");
402 snprintf(value, sizeof(value), "%d", ctdp_level->tdp_ratio);
403 format_and_print(outf, level + 2, header, value);
405 snprintf(header, sizeof(header), "base-frequency(MHz)");
406 if (!ctdp_level->sse_p1)
407 ctdp_level->sse_p1 = ctdp_level->tdp_ratio;
408 snprintf(value, sizeof(value), "%d",
409 ctdp_level->sse_p1 * DISP_FREQ_MULTIPLIER);
410 format_and_print(outf, level + 2, header, value);
412 if (ctdp_level->avx2_p1) {
413 snprintf(header, sizeof(header), "base-frequency-avx2(MHz)");
414 snprintf(value, sizeof(value), "%d",
415 ctdp_level->avx2_p1 * DISP_FREQ_MULTIPLIER);
416 format_and_print(outf, level + 2, header, value);
419 if (ctdp_level->avx512_p1) {
420 snprintf(header, sizeof(header), "base-frequency-avx512(MHz)");
421 snprintf(value, sizeof(value), "%d",
422 ctdp_level->avx512_p1 * DISP_FREQ_MULTIPLIER);
423 format_and_print(outf, level + 2, header, value);
426 if (ctdp_level->uncore_pm) {
427 snprintf(header, sizeof(header), "uncore-frequency-min(MHz)");
428 snprintf(value, sizeof(value), "%d",
429 ctdp_level->uncore_pm * DISP_FREQ_MULTIPLIER);
430 format_and_print(outf, level + 2, header, value);
433 if (ctdp_level->uncore_p0) {
434 snprintf(header, sizeof(header), "uncore-frequency-max(MHz)");
435 snprintf(value, sizeof(value), "%d",
436 ctdp_level->uncore_p0 * DISP_FREQ_MULTIPLIER);
437 format_and_print(outf, level + 2, header, value);
440 if (ctdp_level->uncore_p1) {
441 snprintf(header, sizeof(header), "uncore-frequency-base(MHz)");
442 snprintf(value, sizeof(value), "%d",
443 ctdp_level->uncore_p1 * DISP_FREQ_MULTIPLIER);
444 format_and_print(outf, level + 2, header, value);
447 if (ctdp_level->mem_freq) {
448 snprintf(header, sizeof(header), "mem-frequency(MHz)");
449 snprintf(value, sizeof(value), "%d",
450 ctdp_level->mem_freq);
451 format_and_print(outf, level + 2, header, value);
454 snprintf(header, sizeof(header),
455 "speed-select-turbo-freq");
456 if (ctdp_level->fact_support) {
457 if (ctdp_level->fact_enabled)
458 snprintf(value, sizeof(value), "enabled");
460 snprintf(value, sizeof(value), "disabled");
462 snprintf(value, sizeof(value), "unsupported");
463 format_and_print(outf, level + 2, header, value);
465 snprintf(header, sizeof(header),
466 "speed-select-base-freq");
467 if (ctdp_level->pbf_support) {
468 if (ctdp_level->pbf_enabled)
469 snprintf(value, sizeof(value), "enabled");
471 snprintf(value, sizeof(value), "disabled");
473 snprintf(value, sizeof(value), "unsupported");
474 format_and_print(outf, level + 2, header, value);
476 snprintf(header, sizeof(header),
477 "speed-select-core-power");
478 if (ctdp_level->sst_cp_support) {
479 if (ctdp_level->sst_cp_enabled)
480 snprintf(value, sizeof(value), "enabled");
482 snprintf(value, sizeof(value), "disabled");
484 snprintf(value, sizeof(value), "unsupported");
485 format_and_print(outf, level + 2, header, value);
487 if (is_clx_n_platform()) {
488 if (ctdp_level->pbf_support)
489 _isst_pbf_display_information(id, outf,
491 &ctdp_level->pbf_info,
496 if (ctdp_level->pkg_tdp) {
497 snprintf(header, sizeof(header), "thermal-design-power(W)");
498 snprintf(value, sizeof(value), "%d", ctdp_level->pkg_tdp);
499 format_and_print(outf, level + 2, header, value);
502 if (ctdp_level->t_proc_hot) {
503 snprintf(header, sizeof(header), "tjunction-max(C)");
504 snprintf(value, sizeof(value), "%d", ctdp_level->t_proc_hot);
505 format_and_print(outf, level + 2, header, value);
508 snprintf(header, sizeof(header), "turbo-ratio-limits-sse");
509 format_and_print(outf, level + 2, header, NULL);
510 for (j = 0; j < 8; ++j) {
511 snprintf(header, sizeof(header), "bucket-%d", j);
512 format_and_print(outf, level + 3, header, NULL);
514 snprintf(header, sizeof(header), "core-count");
515 snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
516 format_and_print(outf, level + 4, header, value);
518 snprintf(header, sizeof(header),
519 "max-turbo-frequency(MHz)");
520 snprintf(value, sizeof(value), "%d",
521 ctdp_level->trl_sse_active_cores[j] *
522 DISP_FREQ_MULTIPLIER);
523 format_and_print(outf, level + 4, header, value);
526 if (ctdp_level->trl_avx_active_cores[0]) {
527 snprintf(header, sizeof(header), "turbo-ratio-limits-avx2");
528 format_and_print(outf, level + 2, header, NULL);
529 for (j = 0; j < 8; ++j) {
530 snprintf(header, sizeof(header), "bucket-%d", j);
531 format_and_print(outf, level + 3, header, NULL);
533 snprintf(header, sizeof(header), "core-count");
534 snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
535 format_and_print(outf, level + 4, header, value);
537 snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
538 snprintf(value, sizeof(value), "%d", ctdp_level->trl_avx_active_cores[j] * DISP_FREQ_MULTIPLIER);
539 format_and_print(outf, level + 4, header, value);
543 if (ctdp_level->trl_avx_512_active_cores[0]) {
544 snprintf(header, sizeof(header), "turbo-ratio-limits-avx512");
545 format_and_print(outf, level + 2, header, NULL);
546 for (j = 0; j < 8; ++j) {
547 snprintf(header, sizeof(header), "bucket-%d", j);
548 format_and_print(outf, level + 3, header, NULL);
550 snprintf(header, sizeof(header), "core-count");
551 snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
552 format_and_print(outf, level + 4, header, value);
554 snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
555 snprintf(value, sizeof(value), "%d", ctdp_level->trl_avx_512_active_cores[j] * DISP_FREQ_MULTIPLIER);
556 format_and_print(outf, level + 4, header, value);
560 if (ctdp_level->pbf_support)
561 _isst_pbf_display_information(id, outf, i,
562 &ctdp_level->pbf_info,
564 if (ctdp_level->fact_support)
565 _isst_fact_display_information(id, outf, i, 0xff, 0xff,
566 &ctdp_level->fact_info,
570 format_and_print(outf, 1, NULL, NULL);
574 void isst_ctdp_display_information_start(FILE *outf)
577 format_and_print(outf, 0, "start", NULL);
581 void isst_ctdp_display_information_end(FILE *outf)
583 format_and_print(outf, 0, NULL, NULL);
587 void isst_pbf_display_information(struct isst_id *id, FILE *outf, int level,
588 struct isst_pbf_info *pbf_info)
592 _level = print_package_info(id, outf);
593 _isst_pbf_display_information(id, outf, level, pbf_info, _level + 1);
594 format_and_print(outf, 1, NULL, NULL);
597 void isst_fact_display_information(struct isst_id *id, FILE *outf, int level,
598 int fact_bucket, int fact_avx,
599 struct isst_fact_info *fact_info)
603 _level = print_package_info(id, outf);
604 _isst_fact_display_information(id, outf, level, fact_bucket, fact_avx,
605 fact_info, _level + 1);
606 format_and_print(outf, 1, NULL, NULL);
609 void isst_clos_display_information(struct isst_id *id, FILE *outf, int clos,
610 struct isst_clos_config *clos_config)
616 level = print_package_info(id, outf);
618 snprintf(header, sizeof(header), "core-power");
619 format_and_print(outf, level + 1, header, NULL);
621 snprintf(header, sizeof(header), "clos");
622 snprintf(value, sizeof(value), "%d", clos);
623 format_and_print(outf, level + 2, header, value);
625 snprintf(header, sizeof(header), "epp");
626 snprintf(value, sizeof(value), "%d", clos_config->epp);
627 format_and_print(outf, level + 2, header, value);
629 snprintf(header, sizeof(header), "clos-proportional-priority");
630 snprintf(value, sizeof(value), "%d", clos_config->clos_prop_prio);
631 format_and_print(outf, level + 2, header, value);
633 snprintf(header, sizeof(header), "clos-min");
634 snprintf(value, sizeof(value), "%d MHz", clos_config->clos_min * DISP_FREQ_MULTIPLIER);
635 format_and_print(outf, level + 2, header, value);
637 snprintf(header, sizeof(header), "clos-max");
638 if (clos_config->clos_max == 0xff)
639 snprintf(value, sizeof(value), "Max Turbo frequency");
641 snprintf(value, sizeof(value), "%d MHz", clos_config->clos_max * DISP_FREQ_MULTIPLIER);
642 format_and_print(outf, level + 2, header, value);
644 snprintf(header, sizeof(header), "clos-desired");
645 snprintf(value, sizeof(value), "%d MHz", clos_config->clos_desired * DISP_FREQ_MULTIPLIER);
646 format_and_print(outf, level + 2, header, value);
648 format_and_print(outf, level, NULL, NULL);
651 void isst_clos_display_clos_information(struct isst_id *id, FILE *outf,
652 int clos_enable, int type,
659 level = print_package_info(id, outf);
661 snprintf(header, sizeof(header), "core-power");
662 format_and_print(outf, level + 1, header, NULL);
664 snprintf(header, sizeof(header), "support-status");
666 snprintf(value, sizeof(value), "supported");
668 snprintf(value, sizeof(value), "unsupported");
669 format_and_print(outf, level + 2, header, value);
671 snprintf(header, sizeof(header), "enable-status");
673 snprintf(value, sizeof(value), "enabled");
675 snprintf(value, sizeof(value), "disabled");
676 format_and_print(outf, level + 2, header, value);
678 snprintf(header, sizeof(header), "clos-enable-status");
680 snprintf(value, sizeof(value), "enabled");
682 snprintf(value, sizeof(value), "disabled");
683 format_and_print(outf, level + 2, header, value);
685 snprintf(header, sizeof(header), "priority-type");
687 snprintf(value, sizeof(value), "ordered");
689 snprintf(value, sizeof(value), "proportional");
690 format_and_print(outf, level + 2, header, value);
692 format_and_print(outf, level, NULL, NULL);
695 void isst_clos_display_assoc_information(struct isst_id *id, FILE *outf, int clos)
701 level = print_package_info(id, outf);
703 snprintf(header, sizeof(header), "get-assoc");
704 format_and_print(outf, level + 1, header, NULL);
706 snprintf(header, sizeof(header), "clos");
707 snprintf(value, sizeof(value), "%d", clos);
708 format_and_print(outf, level + 2, header, value);
710 format_and_print(outf, level, NULL, NULL);
713 void isst_display_result(struct isst_id *id, FILE *outf, char *feature, char *cmd,
721 level = print_package_info(id, outf);
723 snprintf(header, sizeof(header), "%s", feature);
724 format_and_print(outf, level + 1, header, NULL);
725 snprintf(header, sizeof(header), "%s", cmd);
727 snprintf(value, sizeof(value), "success");
729 snprintf(value, sizeof(value), "failed(error %d)", result);
730 format_and_print(outf, level + 2, header, value);
732 format_and_print(outf, level, NULL, NULL);
735 void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg)
737 FILE *outf = get_output_file();
738 static int error_index;
742 if (!out_format_is_json()) {
744 snprintf(value, sizeof(value), "%s %d", msg, arg);
746 snprintf(value, sizeof(value), "%s", msg);
749 fprintf(outf, "Error: %s\n", value);
751 fprintf(outf, "Information: %s\n", value);
756 format_and_print(outf, 0, "start", NULL);
759 snprintf(header, sizeof(header), "Error%d", error_index++);
761 snprintf(header, sizeof(header), "Information:%d", error_index++);
762 format_and_print(outf, 1, header, NULL);
764 snprintf(header, sizeof(header), "message");
766 snprintf(value, sizeof(value), "%s %d", msg, arg);
768 snprintf(value, sizeof(value), "%s", msg);
770 format_and_print(outf, 2, header, value);
771 format_and_print(outf, 1, NULL, NULL);
773 format_and_print(outf, 0, NULL, NULL);
776 void isst_trl_display_information(struct isst_id *id, FILE *outf, unsigned long long trl)
782 level = print_package_info(id, outf);
784 snprintf(header, sizeof(header), "get-trl");
785 format_and_print(outf, level + 1, header, NULL);
787 snprintf(header, sizeof(header), "trl");
788 snprintf(value, sizeof(value), "0x%llx", trl);
789 format_and_print(outf, level + 2, header, value);
791 format_and_print(outf, level, NULL, NULL);