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 10 #include <errno.h> 11 #include <stdio.h> 12 #include <string.h> 13 #include <dirent.h> 14 #include <sys/types.h> 15 #include <sys/stat.h> 16 #include <unistd.h> 17 #include <stdlib.h> 18 19 #include "utils.h" 20 21 enum energy_freq_attrs { 22 POWER_PERFORMANCE_MODE = 1, 23 IDLE_POWER_SAVER_STATUS = 2, 24 MIN_FREQ = 3, 25 STAT_FREQ = 4, 26 MAX_FREQ = 6, 27 PROC_FOLDING_STATUS = 8 28 }; 29 30 enum type { 31 INVALID, 32 STR_VAL, 33 NUM_VAL 34 }; 35 36 static int value_type(int id) 37 { 38 int val_type; 39 40 switch (id) { 41 case POWER_PERFORMANCE_MODE: 42 case IDLE_POWER_SAVER_STATUS: 43 val_type = STR_VAL; 44 break; 45 case MIN_FREQ: 46 case STAT_FREQ: 47 case MAX_FREQ: 48 case PROC_FOLDING_STATUS: 49 val_type = NUM_VAL; 50 break; 51 default: 52 val_type = INVALID; 53 } 54 55 return val_type; 56 } 57 58 static int verify_energy_info(void) 59 { 60 const char *path = "/sys/firmware/papr/energy_scale_info"; 61 struct dirent *entry; 62 struct stat s; 63 DIR *dirp; 64 65 errno = 0; 66 if (stat(path, &s)) { 67 SKIP_IF(errno == ENOENT); 68 FAIL_IF(errno); 69 } 70 71 FAIL_IF(!S_ISDIR(s.st_mode)); 72 73 dirp = opendir(path); 74 75 while ((entry = readdir(dirp)) != NULL) { 76 char file_name[64]; 77 int id, attr_type; 78 FILE *f; 79 80 if (strcmp(entry->d_name, ".") == 0 || 81 strcmp(entry->d_name, "..") == 0) 82 continue; 83 84 id = atoi(entry->d_name); 85 attr_type = value_type(id); 86 FAIL_IF(attr_type == INVALID); 87 88 /* Check if the files exist and have data in them */ 89 sprintf(file_name, "%s/%d/desc", path, id); 90 f = fopen(file_name, "r"); 91 FAIL_IF(!f); 92 FAIL_IF(fgetc(f) == EOF); 93 94 sprintf(file_name, "%s/%d/value", path, id); 95 f = fopen(file_name, "r"); 96 FAIL_IF(!f); 97 FAIL_IF(fgetc(f) == EOF); 98 99 if (attr_type == STR_VAL) { 100 sprintf(file_name, "%s/%d/value_desc", path, id); 101 f = fopen(file_name, "r"); 102 FAIL_IF(!f); 103 FAIL_IF(fgetc(f) == EOF); 104 } 105 } 106 107 return 0; 108 } 109 110 int main(void) 111 { 112 return test_harness(verify_energy_info, "papr_attributes"); 113 } 114