attr_test.c 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. /*
  3. * PAPR Energy attributes sniff test
  4. * This checks if the papr folders and contents are populated relating to
  5. * the energy and frequency attributes
  6. *
  7. * Copyright 2022, Pratik Rajesh Sampat, IBM Corp.
  8. */
  9. #include <errno.h>
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <dirent.h>
  13. #include <sys/types.h>
  14. #include <sys/stat.h>
  15. #include <unistd.h>
  16. #include <stdlib.h>
  17. #include "utils.h"
  18. enum energy_freq_attrs {
  19. POWER_PERFORMANCE_MODE = 1,
  20. IDLE_POWER_SAVER_STATUS = 2,
  21. MIN_FREQ = 3,
  22. STAT_FREQ = 4,
  23. MAX_FREQ = 6,
  24. PROC_FOLDING_STATUS = 8
  25. };
  26. enum type {
  27. INVALID,
  28. STR_VAL,
  29. NUM_VAL
  30. };
  31. static int value_type(int id)
  32. {
  33. int val_type;
  34. switch (id) {
  35. case POWER_PERFORMANCE_MODE:
  36. case IDLE_POWER_SAVER_STATUS:
  37. val_type = STR_VAL;
  38. break;
  39. case MIN_FREQ:
  40. case STAT_FREQ:
  41. case MAX_FREQ:
  42. case PROC_FOLDING_STATUS:
  43. val_type = NUM_VAL;
  44. break;
  45. default:
  46. val_type = INVALID;
  47. }
  48. return val_type;
  49. }
  50. static int verify_energy_info(void)
  51. {
  52. const char *path = "/sys/firmware/papr/energy_scale_info";
  53. struct dirent *entry;
  54. struct stat s;
  55. DIR *dirp;
  56. errno = 0;
  57. if (stat(path, &s)) {
  58. SKIP_IF(errno == ENOENT);
  59. FAIL_IF(errno);
  60. }
  61. FAIL_IF(!S_ISDIR(s.st_mode));
  62. dirp = opendir(path);
  63. while ((entry = readdir(dirp)) != NULL) {
  64. char file_name[64];
  65. int id, attr_type;
  66. FILE *f;
  67. if (strcmp(entry->d_name, ".") == 0 ||
  68. strcmp(entry->d_name, "..") == 0)
  69. continue;
  70. id = atoi(entry->d_name);
  71. attr_type = value_type(id);
  72. FAIL_IF(attr_type == INVALID);
  73. /* Check if the files exist and have data in them */
  74. sprintf(file_name, "%s/%d/desc", path, id);
  75. f = fopen(file_name, "r");
  76. FAIL_IF(!f);
  77. FAIL_IF(fgetc(f) == EOF);
  78. sprintf(file_name, "%s/%d/value", path, id);
  79. f = fopen(file_name, "r");
  80. FAIL_IF(!f);
  81. FAIL_IF(fgetc(f) == EOF);
  82. if (attr_type == STR_VAL) {
  83. sprintf(file_name, "%s/%d/value_desc", path, id);
  84. f = fopen(file_name, "r");
  85. FAIL_IF(!f);
  86. FAIL_IF(fgetc(f) == EOF);
  87. }
  88. }
  89. return 0;
  90. }
  91. int main(void)
  92. {
  93. return test_harness(verify_energy_info, "papr_attributes");
  94. }