14c6315f8SAnshuman Khandual /* 24c6315f8SAnshuman Khandual * POWER Data Stream Control Register (DSCR) 34c6315f8SAnshuman Khandual * 44c6315f8SAnshuman Khandual * This header file contains helper functions and macros 54c6315f8SAnshuman Khandual * required for all the DSCR related test cases. 64c6315f8SAnshuman Khandual * 74c6315f8SAnshuman Khandual * Copyright 2012, Anton Blanchard, IBM Corporation. 84c6315f8SAnshuman Khandual * Copyright 2015, Anshuman Khandual, IBM Corporation. 94c6315f8SAnshuman Khandual * 104c6315f8SAnshuman Khandual * This program is free software; you can redistribute it and/or modify it 114c6315f8SAnshuman Khandual * under the terms of the GNU General Public License version 2 as published 124c6315f8SAnshuman Khandual * by the Free Software Foundation. 134c6315f8SAnshuman Khandual */ 144c6315f8SAnshuman Khandual #ifndef _SELFTESTS_POWERPC_DSCR_DSCR_H 154c6315f8SAnshuman Khandual #define _SELFTESTS_POWERPC_DSCR_DSCR_H 164c6315f8SAnshuman Khandual 174c6315f8SAnshuman Khandual #include <unistd.h> 184c6315f8SAnshuman Khandual #include <stdio.h> 194c6315f8SAnshuman Khandual #include <stdlib.h> 204c6315f8SAnshuman Khandual #include <string.h> 214c6315f8SAnshuman Khandual #include <fcntl.h> 224c6315f8SAnshuman Khandual #include <dirent.h> 234c6315f8SAnshuman Khandual #include <pthread.h> 244c6315f8SAnshuman Khandual #include <sched.h> 254c6315f8SAnshuman Khandual #include <sys/types.h> 264c6315f8SAnshuman Khandual #include <sys/stat.h> 274c6315f8SAnshuman Khandual #include <sys/wait.h> 284c6315f8SAnshuman Khandual 294c6315f8SAnshuman Khandual #include "utils.h" 304c6315f8SAnshuman Khandual 314c6315f8SAnshuman Khandual #define SPRN_DSCR 0x11 /* Privilege state SPR */ 324c6315f8SAnshuman Khandual #define SPRN_DSCR_USR 0x03 /* Problem state SPR */ 334c6315f8SAnshuman Khandual #define THREADS 100 /* Max threads */ 344c6315f8SAnshuman Khandual #define COUNT 100 /* Max iterations */ 354c6315f8SAnshuman Khandual #define DSCR_MAX 16 /* Max DSCR value */ 364c6315f8SAnshuman Khandual #define LEN_MAX 100 /* Max name length */ 374c6315f8SAnshuman Khandual 384c6315f8SAnshuman Khandual #define DSCR_DEFAULT "/sys/devices/system/cpu/dscr_default" 394c6315f8SAnshuman Khandual #define CPU_PATH "/sys/devices/system/cpu/" 404c6315f8SAnshuman Khandual 414c6315f8SAnshuman Khandual #define rmb() asm volatile("lwsync":::"memory") 424c6315f8SAnshuman Khandual #define wmb() asm volatile("lwsync":::"memory") 434c6315f8SAnshuman Khandual 444c6315f8SAnshuman Khandual #define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x)) 454c6315f8SAnshuman Khandual 464c6315f8SAnshuman Khandual /* Prilvilege state DSCR access */ 474c6315f8SAnshuman Khandual inline unsigned long get_dscr(void) 484c6315f8SAnshuman Khandual { 494c6315f8SAnshuman Khandual unsigned long ret; 504c6315f8SAnshuman Khandual 514c6315f8SAnshuman Khandual asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR)); 524c6315f8SAnshuman Khandual 534c6315f8SAnshuman Khandual return ret; 544c6315f8SAnshuman Khandual } 554c6315f8SAnshuman Khandual 564c6315f8SAnshuman Khandual inline void set_dscr(unsigned long val) 574c6315f8SAnshuman Khandual { 584c6315f8SAnshuman Khandual asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR)); 594c6315f8SAnshuman Khandual } 604c6315f8SAnshuman Khandual 614c6315f8SAnshuman Khandual /* Problem state DSCR access */ 624c6315f8SAnshuman Khandual inline unsigned long get_dscr_usr(void) 634c6315f8SAnshuman Khandual { 644c6315f8SAnshuman Khandual unsigned long ret; 654c6315f8SAnshuman Khandual 664c6315f8SAnshuman Khandual asm volatile("mfspr %0,%1" : "=r" (ret): "i" (SPRN_DSCR_USR)); 674c6315f8SAnshuman Khandual 684c6315f8SAnshuman Khandual return ret; 694c6315f8SAnshuman Khandual } 704c6315f8SAnshuman Khandual 714c6315f8SAnshuman Khandual inline void set_dscr_usr(unsigned long val) 724c6315f8SAnshuman Khandual { 734c6315f8SAnshuman Khandual asm volatile("mtspr %1,%0" : : "r" (val), "i" (SPRN_DSCR_USR)); 744c6315f8SAnshuman Khandual } 754c6315f8SAnshuman Khandual 764c6315f8SAnshuman Khandual /* Default DSCR access */ 774c6315f8SAnshuman Khandual unsigned long get_default_dscr(void) 784c6315f8SAnshuman Khandual { 794c6315f8SAnshuman Khandual int fd = -1, ret; 804c6315f8SAnshuman Khandual char buf[16]; 814c6315f8SAnshuman Khandual unsigned long val; 824c6315f8SAnshuman Khandual 834c6315f8SAnshuman Khandual if (fd == -1) { 844c6315f8SAnshuman Khandual fd = open(DSCR_DEFAULT, O_RDONLY); 854c6315f8SAnshuman Khandual if (fd == -1) { 864c6315f8SAnshuman Khandual perror("open() failed"); 874c6315f8SAnshuman Khandual exit(1); 884c6315f8SAnshuman Khandual } 894c6315f8SAnshuman Khandual } 904c6315f8SAnshuman Khandual memset(buf, 0, sizeof(buf)); 914c6315f8SAnshuman Khandual lseek(fd, 0, SEEK_SET); 924c6315f8SAnshuman Khandual ret = read(fd, buf, sizeof(buf)); 934c6315f8SAnshuman Khandual if (ret == -1) { 944c6315f8SAnshuman Khandual perror("read() failed"); 954c6315f8SAnshuman Khandual exit(1); 964c6315f8SAnshuman Khandual } 974c6315f8SAnshuman Khandual sscanf(buf, "%lx", &val); 984c6315f8SAnshuman Khandual close(fd); 994c6315f8SAnshuman Khandual return val; 1004c6315f8SAnshuman Khandual } 1014c6315f8SAnshuman Khandual 1024c6315f8SAnshuman Khandual void set_default_dscr(unsigned long val) 1034c6315f8SAnshuman Khandual { 1044c6315f8SAnshuman Khandual int fd = -1, ret; 1054c6315f8SAnshuman Khandual char buf[16]; 1064c6315f8SAnshuman Khandual 1074c6315f8SAnshuman Khandual if (fd == -1) { 1084c6315f8SAnshuman Khandual fd = open(DSCR_DEFAULT, O_RDWR); 1094c6315f8SAnshuman Khandual if (fd == -1) { 1104c6315f8SAnshuman Khandual perror("open() failed"); 1114c6315f8SAnshuman Khandual exit(1); 1124c6315f8SAnshuman Khandual } 1134c6315f8SAnshuman Khandual } 1144c6315f8SAnshuman Khandual sprintf(buf, "%lx\n", val); 1154c6315f8SAnshuman Khandual ret = write(fd, buf, strlen(buf)); 1164c6315f8SAnshuman Khandual if (ret == -1) { 1174c6315f8SAnshuman Khandual perror("write() failed"); 1184c6315f8SAnshuman Khandual exit(1); 1194c6315f8SAnshuman Khandual } 1204c6315f8SAnshuman Khandual close(fd); 1214c6315f8SAnshuman Khandual } 1224c6315f8SAnshuman Khandual 1234c6315f8SAnshuman Khandual double uniform_deviate(int seed) 1244c6315f8SAnshuman Khandual { 1254c6315f8SAnshuman Khandual return seed * (1.0 / (RAND_MAX + 1.0)); 1264c6315f8SAnshuman Khandual } 1274c6315f8SAnshuman Khandual #endif /* _SELFTESTS_POWERPC_DSCR_DSCR_H */ 128