[rtems commit] powerpc: Set PPC_DEFAULT_CACHE_LINE_SIZE for e6500

Sebastian Huber sebh at rtems.org
Fri Jan 9 13:09:38 UTC 2015


Module:    rtems
Branch:    master
Commit:    7c16e1a5143b92228d9f3fac7fe653e5c3e4b880
Changeset: http://git.rtems.org/rtems/commit/?id=7c16e1a5143b92228d9f3fac7fe653e5c3e4b880

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Dec 23 11:38:34 2014 +0100

powerpc: Set PPC_DEFAULT_CACHE_LINE_SIZE for e6500

---

 c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S | 26 ++++++++++-------------
 cpukit/score/cpu/powerpc/rtems/score/cpu.h        | 10 ++++-----
 cpukit/score/cpu/powerpc/rtems/score/powerpc.h    |  8 ++++++-
 3 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S b/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S
index aeb4541..3b0b121 100644
--- a/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S
+++ b/c/src/lib/libcpu/powerpc/new-exceptions/cpu_asm.S
@@ -36,10 +36,6 @@
 #include <libcpu/powerpc-utility.h>
 #include <bspopts.h>
 
-#if PPC_DEFAULT_CACHE_LINE_SIZE != 32
-  #error "unexpected PPC_DEFAULT_CACHE_LINE_SIZE value"
-#endif
-
 #ifdef BSP_USE_DATA_CACHE_BLOCK_TOUCH
   #define DATA_CACHE_TOUCH(rega, regb) \
 	dcbt rega, regb
@@ -47,18 +43,18 @@
   #define DATA_CACHE_TOUCH(rega, regb)
 #endif
 
-#if BSP_DATA_CACHE_ENABLED && PPC_CACHE_ALIGNMENT == 32
+#if BSP_DATA_CACHE_ENABLED && PPC_DEFAULT_CACHE_LINE_SIZE == 32
   #define DATA_CACHE_ZERO_AND_TOUCH(reg, offset) \
 	li reg, offset; dcbz reg, r3; DATA_CACHE_TOUCH(reg, r4)
 #else
   #define DATA_CACHE_ZERO_AND_TOUCH(reg, offset)
 #endif
 
-#define PPC_CONTEXT_CACHE_LINE_0 32
-#define PPC_CONTEXT_CACHE_LINE_1 64
-#define PPC_CONTEXT_CACHE_LINE_2 96
-#define PPC_CONTEXT_CACHE_LINE_3 128
-#define PPC_CONTEXT_CACHE_LINE_4 160
+#define PPC_CONTEXT_CACHE_LINE_0 (1 * PPC_DEFAULT_CACHE_LINE_SIZE)
+#define PPC_CONTEXT_CACHE_LINE_1 (2 * PPC_DEFAULT_CACHE_LINE_SIZE)
+#define PPC_CONTEXT_CACHE_LINE_2 (3 * PPC_DEFAULT_CACHE_LINE_SIZE)
+#define PPC_CONTEXT_CACHE_LINE_3 (4 * PPC_DEFAULT_CACHE_LINE_SIZE)
+#define PPC_CONTEXT_CACHE_LINE_4 (5 * PPC_DEFAULT_CACHE_LINE_SIZE)
 
 /*
  * Offsets for various Contexts
@@ -257,8 +253,8 @@ PROC (_CPU_Context_switch):
 #endif
 
 	/* Align to a cache line */
-	clrrwi	r3, r3, 5
-	clrrwi	r5, r4, 5
+	clrrwi	r3, r3, PPC_DEFAULT_CACHE_LINE_POWER
+	clrrwi	r5, r4, PPC_DEFAULT_CACHE_LINE_POWER
 
 	DATA_CACHE_ZERO_AND_TOUCH(r10, PPC_CONTEXT_CACHE_LINE_0)
 	DATA_CACHE_ZERO_AND_TOUCH(r11, PPC_CONTEXT_CACHE_LINE_1)
@@ -278,7 +274,7 @@ PROC (_CPU_Context_switch):
 	 */
 #if PPC_CONTEXT_OFFSET_GPR1 != PPC_CONTEXT_CACHE_LINE_0 \
   || !BSP_DATA_CACHE_ENABLED \
-  || PPC_CACHE_ALIGNMENT != 32
+  || PPC_DEFAULT_CACHE_LINE_SIZE != 32
 	li	r10, PPC_CONTEXT_OFFSET_GPR1
 #endif
 #ifndef RTEMS_SMP
@@ -407,7 +403,7 @@ restore_context:
 	PUBLIC_PROC (_CPU_Context_restore)
 PROC (_CPU_Context_restore):
 	/* Align to a cache line */
-	clrrwi	r5, r3, 5
+	clrrwi	r5, r3, PPC_DEFAULT_CACHE_LINE_POWER
 
 #ifdef __ALTIVEC__
 	li	r3, 0
@@ -439,7 +435,7 @@ check_thread_dispatch_necessary:
 	/* Calculate the heir context pointer */
 	sub	r7, r4, r7
 	add	r4, r8, r7
-	clrrwi	r5, r4, 5
+	clrrwi	r5, r4, PPC_DEFAULT_CACHE_LINE_POWER
 
 	/* Update the executing */
 	stw	r8, PER_CPU_OFFSET_EXECUTING(r6)
diff --git a/cpukit/score/cpu/powerpc/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
index 889ecdf..29a2833 100644
--- a/cpukit/score/cpu/powerpc/rtems/score/cpu.h
+++ b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
@@ -358,13 +358,13 @@ static inline ppc_context *ppc_get_context( const Context_Control *context )
 #endif
 #endif /* ASM */
 
-#define PPC_CONTEXT_OFFSET_GPR1 32
-#define PPC_CONTEXT_OFFSET_MSR 36
-#define PPC_CONTEXT_OFFSET_LR 40
-#define PPC_CONTEXT_OFFSET_CR 44
+#define PPC_CONTEXT_OFFSET_GPR1 (PPC_DEFAULT_CACHE_LINE_SIZE + 0)
+#define PPC_CONTEXT_OFFSET_MSR (PPC_DEFAULT_CACHE_LINE_SIZE + 4)
+#define PPC_CONTEXT_OFFSET_LR (PPC_DEFAULT_CACHE_LINE_SIZE + 8)
+#define PPC_CONTEXT_OFFSET_CR (PPC_DEFAULT_CACHE_LINE_SIZE + 12)
 
 #define PPC_CONTEXT_GPR_OFFSET( gpr ) \
-  (((gpr) - 14) * PPC_GPR_SIZE + 48)
+  (((gpr) - 14) * PPC_GPR_SIZE + PPC_DEFAULT_CACHE_LINE_SIZE + 16)
 
 #define PPC_CONTEXT_OFFSET_GPR14 PPC_CONTEXT_GPR_OFFSET( 14 )
 #define PPC_CONTEXT_OFFSET_GPR15 PPC_CONTEXT_GPR_OFFSET( 15 )
diff --git a/cpukit/score/cpu/powerpc/rtems/score/powerpc.h b/cpukit/score/cpu/powerpc/rtems/score/powerpc.h
index ee5484b..90cbbd1 100644
--- a/cpukit/score/cpu/powerpc/rtems/score/powerpc.h
+++ b/cpukit/score/cpu/powerpc/rtems/score/powerpc.h
@@ -74,7 +74,13 @@ extern "C" {
 
 #define PPC_ALIGNMENT			8
 
-#define PPC_DEFAULT_CACHE_LINE_SIZE 32
+#ifdef __PPC_CPU_E6500__
+#define PPC_DEFAULT_CACHE_LINE_POWER 6
+#else
+#define PPC_DEFAULT_CACHE_LINE_POWER 5
+#endif
+
+#define PPC_DEFAULT_CACHE_LINE_SIZE (1 << PPC_DEFAULT_CACHE_LINE_POWER)
 
 #define PPC_STRUCTURE_ALIGNMENT PPC_DEFAULT_CACHE_LINE_SIZE
 



More information about the vc mailing list