0001
0002
0003
0004
0005
0006
0007 #include "isst.h"
0008
0009 static void printcpulist(int str_len, char *str, int mask_size,
0010 cpu_set_t *cpu_mask)
0011 {
0012 int i, first, curr_index, index;
0013
0014 if (!CPU_COUNT_S(mask_size, cpu_mask)) {
0015 snprintf(str, str_len, "none");
0016 return;
0017 }
0018
0019 curr_index = 0;
0020 first = 1;
0021 for (i = 0; i < get_topo_max_cpus(); ++i) {
0022 if (!CPU_ISSET_S(i, mask_size, cpu_mask))
0023 continue;
0024 if (!first) {
0025 index = snprintf(&str[curr_index],
0026 str_len - curr_index, ",");
0027 curr_index += index;
0028 if (curr_index >= str_len)
0029 break;
0030 }
0031 index = snprintf(&str[curr_index], str_len - curr_index, "%d",
0032 i);
0033 curr_index += index;
0034 if (curr_index >= str_len)
0035 break;
0036 first = 0;
0037 }
0038 }
0039
0040 static void printcpumask(int str_len, char *str, int mask_size,
0041 cpu_set_t *cpu_mask)
0042 {
0043 int i, max_cpus = get_topo_max_cpus();
0044 unsigned int *mask;
0045 int size, index, curr_index;
0046
0047 size = max_cpus / (sizeof(unsigned int) * 8);
0048 if (max_cpus % (sizeof(unsigned int) * 8))
0049 size++;
0050
0051 mask = calloc(size, sizeof(unsigned int));
0052 if (!mask)
0053 return;
0054
0055 for (i = 0; i < max_cpus; ++i) {
0056 int mask_index, bit_index;
0057
0058 if (!CPU_ISSET_S(i, mask_size, cpu_mask))
0059 continue;
0060
0061 mask_index = i / (sizeof(unsigned int) * 8);
0062 bit_index = i % (sizeof(unsigned int) * 8);
0063 mask[mask_index] |= BIT(bit_index);
0064 }
0065
0066 curr_index = 0;
0067 for (i = size - 1; i >= 0; --i) {
0068 index = snprintf(&str[curr_index], str_len - curr_index, "%08x",
0069 mask[i]);
0070 curr_index += index;
0071 if (curr_index >= str_len)
0072 break;
0073 if (i) {
0074 strncat(&str[curr_index], ",", str_len - curr_index);
0075 curr_index++;
0076 }
0077 if (curr_index >= str_len)
0078 break;
0079 }
0080
0081 free(mask);
0082 }
0083
0084 static void format_and_print_txt(FILE *outf, int level, char *header,
0085 char *value)
0086 {
0087 char *spaces = " ";
0088 static char delimiters[256];
0089 int i, j = 0;
0090
0091 if (!level)
0092 return;
0093
0094 if (level == 1) {
0095 strcpy(delimiters, " ");
0096 } else {
0097 for (i = 0; i < level - 1; ++i)
0098 j += snprintf(&delimiters[j], sizeof(delimiters) - j,
0099 "%s", spaces);
0100 }
0101
0102 if (header && value) {
0103 fprintf(outf, "%s", delimiters);
0104 fprintf(outf, "%s:%s\n", header, value);
0105 } else if (header) {
0106 fprintf(outf, "%s", delimiters);
0107 fprintf(outf, "%s\n", header);
0108 }
0109 }
0110
0111 static int last_level;
0112 static void format_and_print(FILE *outf, int level, char *header, char *value)
0113 {
0114 char *spaces = " ";
0115 static char delimiters[256];
0116 int i;
0117
0118 if (!out_format_is_json()) {
0119 format_and_print_txt(outf, level, header, value);
0120 return;
0121 }
0122
0123 if (level == 0) {
0124 if (header)
0125 fprintf(outf, "{");
0126 else
0127 fprintf(outf, "\n}\n");
0128
0129 } else {
0130 int j = 0;
0131
0132 for (i = 0; i < level; ++i)
0133 j += snprintf(&delimiters[j], sizeof(delimiters) - j,
0134 "%s", spaces);
0135
0136 if (last_level == level)
0137 fprintf(outf, ",\n");
0138
0139 if (value) {
0140 if (last_level != level)
0141 fprintf(outf, "\n");
0142
0143 fprintf(outf, "%s\"%s\": ", delimiters, header);
0144 fprintf(outf, "\"%s\"", value);
0145 } else {
0146 for (i = last_level - 1; i >= level; --i) {
0147 int k = 0;
0148
0149 for (j = i; j > 0; --j)
0150 k += snprintf(&delimiters[k],
0151 sizeof(delimiters) - k,
0152 "%s", spaces);
0153 if (i == level && header)
0154 fprintf(outf, "\n%s},", delimiters);
0155 else
0156 fprintf(outf, "\n%s}", delimiters);
0157 }
0158 if (abs(last_level - level) < 3)
0159 fprintf(outf, "\n");
0160 if (header)
0161 fprintf(outf, "%s\"%s\": {", delimiters,
0162 header);
0163 }
0164 }
0165
0166 last_level = level;
0167 }
0168
0169 static int print_package_info(int cpu, FILE *outf)
0170 {
0171 char header[256];
0172
0173 if (out_format_is_json()) {
0174 snprintf(header, sizeof(header), "package-%d:die-%d:cpu-%d",
0175 get_physical_package_id(cpu), get_physical_die_id(cpu),
0176 cpu);
0177 format_and_print(outf, 1, header, NULL);
0178 return 1;
0179 }
0180 snprintf(header, sizeof(header), "package-%d",
0181 get_physical_package_id(cpu));
0182 format_and_print(outf, 1, header, NULL);
0183 snprintf(header, sizeof(header), "die-%d", get_physical_die_id(cpu));
0184 format_and_print(outf, 2, header, NULL);
0185 snprintf(header, sizeof(header), "cpu-%d", cpu);
0186 format_and_print(outf, 3, header, NULL);
0187
0188 return 3;
0189 }
0190
0191 static void _isst_pbf_display_information(int cpu, FILE *outf, int level,
0192 struct isst_pbf_info *pbf_info,
0193 int disp_level)
0194 {
0195 char header[256];
0196 char value[512];
0197
0198 snprintf(header, sizeof(header), "speed-select-base-freq-properties");
0199 format_and_print(outf, disp_level, header, NULL);
0200
0201 snprintf(header, sizeof(header), "high-priority-base-frequency(MHz)");
0202 snprintf(value, sizeof(value), "%d",
0203 pbf_info->p1_high * DISP_FREQ_MULTIPLIER);
0204 format_and_print(outf, disp_level + 1, header, value);
0205
0206 snprintf(header, sizeof(header), "high-priority-cpu-mask");
0207 printcpumask(sizeof(value), value, pbf_info->core_cpumask_size,
0208 pbf_info->core_cpumask);
0209 format_and_print(outf, disp_level + 1, header, value);
0210
0211 snprintf(header, sizeof(header), "high-priority-cpu-list");
0212 printcpulist(sizeof(value), value,
0213 pbf_info->core_cpumask_size,
0214 pbf_info->core_cpumask);
0215 format_and_print(outf, disp_level + 1, header, value);
0216
0217 snprintf(header, sizeof(header), "low-priority-base-frequency(MHz)");
0218 snprintf(value, sizeof(value), "%d",
0219 pbf_info->p1_low * DISP_FREQ_MULTIPLIER);
0220 format_and_print(outf, disp_level + 1, header, value);
0221
0222 if (is_clx_n_platform())
0223 return;
0224
0225 snprintf(header, sizeof(header), "tjunction-temperature(C)");
0226 snprintf(value, sizeof(value), "%d", pbf_info->t_prochot);
0227 format_and_print(outf, disp_level + 1, header, value);
0228
0229 snprintf(header, sizeof(header), "thermal-design-power(W)");
0230 snprintf(value, sizeof(value), "%d", pbf_info->tdp);
0231 format_and_print(outf, disp_level + 1, header, value);
0232 }
0233
0234 static void _isst_fact_display_information(int cpu, FILE *outf, int level,
0235 int fact_bucket, int fact_avx,
0236 struct isst_fact_info *fact_info,
0237 int base_level)
0238 {
0239 struct isst_fact_bucket_info *bucket_info = fact_info->bucket_info;
0240 char header[256];
0241 char value[256];
0242 int print = 0, j;
0243
0244 for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
0245 if (fact_bucket != 0xff && fact_bucket != j)
0246 continue;
0247
0248 if (!bucket_info[j].high_priority_cores_count)
0249 break;
0250
0251 print = 1;
0252 }
0253 if (!print) {
0254 fprintf(stderr, "Invalid bucket\n");
0255 return;
0256 }
0257
0258 snprintf(header, sizeof(header), "speed-select-turbo-freq-properties");
0259 format_and_print(outf, base_level, header, NULL);
0260 for (j = 0; j < ISST_FACT_MAX_BUCKETS; ++j) {
0261 if (fact_bucket != 0xff && fact_bucket != j)
0262 continue;
0263
0264 if (!bucket_info[j].high_priority_cores_count)
0265 break;
0266
0267 snprintf(header, sizeof(header), "bucket-%d", j);
0268 format_and_print(outf, base_level + 1, header, NULL);
0269
0270 snprintf(header, sizeof(header), "high-priority-cores-count");
0271 snprintf(value, sizeof(value), "%d",
0272 bucket_info[j].high_priority_cores_count);
0273 format_and_print(outf, base_level + 2, header, value);
0274
0275 if (fact_avx & 0x01) {
0276 snprintf(header, sizeof(header),
0277 "high-priority-max-frequency(MHz)");
0278 snprintf(value, sizeof(value), "%d",
0279 bucket_info[j].sse_trl * DISP_FREQ_MULTIPLIER);
0280 format_and_print(outf, base_level + 2, header, value);
0281 }
0282
0283 if (fact_avx & 0x02) {
0284 snprintf(header, sizeof(header),
0285 "high-priority-max-avx2-frequency(MHz)");
0286 snprintf(value, sizeof(value), "%d",
0287 bucket_info[j].avx_trl * DISP_FREQ_MULTIPLIER);
0288 format_and_print(outf, base_level + 2, header, value);
0289 }
0290
0291 if (fact_avx & 0x04) {
0292 snprintf(header, sizeof(header),
0293 "high-priority-max-avx512-frequency(MHz)");
0294 snprintf(value, sizeof(value), "%d",
0295 bucket_info[j].avx512_trl *
0296 DISP_FREQ_MULTIPLIER);
0297 format_and_print(outf, base_level + 2, header, value);
0298 }
0299 }
0300 snprintf(header, sizeof(header),
0301 "speed-select-turbo-freq-clip-frequencies");
0302 format_and_print(outf, base_level + 1, header, NULL);
0303 snprintf(header, sizeof(header), "low-priority-max-frequency(MHz)");
0304 snprintf(value, sizeof(value), "%d",
0305 fact_info->lp_clipping_ratio_license_sse *
0306 DISP_FREQ_MULTIPLIER);
0307 format_and_print(outf, base_level + 2, header, value);
0308 snprintf(header, sizeof(header),
0309 "low-priority-max-avx2-frequency(MHz)");
0310 snprintf(value, sizeof(value), "%d",
0311 fact_info->lp_clipping_ratio_license_avx2 *
0312 DISP_FREQ_MULTIPLIER);
0313 format_and_print(outf, base_level + 2, header, value);
0314 snprintf(header, sizeof(header),
0315 "low-priority-max-avx512-frequency(MHz)");
0316 snprintf(value, sizeof(value), "%d",
0317 fact_info->lp_clipping_ratio_license_avx512 *
0318 DISP_FREQ_MULTIPLIER);
0319 format_and_print(outf, base_level + 2, header, value);
0320 }
0321
0322 void isst_ctdp_display_core_info(int cpu, FILE *outf, char *prefix,
0323 unsigned int val, char *str0, char *str1)
0324 {
0325 char header[256];
0326 char value[256];
0327 int level = 1;
0328
0329 if (out_format_is_json()) {
0330 snprintf(header, sizeof(header), "package-%d:die-%d:cpu-%d",
0331 get_physical_package_id(cpu), get_physical_die_id(cpu),
0332 cpu);
0333 format_and_print(outf, level++, header, NULL);
0334 } else {
0335 snprintf(header, sizeof(header), "package-%d",
0336 get_physical_package_id(cpu));
0337 format_and_print(outf, level++, header, NULL);
0338 snprintf(header, sizeof(header), "die-%d",
0339 get_physical_die_id(cpu));
0340 format_and_print(outf, level++, header, NULL);
0341 snprintf(header, sizeof(header), "cpu-%d", cpu);
0342 format_and_print(outf, level++, header, NULL);
0343 }
0344
0345 if (str0 && !val)
0346 snprintf(value, sizeof(value), "%s", str0);
0347 else if (str1 && val)
0348 snprintf(value, sizeof(value), "%s", str1);
0349 else
0350 snprintf(value, sizeof(value), "%u", val);
0351 format_and_print(outf, level, prefix, value);
0352
0353 format_and_print(outf, 1, NULL, NULL);
0354 }
0355
0356 void isst_ctdp_display_information(int cpu, FILE *outf, int tdp_level,
0357 struct isst_pkg_ctdp *pkg_dev)
0358 {
0359 char header[256];
0360 char value[512];
0361 static int level;
0362 int i;
0363
0364 if (pkg_dev->processed)
0365 level = print_package_info(cpu, outf);
0366
0367 for (i = 0; i <= pkg_dev->levels; ++i) {
0368 struct isst_pkg_ctdp_level_info *ctdp_level;
0369 int j;
0370
0371 ctdp_level = &pkg_dev->ctdp_level[i];
0372 if (!ctdp_level->processed)
0373 continue;
0374
0375 snprintf(header, sizeof(header), "perf-profile-level-%d",
0376 ctdp_level->level);
0377 format_and_print(outf, level + 1, header, NULL);
0378
0379 snprintf(header, sizeof(header), "cpu-count");
0380 j = get_cpu_count(get_physical_die_id(cpu),
0381 get_physical_die_id(cpu));
0382 snprintf(value, sizeof(value), "%d", j);
0383 format_and_print(outf, level + 2, header, value);
0384
0385 j = CPU_COUNT_S(ctdp_level->core_cpumask_size,
0386 ctdp_level->core_cpumask);
0387 if (j) {
0388 snprintf(header, sizeof(header), "enable-cpu-count");
0389 snprintf(value, sizeof(value), "%d", j);
0390 format_and_print(outf, level + 2, header, value);
0391 }
0392
0393 if (ctdp_level->core_cpumask_size) {
0394 snprintf(header, sizeof(header), "enable-cpu-mask");
0395 printcpumask(sizeof(value), value,
0396 ctdp_level->core_cpumask_size,
0397 ctdp_level->core_cpumask);
0398 format_and_print(outf, level + 2, header, value);
0399
0400 snprintf(header, sizeof(header), "enable-cpu-list");
0401 printcpulist(sizeof(value), value,
0402 ctdp_level->core_cpumask_size,
0403 ctdp_level->core_cpumask);
0404 format_and_print(outf, level + 2, header, value);
0405 }
0406
0407 snprintf(header, sizeof(header), "thermal-design-power-ratio");
0408 snprintf(value, sizeof(value), "%d", ctdp_level->tdp_ratio);
0409 format_and_print(outf, level + 2, header, value);
0410
0411 snprintf(header, sizeof(header), "base-frequency(MHz)");
0412 if (!ctdp_level->sse_p1)
0413 ctdp_level->sse_p1 = ctdp_level->tdp_ratio;
0414 snprintf(value, sizeof(value), "%d",
0415 ctdp_level->sse_p1 * DISP_FREQ_MULTIPLIER);
0416 format_and_print(outf, level + 2, header, value);
0417
0418 if (ctdp_level->avx2_p1) {
0419 snprintf(header, sizeof(header), "base-frequency-avx2(MHz)");
0420 snprintf(value, sizeof(value), "%d",
0421 ctdp_level->avx2_p1 * DISP_FREQ_MULTIPLIER);
0422 format_and_print(outf, level + 2, header, value);
0423 }
0424
0425 if (ctdp_level->avx512_p1) {
0426 snprintf(header, sizeof(header), "base-frequency-avx512(MHz)");
0427 snprintf(value, sizeof(value), "%d",
0428 ctdp_level->avx512_p1 * DISP_FREQ_MULTIPLIER);
0429 format_and_print(outf, level + 2, header, value);
0430 }
0431
0432 if (ctdp_level->uncore_p1) {
0433 snprintf(header, sizeof(header), "uncore-frequency-min(MHz)");
0434 snprintf(value, sizeof(value), "%d",
0435 ctdp_level->uncore_p1 * DISP_FREQ_MULTIPLIER);
0436 format_and_print(outf, level + 2, header, value);
0437 }
0438
0439 if (ctdp_level->uncore_p0) {
0440 snprintf(header, sizeof(header), "uncore-frequency-max(MHz)");
0441 snprintf(value, sizeof(value), "%d",
0442 ctdp_level->uncore_p0 * DISP_FREQ_MULTIPLIER);
0443 format_and_print(outf, level + 2, header, value);
0444 }
0445
0446 if (ctdp_level->mem_freq) {
0447 snprintf(header, sizeof(header), "mem-frequency(MHz)");
0448 snprintf(value, sizeof(value), "%d",
0449 ctdp_level->mem_freq);
0450 format_and_print(outf, level + 2, header, value);
0451 }
0452
0453 snprintf(header, sizeof(header),
0454 "speed-select-turbo-freq");
0455 if (ctdp_level->fact_support) {
0456 if (ctdp_level->fact_enabled)
0457 snprintf(value, sizeof(value), "enabled");
0458 else
0459 snprintf(value, sizeof(value), "disabled");
0460 } else
0461 snprintf(value, sizeof(value), "unsupported");
0462 format_and_print(outf, level + 2, header, value);
0463
0464 snprintf(header, sizeof(header),
0465 "speed-select-base-freq");
0466 if (ctdp_level->pbf_support) {
0467 if (ctdp_level->pbf_enabled)
0468 snprintf(value, sizeof(value), "enabled");
0469 else
0470 snprintf(value, sizeof(value), "disabled");
0471 } else
0472 snprintf(value, sizeof(value), "unsupported");
0473 format_and_print(outf, level + 2, header, value);
0474
0475 snprintf(header, sizeof(header),
0476 "speed-select-core-power");
0477 if (ctdp_level->sst_cp_support) {
0478 if (ctdp_level->sst_cp_enabled)
0479 snprintf(value, sizeof(value), "enabled");
0480 else
0481 snprintf(value, sizeof(value), "disabled");
0482 } else
0483 snprintf(value, sizeof(value), "unsupported");
0484 format_and_print(outf, level + 2, header, value);
0485
0486 if (is_clx_n_platform()) {
0487 if (ctdp_level->pbf_support)
0488 _isst_pbf_display_information(cpu, outf,
0489 tdp_level,
0490 &ctdp_level->pbf_info,
0491 level + 2);
0492 continue;
0493 }
0494
0495 if (ctdp_level->pkg_tdp) {
0496 snprintf(header, sizeof(header), "thermal-design-power(W)");
0497 snprintf(value, sizeof(value), "%d", ctdp_level->pkg_tdp);
0498 format_and_print(outf, level + 2, header, value);
0499 }
0500
0501 if (ctdp_level->t_proc_hot) {
0502 snprintf(header, sizeof(header), "tjunction-max(C)");
0503 snprintf(value, sizeof(value), "%d", ctdp_level->t_proc_hot);
0504 format_and_print(outf, level + 2, header, value);
0505 }
0506
0507 snprintf(header, sizeof(header), "turbo-ratio-limits-sse");
0508 format_and_print(outf, level + 2, header, NULL);
0509 for (j = 0; j < 8; ++j) {
0510 snprintf(header, sizeof(header), "bucket-%d", j);
0511 format_and_print(outf, level + 3, header, NULL);
0512
0513 snprintf(header, sizeof(header), "core-count");
0514 snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
0515 format_and_print(outf, level + 4, header, value);
0516
0517 snprintf(header, sizeof(header),
0518 "max-turbo-frequency(MHz)");
0519 snprintf(value, sizeof(value), "%d",
0520 ctdp_level->trl_sse_active_cores[j] *
0521 DISP_FREQ_MULTIPLIER);
0522 format_and_print(outf, level + 4, header, value);
0523 }
0524
0525 if (ctdp_level->trl_avx_active_cores[0]) {
0526 snprintf(header, sizeof(header), "turbo-ratio-limits-avx2");
0527 format_and_print(outf, level + 2, header, NULL);
0528 for (j = 0; j < 8; ++j) {
0529 snprintf(header, sizeof(header), "bucket-%d", j);
0530 format_and_print(outf, level + 3, header, NULL);
0531
0532 snprintf(header, sizeof(header), "core-count");
0533 snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
0534 format_and_print(outf, level + 4, header, value);
0535
0536 snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
0537 snprintf(value, sizeof(value), "%d", ctdp_level->trl_avx_active_cores[j] * DISP_FREQ_MULTIPLIER);
0538 format_and_print(outf, level + 4, header, value);
0539 }
0540 }
0541
0542 if (ctdp_level->trl_avx_512_active_cores[0]) {
0543 snprintf(header, sizeof(header), "turbo-ratio-limits-avx512");
0544 format_and_print(outf, level + 2, header, NULL);
0545 for (j = 0; j < 8; ++j) {
0546 snprintf(header, sizeof(header), "bucket-%d", j);
0547 format_and_print(outf, level + 3, header, NULL);
0548
0549 snprintf(header, sizeof(header), "core-count");
0550 snprintf(value, sizeof(value), "%llu", (ctdp_level->buckets_info >> (j * 8)) & 0xff);
0551 format_and_print(outf, level + 4, header, value);
0552
0553 snprintf(header, sizeof(header), "max-turbo-frequency(MHz)");
0554 snprintf(value, sizeof(value), "%d", ctdp_level->trl_avx_512_active_cores[j] * DISP_FREQ_MULTIPLIER);
0555 format_and_print(outf, level + 4, header, value);
0556 }
0557 }
0558
0559 if (ctdp_level->pbf_support)
0560 _isst_pbf_display_information(cpu, outf, i,
0561 &ctdp_level->pbf_info,
0562 level + 2);
0563 if (ctdp_level->fact_support)
0564 _isst_fact_display_information(cpu, outf, i, 0xff, 0xff,
0565 &ctdp_level->fact_info,
0566 level + 2);
0567 }
0568
0569 format_and_print(outf, 1, NULL, NULL);
0570 }
0571
0572 static int start;
0573 void isst_ctdp_display_information_start(FILE *outf)
0574 {
0575 last_level = 0;
0576 format_and_print(outf, 0, "start", NULL);
0577 start = 1;
0578 }
0579
0580 void isst_ctdp_display_information_end(FILE *outf)
0581 {
0582 format_and_print(outf, 0, NULL, NULL);
0583 start = 0;
0584 }
0585
0586 void isst_pbf_display_information(int cpu, FILE *outf, int level,
0587 struct isst_pbf_info *pbf_info)
0588 {
0589 int _level;
0590
0591 _level = print_package_info(cpu, outf);
0592 _isst_pbf_display_information(cpu, outf, level, pbf_info, _level + 1);
0593 format_and_print(outf, 1, NULL, NULL);
0594 }
0595
0596 void isst_fact_display_information(int cpu, FILE *outf, int level,
0597 int fact_bucket, int fact_avx,
0598 struct isst_fact_info *fact_info)
0599 {
0600 int _level;
0601
0602 _level = print_package_info(cpu, outf);
0603 _isst_fact_display_information(cpu, outf, level, fact_bucket, fact_avx,
0604 fact_info, _level + 1);
0605 format_and_print(outf, 1, NULL, NULL);
0606 }
0607
0608 void isst_clos_display_information(int cpu, FILE *outf, int clos,
0609 struct isst_clos_config *clos_config)
0610 {
0611 char header[256];
0612 char value[256];
0613 int level;
0614
0615 level = print_package_info(cpu, outf);
0616
0617 snprintf(header, sizeof(header), "core-power");
0618 format_and_print(outf, level + 1, header, NULL);
0619
0620 snprintf(header, sizeof(header), "clos");
0621 snprintf(value, sizeof(value), "%d", clos);
0622 format_and_print(outf, level + 2, header, value);
0623
0624 snprintf(header, sizeof(header), "epp");
0625 snprintf(value, sizeof(value), "%d", clos_config->epp);
0626 format_and_print(outf, level + 2, header, value);
0627
0628 snprintf(header, sizeof(header), "clos-proportional-priority");
0629 snprintf(value, sizeof(value), "%d", clos_config->clos_prop_prio);
0630 format_and_print(outf, level + 2, header, value);
0631
0632 snprintf(header, sizeof(header), "clos-min");
0633 snprintf(value, sizeof(value), "%d MHz", clos_config->clos_min * DISP_FREQ_MULTIPLIER);
0634 format_and_print(outf, level + 2, header, value);
0635
0636 snprintf(header, sizeof(header), "clos-max");
0637 if (clos_config->clos_max == 0xff)
0638 snprintf(value, sizeof(value), "Max Turbo frequency");
0639 else
0640 snprintf(value, sizeof(value), "%d MHz", clos_config->clos_max * DISP_FREQ_MULTIPLIER);
0641 format_and_print(outf, level + 2, header, value);
0642
0643 snprintf(header, sizeof(header), "clos-desired");
0644 snprintf(value, sizeof(value), "%d MHz", clos_config->clos_desired * DISP_FREQ_MULTIPLIER);
0645 format_and_print(outf, level + 2, header, value);
0646
0647 format_and_print(outf, level, NULL, NULL);
0648 }
0649
0650 void isst_clos_display_clos_information(int cpu, FILE *outf,
0651 int clos_enable, int type,
0652 int state, int cap)
0653 {
0654 char header[256];
0655 char value[256];
0656 int level;
0657
0658 level = print_package_info(cpu, outf);
0659
0660 snprintf(header, sizeof(header), "core-power");
0661 format_and_print(outf, level + 1, header, NULL);
0662
0663 snprintf(header, sizeof(header), "support-status");
0664 if (cap)
0665 snprintf(value, sizeof(value), "supported");
0666 else
0667 snprintf(value, sizeof(value), "unsupported");
0668 format_and_print(outf, level + 2, header, value);
0669
0670 snprintf(header, sizeof(header), "enable-status");
0671 if (state)
0672 snprintf(value, sizeof(value), "enabled");
0673 else
0674 snprintf(value, sizeof(value), "disabled");
0675 format_and_print(outf, level + 2, header, value);
0676
0677 snprintf(header, sizeof(header), "clos-enable-status");
0678 if (clos_enable)
0679 snprintf(value, sizeof(value), "enabled");
0680 else
0681 snprintf(value, sizeof(value), "disabled");
0682 format_and_print(outf, level + 2, header, value);
0683
0684 snprintf(header, sizeof(header), "priority-type");
0685 if (type)
0686 snprintf(value, sizeof(value), "ordered");
0687 else
0688 snprintf(value, sizeof(value), "proportional");
0689 format_and_print(outf, level + 2, header, value);
0690
0691 format_and_print(outf, level, NULL, NULL);
0692 }
0693
0694 void isst_clos_display_assoc_information(int cpu, FILE *outf, int clos)
0695 {
0696 char header[256];
0697 char value[256];
0698 int level;
0699
0700 level = print_package_info(cpu, outf);
0701
0702 snprintf(header, sizeof(header), "get-assoc");
0703 format_and_print(outf, level + 1, header, NULL);
0704
0705 snprintf(header, sizeof(header), "clos");
0706 snprintf(value, sizeof(value), "%d", clos);
0707 format_and_print(outf, level + 2, header, value);
0708
0709 format_and_print(outf, level, NULL, NULL);
0710 }
0711
0712 void isst_display_result(int cpu, FILE *outf, char *feature, char *cmd,
0713 int result)
0714 {
0715 char header[256];
0716 char value[256];
0717 int level = 3;
0718
0719 if (cpu >= 0)
0720 level = print_package_info(cpu, outf);
0721
0722 snprintf(header, sizeof(header), "%s", feature);
0723 format_and_print(outf, level + 1, header, NULL);
0724 snprintf(header, sizeof(header), "%s", cmd);
0725 if (!result)
0726 snprintf(value, sizeof(value), "success");
0727 else
0728 snprintf(value, sizeof(value), "failed(error %d)", result);
0729 format_and_print(outf, level + 2, header, value);
0730
0731 format_and_print(outf, level, NULL, NULL);
0732 }
0733
0734 void isst_display_error_info_message(int error, char *msg, int arg_valid, int arg)
0735 {
0736 FILE *outf = get_output_file();
0737 static int error_index;
0738 char header[256];
0739 char value[256];
0740
0741 if (!out_format_is_json()) {
0742 if (arg_valid)
0743 snprintf(value, sizeof(value), "%s %d", msg, arg);
0744 else
0745 snprintf(value, sizeof(value), "%s", msg);
0746
0747 if (error)
0748 fprintf(outf, "Error: %s\n", value);
0749 else
0750 fprintf(outf, "Information: %s\n", value);
0751 return;
0752 }
0753
0754 if (!start)
0755 format_and_print(outf, 0, "start", NULL);
0756
0757 if (error)
0758 snprintf(header, sizeof(header), "Error%d", error_index++);
0759 else
0760 snprintf(header, sizeof(header), "Information:%d", error_index++);
0761 format_and_print(outf, 1, header, NULL);
0762
0763 snprintf(header, sizeof(header), "message");
0764 if (arg_valid)
0765 snprintf(value, sizeof(value), "%s %d", msg, arg);
0766 else
0767 snprintf(value, sizeof(value), "%s", msg);
0768
0769 format_and_print(outf, 2, header, value);
0770 format_and_print(outf, 1, NULL, NULL);
0771 if (!start)
0772 format_and_print(outf, 0, NULL, NULL);
0773 }
0774
0775 void isst_trl_display_information(int cpu, FILE *outf, unsigned long long trl)
0776 {
0777 char header[256];
0778 char value[256];
0779 int level;
0780
0781 level = print_package_info(cpu, outf);
0782
0783 snprintf(header, sizeof(header), "get-trl");
0784 format_and_print(outf, level + 1, header, NULL);
0785
0786 snprintf(header, sizeof(header), "trl");
0787 snprintf(value, sizeof(value), "0x%llx", trl);
0788 format_and_print(outf, level + 2, header, value);
0789
0790 format_and_print(outf, level, NULL, NULL);
0791 }