diff options
author | Steven J. Hill <Steven.Hill@imgtec.com> | 2014-11-13 10:51:59 -0500 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 2014-11-24 16:47:31 -0500 |
commit | 23d06e4fb7138e29ef77edf2fa918acc20ad5f8d (patch) | |
tree | 9f74a04f5e32eaa47612eefa31659cad3f2a34f3 | |
parent | 1ca1f8f6b3aaf6d7f93262594578dfad404bd94e (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.h | 40 |
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) \ | ||
1018 | do { \ | ||
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 | ||