Home | History | Annotate | Download | only in dscr
      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