1ebd5858cSAnshuman Khandual /* 2ebd5858cSAnshuman Khandual * POWER Data Stream Control Register (DSCR) sysfs interface test 3ebd5858cSAnshuman Khandual * 4ebd5858cSAnshuman Khandual * This test updates to system wide DSCR default through the sysfs interface 5ebd5858cSAnshuman Khandual * and then verifies that all the CPU specific DSCR defaults are updated as 6ebd5858cSAnshuman Khandual * well verified from their sysfs interfaces. 7ebd5858cSAnshuman Khandual * 8ebd5858cSAnshuman Khandual * Copyright 2015, Anshuman Khandual, IBM Corporation. 9ebd5858cSAnshuman Khandual * 10ebd5858cSAnshuman Khandual * This program is free software; you can redistribute it and/or modify it 11ebd5858cSAnshuman Khandual * under the terms of the GNU General Public License version 2 as published 12ebd5858cSAnshuman Khandual * by the Free Software Foundation. 13ebd5858cSAnshuman Khandual */ 14ebd5858cSAnshuman Khandual #include "dscr.h" 15ebd5858cSAnshuman Khandual 16ebd5858cSAnshuman Khandual static int check_cpu_dscr_default(char *file, unsigned long val) 17ebd5858cSAnshuman Khandual { 18ebd5858cSAnshuman Khandual char buf[10]; 19ebd5858cSAnshuman Khandual int fd, rc; 20ebd5858cSAnshuman Khandual 21ebd5858cSAnshuman Khandual fd = open(file, O_RDWR); 22ebd5858cSAnshuman Khandual if (fd == -1) { 23ebd5858cSAnshuman Khandual perror("open() failed"); 24ebd5858cSAnshuman Khandual return 1; 25ebd5858cSAnshuman Khandual } 26ebd5858cSAnshuman Khandual 27ebd5858cSAnshuman Khandual rc = read(fd, buf, sizeof(buf)); 28ebd5858cSAnshuman Khandual if (rc == -1) { 29ebd5858cSAnshuman Khandual perror("read() failed"); 30ebd5858cSAnshuman Khandual return 1; 31ebd5858cSAnshuman Khandual } 32ebd5858cSAnshuman Khandual close(fd); 33ebd5858cSAnshuman Khandual 34ebd5858cSAnshuman Khandual buf[rc] = '\0'; 35ebd5858cSAnshuman Khandual if (strtol(buf, NULL, 16) != val) { 36ebd5858cSAnshuman Khandual printf("DSCR match failed: %ld (system) %ld (cpu)\n", 37ebd5858cSAnshuman Khandual val, strtol(buf, NULL, 16)); 38ebd5858cSAnshuman Khandual return 1; 39ebd5858cSAnshuman Khandual } 40ebd5858cSAnshuman Khandual return 0; 41ebd5858cSAnshuman Khandual } 42ebd5858cSAnshuman Khandual 43ebd5858cSAnshuman Khandual static int check_all_cpu_dscr_defaults(unsigned long val) 44ebd5858cSAnshuman Khandual { 45ebd5858cSAnshuman Khandual DIR *sysfs; 46ebd5858cSAnshuman Khandual struct dirent *dp; 47ebd5858cSAnshuman Khandual char file[LEN_MAX]; 48ebd5858cSAnshuman Khandual 49ebd5858cSAnshuman Khandual sysfs = opendir(CPU_PATH); 50ebd5858cSAnshuman Khandual if (!sysfs) { 51ebd5858cSAnshuman Khandual perror("opendir() failed"); 52ebd5858cSAnshuman Khandual return 1; 53ebd5858cSAnshuman Khandual } 54ebd5858cSAnshuman Khandual 55ebd5858cSAnshuman Khandual while ((dp = readdir(sysfs))) { 56ebd5858cSAnshuman Khandual if (!(dp->d_type & DT_DIR)) 57ebd5858cSAnshuman Khandual continue; 58ebd5858cSAnshuman Khandual if (!strcmp(dp->d_name, "cpuidle")) 59ebd5858cSAnshuman Khandual continue; 60ebd5858cSAnshuman Khandual if (!strstr(dp->d_name, "cpu")) 61ebd5858cSAnshuman Khandual continue; 62ebd5858cSAnshuman Khandual 63ebd5858cSAnshuman Khandual sprintf(file, "%s%s/dscr", CPU_PATH, dp->d_name); 64ebd5858cSAnshuman Khandual if (access(file, F_OK)) 65ebd5858cSAnshuman Khandual continue; 66ebd5858cSAnshuman Khandual 67ebd5858cSAnshuman Khandual if (check_cpu_dscr_default(file, val)) 68ebd5858cSAnshuman Khandual return 1; 69ebd5858cSAnshuman Khandual } 70ebd5858cSAnshuman Khandual closedir(sysfs); 71ebd5858cSAnshuman Khandual return 0; 72ebd5858cSAnshuman Khandual } 73ebd5858cSAnshuman Khandual 74ebd5858cSAnshuman Khandual int dscr_sysfs(void) 75ebd5858cSAnshuman Khandual { 76ebd5858cSAnshuman Khandual unsigned long orig_dscr_default; 77ebd5858cSAnshuman Khandual int i, j; 78ebd5858cSAnshuman Khandual 79ebd5858cSAnshuman Khandual orig_dscr_default = get_default_dscr(); 80ebd5858cSAnshuman Khandual for (i = 0; i < COUNT; i++) { 81ebd5858cSAnshuman Khandual for (j = 0; j < DSCR_MAX; j++) { 82ebd5858cSAnshuman Khandual set_default_dscr(j); 83ebd5858cSAnshuman Khandual if (check_all_cpu_dscr_defaults(j)) 84ebd5858cSAnshuman Khandual goto fail; 85ebd5858cSAnshuman Khandual } 86ebd5858cSAnshuman Khandual } 87ebd5858cSAnshuman Khandual set_default_dscr(orig_dscr_default); 88ebd5858cSAnshuman Khandual return 0; 89ebd5858cSAnshuman Khandual fail: 90ebd5858cSAnshuman Khandual set_default_dscr(orig_dscr_default); 91ebd5858cSAnshuman Khandual return 1; 92ebd5858cSAnshuman Khandual } 93ebd5858cSAnshuman Khandual 94ebd5858cSAnshuman Khandual int main(int argc, char *argv[]) 95ebd5858cSAnshuman Khandual { 96ebd5858cSAnshuman Khandual return test_harness(dscr_sysfs, "dscr_sysfs_test"); 97ebd5858cSAnshuman Khandual } 98