powerpc: Macros for saving/restore PPR
authorHaren Myneni <haren@linux.vnet.ibm.com>
Thu, 6 Dec 2012 21:50:32 +0000 (21:50 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Thu, 10 Jan 2013 06:01:10 +0000 (17:01 +1100)
[PATCH 5/6] powerpc: Macros for saving/restore PPR

Several macros are defined for saving and restore user defined PPR value.

Signed-off-by: Haren Myneni <haren@us.ibm.com>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/include/asm/exception-64s.h
arch/powerpc/include/asm/ppc_asm.h
arch/powerpc/include/asm/reg.h

index ed3cdcb501985e42b0da216a68d59d363342334d..391e0138724837d11c0b392d8d454fda9b4b7d00 100644 (file)
 #define RESTORE_LR(reg, area)
 #endif
 
+/*
+ * PPR save/restore macros used in exceptions_64s.S  
+ * Used for P7 or later processors
+ */
+#define SAVE_PPR(area, ra, rb)                                         \
+BEGIN_FTR_SECTION_NESTED(940)                                          \
+       ld      ra,PACACURRENT(r13);                                    \
+       ld      rb,area+EX_PPR(r13);    /* Read PPR from paca */        \
+       std     rb,TASKTHREADPPR(ra);                                   \
+END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,940)
+
+#define RESTORE_PPR_PACA(area, ra)                                     \
+BEGIN_FTR_SECTION_NESTED(941)                                          \
+       ld      ra,area+EX_PPR(r13);                                    \
+       mtspr   SPRN_PPR,ra;                                            \
+END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,941)
+
+/*
+ * Increase the priority on systems where PPR save/restore is not
+ * implemented/ supported.
+ */
+#define HMT_MEDIUM_PPR_DISCARD                                         \
+BEGIN_FTR_SECTION_NESTED(942)                                          \
+       HMT_MEDIUM;                                                     \
+END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,0,942)  /*non P7*/              
+
+/*
+ * Save PPR in paca whenever some register is available to use.
+ * Then increase the priority.
+ */
+#define HMT_MEDIUM_PPR_SAVE(area, ra)                                  \
+BEGIN_FTR_SECTION_NESTED(943)                                          \
+       mfspr   ra,SPRN_PPR;                                            \
+       std     ra,area+EX_PPR(r13);                                    \
+       HMT_MEDIUM;                                                     \
+END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,943) 
+
 #define __EXCEPTION_PROLOG_1(area, extra, vec)                         \
        GET_PACA(r13);                                                  \
        std     r9,area+EX_R9(r13);     /* save r9 - r12 */             \
index 376e36d707f998b6d3acd71f08593e5e41166473..c2d0e58aba3169d81052c7e2a47847eb986f752b 100644 (file)
@@ -389,6 +389,31 @@ END_FTR_SECTION_IFCLR(CPU_FTR_601)
        FTR_SECTION_ELSE_NESTED(848);   \
        mtocrf (FXM), RS;               \
        ALT_FTR_SECTION_END_NESTED_IFCLR(CPU_FTR_NOEXECUTE, 848)
+
+/*
+ * PPR restore macros used in entry_64.S
+ * Used for P7 or later processors
+ */
+#define HMT_MEDIUM_LOW_HAS_PPR                                         \
+BEGIN_FTR_SECTION_NESTED(944)                                          \
+       HMT_MEDIUM_LOW;                                                 \
+END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,944)
+
+#define SET_DEFAULT_THREAD_PPR(ra, rb)                                 \
+BEGIN_FTR_SECTION_NESTED(945)                                          \
+       lis     ra,INIT_PPR@highest;    /* default ppr=3 */             \
+       ld      rb,PACACURRENT(r13);                                    \
+       sldi    ra,ra,32;       /* 11- 13 bits are used for ppr */      \
+       std     ra,TASKTHREADPPR(rb);                                   \
+END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,945)
+
+#define RESTORE_PPR(ra, rb)                                            \
+BEGIN_FTR_SECTION_NESTED(946)                                          \
+       ld      ra,PACACURRENT(r13);                                    \
+       ld      rb,TASKTHREADPPR(ra);                                   \
+       mtspr   SPRN_PPR,rb;    /* Restore PPR */                       \
+END_FTR_SECTION_NESTED(CPU_FTR_HAS_PPR,CPU_FTR_HAS_PPR,946)
+
 #endif
 
 /*
index af88486b0c2359b0ae01d8f8607cd0d0d7fc25f1..1bdba54839b47b44f78bdb242808424e85be5d37 100644 (file)
 #define SPRN_DBAT6U    0x23C   /* Data BAT 6 Upper Register */
 #define SPRN_DBAT7L    0x23F   /* Data BAT 7 Lower Register */
 #define SPRN_DBAT7U    0x23E   /* Data BAT 7 Upper Register */
+#define SPRN_PPR       0x380   /* SMT Thread status Register */
 
 #define SPRN_DEC       0x016           /* Decrement Register */
 #define SPRN_DER       0x095           /* Debug Enable Regsiter */