diff options
Diffstat (limited to 'arch/powerpc/kernel/dt_cpu_ftrs.c')
| -rw-r--r-- | arch/powerpc/kernel/dt_cpu_ftrs.c | 24 | 
1 files changed, 16 insertions, 8 deletions
| diff --git a/arch/powerpc/kernel/dt_cpu_ftrs.c b/arch/powerpc/kernel/dt_cpu_ftrs.c index ba527fb52993..7d1b2c4a4891 100644 --- a/arch/powerpc/kernel/dt_cpu_ftrs.c +++ b/arch/powerpc/kernel/dt_cpu_ftrs.c @@ -80,6 +80,7 @@ static void __restore_cpu_cpufeatures(void)  	mtspr(SPRN_LPCR, system_registers.lpcr);  	if (hv_mode) {  		mtspr(SPRN_LPID, 0); +		mtspr(SPRN_AMOR, ~0);  		mtspr(SPRN_HFSCR, system_registers.hfscr);  		mtspr(SPRN_PCR, system_registers.pcr);  	} @@ -216,6 +217,7 @@ static int __init feat_enable_hv(struct dt_cpu_feature *f)  	}  	mtspr(SPRN_LPID, 0); +	mtspr(SPRN_AMOR, ~0);  	lpcr = mfspr(SPRN_LPCR);  	lpcr &=  ~LPCR_LPES0; /* HV external interrupts */ @@ -271,6 +273,9 @@ static int __init feat_enable_mmu_hash(struct dt_cpu_feature *f)  {  	u64 lpcr; +	if (!IS_ENABLED(CONFIG_PPC_64S_HASH_MMU)) +		return 0; +  	lpcr = mfspr(SPRN_LPCR);  	lpcr &= ~LPCR_ISL; @@ -290,6 +295,9 @@ static int __init feat_enable_mmu_hash_v3(struct dt_cpu_feature *f)  {  	u64 lpcr; +	if (!IS_ENABLED(CONFIG_PPC_64S_HASH_MMU)) +		return 0; +  	lpcr = mfspr(SPRN_LPCR);  	lpcr &= ~(LPCR_ISL | LPCR_UPRT | LPCR_HR);  	mtspr(SPRN_LPCR, lpcr); @@ -303,15 +311,15 @@ static int __init feat_enable_mmu_hash_v3(struct dt_cpu_feature *f)  static int __init feat_enable_mmu_radix(struct dt_cpu_feature *f)  { -#ifdef CONFIG_PPC_RADIX_MMU +	if (!IS_ENABLED(CONFIG_PPC_RADIX_MMU)) +		return 0; + +	cur_cpu_spec->mmu_features |= MMU_FTR_KERNEL_RO;  	cur_cpu_spec->mmu_features |= MMU_FTR_TYPE_RADIX; -	cur_cpu_spec->mmu_features |= MMU_FTRS_HASH_BASE;  	cur_cpu_spec->mmu_features |= MMU_FTR_GTSE;  	cur_cpu_spec->cpu_user_features |= PPC_FEATURE_HAS_MMU;  	return 1; -#endif -	return 0;  }  static int __init feat_enable_dscr(struct dt_cpu_feature *f) @@ -336,7 +344,7 @@ static int __init feat_enable_dscr(struct dt_cpu_feature *f)  	return 1;  } -static void hfscr_pmu_enable(void) +static void __init hfscr_pmu_enable(void)  {  	u64 hfscr = mfspr(SPRN_HFSCR);  	hfscr |= PPC_BIT(60); @@ -351,7 +359,7 @@ static void init_pmu_power8(void)  	}  	mtspr(SPRN_MMCRA, 0); -	mtspr(SPRN_MMCR0, 0); +	mtspr(SPRN_MMCR0, MMCR0_FC);  	mtspr(SPRN_MMCR1, 0);  	mtspr(SPRN_MMCR2, 0);  	mtspr(SPRN_MMCRS, 0); @@ -390,7 +398,7 @@ static void init_pmu_power9(void)  		mtspr(SPRN_MMCRC, 0);  	mtspr(SPRN_MMCRA, 0); -	mtspr(SPRN_MMCR0, 0); +	mtspr(SPRN_MMCR0, MMCR0_FC);  	mtspr(SPRN_MMCR1, 0);  	mtspr(SPRN_MMCR2, 0);  } @@ -426,7 +434,7 @@ static void init_pmu_power10(void)  	mtspr(SPRN_MMCR3, 0);  	mtspr(SPRN_MMCRA, MMCRA_BHRB_DISABLE); -	mtspr(SPRN_MMCR0, MMCR0_PMCCEXT); +	mtspr(SPRN_MMCR0, MMCR0_FC | MMCR0_PMCCEXT);  }  static int __init feat_enable_pmu_power10(struct dt_cpu_feature *f) |