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