|
@@ -112,90 +112,7 @@
|
|
|
|
|
|
#ifndef __ASSEMBLY__
|
|
|
|
|
|
-/*
|
|
|
- ******************************************************************
|
|
|
- * Inline ASM macros to read/write AUX Regs
|
|
|
- * Essentially invocation of lr/sr insns from "C"
|
|
|
- */
|
|
|
-
|
|
|
-#if 1
|
|
|
-
|
|
|
-#define read_aux_reg(reg) __builtin_arc_lr(reg)
|
|
|
-
|
|
|
-/* gcc builtin sr needs reg param to be long immediate */
|
|
|
-#define write_aux_reg(reg_immed, val) \
|
|
|
- __builtin_arc_sr((unsigned int)(val), reg_immed)
|
|
|
-
|
|
|
-#else
|
|
|
-
|
|
|
-#define read_aux_reg(reg) \
|
|
|
-({ \
|
|
|
- unsigned int __ret; \
|
|
|
- __asm__ __volatile__( \
|
|
|
- " lr %0, [%1]" \
|
|
|
- : "=r"(__ret) \
|
|
|
- : "i"(reg)); \
|
|
|
- __ret; \
|
|
|
-})
|
|
|
-
|
|
|
-/*
|
|
|
- * Aux Reg address is specified as long immediate by caller
|
|
|
- * e.g.
|
|
|
- * write_aux_reg(0x69, some_val);
|
|
|
- * This generates tightest code.
|
|
|
- */
|
|
|
-#define write_aux_reg(reg_imm, val) \
|
|
|
-({ \
|
|
|
- __asm__ __volatile__( \
|
|
|
- " sr %0, [%1] \n" \
|
|
|
- : \
|
|
|
- : "ir"(val), "i"(reg_imm)); \
|
|
|
-})
|
|
|
-
|
|
|
-/*
|
|
|
- * Aux Reg address is specified in a variable
|
|
|
- * * e.g.
|
|
|
- * reg_num = 0x69
|
|
|
- * write_aux_reg2(reg_num, some_val);
|
|
|
- * This has to generate glue code to load the reg num from
|
|
|
- * memory to a reg hence not recommended.
|
|
|
- */
|
|
|
-#define write_aux_reg2(reg_in_var, val) \
|
|
|
-({ \
|
|
|
- unsigned int tmp; \
|
|
|
- \
|
|
|
- __asm__ __volatile__( \
|
|
|
- " ld %0, [%2] \n\t" \
|
|
|
- " sr %1, [%0] \n\t" \
|
|
|
- : "=&r"(tmp) \
|
|
|
- : "r"(val), "memory"(®_in_var)); \
|
|
|
-})
|
|
|
-
|
|
|
-#endif
|
|
|
-
|
|
|
-#define READ_BCR(reg, into) \
|
|
|
-{ \
|
|
|
- unsigned int tmp; \
|
|
|
- tmp = read_aux_reg(reg); \
|
|
|
- if (sizeof(tmp) == sizeof(into)) { \
|
|
|
- into = *((typeof(into) *)&tmp); \
|
|
|
- } else { \
|
|
|
- extern void bogus_undefined(void); \
|
|
|
- bogus_undefined(); \
|
|
|
- } \
|
|
|
-}
|
|
|
-
|
|
|
-#define WRITE_AUX(reg, into) \
|
|
|
-{ \
|
|
|
- unsigned int tmp; \
|
|
|
- if (sizeof(tmp) == sizeof(into)) { \
|
|
|
- tmp = (*(unsigned int *)&(into)); \
|
|
|
- write_aux_reg(reg, tmp); \
|
|
|
- } else { \
|
|
|
- extern void bogus_undefined(void); \
|
|
|
- bogus_undefined(); \
|
|
|
- } \
|
|
|
-}
|
|
|
+#include <soc/arc/aux.h>
|
|
|
|
|
|
/* Helpers */
|
|
|
#define TO_KB(bytes) ((bytes) >> 10)
|