aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven J. Hill <Steven.Hill@imgtec.com>2014-11-13 10:51:59 -0500
committerRalf Baechle <ralf@linux-mips.org>2014-11-24 16:47:31 -0500
commit23d06e4fb7138e29ef77edf2fa918acc20ad5f8d (patch)
tree9f74a04f5e32eaa47612eefa31659cad3f2a34f3
parent1ca1f8f6b3aaf6d7f93262594578dfad404bd94e (diff)
MIPS: Add CP0 macros for extended EntryLo registers
Add read/write macros to access the upper bits of the extended EntryLo0 and EntryLo1 registers used by XPA. Signed-off-by: Steven J. Hill <Steven.Hill@imgtec.com> Cc: linux-mips@linux-mips.org Patchwork: https://patchwork.linux-mips.org/patch/8455/ Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
-rw-r--r--arch/mips/include/asm/mipsregs.h40
1 files changed, 40 insertions, 0 deletions
diff --git a/arch/mips/include/asm/mipsregs.h b/arch/mips/include/asm/mipsregs.h
index 7ebb6544392e..087b2af00150 100644
--- a/arch/mips/include/asm/mipsregs.h
+++ b/arch/mips/include/asm/mipsregs.h
@@ -653,6 +653,7 @@
653#define MIPS_CONF5_NF (_ULCAST_(1) << 0) 653#define MIPS_CONF5_NF (_ULCAST_(1) << 0)
654#define MIPS_CONF5_UFR (_ULCAST_(1) << 2) 654#define MIPS_CONF5_UFR (_ULCAST_(1) << 2)
655#define MIPS_CONF5_MRP (_ULCAST_(1) << 3) 655#define MIPS_CONF5_MRP (_ULCAST_(1) << 3)
656#define MIPS_CONF5_MVH (_ULCAST_(1) << 5)
656#define MIPS_CONF5_FRE (_ULCAST_(1) << 8) 657#define MIPS_CONF5_FRE (_ULCAST_(1) << 8)
657#define MIPS_CONF5_UFE (_ULCAST_(1) << 9) 658#define MIPS_CONF5_UFE (_ULCAST_(1) << 9)
658#define MIPS_CONF5_MSAEN (_ULCAST_(1) << 27) 659#define MIPS_CONF5_MSAEN (_ULCAST_(1) << 27)
@@ -995,6 +996,39 @@ do { \
995 local_irq_restore(__flags); \ 996 local_irq_restore(__flags); \
996} while (0) 997} while (0)
997 998
999#define __readx_32bit_c0_register(source) \
1000({ \
1001 unsigned int __res; \
1002 \
1003 __asm__ __volatile__( \
1004 " .set push \n" \
1005 " .set noat \n" \
1006 " .set mips32r2 \n" \
1007 " .insn \n" \
1008 " # mfhc0 $1, %1 \n" \
1009 " .word (0x40410000 | ((%1 & 0x1f) << 11)) \n" \
1010 " move %0, $1 \n" \
1011 " .set pop \n" \
1012 : "=r" (__res) \
1013 : "i" (source)); \
1014 __res; \
1015})
1016
1017#define __writex_32bit_c0_register(register, value) \
1018do { \
1019 __asm__ __volatile__( \
1020 " .set push \n" \
1021 " .set noat \n" \
1022 " .set mips32r2 \n" \
1023 " move $1, %0 \n" \
1024 " # mthc0 $1, %1 \n" \
1025 " .insn \n" \
1026 " .word (0x40c10000 | ((%1 & 0x1f) << 11)) \n" \
1027 " .set pop \n" \
1028 : \
1029 : "r" (value), "i" (register)); \
1030} while (0)
1031
998#define read_c0_index() __read_32bit_c0_register($0, 0) 1032#define read_c0_index() __read_32bit_c0_register($0, 0)
999#define write_c0_index(val) __write_32bit_c0_register($0, 0, val) 1033#define write_c0_index(val) __write_32bit_c0_register($0, 0, val)
1000 1034
@@ -1004,9 +1038,15 @@ do { \
1004#define read_c0_entrylo0() __read_ulong_c0_register($2, 0) 1038#define read_c0_entrylo0() __read_ulong_c0_register($2, 0)
1005#define write_c0_entrylo0(val) __write_ulong_c0_register($2, 0, val) 1039#define write_c0_entrylo0(val) __write_ulong_c0_register($2, 0, val)
1006 1040
1041#define readx_c0_entrylo0() __readx_32bit_c0_register(2)
1042#define writex_c0_entrylo0(val) __writex_32bit_c0_register(2, val)
1043
1007#define read_c0_entrylo1() __read_ulong_c0_register($3, 0) 1044#define read_c0_entrylo1() __read_ulong_c0_register($3, 0)
1008#define write_c0_entrylo1(val) __write_ulong_c0_register($3, 0, val) 1045#define write_c0_entrylo1(val) __write_ulong_c0_register($3, 0, val)
1009 1046
1047#define readx_c0_entrylo1() __readx_32bit_c0_register(3)
1048#define writex_c0_entrylo1(val) __writex_32bit_c0_register(3, val)
1049
1010#define read_c0_conf() __read_32bit_c0_register($3, 0) 1050#define read_c0_conf() __read_32bit_c0_register($3, 0)
1011#define write_c0_conf(val) __write_32bit_c0_register($3, 0, val) 1051#define write_c0_conf(val) __write_32bit_c0_register($3, 0, val)
1012 1052