aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorScott Wood <scottwood@freescale.com>2013-08-20 20:33:12 -0400
committerScott Wood <scottwood@freescale.com>2013-08-20 20:33:12 -0400
commitbeb2dc0a7a84be003ce54e98b95d65cc66e6e536 (patch)
treea30c97effb8f723cccbc343306df4c7b6ab0047b /arch/powerpc
parentd52459ca3047435aa5d7957e50857fc7ba193411 (diff)
powerpc: Convert some mftb/mftbu into mfspr
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>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/boot/ppc_asm.h3
-rw-r--r--arch/powerpc/boot/util.S10
-rw-r--r--arch/powerpc/include/asm/ppc_asm.h4
-rw-r--r--arch/powerpc/include/asm/reg.h15
-rw-r--r--arch/powerpc/include/asm/timex.h4
-rw-r--r--arch/powerpc/kernel/vdso32/gettimeofday.S6
-rw-r--r--arch/powerpc/platforms/85xx/smp.c6
7 files changed, 29 insertions, 19 deletions
diff --git a/arch/powerpc/boot/ppc_asm.h b/arch/powerpc/boot/ppc_asm.h
index 1c2c2817f9b7..eb0e98be69e0 100644
--- a/arch/powerpc/boot/ppc_asm.h
+++ b/arch/powerpc/boot/ppc_asm.h
@@ -59,4 +59,7 @@
59#define r30 30 59#define r30 30
60#define r31 31 60#define r31 31
61 61
62#define SPRN_TBRL 268
63#define SPRN_TBRU 269
64
62#endif /* _PPC64_PPC_ASM_H */ 65#endif /* _PPC64_PPC_ASM_H */
diff --git a/arch/powerpc/boot/util.S b/arch/powerpc/boot/util.S
index 427ddfc11991..5143228e3e5f 100644
--- a/arch/powerpc/boot/util.S
+++ b/arch/powerpc/boot/util.S
@@ -71,18 +71,18 @@ udelay:
71 add r4,r4,r5 71 add r4,r4,r5
72 addi r4,r4,-1 72 addi r4,r4,-1
73 divw r4,r4,r5 /* BUS ticks */ 73 divw r4,r4,r5 /* BUS ticks */
741: mftbu r5 741: mfspr r5, SPRN_TBRU
75 mftb r6 75 mfspr r6, SPRN_TBRL
76 mftbu r7 76 mfspr r7, SPRN_TBRU
77 cmpw 0,r5,r7 77 cmpw 0,r5,r7
78 bne 1b /* Get [synced] base time */ 78 bne 1b /* Get [synced] base time */
79 addc r9,r6,r4 /* Compute end time */ 79 addc r9,r6,r4 /* Compute end time */
80 addze r8,r5 80 addze r8,r5
812: mftbu r5 812: mfspr r5, SPRN_TBRU
82 cmpw 0,r5,r8 82 cmpw 0,r5,r8
83 blt 2b 83 blt 2b
84 bgt 3f 84 bgt 3f
85 mftb r6 85 mfspr r6, SPRN_TBRL
86 cmpw 0,r6,r9 86 cmpw 0,r6,r9
87 blt 2b 87 blt 2b
883: blr 883: blr
diff --git a/arch/powerpc/include/asm/ppc_asm.h b/arch/powerpc/include/asm/ppc_asm.h
index 8fdd3da134e0..599545738af3 100644
--- a/arch/powerpc/include/asm/ppc_asm.h
+++ b/arch/powerpc/include/asm/ppc_asm.h
@@ -433,13 +433,13 @@ END_FTR_SECTION_IFSET(CPU_FTR_601)
433 433
434#if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E) 434#if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
435#define MFTB(dest) \ 435#define MFTB(dest) \
43690: mftb dest; \ 43690: mfspr dest, SPRN_TBRL; \
437BEGIN_FTR_SECTION_NESTED(96); \ 437BEGIN_FTR_SECTION_NESTED(96); \
438 cmpwi dest,0; \ 438 cmpwi dest,0; \
439 beq- 90b; \ 439 beq- 90b; \
440END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96) 440END_FTR_SECTION_NESTED(CPU_FTR_CELL_TB_BUG, CPU_FTR_CELL_TB_BUG, 96)
441#else 441#else
442#define MFTB(dest) mftb dest 442#define MFTB(dest) mfspr dest, SPRN_TBRL
443#endif 443#endif
444 444
445#ifndef CONFIG_SMP 445#ifndef CONFIG_SMP
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index 55b03079d197..64264bf601f5 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h
@@ -1120,7 +1120,7 @@
1120#if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E) 1120#if defined(CONFIG_PPC_CELL) || defined(CONFIG_PPC_FSL_BOOK3E)
1121#define mftb() ({unsigned long rval; \ 1121#define mftb() ({unsigned long rval; \
1122 asm volatile( \ 1122 asm volatile( \
1123 "90: mftb %0;\n" \ 1123 "90: mfspr %0, %2;\n" \
1124 "97: cmpwi %0,0;\n" \ 1124 "97: cmpwi %0,0;\n" \
1125 " beq- 90b;\n" \ 1125 " beq- 90b;\n" \
1126 "99:\n" \ 1126 "99:\n" \
@@ -1134,18 +1134,23 @@
1134 " .llong 0\n" \ 1134 " .llong 0\n" \
1135 " .llong 0\n" \ 1135 " .llong 0\n" \
1136 ".previous" \ 1136 ".previous" \
1137 : "=r" (rval) : "i" (CPU_FTR_CELL_TB_BUG)); rval;}) 1137 : "=r" (rval) \
1138 : "i" (CPU_FTR_CELL_TB_BUG), "i" (SPRN_TBRL)); \
1139 rval;})
1138#else 1140#else
1139#define mftb() ({unsigned long rval; \ 1141#define mftb() ({unsigned long rval; \
1140 asm volatile("mftb %0" : "=r" (rval)); rval;}) 1142 asm volatile("mfspr %0, %1" : \
1143 "=r" (rval) : "i" (SPRN_TBRL)); rval;})
1141#endif /* !CONFIG_PPC_CELL */ 1144#endif /* !CONFIG_PPC_CELL */
1142 1145
1143#else /* __powerpc64__ */ 1146#else /* __powerpc64__ */
1144 1147
1145#define mftbl() ({unsigned long rval; \ 1148#define mftbl() ({unsigned long rval; \
1146 asm volatile("mftbl %0" : "=r" (rval)); rval;}) 1149 asm volatile("mfspr %0, %1" : "=r" (rval) : \
1150 "i" (SPRN_TBRL)); rval;})
1147#define mftbu() ({unsigned long rval; \ 1151#define mftbu() ({unsigned long rval; \
1148 asm volatile("mftbu %0" : "=r" (rval)); rval;}) 1152 asm volatile("mfspr %0, %1" : "=r" (rval) : \
1153 "i" (SPRN_TBRU)); rval;})
1149#endif /* !__powerpc64__ */ 1154#endif /* !__powerpc64__ */
1150 1155
1151#define mttbl(v) asm volatile("mttbl %0":: "r"(v)) 1156#define mttbl(v) asm volatile("mttbl %0":: "r"(v))
diff --git a/arch/powerpc/include/asm/timex.h b/arch/powerpc/include/asm/timex.h
index c55e14f7ef44..18908caa1f3b 100644
--- a/arch/powerpc/include/asm/timex.h
+++ b/arch/powerpc/include/asm/timex.h
@@ -29,7 +29,7 @@ static inline cycles_t get_cycles(void)
29 ret = 0; 29 ret = 0;
30 30
31 __asm__ __volatile__( 31 __asm__ __volatile__(
32 "97: mftb %0\n" 32 "97: mfspr %0, %2\n"
33 "99:\n" 33 "99:\n"
34 ".section __ftr_fixup,\"a\"\n" 34 ".section __ftr_fixup,\"a\"\n"
35 ".align 2\n" 35 ".align 2\n"
@@ -41,7 +41,7 @@ static inline cycles_t get_cycles(void)
41 " .long 0\n" 41 " .long 0\n"
42 " .long 0\n" 42 " .long 0\n"
43 ".previous" 43 ".previous"
44 : "=r" (ret) : "i" (CPU_FTR_601)); 44 : "=r" (ret) : "i" (CPU_FTR_601), "i" (SPRN_TBRL));
45 return ret; 45 return ret;
46#endif 46#endif
47} 47}
diff --git a/arch/powerpc/kernel/vdso32/gettimeofday.S b/arch/powerpc/kernel/vdso32/gettimeofday.S
index 27e2f623210b..6b1f2a6d5517 100644
--- a/arch/powerpc/kernel/vdso32/gettimeofday.S
+++ b/arch/powerpc/kernel/vdso32/gettimeofday.S
@@ -232,9 +232,9 @@ __do_get_tspec:
232 lwz r6,(CFG_TB_ORIG_STAMP+4)(r9) 232 lwz r6,(CFG_TB_ORIG_STAMP+4)(r9)
233 233
234 /* Get a stable TB value */ 234 /* Get a stable TB value */
2352: mftbu r3 2352: mfspr r3, SPRN_TBRU
236 mftbl r4 236 mfspr r4, SPRN_TBRL
237 mftbu r0 237 mfspr r0, SPRN_TBRU
238 cmplw cr0,r3,r0 238 cmplw cr0,r3,r0
239 bne- 2b 239 bne- 2b
240 240
diff --git a/arch/powerpc/platforms/85xx/smp.c b/arch/powerpc/platforms/85xx/smp.c
index ea7e62910891..281b7f01df63 100644
--- a/arch/powerpc/platforms/85xx/smp.c
+++ b/arch/powerpc/platforms/85xx/smp.c
@@ -83,11 +83,13 @@ static void mpc85xx_give_timebase(void)
83 { 83 {
84 u64 prev; 84 u64 prev;
85 85
86 asm volatile("mftb %0" : "=r" (timebase)); 86 asm volatile("mfspr %0, %1" : "=r" (timebase) :
87 "i" (SPRN_TBRL));
87 88
88 do { 89 do {
89 prev = timebase; 90 prev = timebase;
90 asm volatile("mftb %0" : "=r" (timebase)); 91 asm volatile("mfspr %0, %1" : "=r" (timebase) :
92 "i" (SPRN_TBRL));
91 } while (prev != timebase); 93 } while (prev != timebase);
92 } 94 }
93#else 95#else