powerpc/ppc64: Do not turn AIL (reloc-on interrupts) too early
Turn them on at the same time as we allow MSR_IR/DR in the paca kernel MSR, ie, after the MMU has been setup enough to be able to handle relocated access to the linear mapping. Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
		
					parent
					
						
							
								a944a9c40b
							
						
					
				
			
			
				commit
				
					
						8f619b5429
					
				
			
		
					 2 changed files with 15 additions and 5 deletions
				
			
		| 
						 | 
					@ -56,7 +56,6 @@ _GLOBAL(__setup_cpu_power8)
 | 
				
			||||||
	li	r0,0
 | 
						li	r0,0
 | 
				
			||||||
	mtspr	SPRN_LPID,r0
 | 
						mtspr	SPRN_LPID,r0
 | 
				
			||||||
	mfspr	r3,SPRN_LPCR
 | 
						mfspr	r3,SPRN_LPCR
 | 
				
			||||||
	oris	r3, r3, LPCR_AIL_3@h
 | 
					 | 
				
			||||||
	bl	__init_LPCR
 | 
						bl	__init_LPCR
 | 
				
			||||||
	bl	__init_HFSCR
 | 
						bl	__init_HFSCR
 | 
				
			||||||
	bl	__init_tlb_power8
 | 
						bl	__init_tlb_power8
 | 
				
			||||||
| 
						 | 
					@ -75,7 +74,6 @@ _GLOBAL(__restore_cpu_power8)
 | 
				
			||||||
	li	r0,0
 | 
						li	r0,0
 | 
				
			||||||
	mtspr	SPRN_LPID,r0
 | 
						mtspr	SPRN_LPID,r0
 | 
				
			||||||
	mfspr   r3,SPRN_LPCR
 | 
						mfspr   r3,SPRN_LPCR
 | 
				
			||||||
	oris	r3, r3, LPCR_AIL_3@h
 | 
					 | 
				
			||||||
	bl	__init_LPCR
 | 
						bl	__init_LPCR
 | 
				
			||||||
	bl	__init_HFSCR
 | 
						bl	__init_HFSCR
 | 
				
			||||||
	bl	__init_tlb_power8
 | 
						bl	__init_tlb_power8
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -195,6 +195,18 @@ static void fixup_boot_paca(void)
 | 
				
			||||||
	get_paca()->data_offset = 0;
 | 
						get_paca()->data_offset = 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static void cpu_ready_for_interrupts(void)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						/* Set IR and DR in PACA MSR */
 | 
				
			||||||
 | 
						get_paca()->kernel_msr = MSR_KERNEL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						/* Enable AIL if supported */
 | 
				
			||||||
 | 
						if (cpu_has_feature(CPU_FTR_ARCH_207S)) {
 | 
				
			||||||
 | 
							unsigned long lpcr = mfspr(SPRN_LPCR);
 | 
				
			||||||
 | 
							mtspr(SPRN_LPCR, lpcr | LPCR_AIL_3);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 * Early initialization entry point. This is called by head.S
 | 
					 * Early initialization entry point. This is called by head.S
 | 
				
			||||||
 * with MMU translation disabled. We rely on the "feature" of
 | 
					 * with MMU translation disabled. We rely on the "feature" of
 | 
				
			||||||
| 
						 | 
					@ -264,9 +276,9 @@ void __init early_setup(unsigned long dt_ptr)
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * At this point, we can let interrupts switch to virtual mode
 | 
						 * At this point, we can let interrupts switch to virtual mode
 | 
				
			||||||
	 * (the MMU has been setup), so adjust the MSR in the PACA to
 | 
						 * (the MMU has been setup), so adjust the MSR in the PACA to
 | 
				
			||||||
	 * have IR and DR set.
 | 
						 * have IR and DR set and enable AIL if it exists
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	get_paca()->kernel_msr = MSR_KERNEL;
 | 
						cpu_ready_for_interrupts();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/* Reserve large chunks of memory for use by CMA for KVM */
 | 
						/* Reserve large chunks of memory for use by CMA for KVM */
 | 
				
			||||||
	kvm_cma_reserve();
 | 
						kvm_cma_reserve();
 | 
				
			||||||
| 
						 | 
					@ -307,7 +319,7 @@ void early_setup_secondary(void)
 | 
				
			||||||
	 * (the MMU has been setup), so adjust the MSR in the PACA to
 | 
						 * (the MMU has been setup), so adjust the MSR in the PACA to
 | 
				
			||||||
	 * have IR and DR set.
 | 
						 * have IR and DR set.
 | 
				
			||||||
	 */
 | 
						 */
 | 
				
			||||||
	get_paca()->kernel_msr = MSR_KERNEL;
 | 
						cpu_ready_for_interrupts();
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif /* CONFIG_SMP */
 | 
					#endif /* CONFIG_SMP */
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue