xref: /openbmc/linux/tools/testing/selftests/powerpc/papr_attributes/attr_test.c (revision 4f2c0a4acffbec01079c28f839422e64ddeff004)
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