forked from Minki/linux
beb2dc0a7a
Some CPUs (such as e500v1/v2) don't implement mftb and will take a trap. mfspr should work on everything that has a timebase, and is the preferred instruction according to ISA v2.06. Currently we get away with mftb on 85xx because the assembler converts it to mfspr due to -Wa,-me500. However, that flag has other effects that are undesireable for certain targets (e.g. lwsync is converted to sync), and is hostile to multiplatform kernels. Thus we would like to stop setting it for all e500-family builds. mftb/mftbu instances which are in 85xx code or common code are converted. Instances which will never run on 85xx are left alone. Signed-off-by: Scott Wood <scottwood@freescale.com>
51 lines
845 B
C
51 lines
845 B
C
#ifndef _ASM_POWERPC_TIMEX_H
|
|
#define _ASM_POWERPC_TIMEX_H
|
|
|
|
#ifdef __KERNEL__
|
|
|
|
/*
|
|
* PowerPC architecture timex specifications
|
|
*/
|
|
|
|
#include <asm/cputable.h>
|
|
#include <asm/reg.h>
|
|
|
|
#define CLOCK_TICK_RATE 1024000 /* Underlying HZ */
|
|
|
|
typedef unsigned long cycles_t;
|
|
|
|
static inline cycles_t get_cycles(void)
|
|
{
|
|
#ifdef __powerpc64__
|
|
return mftb();
|
|
#else
|
|
cycles_t ret;
|
|
|
|
/*
|
|
* For the "cycle" counter we use the timebase lower half.
|
|
* Currently only used on SMP.
|
|
*/
|
|
|
|
ret = 0;
|
|
|
|
__asm__ __volatile__(
|
|
"97: mfspr %0, %2\n"
|
|
"99:\n"
|
|
".section __ftr_fixup,\"a\"\n"
|
|
".align 2\n"
|
|
"98:\n"
|
|
" .long %1\n"
|
|
" .long 0\n"
|
|
" .long 97b-98b\n"
|
|
" .long 99b-98b\n"
|
|
" .long 0\n"
|
|
" .long 0\n"
|
|
".previous"
|
|
: "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL));
|
|
return ret;
|
|
#endif
|
|
}
|
|
|
|
#endif /* __KERNEL__ */
|
|
#endif /* _ASM_POWERPC_TIMEX_H */
|