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