1d2912cb1SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
24c6315f8SAnshuman Khandual /*
34c6315f8SAnshuman Khandual  * POWER Data Stream Control Register (DSCR)
44c6315f8SAnshuman Khandual  *
54c6315f8SAnshuman Khandual  * This header file contains helper functions and macros
64c6315f8SAnshuman Khandual  * required for all the DSCR related test cases.
74c6315f8SAnshuman Khandual  *
84c6315f8SAnshuman Khandual  * Copyright 2012, Anton Blanchard, IBM Corporation.
94c6315f8SAnshuman Khandual  * Copyright 2015, Anshuman Khandual, IBM Corporation.
104c6315f8SAnshuman Khandual  */
114c6315f8SAnshuman Khandual #ifndef _SELFTESTS_POWERPC_DSCR_DSCR_H
124c6315f8SAnshuman Khandual #define _SELFTESTS_POWERPC_DSCR_DSCR_H
134c6315f8SAnshuman Khandual 
144c6315f8SAnshuman Khandual #include <unistd.h>
154c6315f8SAnshuman Khandual #include <stdio.h>
164c6315f8SAnshuman Khandual #include <stdlib.h>
174c6315f8SAnshuman Khandual #include <string.h>
184c6315f8SAnshuman Khandual #include <fcntl.h>
194c6315f8SAnshuman Khandual #include <dirent.h>
204c6315f8SAnshuman Khandual #include <pthread.h>
214c6315f8SAnshuman Khandual #include <sched.h>
224c6315f8SAnshuman Khandual #include <sys/types.h>
234c6315f8SAnshuman Khandual #include <sys/stat.h>
244c6315f8SAnshuman Khandual #include <sys/wait.h>
254c6315f8SAnshuman Khandual 
26aecfd680SBenjamin Gray #include "reg.h"
274c6315f8SAnshuman Khandual #include "utils.h"
284c6315f8SAnshuman Khandual 
294c6315f8SAnshuman Khandual #define THREADS		100	/* Max threads */
304c6315f8SAnshuman Khandual #define COUNT		100	/* Max iterations */
314c6315f8SAnshuman Khandual #define DSCR_MAX	16	/* Max DSCR value */
324c6315f8SAnshuman Khandual #define LEN_MAX		100	/* Max name length */
334c6315f8SAnshuman Khandual 
344c6315f8SAnshuman Khandual #define DSCR_DEFAULT	"/sys/devices/system/cpu/dscr_default"
354c6315f8SAnshuman Khandual #define CPU_PATH	"/sys/devices/system/cpu/"
364c6315f8SAnshuman Khandual 
374c6315f8SAnshuman Khandual #define rmb()  asm volatile("lwsync":::"memory")
384c6315f8SAnshuman Khandual #define wmb()  asm volatile("lwsync":::"memory")
394c6315f8SAnshuman Khandual 
40564cbc87SMark Rutland #define READ_ONCE(x) (*(volatile typeof(x) *)&(x))
414c6315f8SAnshuman Khandual 
424c6315f8SAnshuman Khandual /* Prilvilege state DSCR access */
get_dscr(void)434c6315f8SAnshuman Khandual inline unsigned long get_dscr(void)
444c6315f8SAnshuman Khandual {
45aecfd680SBenjamin Gray 	return mfspr(SPRN_DSCR_PRIV);
464c6315f8SAnshuman Khandual }
474c6315f8SAnshuman Khandual 
set_dscr(unsigned long val)484c6315f8SAnshuman Khandual inline void set_dscr(unsigned long val)
494c6315f8SAnshuman Khandual {
50aecfd680SBenjamin Gray 	mtspr(SPRN_DSCR_PRIV, val);
514c6315f8SAnshuman Khandual }
524c6315f8SAnshuman Khandual 
534c6315f8SAnshuman Khandual /* Problem state DSCR access */
get_dscr_usr(void)544c6315f8SAnshuman Khandual inline unsigned long get_dscr_usr(void)
554c6315f8SAnshuman Khandual {
56aecfd680SBenjamin Gray 	return mfspr(SPRN_DSCR);
574c6315f8SAnshuman Khandual }
584c6315f8SAnshuman Khandual 
set_dscr_usr(unsigned long val)594c6315f8SAnshuman Khandual inline void set_dscr_usr(unsigned long val)
604c6315f8SAnshuman Khandual {
61aecfd680SBenjamin Gray 	mtspr(SPRN_DSCR, val);
624c6315f8SAnshuman Khandual }
634c6315f8SAnshuman Khandual 
644c6315f8SAnshuman Khandual /* Default DSCR access */
get_default_dscr(void)654c6315f8SAnshuman Khandual unsigned long get_default_dscr(void)
664c6315f8SAnshuman Khandual {
67a974f0c1SBenjamin Gray 	int err;
684c6315f8SAnshuman Khandual 	unsigned long val;
694c6315f8SAnshuman Khandual 
70*5c20de57SBenjamin Gray 	err = read_ulong(DSCR_DEFAULT, &val, 16);
71a974f0c1SBenjamin Gray 	if (err) {
724c6315f8SAnshuman Khandual 		perror("read() failed");
734c6315f8SAnshuman Khandual 		exit(1);
744c6315f8SAnshuman Khandual 	}
754c6315f8SAnshuman Khandual 	return val;
764c6315f8SAnshuman Khandual }
774c6315f8SAnshuman Khandual 
set_default_dscr(unsigned long val)784c6315f8SAnshuman Khandual void set_default_dscr(unsigned long val)
794c6315f8SAnshuman Khandual {
80a974f0c1SBenjamin Gray 	int err;
814c6315f8SAnshuman Khandual 
82*5c20de57SBenjamin Gray 	err = write_ulong(DSCR_DEFAULT, val, 16);
83a974f0c1SBenjamin Gray 	if (err) {
844c6315f8SAnshuman Khandual 		perror("write() failed");
854c6315f8SAnshuman Khandual 		exit(1);
864c6315f8SAnshuman Khandual 	}
874c6315f8SAnshuman Khandual }
884c6315f8SAnshuman Khandual 
894c6315f8SAnshuman Khandual #endif	/* _SELFTESTS_POWERPC_DSCR_DSCR_H */
90