[PATCH v2] powerpc: Add an inline function to update HID0
From: Gautham R. Shenoy <hidden>
Date: 2015-08-04 11:06:45
Also in:
lkml
Subsystem:
linux for powerpc (32-bit and 64-bit), the rest · Maintainers:
Madhavan Srinivasan, Linus Torvalds
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_hid0() which follows this recipe and invoke it from the static split core path. Signed-off-by: Gautham R. Shenoy <redacted> --- [v1--> v2: Moved defn of update_hid0 to reg.h from kvm_ppc.h] arch/powerpc/include/asm/reg.h | 13 +++++++++++++ arch/powerpc/platforms/powernv/subcore.c | 4 ++-- 2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/arch/powerpc/include/asm/reg.h b/arch/powerpc/include/asm/reg.h
index af56b5c..beb98ac 100644
--- a/arch/powerpc/include/asm/reg.h
+++ b/arch/powerpc/include/asm/reg.h@@ -12,6 +12,8 @@ #include <linux/stringify.h> #include <asm/cputable.h> +#include <asm/barrier.h> +#include <asm/synch.h> /* Pickup Book E specific registers. */ #if defined(CONFIG_BOOKE) || defined(CONFIG_40x)
@@ -1281,6 +1283,17 @@ struct pt_regs; extern void ppc_save_regs(struct pt_regs *regs); +static inline void update_hid0(unsigned long hid0) +{ + /* + * The HID0 update should at the very least be preceded by a + * a SYNC instruction followed by an ISYNC instruction + */ + mb(); + mtspr(SPRN_HID0, hid0); + isync(); +} + #endif /* __ASSEMBLY__ */ #endif /* __KERNEL__ */ #endif /* _ASM_POWERPC_REG_H */
diff --git a/arch/powerpc/platforms/powernv/subcore.c b/arch/powerpc/platforms/powernv/subcore.c
index f60f80a..37e77bf 100644
--- a/arch/powerpc/platforms/powernv/subcore.c
+++ b/arch/powerpc/platforms/powernv/subcore.c@@ -190,7 +190,7 @@ static void unsplit_core(void) hid0 = mfspr(SPRN_HID0); hid0 &= ~HID0_POWER8_DYNLPARDIS; - mtspr(SPRN_HID0, hid0); + update_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_hid0(hid0); update_hid_in_slw(hid0); /* Wait for it to happen */
--
1.9.3