Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

selftest/powerpc: Add PAPR sysfs attributes sniff test

Include a testcase to check if the sysfs files for energy and frequency
related have its related attribute files exist and populated

Signed-off-by: Pratik R. Sampat <psampat@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20220217105321.52941-3-psampat@linux.ibm.com

authored by

Pratik R. Sampat and committed by
Michael Ellerman
57201d65 3c14b734

+117
+1
tools/testing/selftests/powerpc/Makefile
··· 30 30 eeh \ 31 31 vphn \ 32 32 math \ 33 + papr_attributes \ 33 34 ptrace \ 34 35 security \ 35 36 mce
+2
tools/testing/selftests/powerpc/papr_attributes/.gitignore
··· 1 + # SPDX-License-Identifier: GPL-2.0-only 2 + attr_test
+7
tools/testing/selftests/powerpc/papr_attributes/Makefile
··· 1 + # SPDX-License-Identifier: GPL-2.0 2 + TEST_GEN_PROGS := attr_test 3 + 4 + top_srcdir = ../../../../.. 5 + include ../../lib.mk 6 + 7 + $(TEST_GEN_PROGS): ../harness.c ../utils.c
+107
tools/testing/selftests/powerpc/papr_attributes/attr_test.c
··· 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 <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 + 18 + #include "utils.h" 19 + 20 + enum energy_freq_attrs { 21 + POWER_PERFORMANCE_MODE = 1, 22 + IDLE_POWER_SAVER_STATUS = 2, 23 + MIN_FREQ = 3, 24 + STAT_FREQ = 4, 25 + MAX_FREQ = 6, 26 + PROC_FOLDING_STATUS = 8 27 + }; 28 + 29 + enum type { 30 + INVALID, 31 + STR_VAL, 32 + NUM_VAL 33 + }; 34 + 35 + int value_type(int id) 36 + { 37 + int val_type; 38 + 39 + switch (id) { 40 + case POWER_PERFORMANCE_MODE: 41 + case IDLE_POWER_SAVER_STATUS: 42 + val_type = STR_VAL; 43 + break; 44 + case MIN_FREQ: 45 + case STAT_FREQ: 46 + case MAX_FREQ: 47 + case PROC_FOLDING_STATUS: 48 + val_type = NUM_VAL; 49 + break; 50 + default: 51 + val_type = INVALID; 52 + } 53 + 54 + return val_type; 55 + } 56 + 57 + int verify_energy_info(void) 58 + { 59 + const char *path = "/sys/firmware/papr/energy_scale_info"; 60 + struct dirent *entry; 61 + struct stat s; 62 + DIR *dirp; 63 + 64 + if (stat(path, &s) || !S_ISDIR(s.st_mode)) 65 + return -1; 66 + dirp = opendir(path); 67 + 68 + while ((entry = readdir(dirp)) != NULL) { 69 + char file_name[64]; 70 + int id, attr_type; 71 + FILE *f; 72 + 73 + if (strcmp(entry->d_name, ".") == 0 || 74 + strcmp(entry->d_name, "..") == 0) 75 + continue; 76 + 77 + id = atoi(entry->d_name); 78 + attr_type = value_type(id); 79 + if (attr_type == INVALID) 80 + return -1; 81 + 82 + /* Check if the files exist and have data in them */ 83 + sprintf(file_name, "%s/%d/desc", path, id); 84 + f = fopen(file_name, "r"); 85 + if (!f || fgetc(f) == EOF) 86 + return -1; 87 + 88 + sprintf(file_name, "%s/%d/value", path, id); 89 + f = fopen(file_name, "r"); 90 + if (!f || fgetc(f) == EOF) 91 + return -1; 92 + 93 + if (attr_type == STR_VAL) { 94 + sprintf(file_name, "%s/%d/value_desc", path, id); 95 + f = fopen(file_name, "r"); 96 + if (!f || fgetc(f) == EOF) 97 + return -1; 98 + } 99 + } 100 + 101 + return 0; 102 + } 103 + 104 + int main(void) 105 + { 106 + return test_harness(verify_energy_info, "papr_attributes"); 107 + }