12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- /* SPDX-License-Identifier: GPL-2.0-or-later */
- /*
- * Common timebase prototypes and such for all ppc machines.
- */
- #ifndef _ASM_POWERPC_VDSO_TIMEBASE_H
- #define _ASM_POWERPC_VDSO_TIMEBASE_H
- #include <asm/reg.h>
- /*
- * We use __powerpc64__ here because we want the compat VDSO to use the 32-bit
- * version below in the else case of the ifdef.
- */
- #if defined(__powerpc64__) && (defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_E500))
- #define mftb() ({unsigned long rval; \
- asm volatile( \
- "90: mfspr %0, %2;\n" \
- ASM_FTR_IFSET( \
- "97: cmpwi %0,0;\n" \
- " beq- 90b;\n", "", %1) \
- : "=r" (rval) \
- : "i" (CPU_FTR_CELL_TB_BUG), "i" (SPRN_TBRL) : "cr0"); \
- rval;})
- #elif defined(CONFIG_PPC_8xx)
- #define mftb() ({unsigned long rval; \
- asm volatile("mftbl %0" : "=r" (rval)); rval;})
- #else
- #define mftb() ({unsigned long rval; \
- asm volatile("mfspr %0, %1" : \
- "=r" (rval) : "i" (SPRN_TBRL)); rval;})
- #endif /* !CONFIG_PPC_CELL */
- #if defined(CONFIG_PPC_8xx)
- #define mftbu() ({unsigned long rval; \
- asm volatile("mftbu %0" : "=r" (rval)); rval;})
- #else
- #define mftbu() ({unsigned long rval; \
- asm volatile("mfspr %0, %1" : "=r" (rval) : \
- "i" (SPRN_TBRU)); rval;})
- #endif
- #define mttbl(v) asm volatile("mttbl %0":: "r"(v))
- #define mttbu(v) asm volatile("mttbu %0":: "r"(v))
- static __always_inline u64 get_tb(void)
- {
- unsigned int tbhi, tblo, tbhi2;
- /*
- * We use __powerpc64__ here not CONFIG_PPC64 because we want the compat
- * VDSO to use the 32-bit compatible version in the while loop below.
- */
- if (__is_defined(__powerpc64__))
- return mftb();
- do {
- tbhi = mftbu();
- tblo = mftb();
- tbhi2 = mftbu();
- } while (tbhi != tbhi2);
- return ((u64)tbhi << 32) | tblo;
- }
- static inline void set_tb(unsigned int upper, unsigned int lower)
- {
- mtspr(SPRN_TBWL, 0);
- mtspr(SPRN_TBWU, upper);
- mtspr(SPRN_TBWL, lower);
- }
- #endif /* _ASM_POWERPC_VDSO_TIMEBASE_H */
|