778 lines · c
1// SPDX-License-Identifier: GPL-2.02/*3 * Intel dynamic_speed_select -- Enumerate and control features4 * 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 else127 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 else156 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 else181 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 else203 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 else304 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 else323 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 else344 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 else476 snprintf(value, sizeof(value), "disabled");477 } else478 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 else487 snprintf(value, sizeof(value), "disabled");488 } else489 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 else498 snprintf(value, sizeof(value), "disabled");499 } else500 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 else627 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 else654 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 else661 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 else668 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 else675 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 else714 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 else731 snprintf(value, sizeof(value), "%s", msg);732 733 if (error)734 fprintf(outf, "Error: %s\n", value);735 else736 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 else746 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 else753 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