157201d65SPratik R. Sampat // SPDX-License-Identifier: GPL-2.0-or-later
257201d65SPratik R. Sampat /*
357201d65SPratik R. Sampat * PAPR Energy attributes sniff test
457201d65SPratik R. Sampat * This checks if the papr folders and contents are populated relating to
557201d65SPratik R. Sampat * the energy and frequency attributes
657201d65SPratik R. Sampat *
757201d65SPratik R. Sampat * Copyright 2022, Pratik Rajesh Sampat, IBM Corp.
857201d65SPratik R. Sampat */
957201d65SPratik R. Sampat
10*4228a996SMichael Ellerman #include <errno.h>
1157201d65SPratik R. Sampat #include <stdio.h>
1257201d65SPratik R. Sampat #include <string.h>
1357201d65SPratik R. Sampat #include <dirent.h>
1457201d65SPratik R. Sampat #include <sys/types.h>
1557201d65SPratik R. Sampat #include <sys/stat.h>
1657201d65SPratik R. Sampat #include <unistd.h>
1757201d65SPratik R. Sampat #include <stdlib.h>
1857201d65SPratik R. Sampat
1957201d65SPratik R. Sampat #include "utils.h"
2057201d65SPratik R. Sampat
2157201d65SPratik R. Sampat enum energy_freq_attrs {
2257201d65SPratik R. Sampat POWER_PERFORMANCE_MODE = 1,
2357201d65SPratik R. Sampat IDLE_POWER_SAVER_STATUS = 2,
2457201d65SPratik R. Sampat MIN_FREQ = 3,
2557201d65SPratik R. Sampat STAT_FREQ = 4,
2657201d65SPratik R. Sampat MAX_FREQ = 6,
2757201d65SPratik R. Sampat PROC_FOLDING_STATUS = 8
2857201d65SPratik R. Sampat };
2957201d65SPratik R. Sampat
3057201d65SPratik R. Sampat enum type {
3157201d65SPratik R. Sampat INVALID,
3257201d65SPratik R. Sampat STR_VAL,
3357201d65SPratik R. Sampat NUM_VAL
3457201d65SPratik R. Sampat };
3557201d65SPratik R. Sampat
value_type(int id)36*4228a996SMichael Ellerman static int value_type(int id)
3757201d65SPratik R. Sampat {
3857201d65SPratik R. Sampat int val_type;
3957201d65SPratik R. Sampat
4057201d65SPratik R. Sampat switch (id) {
4157201d65SPratik R. Sampat case POWER_PERFORMANCE_MODE:
4257201d65SPratik R. Sampat case IDLE_POWER_SAVER_STATUS:
4357201d65SPratik R. Sampat val_type = STR_VAL;
4457201d65SPratik R. Sampat break;
4557201d65SPratik R. Sampat case MIN_FREQ:
4657201d65SPratik R. Sampat case STAT_FREQ:
4757201d65SPratik R. Sampat case MAX_FREQ:
4857201d65SPratik R. Sampat case PROC_FOLDING_STATUS:
4957201d65SPratik R. Sampat val_type = NUM_VAL;
5057201d65SPratik R. Sampat break;
5157201d65SPratik R. Sampat default:
5257201d65SPratik R. Sampat val_type = INVALID;
5357201d65SPratik R. Sampat }
5457201d65SPratik R. Sampat
5557201d65SPratik R. Sampat return val_type;
5657201d65SPratik R. Sampat }
5757201d65SPratik R. Sampat
verify_energy_info(void)58*4228a996SMichael Ellerman static int verify_energy_info(void)
5957201d65SPratik R. Sampat {
6057201d65SPratik R. Sampat const char *path = "/sys/firmware/papr/energy_scale_info";
6157201d65SPratik R. Sampat struct dirent *entry;
6257201d65SPratik R. Sampat struct stat s;
6357201d65SPratik R. Sampat DIR *dirp;
6457201d65SPratik R. Sampat
65*4228a996SMichael Ellerman errno = 0;
66*4228a996SMichael Ellerman if (stat(path, &s)) {
67*4228a996SMichael Ellerman SKIP_IF(errno == ENOENT);
68*4228a996SMichael Ellerman FAIL_IF(errno);
69*4228a996SMichael Ellerman }
70*4228a996SMichael Ellerman
71*4228a996SMichael Ellerman FAIL_IF(!S_ISDIR(s.st_mode));
72*4228a996SMichael Ellerman
7357201d65SPratik R. Sampat dirp = opendir(path);
7457201d65SPratik R. Sampat
7557201d65SPratik R. Sampat while ((entry = readdir(dirp)) != NULL) {
7657201d65SPratik R. Sampat char file_name[64];
7757201d65SPratik R. Sampat int id, attr_type;
7857201d65SPratik R. Sampat FILE *f;
7957201d65SPratik R. Sampat
8057201d65SPratik R. Sampat if (strcmp(entry->d_name, ".") == 0 ||
8157201d65SPratik R. Sampat strcmp(entry->d_name, "..") == 0)
8257201d65SPratik R. Sampat continue;
8357201d65SPratik R. Sampat
8457201d65SPratik R. Sampat id = atoi(entry->d_name);
8557201d65SPratik R. Sampat attr_type = value_type(id);
86*4228a996SMichael Ellerman FAIL_IF(attr_type == INVALID);
8757201d65SPratik R. Sampat
8857201d65SPratik R. Sampat /* Check if the files exist and have data in them */
8957201d65SPratik R. Sampat sprintf(file_name, "%s/%d/desc", path, id);
9057201d65SPratik R. Sampat f = fopen(file_name, "r");
91*4228a996SMichael Ellerman FAIL_IF(!f);
92*4228a996SMichael Ellerman FAIL_IF(fgetc(f) == EOF);
9357201d65SPratik R. Sampat
9457201d65SPratik R. Sampat sprintf(file_name, "%s/%d/value", path, id);
9557201d65SPratik R. Sampat f = fopen(file_name, "r");
96*4228a996SMichael Ellerman FAIL_IF(!f);
97*4228a996SMichael Ellerman FAIL_IF(fgetc(f) == EOF);
9857201d65SPratik R. Sampat
9957201d65SPratik R. Sampat if (attr_type == STR_VAL) {
10057201d65SPratik R. Sampat sprintf(file_name, "%s/%d/value_desc", path, id);
10157201d65SPratik R. Sampat f = fopen(file_name, "r");
102*4228a996SMichael Ellerman FAIL_IF(!f);
103*4228a996SMichael Ellerman FAIL_IF(fgetc(f) == EOF);
10457201d65SPratik R. Sampat }
10557201d65SPratik R. Sampat }
10657201d65SPratik R. Sampat
10757201d65SPratik R. Sampat return 0;
10857201d65SPratik R. Sampat }
10957201d65SPratik R. Sampat
main(void)11057201d65SPratik R. Sampat int main(void)
11157201d65SPratik R. Sampat {
11257201d65SPratik R. Sampat return test_harness(verify_energy_info, "papr_attributes");
11357201d65SPratik R. Sampat }
114