powerpc: Add an inline function to update POWER8 HID0
authorGautham R. Shenoy <ego@linux.vnet.ibm.com>
Wed, 5 Aug 2015 07:08:31 +0000 (12:38 +0530)
committerMichael Ellerman <mpe@ellerman.id.au>
Fri, 14 Aug 2015 05:58:28 +0000 (15:58 +1000)
Section 3.7 of Version 1.2 of the Power8 Processor User's Manual
prescribes that updates to HID0 be preceded by a SYNC instruction and
followed by an ISYNC instruction (Page 91).

Create an inline function name update_power8_hid0() which follows this
recipe and invoke it from the static split core path.

Signed-off-by: Gautham R. Shenoy <ego@linux.vnet.ibm.com>
Reviewed-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
Tested-by: Sam Bobroff <sam.bobroff@au1.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/include/asm/reg.h
arch/powerpc/platforms/powernv/subcore.c

index bb27588..aa1cc5f 100644 (file)
@@ -1280,6 +1280,15 @@ struct pt_regs;
 
 extern void ppc_save_regs(struct pt_regs *regs);
 
+static inline void update_power8_hid0(unsigned long hid0)
+{
+       /*
+        *  The HID0 update on Power8 should at the very least be
+        *  preceded by a a SYNC instruction followed by an ISYNC
+        *  instruction
+        */
+       asm volatile("sync; mtspr %0,%1; isync":: "i"(SPRN_HID0), "r"(hid0));
+}
 #endif /* __ASSEMBLY__ */
 #endif /* __KERNEL__ */
 #endif /* _ASM_POWERPC_REG_H */
index f60f80a..503a73f 100644 (file)
@@ -190,7 +190,7 @@ static void unsplit_core(void)
 
        hid0 = mfspr(SPRN_HID0);
        hid0 &= ~HID0_POWER8_DYNLPARDIS;
-       mtspr(SPRN_HID0, hid0);
+       update_power8_hid0(hid0);
        update_hid_in_slw(hid0);
 
        while (mfspr(SPRN_HID0) & mask)
@@ -227,7 +227,7 @@ static void split_core(int new_mode)
        /* Write new mode */
        hid0  = mfspr(SPRN_HID0);
        hid0 |= HID0_POWER8_DYNLPARDIS | split_parms[i].value;
-       mtspr(SPRN_HID0, hid0);
+       update_power8_hid0(hid0);
        update_hid_in_slw(hid0);
 
        /* Wait for it to happen */