|
@@ -1107,3 +1107,170 @@ do { \
|
|
|
/* BMIPS43xx */
|
|
|
#define read_c0_brcm_cmt_intr() __read_32bit_c0_register($22, 1)
|
|
|
#define write_c0_brcm_cmt_intr(val) __write_32bit_c0_register($22, 1, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_cmt_ctrl() __read_32bit_c0_register($22, 2)
|
|
|
+#define write_c0_brcm_cmt_ctrl(val) __write_32bit_c0_register($22, 2, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_cmt_local() __read_32bit_c0_register($22, 3)
|
|
|
+#define write_c0_brcm_cmt_local(val) __write_32bit_c0_register($22, 3, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_config_1() __read_32bit_c0_register($22, 5)
|
|
|
+#define write_c0_brcm_config_1(val) __write_32bit_c0_register($22, 5, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_cbr() __read_32bit_c0_register($22, 6)
|
|
|
+#define write_c0_brcm_cbr(val) __write_32bit_c0_register($22, 6, val)
|
|
|
+
|
|
|
+/* BMIPS5000 */
|
|
|
+#define read_c0_brcm_config() __read_32bit_c0_register($22, 0)
|
|
|
+#define write_c0_brcm_config(val) __write_32bit_c0_register($22, 0, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_mode() __read_32bit_c0_register($22, 1)
|
|
|
+#define write_c0_brcm_mode(val) __write_32bit_c0_register($22, 1, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_action() __read_32bit_c0_register($22, 2)
|
|
|
+#define write_c0_brcm_action(val) __write_32bit_c0_register($22, 2, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_edsp() __read_32bit_c0_register($22, 3)
|
|
|
+#define write_c0_brcm_edsp(val) __write_32bit_c0_register($22, 3, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_bootvec() __read_32bit_c0_register($22, 4)
|
|
|
+#define write_c0_brcm_bootvec(val) __write_32bit_c0_register($22, 4, val)
|
|
|
+
|
|
|
+#define read_c0_brcm_sleepcount() __read_32bit_c0_register($22, 7)
|
|
|
+#define write_c0_brcm_sleepcount(val) __write_32bit_c0_register($22, 7, val)
|
|
|
+
|
|
|
+/*
|
|
|
+ * Macros to access the floating point coprocessor control registers
|
|
|
+ */
|
|
|
+#define read_32bit_cp1_register(source) \
|
|
|
+({ int __res; \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ ".set\tpush\n\t" \
|
|
|
+ ".set\treorder\n\t" \
|
|
|
+ /* gas fails to assemble cfc1 for some archs (octeon).*/ \
|
|
|
+ ".set\tmips1\n\t" \
|
|
|
+ "cfc1\t%0,"STR(source)"\n\t" \
|
|
|
+ ".set\tpop" \
|
|
|
+ : "=r" (__res)); \
|
|
|
+ __res;})
|
|
|
+
|
|
|
+#define rddsp(mask) \
|
|
|
+({ \
|
|
|
+ unsigned int __res; \
|
|
|
+ \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ " .set push \n" \
|
|
|
+ " .set noat \n" \
|
|
|
+ " # rddsp $1, %x1 \n" \
|
|
|
+ " .word 0x7c000cb8 | (%x1 << 16) \n" \
|
|
|
+ " move %0, $1 \n" \
|
|
|
+ " .set pop \n" \
|
|
|
+ : "=r" (__res) \
|
|
|
+ : "i" (mask)); \
|
|
|
+ __res; \
|
|
|
+})
|
|
|
+
|
|
|
+#define wrdsp(val, mask) \
|
|
|
+do { \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ " .set push \n" \
|
|
|
+ " .set noat \n" \
|
|
|
+ " move $1, %0 \n" \
|
|
|
+ " # wrdsp $1, %x1 \n" \
|
|
|
+ " .word 0x7c2004f8 | (%x1 << 11) \n" \
|
|
|
+ " .set pop \n" \
|
|
|
+ : \
|
|
|
+ : "r" (val), "i" (mask)); \
|
|
|
+} while (0)
|
|
|
+
|
|
|
+#if 0 /* Need DSP ASE capable assembler ... */
|
|
|
+#define mflo0() ({ long mflo0; __asm__("mflo %0, $ac0" : "=r" (mflo0)); mflo0;})
|
|
|
+#define mflo1() ({ long mflo1; __asm__("mflo %0, $ac1" : "=r" (mflo1)); mflo1;})
|
|
|
+#define mflo2() ({ long mflo2; __asm__("mflo %0, $ac2" : "=r" (mflo2)); mflo2;})
|
|
|
+#define mflo3() ({ long mflo3; __asm__("mflo %0, $ac3" : "=r" (mflo3)); mflo3;})
|
|
|
+
|
|
|
+#define mfhi0() ({ long mfhi0; __asm__("mfhi %0, $ac0" : "=r" (mfhi0)); mfhi0;})
|
|
|
+#define mfhi1() ({ long mfhi1; __asm__("mfhi %0, $ac1" : "=r" (mfhi1)); mfhi1;})
|
|
|
+#define mfhi2() ({ long mfhi2; __asm__("mfhi %0, $ac2" : "=r" (mfhi2)); mfhi2;})
|
|
|
+#define mfhi3() ({ long mfhi3; __asm__("mfhi %0, $ac3" : "=r" (mfhi3)); mfhi3;})
|
|
|
+
|
|
|
+#define mtlo0(x) __asm__("mtlo %0, $ac0" ::"r" (x))
|
|
|
+#define mtlo1(x) __asm__("mtlo %0, $ac1" ::"r" (x))
|
|
|
+#define mtlo2(x) __asm__("mtlo %0, $ac2" ::"r" (x))
|
|
|
+#define mtlo3(x) __asm__("mtlo %0, $ac3" ::"r" (x))
|
|
|
+
|
|
|
+#define mthi0(x) __asm__("mthi %0, $ac0" ::"r" (x))
|
|
|
+#define mthi1(x) __asm__("mthi %0, $ac1" ::"r" (x))
|
|
|
+#define mthi2(x) __asm__("mthi %0, $ac2" ::"r" (x))
|
|
|
+#define mthi3(x) __asm__("mthi %0, $ac3" ::"r" (x))
|
|
|
+
|
|
|
+#else
|
|
|
+
|
|
|
+#define mfhi0() \
|
|
|
+({ \
|
|
|
+ unsigned long __treg; \
|
|
|
+ \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ " .set push \n" \
|
|
|
+ " .set noat \n" \
|
|
|
+ " # mfhi %0, $ac0 \n" \
|
|
|
+ " .word 0x00000810 \n" \
|
|
|
+ " move %0, $1 \n" \
|
|
|
+ " .set pop \n" \
|
|
|
+ : "=r" (__treg)); \
|
|
|
+ __treg; \
|
|
|
+})
|
|
|
+
|
|
|
+#define mfhi1() \
|
|
|
+({ \
|
|
|
+ unsigned long __treg; \
|
|
|
+ \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ " .set push \n" \
|
|
|
+ " .set noat \n" \
|
|
|
+ " # mfhi %0, $ac1 \n" \
|
|
|
+ " .word 0x00200810 \n" \
|
|
|
+ " move %0, $1 \n" \
|
|
|
+ " .set pop \n" \
|
|
|
+ : "=r" (__treg)); \
|
|
|
+ __treg; \
|
|
|
+})
|
|
|
+
|
|
|
+#define mfhi2() \
|
|
|
+({ \
|
|
|
+ unsigned long __treg; \
|
|
|
+ \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ " .set push \n" \
|
|
|
+ " .set noat \n" \
|
|
|
+ " # mfhi %0, $ac2 \n" \
|
|
|
+ " .word 0x00400810 \n" \
|
|
|
+ " move %0, $1 \n" \
|
|
|
+ " .set pop \n" \
|
|
|
+ : "=r" (__treg)); \
|
|
|
+ __treg; \
|
|
|
+})
|
|
|
+
|
|
|
+#define mfhi3() \
|
|
|
+({ \
|
|
|
+ unsigned long __treg; \
|
|
|
+ \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ " .set push \n" \
|
|
|
+ " .set noat \n" \
|
|
|
+ " # mfhi %0, $ac3 \n" \
|
|
|
+ " .word 0x00600810 \n" \
|
|
|
+ " move %0, $1 \n" \
|
|
|
+ " .set pop \n" \
|
|
|
+ : "=r" (__treg)); \
|
|
|
+ __treg; \
|
|
|
+})
|
|
|
+
|
|
|
+#define mflo0() \
|
|
|
+({ \
|
|
|
+ unsigned long __treg; \
|
|
|
+ \
|
|
|
+ __asm__ __volatile__( \
|
|
|
+ " .set push \n" \
|
|
|
+ " .set noat \n" \
|
|
|
+ " # mflo %0, $ac0 \n" \
|