Detect the MIPS R2 vectored interrupt, external interrupt controller
options and the precense of the MT ASE.

Signed-off-by: Ralf Baechle <ralf@linux-mips.org>
diff --git a/include/asm-mips/mipsmtregs.h b/include/asm-mips/mipsmtregs.h
index 9aaefc1..eda24c2 100644
--- a/include/asm-mips/mipsmtregs.h
+++ b/include/asm-mips/mipsmtregs.h
@@ -175,8 +175,8 @@
 	"	.set	noreorder					\n"
 	"	.set	noat						\n"
 	"	.set	mips32r2					\n"
-	"	move	$1, %0						\n"
 	"	.word	0x41610001		# dvpe $1		\n"
+	"	move	%0, $1						\n"
 	"	ehb							\n"
 	"	.set	pop						\n"
 	: "=r" (res));
@@ -214,12 +214,13 @@
 	int res;
 
 	__asm__ __volatile__(
-	"	.set	noreorder					\n"
+	"	.set	push						\n"
 	"	.set	mips32r2					\n"
-	"	dmt	%0						\n"
+	"	.set	noat						\n"
+	"	.word	0x41610BC1			# dmt $1	\n"
 	"	ehb							\n"
-	"	.set mips0						\n"
-	"	.set reorder						\n"
+	"	move	%0, $1						\n"
+	"	.set	pop						\n"
 	: "=r" (res));
 
 	instruction_hazard();
@@ -251,7 +252,10 @@
 
 static inline void ehb(void)
 {
-	__asm__ __volatile__("ehb");
+	__asm__ __volatile__(
+	"	.set	mips32r2				\n"
+	"	ehb						\n"
+	"	.set	mips0					\n");
 }
 
 #define mftc0(rt,sel)							\
@@ -259,10 +263,14 @@
 	 unsigned long  __res;						\
 									\
 	__asm__ __volatile__(						\
-	 "	.set noat\n\t"						\
-	 "	mftc0\t%0," #rt ", " #sel "\n\t"			\
-	 "	.set at\n\t"						\
-	 : "=r" (__res));						\
+	"	.set	push					\n"	\
+	"	.set	mips32r2				\n"	\
+	"	.set	noat					\n"	\
+	"	# mftc0	$1, $" #rt ", " #sel "			\n"	\
+	"	.word	0x41000800 | (" #rt " << 16) | " #sel "	\n"	\
+	"	move	%0, $1					\n"	\
+	"	.set	pop					\n"	\
+	: "=r" (__res));						\
 									\
 	__res;								\
 })
@@ -272,9 +280,10 @@
 	unsigned long __res;						\
 									\
 	__asm__ __volatile__(						\
-	"	.set	noat					\n"	\
+	"	.set	push					\n"	\
+	"	.set	mips32r2				\n"	\
 	"	mftgpr	%0," #rt "				\n"	\
-	"	.set	at					\n"	\
+	"	.set	pop					\n"	\
 	: "=r" (__res));						\
 									\
 	__res;								\
@@ -294,17 +303,30 @@
 })
 
 #define mttgpr(rd,v)							\
-({									\
+do {									\
 	__asm__ __volatile__(						\
-	"mttgpr	%0," #rd						\
+	"	.set	push					\n"	\
+	"	.set	mips32r2				\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mttgpr $1, " #rd "				\n"	\
+	"	.word	0x41810020 | (" #rd " << 11)		\n"	\
+	"	.set	pop					\n"	\
 	: : "r" (v));							\
-})
+} while (0)
 
 #define mttc0(rd,sel,v)							\
 ({									\
 	__asm__ __volatile__(						\
-	"mttc0\t %0," #rd ", " #sel					\
-	: : "r" (v));							\
+	"	.set	push					\n"	\
+	"	.set	mips32r2				\n"	\
+	"	.set	noat					\n"	\
+	"	move	$1, %0					\n"	\
+	"	# mttc0 %0," #rd ", " #sel "			\n"	\
+	"	.word	0x41810000 | (" #rd " << 11) | " #sel "	\n"	\
+	"	.set	pop					\n"	\
+	:								\
+	: "r" (v));							\
 })
 
 
@@ -324,42 +346,42 @@
 
 
 /* you *must* set the target tc (settc) before trying to use these */
-#define read_vpe_c0_vpecontrol()	mftc0($1, 1)
-#define write_vpe_c0_vpecontrol(val)	mttc0($1, 1, val)
-#define read_vpe_c0_vpeconf0()		mftc0($1, 2)
-#define write_vpe_c0_vpeconf0(val)	mttc0($1, 2, val)
-#define read_vpe_c0_status()		mftc0($12, 0)
-#define write_vpe_c0_status(val)	mttc0($12, 0, val)
-#define read_vpe_c0_cause()		mftc0($13, 0)
-#define write_vpe_c0_cause(val)		mttc0($13, 0, val)
-#define read_vpe_c0_config()		mftc0($16, 0)
-#define write_vpe_c0_config(val)	mttc0($16, 0, val)
-#define read_vpe_c0_config1()		mftc0($16, 1)
-#define write_vpe_c0_config1(val)	mttc0($16, 1, val)
-#define read_vpe_c0_config7()		mftc0($16, 7)
-#define write_vpe_c0_config7(val)	mttc0($16, 7, val)
-#define read_vpe_c0_ebase()		mftc0($15,1)
-#define write_vpe_c0_ebase(val)		mttc0($15, 1, val)
-#define write_vpe_c0_compare(val)	mttc0($11, 0, val)
+#define read_vpe_c0_vpecontrol()	mftc0(1, 1)
+#define write_vpe_c0_vpecontrol(val)	mttc0(1, 1, val)
+#define read_vpe_c0_vpeconf0()		mftc0(1, 2)
+#define write_vpe_c0_vpeconf0(val)	mttc0(1, 2, val)
+#define read_vpe_c0_status()		mftc0(12, 0)
+#define write_vpe_c0_status(val)	mttc0(12, 0, val)
+#define read_vpe_c0_cause()		mftc0(13, 0)
+#define write_vpe_c0_cause(val)		mttc0(13, 0, val)
+#define read_vpe_c0_config()		mftc0(16, 0)
+#define write_vpe_c0_config(val)	mttc0(16, 0, val)
+#define read_vpe_c0_config1()		mftc0(16, 1)
+#define write_vpe_c0_config1(val)	mttc0(16, 1, val)
+#define read_vpe_c0_config7()		mftc0(16, 7)
+#define write_vpe_c0_config7(val)	mttc0(16, 7, val)
+#define read_vpe_c0_ebase()		mftc0(15,1)
+#define write_vpe_c0_ebase(val)		mttc0(15, 1, val)
+#define write_vpe_c0_compare(val)	mttc0(11, 0, val)
 
 
 /* TC */
-#define read_tc_c0_tcstatus()		mftc0($2, 1)
-#define write_tc_c0_tcstatus(val)	mttc0($2,1,val)
-#define read_tc_c0_tcbind()		mftc0($2, 2)
-#define write_tc_c0_tcbind(val)		mttc0($2,2,val)
-#define read_tc_c0_tcrestart()		mftc0($2, 3)
-#define write_tc_c0_tcrestart(val)	mttc0($2,3,val)
-#define read_tc_c0_tchalt()		mftc0($2, 4)
-#define write_tc_c0_tchalt(val)		mttc0($2,4,val)
-#define read_tc_c0_tccontext()		mftc0($2, 5)
-#define write_tc_c0_tccontext(val)	mttc0($2,5,val)
+#define read_tc_c0_tcstatus()		mftc0(2, 1)
+#define write_tc_c0_tcstatus(val)	mttc0(2,1,val)
+#define read_tc_c0_tcbind()		mftc0(2, 2)
+#define write_tc_c0_tcbind(val)		mttc0(2,2,val)
+#define read_tc_c0_tcrestart()		mftc0(2, 3)
+#define write_tc_c0_tcrestart(val)	mttc0(2,3,val)
+#define read_tc_c0_tchalt()		mftc0(2, 4)
+#define write_tc_c0_tchalt(val)		mttc0(2,4,val)
+#define read_tc_c0_tccontext()		mftc0(2, 5)
+#define write_tc_c0_tccontext(val)	mttc0(2,5,val)
 
 /* GPR */
-#define read_tc_gpr_sp()		mftgpr($29)
-#define write_tc_gpr_sp(val)		mttgpr($29, val)
-#define read_tc_gpr_gp()		mftgpr($28)
-#define write_tc_gpr_gp(val)		mttgpr($28, val)
+#define read_tc_gpr_sp()		mftgpr(29)
+#define write_tc_gpr_sp(val)		mttgpr(29, val)
+#define read_tc_gpr_gp()		mftgpr(28)
+#define write_tc_gpr_gp(val)		mttgpr(28, val)
 
 
 #endif /* Not __ASSEMBLY__ */