| // SPDX-License-Identifier: GPL-2.0-or-later |
| /* |
| * PAPR Energy attributes sniff test |
| * This checks if the papr folders and contents are populated relating to |
| * the energy and frequency attributes |
| * |
| * Copyright 2022, Pratik Rajesh Sampat, IBM Corp. |
| */ |
| |
| #include <errno.h> |
| #include <stdio.h> |
| #include <string.h> |
| #include <dirent.h> |
| #include <sys/types.h> |
| #include <sys/stat.h> |
| #include <unistd.h> |
| #include <stdlib.h> |
| |
| #include "utils.h" |
| |
| enum energy_freq_attrs { |
| POWER_PERFORMANCE_MODE = 1, |
| IDLE_POWER_SAVER_STATUS = 2, |
| MIN_FREQ = 3, |
| STAT_FREQ = 4, |
| MAX_FREQ = 6, |
| PROC_FOLDING_STATUS = 8 |
| }; |
| |
| enum type { |
| INVALID, |
| STR_VAL, |
| NUM_VAL |
| }; |
| |
| static int value_type(int id) |
| { |
| int val_type; |
| |
| switch (id) { |
| case POWER_PERFORMANCE_MODE: |
| case IDLE_POWER_SAVER_STATUS: |
| val_type = STR_VAL; |
| break; |
| case MIN_FREQ: |
| case STAT_FREQ: |
| case MAX_FREQ: |
| case PROC_FOLDING_STATUS: |
| val_type = NUM_VAL; |
| break; |
| default: |
| val_type = INVALID; |
| } |
| |
| return val_type; |
| } |
| |
| static int verify_energy_info(void) |
| { |
| const char *path = "/sys/firmware/papr/energy_scale_info"; |
| struct dirent *entry; |
| struct stat s; |
| DIR *dirp; |
| |
| errno = 0; |
| if (stat(path, &s)) { |
| SKIP_IF(errno == ENOENT); |
| FAIL_IF(errno); |
| } |
| |
| FAIL_IF(!S_ISDIR(s.st_mode)); |
| |
| dirp = opendir(path); |
| |
| while ((entry = readdir(dirp)) != NULL) { |
| char file_name[64]; |
| int id, attr_type; |
| FILE *f; |
| |
| if (strcmp(entry->d_name, ".") == 0 || |
| strcmp(entry->d_name, "..") == 0) |
| continue; |
| |
| id = atoi(entry->d_name); |
| attr_type = value_type(id); |
| FAIL_IF(attr_type == INVALID); |
| |
| /* Check if the files exist and have data in them */ |
| sprintf(file_name, "%s/%d/desc", path, id); |
| f = fopen(file_name, "r"); |
| FAIL_IF(!f); |
| FAIL_IF(fgetc(f) == EOF); |
| |
| sprintf(file_name, "%s/%d/value", path, id); |
| f = fopen(file_name, "r"); |
| FAIL_IF(!f); |
| FAIL_IF(fgetc(f) == EOF); |
| |
| if (attr_type == STR_VAL) { |
| sprintf(file_name, "%s/%d/value_desc", path, id); |
| f = fopen(file_name, "r"); |
| FAIL_IF(!f); |
| FAIL_IF(fgetc(f) == EOF); |
| } |
| } |
| |
| return 0; |
| } |
| |
| int main(void) |
| { |
| return test_harness(verify_energy_info, "papr_attributes"); |
| } |