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                if (!(dp->d_type & DT_DIR))
  57                        continue;
  58                if (!strcmp(dp->d_name, "cpuidle"))
  59                        continue;
  60                if (!strstr(dp->d_name, "cpu"))
  61                        continue;
  62
  63                sprintf(file, "%s%s/dscr", CPU_PATH, dp->d_name);
  64                if (access(file, F_OK))
  65                        continue;
  66
  67                if (check_cpu_dscr_default(file, val))
  68                        return 1;
  69        }
  70        closedir(sysfs);
  71        return 0;
  72}
  73
  74int dscr_sysfs(void)
  75{
  76        unsigned long orig_dscr_default;
  77        int i, j;
  78
  79        orig_dscr_default = get_default_dscr();
  80        for (i = 0; i < COUNT; i++) {
  81                for (j = 0; j < DSCR_MAX; j++) {
  82                        set_default_dscr(j);
  83                        if (check_all_cpu_dscr_defaults(j))
  84                                goto fail;
  85                }
  86        }
  87        set_default_dscr(orig_dscr_default);
  88        return 0;
  89fail:
  90        set_default_dscr(orig_dscr_default);
  91        return 1;
  92}
  93
  94int main(int argc, char *argv[])
  95{
  96        return test_harness(dscr_sysfs, "dscr_sysfs_test");
  97}
  98