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 THREADS 100 /* Max threads */ 32 #define COUNT 100 /* Max iterations */ 33 #define DSCR_MAX 16 /* Max DSCR value */ 34 #define LEN_MAX 100 /* Max name length */ 35 36 #define DSCR_DEFAULT "/sys/devices/system/cpu/dscr_default" 37 #define CPU_PATH "/sys/devices/system/cpu/" 38 39 #define rmb() asm volatile("lwsync":::"memory") 40 #define wmb() asm volatile("lwsync":::"memory") 41 42 #define READ_ONCE(x) (*(volatile typeof(x) *)&(x)) 43 44 /* Prilvilege state DSCR access */ 45 inline unsigned long get_dscr(void) 46 { 47 unsigned long ret; 48 49 asm volatile("mfspr %0,%1" : "=r" (ret) : "i" (SPRN_DSCR_PRIV)); 50 51 return ret; 52 } 53 54 inline void set_dscr(unsigned long val) 55 { 56 asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR_PRIV)); 57 } 58 59 /* Problem state DSCR access */ 60 inline unsigned long get_dscr_usr(void) 61 { 62 unsigned long ret; 63 64 asm volatile("mfspr %0,%1" : "=r" (ret) : "i" (SPRN_DSCR)); 65 66 return ret; 67 } 68 69 inline void set_dscr_usr(unsigned long val) 70 { 71 asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR)); 72 } 73 74 /* Default DSCR access */ 75 unsigned long get_default_dscr(void) 76 { 77 int fd = -1, ret; 78 char buf[16]; 79 unsigned long val; 80 81 if (fd == -1) { 82 fd = open(DSCR_DEFAULT, O_RDONLY); 83 if (fd == -1) { 84 perror("open() failed"); 85 exit(1); 86 } 87 } 88 memset(buf, 0, sizeof(buf)); 89 lseek(fd, 0, SEEK_SET); 90 ret = read(fd, buf, sizeof(buf)); 91 if (ret == -1) { 92 perror("read() failed"); 93 exit(1); 94 } 95 sscanf(buf, "%lx", &val); 96 close(fd); 97 return val; 98 } 99 100 void set_default_dscr(unsigned long val) 101 { 102 int fd = -1, ret; 103 char buf[16]; 104 105 if (fd == -1) { 106 fd = open(DSCR_DEFAULT, O_RDWR); 107 if (fd == -1) { 108 perror("open() failed"); 109 exit(1); 110 } 111 } 112 sprintf(buf, "%lx\n", val); 113 ret = write(fd, buf, strlen(buf)); 114 if (ret == -1) { 115 perror("write() failed"); 116 exit(1); 117 } 118 close(fd); 119 } 120 121 double uniform_deviate(int seed) 122 { 123 return seed * (1.0 / (RAND_MAX + 1.0)); 124 } 125 #endif /* _SELFTESTS_POWERPC_DSCR_DSCR_H */ 126