Add POWER9 DD2.0 feature, remove idle workarounds in DD2.1
Nicholas Piggin
reviewerv3 cover Add POWER9 DD2.0 feature, remove idle workarounds in DD2.1
Since v2: Split up the features into two patches.
I kept Vaidy's reviewed-by because the end result code was not changed.
Nicholas Piggin (3):
powerpc: add POWER9_DD20 feature
powerpc/64s/idle: avoid POWER9 DD1 and DD2.0 ERAT workaround on DD2.1 powerpc/64s/idle: avoid POWER9 DD1 and DD2.0 PMU workaround on DD2.1
arch/powerpc/include/asm/cputable.h | 5 ++++- arch/powerpc/kernel/cputable.c | 20 ++++++++++++++++++++ arch/powerpc/kernel/dt_cpu_ftrs.c | 2 ++ arch/powerpc/kernel/idle_book3s.S | 31 ++++++++++++++++++++----------- 4 files changed, 46 insertions(+), 12 deletions(-)
Signature · 1 line
2.15.0
Nicholas Piggin
reviewerPATCH v3 1/3 powerpc: add POWER9_DD20 feature
--- arch/powerpc/include/asm/cputable.h | 5 ++++- arch/powerpc/kernel/cputable.c | 20 ++++++++++++++++++++ arch/powerpc/kernel/dt_cpu_ftrs.c | 2 ++ 3 files changed, 26 insertions(+), 1 deletion(-)
arch/powerpc/include/asm/cputable.h +4 -1
@@ -215,6 +215,7 @@ enum {#define CPU_FTR_DABRX LONG_ASM_CONST(0x0800000000000000)#define CPU_FTR_PMAO_BUG LONG_ASM_CONST(0x1000000000000000)#define CPU_FTR_POWER9_DD1 LONG_ASM_CONST(0x4000000000000000) +#define CPU_FTR_POWER9_DD20 LONG_ASM_CONST(0x8000000000000000)#ifndef __ASSEMBLY__
@@ -477,6 +478,7 @@ enum { CPU_FTR_ARCH_207S | CPU_FTR_TM_COMP | CPU_FTR_ARCH_300)#define CPU_FTRS_POWER9_DD1 ((CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD1) & \ (~CPU_FTR_SAO)) +#define CPU_FTRS_POWER9_DD20 (CPU_FTRS_POWER9 | CPU_FTR_POWER9_DD20)#define CPU_FTRS_CELL (CPU_FTR_USE_TB | CPU_FTR_LWSYNC | \ CPU_FTR_PPCAS_ARCH_V2 | CPU_FTR_CTRL | \ CPU_FTR_ALTIVEC_COMP | CPU_FTR_MMCRA | CPU_FTR_SMT | \
@@ -495,7 +497,8 @@ enum { (CPU_FTRS_POWER4 |CPU_FTRS_PPC970 |CPU_FTRS_POWER5 | \CPU_FTRS_POWER6 |CPU_FTRS_POWER7 |CPU_FTRS_POWER8E | \CPU_FTRS_POWER8 |CPU_FTRS_POWER8_DD1 |CPU_FTRS_CELL | \ - CPU_FTRS_PA6T | CPU_FTR_VSX | CPU_FTRS_POWER9 | CPU_FTRS_POWER9_DD1) +CPU_FTRS_PA6T |CPU_FTR_VSX |CPU_FTRS_POWER9 | \ + CPU_FTRS_POWER9_DD1 | CPU_FTRS_POWER9_DD20)#endif #else enum {
arch/powerpc/kernel/cputable.c +20 -0
@@ -547,6 +547,26 @@ static struct cpu_spec __initdata cpu_specs[] = { .machine_check_early = __machine_check_early_realmode_p9, .platform = "power9", }, + {/* Power9 DD2.0 */ + .pvr_mask = 0xffffefff, + .pvr_value = 0x004e0200, + .cpu_name = "POWER9 (raw)", + .cpu_features = CPU_FTRS_POWER9_DD20, + .cpu_user_features = COMMON_USER_POWER9, + .cpu_user_features2 = COMMON_USER2_POWER9, + .mmu_features = MMU_FTRS_POWER9, + .icache_bsize = 128, + .dcache_bsize = 128, + .num_pmcs = 6, + .pmc_type = PPC_PMC_IBM, + .oprofile_cpu_type = "ppc64/power9", + .oprofile_type = PPC_OPROFILE_INVALID, + .cpu_setup = __setup_cpu_power9, + .cpu_restore = __restore_cpu_power9, + .flush_tlb = __flush_tlb_power9, + .machine_check_early = __machine_check_early_realmode_p9, + .platform = "power9", + }, { /* Power9 */ .pvr_mask = 0xffff0000, .pvr_value = 0x004e0000,
arch/powerpc/kernel/dt_cpu_ftrs.c +2 -0
@@ -735,6 +735,8 @@ static __init void cpufeatures_cpu_quirks(void)*/ if ((version &0xffffff00 ) ==0x004e0100 ) cur_cpu_spec->cpu_features |=CPU_FTR_POWER9_DD1 ; +else if ((version &0xffffefff ) ==0x004e0200 ) + cur_cpu_spec->cpu_features |=CPU_FTR_POWER9_DD20 ; }static void __init cpufeatures_setup_finished (void )
Signature · 1 line
2.15.0
Re: [v3,1/3] powerpc: add POWER9_DD20 feature
Quoted 2 lines · Nicholas Piggin
Cc Michael Neuling <[email protected]>Signed-off-by Nicholas Piggin <[email protected]>
Series applied to powerpc next, thanks.
https://git.kernel.org/powerpc/c/b6b3755e9bec9c686a34ec81eacced
cheers
Nicholas Piggin
reviewerPATCH v3 2/3 powerpc/64s/idle: avoid POWER9 DD1 and DD2.0 ERAT workaround on DD2.1
In reply to Nicholas PigginDD2.1 does not have to flush the ERAT after a state-loss idle.
Performance testing was done on a DD2.1 using only the stop0 idle state (the shallowest state which supports state loss), using context_switch selftest configured to ping-poing between two threads on the same core and two different cores.
Performance improvement for same core is 7.0%, different cores is 14.8%.
--- arch/powerpc/kernel/idle_book3s.S | 2 ++ 1 file changed, 2 insertions(+)
arch/powerpc/kernel/idle_book3s.S +2 -0
@@ -542,7 +542,9 @@ pnv_restore_hyp_resource_arch300: * then clear bit 60 in MMCRA to ensure the PMU starts running. */ blt cr3,1f +BEGIN_FTR_SECTION PPC_INVALIDATE_ERAT +END_FTR_SECTION_IFSET(CPU_FTR_POWER9_DD1 | CPU_FTR_POWER9_DD20) ld r1,PACAR1(r13) mfspr r4,SPRN_MMCRA ori r4,r4,(1 << (63-60))
Signature · 1 line
2.15.0
Nicholas Piggin
reviewerPATCH v3 3/3 powerpc/64s/idle: avoid POWER9 DD1 and DD2.0 PMU workaround on DD2.1
In reply to Nicholas PigginDD2.1 does not have to save MMCR0 for all state-loss idle states, only after deep idle states (like other PMU registers).
--- arch/powerpc/kernel/idle_book3s.S | 31 +++++++++++++++++++------------ 1 file changed, 19 insertions(+), 12 deletions(-)
arch/powerpc/kernel/idle_book3s.S +19 -12
@@ -112,12 +112,14 @@ power9_save_additional_sprs: std r4, STOP_HFSCR(r13) mfspr r3, SPRN_MMCRA - mfspr r4, SPRN_MMCR1 + mfspr r4, SPRN_MMCR0 std r3, STOP_MMCRA(r13) - std r4, STOP_MMCR1(r13) + std r4, _MMCR0(r1) - mfspr r3, SPRN_MMCR2 - std r3, STOP_MMCR2(r13) + mfspr r3, SPRN_MMCR1 + mfspr r4, SPRN_MMCR2 + std r3, STOP_MMCR1(r13) + std r4, STOP_MMCR2(r13) blr power9_restore_additional_sprs:
@@ -135,11 +137,14 @@ power9_restore_additional_sprs: ld r4, STOP_MMCRA(r13) mtspr SPRN_HFSCR, r3 mtspr SPRN_MMCRA, r4 - /* We have already restored PACA_MMCR0 */ - ld r3, STOP_MMCR1(r13) - ld r4, STOP_MMCR2(r13) - mtspr SPRN_MMCR1, r3 - mtspr SPRN_MMCR2, r4 + + ld r3, _MMCR0(r1) + ld r4, STOP_MMCR1(r13) + mtspr SPRN_MMCR0, r3 + mtspr SPRN_MMCR1, r4 + + ld r3, STOP_MMCR2(r13) + mtspr SPRN_MMCR2, r3 blr /*
@@ -350,6 +355,7 @@ power_enter_stop: b pnv_wakeup_noloss .Lhandle_esl_ec_set: +BEGIN_FTR_SECTION /* * POWER9 DD2 can incorrectly set PMAO when waking up after a * state-loss idle. Saving and restoring MMCR0 over idle is a
@@ -357,6 +363,7 @@ power_enter_stop: */ mfspr r4,SPRN_MMCR0 std r4,_MMCR0(r1) +END_FTR_SECTION_IFSET(CPU_FTR_POWER9_DD1 | CPU_FTR_POWER9_DD20) /* * Check if the requested state is a deep idle state.
@@ -544,15 +551,15 @@ pnv_restore_hyp_resource_arch300: blt cr3,1f BEGIN_FTR_SECTION PPC_INVALIDATE_ERAT -END_FTR_SECTION_IFSET(CPU_FTR_POWER9_DD1 | CPU_FTR_POWER9_DD20) ld r1,PACAR1(r13) + ld r4,_MMCR0(r1) + mtspr SPRN_MMCR0,r4 +END_FTR_SECTION_IFSET(CPU_FTR_POWER9_DD1 | CPU_FTR_POWER9_DD20) mfspr r4,SPRN_MMCRA ori r4,r4,(1 << (63-60)) mtspr SPRN_MMCRA,r4 xori r4,r4,(1 << (63-60)) mtspr SPRN_MMCRA,r4 - ld r4,_MMCR0(r1) - mtspr SPRN_MMCR0,r4 1: /* * POWER ISA 3. Use PSSCR to determine if we
Signature · 1 line
2.15.0