linux/tools/testing/selftests/powerpc/dscr/dscr.h
<<
>>
Prefs
   1/*
   2 * POWER Data Stream Control Register (DSCR)
   3 *
   4 * This header file contains helper functions and macros
   5 * required for all the DSCR related test cases.
   6 *
   7 * Copyright 2012, Anton Blanchard, IBM Corporation.
   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#ifndef _SELFTESTS_POWERPC_DSCR_DSCR_H
  15#define _SELFTESTS_POWERPC_DSCR_DSCR_H
  16
  17#include <unistd.h>
  18#include <stdio.h>
  19#include <stdlib.h>
  20#include <string.h>
  21#include <fcntl.h>
  22#include <dirent.h>
  23#include <pthread.h>
  24#include <sched.h>
  25#include <sys/types.h>
  26#include <sys/stat.h>
  27#include <sys/wait.h>
  28
  29#include "utils.h"
  30
  31#define SPRN_DSCR       0x11    /* Privilege state SPR */
  32#define SPRN_DSCR_USR   0x03    /* Problem state SPR */
  33#define THREADS         100     /* Max threads */
  34#define COUNT           100     /* Max iterations */
  35#define DSCR_MAX        16      /* Max DSCR value */
  36#define LEN_MAX         100     /* Max name length */
  37
  38#define DSCR_DEFAULT    "/sys/devices/system/cpu/dscr_default"
  39#define CPU_PATH        "/sys/devices/system/cpu/"
  40
  41#define rmb()  asm volatile("lwsync":::"memory")
  42#define wmb()  asm volatile("lwsync":::"memory")
  43
  44#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
  45
  46/* Prilvilege state DSCR access */
  47inline unsigned long get_dscr(void)
  48{
  49        unsigned long ret;
  50
  51        asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR));
  52
  53        return ret;
  54}
  55
  56inline void set_dscr(unsigned long val)
  57{
  58        asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR));
  59}
  60
  61/* Problem state DSCR access */
  62inline unsigned long get_dscr_usr(void)
  63{
  64        unsigned long ret;
  65
  66        asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR_USR));
  67
  68        return ret;
  69}
  70
  71inline void set_dscr_usr(unsigned long val)
  72{
  73        asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR_USR));
  74}
  75
  76/* Default DSCR access */
  77unsigned long get_default_dscr(void)
  78{
  79        int fd = -1, ret;
  80        char buf[16];
  81        unsigned long val;
  82
  83        if (fd == -1) {
  84                fd = open(DSCR_DEFAULT, O_RDONLY);
  85                if (fd == -1) {
  86                        perror("open() failed");
  87                        exit(1);
  88                }
  89        }
  90        memset(buf, 0, sizeof(buf));
  91        lseek(fd, 0, SEEK_SET);
  92        ret = read(fd, buf, sizeof(buf));
  93        if (ret == -1) {
  94                perror("read() failed");
  95                exit(1);
  96        }
  97        sscanf(buf, "%lx", &val);
  98        close(fd);
  99        return val;
 100}
 101
 102void set_default_dscr(unsigned long val)
 103{
 104        int fd = -1, ret;
 105        char buf[16];
 106
 107        if (fd == -1) {
 108                fd = open(DSCR_DEFAULT, O_RDWR);
 109                if (fd == -1) {
 110                        perror("open() failed");
 111                        exit(1);
 112                }
 113        }
 114        sprintf(buf, "%lx\n", val);
 115        ret = write(fd, buf, strlen(buf));
 116        if (ret == -1) {
 117                perror("write() failed");
 118                exit(1);
 119        }
 120        close(fd);
 121}
 122
 123double uniform_deviate(int seed)
 124{
 125        return seed * (1.0 / (RAND_MAX + 1.0));
 126}
 127#endif  /* _SELFTESTS_POWERPC_DSCR_DSCR_H */
 128