| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | /* | 
					
						
							|  |  |  |  * This file contains low level CPU setup functions. | 
					
						
							|  |  |  |  *    Copyright (C) 2003 Benjamin Herrenschmidt (benh@kernel.crashing.org)
 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or
 | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version
 | 
					
						
							|  |  |  |  * 2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <asm/processor.h> | 
					
						
							|  |  |  | #include <asm/page.h> | 
					
						
							|  |  |  | #include <asm/cputable.h> | 
					
						
							|  |  |  | #include <asm/ppc_asm.h> | 
					
						
							| 
									
										
										
										
											2005-09-09 20:57:26 +02:00
										 |  |  | #include <asm/asm-offsets.h> | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | #include <asm/cache.h> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-11 00:07:08 -05:00
										 |  |  | _GLOBAL(__cpu_preinit_ppc970) | 
					
						
							|  |  |  | 	/* Do nothing if not running in HV mode */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	mfmsr	r0 | 
					
						
							|  |  |  | 	rldicl.	r0,r0,4,63 | 
					
						
							|  |  |  | 	beqlr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Make sure HID4:rm_ci is off before MMU is turned off, that large | 
					
						
							|  |  |  | 	 * pages are enabled with HID4:61 and clear HID5:DCBZ_size and | 
					
						
							|  |  |  | 	 * HID5:DCBZ32_ill | 
					
						
							|  |  |  | 	 */ | 
					
						
							|  |  |  | 	li	r0,0 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID4 | 
					
						
							|  |  |  | 	rldimi	r3,r0,40,23	/* clear bit 23 (rm_ci) */ | 
					
						
							|  |  |  | 	rldimi	r3,r0,2,61	/* clear bit 61 (lg_pg_en) */ | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID4,r3 | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID5 | 
					
						
							|  |  |  | 	rldimi	r3,r0,6,56	/* clear bits 56 & 57 (DCBZ*) */ | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID5,r3 | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Setup some basic HID1 features */ | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID1 | 
					
						
							|  |  |  | 	li	r3,0x1200		/* enable i-fetch cacheability */ | 
					
						
							|  |  |  | 	sldi	r3,r3,44		/* and prefetch */ | 
					
						
							|  |  |  | 	or	r0,r0,r3 | 
					
						
							|  |  |  | 	mtspr	SPRN_HID1,r0 | 
					
						
							|  |  |  | 	mtspr	SPRN_HID1,r0 | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Clear HIOR */ | 
					
						
							|  |  |  | 	li	r0,0 | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	mtspr	SPRN_HIOR,0		/* Clear interrupt prefix */ | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Definitions for the table use to save CPU states */ | 
					
						
							|  |  |  | #define CS_HID0		0 | 
					
						
							|  |  |  | #define CS_HID1		8 | 
					
						
							|  |  |  | #define	CS_HID4		16 | 
					
						
							|  |  |  | #define CS_HID5		24 | 
					
						
							|  |  |  | #define CS_SIZE		32 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	.data | 
					
						
							|  |  |  | 	.balign	L1_CACHE_BYTES,0 | 
					
						
							| 
									
										
										
										
											2005-11-09 13:38:01 +11:00
										 |  |  | cpu_state_storage: | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	.space	CS_SIZE
 | 
					
						
							|  |  |  | 	.balign	L1_CACHE_BYTES,0 | 
					
						
							|  |  |  | 	.text | 
					
						
							| 
									
										
										
										
											2005-11-09 13:38:01 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-11 00:07:08 -05:00
										 |  |  | _GLOBAL(__setup_cpu_ppc970) | 
					
						
							|  |  |  | 	/* Do nothing if not running in HV mode */ | 
					
						
							| 
									
										
										
										
											2006-06-21 19:15:55 -04:00
										 |  |  | 	mfmsr	r0 | 
					
						
							|  |  |  | 	rldicl.	r0,r0,4,63 | 
					
						
							| 
									
										
											  
											
												powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits
This replaces the single CPU_FTR_HVMODE_206 bit with two bits, one to
indicate that we have a usable hypervisor mode, and another to indicate
that the processor conforms to PowerISA version 2.06.  We also add
another bit to indicate that the processor conforms to ISA version 2.01
and set that for PPC970 and derivatives.
Some PPC970 chips (specifically those in Apple machines) have a
hypervisor mode in that MSR[HV] is always 1, but the hypervisor mode
is not useful in the sense that there is no way to run any code in
supervisor mode (HV=0 PR=0).  On these processors, the LPES0 and LPES1
bits in HID4 are always 0, and we use that as a way of detecting that
hypervisor mode is not useful.
Where we have a feature section in assembly code around code that
only applies on POWER7 in hypervisor mode, we use a construct like
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
The definition of END_FTR_SECTION_IFSET is such that the code will
be enabled (not overwritten with nops) only if all bits in the
provided mask are set.
Note that the CPU feature check in __tlbie() only needs to check the
ARCH_206 bit, not the HVMODE bit, because __tlbie() can only get called
if we are running bare-metal, i.e. in hypervisor mode.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
											
										 
											2011-06-29 00:26:11 +00:00
										 |  |  | 	beq	no_hv_mode | 
					
						
							| 
									
										
										
										
											2006-08-11 00:07:08 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	li	r11,5			/* clear DOZE and SLEEP */ | 
					
						
							|  |  |  | 	rldimi	r0,r11,52,8		/* set NAP and DPM */ | 
					
						
							| 
									
										
										
										
											2006-08-25 14:56:07 +10:00
										 |  |  | 	li	r11,0 | 
					
						
							|  |  |  | 	rldimi	r0,r11,32,31		/* clear EN_ATTN */ | 
					
						
							| 
									
										
										
										
											2006-10-04 23:41:41 -05:00
										 |  |  | 	b	load_hids		/* Jump to shared code */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _GLOBAL(__setup_cpu_ppc970MP) | 
					
						
							|  |  |  | 	/* Do nothing if not running in HV mode */ | 
					
						
							|  |  |  | 	mfmsr	r0 | 
					
						
							|  |  |  | 	rldicl.	r0,r0,4,63 | 
					
						
							| 
									
										
											  
											
												powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits
This replaces the single CPU_FTR_HVMODE_206 bit with two bits, one to
indicate that we have a usable hypervisor mode, and another to indicate
that the processor conforms to PowerISA version 2.06.  We also add
another bit to indicate that the processor conforms to ISA version 2.01
and set that for PPC970 and derivatives.
Some PPC970 chips (specifically those in Apple machines) have a
hypervisor mode in that MSR[HV] is always 1, but the hypervisor mode
is not useful in the sense that there is no way to run any code in
supervisor mode (HV=0 PR=0).  On these processors, the LPES0 and LPES1
bits in HID4 are always 0, and we use that as a way of detecting that
hypervisor mode is not useful.
Where we have a feature section in assembly code around code that
only applies on POWER7 in hypervisor mode, we use a construct like
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
The definition of END_FTR_SECTION_IFSET is such that the code will
be enabled (not overwritten with nops) only if all bits in the
provided mask are set.
Note that the CPU feature check in __tlbie() only needs to check the
ARCH_206 bit, not the HVMODE bit, because __tlbie() can only get called
if we are running bare-metal, i.e. in hypervisor mode.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
											
										 
											2011-06-29 00:26:11 +00:00
										 |  |  | 	beq	no_hv_mode | 
					
						
							| 
									
										
										
										
											2006-10-04 23:41:41 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	li	r11,0x15		/* clear DOZE and SLEEP */ | 
					
						
							|  |  |  | 	rldimi	r0,r11,52,6		/* set DEEPNAP, NAP and DPM */ | 
					
						
							|  |  |  | 	li	r11,0 | 
					
						
							|  |  |  | 	rldimi	r0,r11,32,31		/* clear EN_ATTN */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | load_hids: | 
					
						
							| 
									
										
										
										
											2006-08-11 00:07:08 -05:00
										 |  |  | 	mtspr	SPRN_HID0,r0 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID0 | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
											  
											
												powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits
This replaces the single CPU_FTR_HVMODE_206 bit with two bits, one to
indicate that we have a usable hypervisor mode, and another to indicate
that the processor conforms to PowerISA version 2.06.  We also add
another bit to indicate that the processor conforms to ISA version 2.01
and set that for PPC970 and derivatives.
Some PPC970 chips (specifically those in Apple machines) have a
hypervisor mode in that MSR[HV] is always 1, but the hypervisor mode
is not useful in the sense that there is no way to run any code in
supervisor mode (HV=0 PR=0).  On these processors, the LPES0 and LPES1
bits in HID4 are always 0, and we use that as a way of detecting that
hypervisor mode is not useful.
Where we have a feature section in assembly code around code that
only applies on POWER7 in hypervisor mode, we use a construct like
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
The definition of END_FTR_SECTION_IFSET is such that the code will
be enabled (not overwritten with nops) only if all bits in the
provided mask are set.
Note that the CPU feature check in __tlbie() only needs to check the
ARCH_206 bit, not the HVMODE bit, because __tlbie() can only get called
if we are running bare-metal, i.e. in hypervisor mode.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
											
										 
											2011-06-29 00:26:11 +00:00
										 |  |  | 	/* Try to set LPES = 01 in HID4 */ | 
					
						
							|  |  |  | 	mfspr	r0,SPRN_HID4 | 
					
						
							|  |  |  | 	clrldi	r0,r0,1			/* clear LPES0 */ | 
					
						
							|  |  |  | 	ori	r0,r0,HID4_LPES1	/* set LPES1 */ | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID4,r0 | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2006-08-11 00:07:08 -05:00
										 |  |  | 	/* Save away cpu state */ | 
					
						
							| 
									
										
										
										
											2008-08-30 11:41:12 +10:00
										 |  |  | 	LOAD_REG_ADDR(r5,cpu_state_storage) | 
					
						
							| 
									
										
										
										
											2006-06-21 19:15:55 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* Save HID0,1,4 and 5 */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	mfspr	r3,SPRN_HID0 | 
					
						
							|  |  |  | 	std	r3,CS_HID0(r5) | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID1 | 
					
						
							|  |  |  | 	std	r3,CS_HID1(r5) | 
					
						
							| 
									
										
											  
											
												powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits
This replaces the single CPU_FTR_HVMODE_206 bit with two bits, one to
indicate that we have a usable hypervisor mode, and another to indicate
that the processor conforms to PowerISA version 2.06.  We also add
another bit to indicate that the processor conforms to ISA version 2.01
and set that for PPC970 and derivatives.
Some PPC970 chips (specifically those in Apple machines) have a
hypervisor mode in that MSR[HV] is always 1, but the hypervisor mode
is not useful in the sense that there is no way to run any code in
supervisor mode (HV=0 PR=0).  On these processors, the LPES0 and LPES1
bits in HID4 are always 0, and we use that as a way of detecting that
hypervisor mode is not useful.
Where we have a feature section in assembly code around code that
only applies on POWER7 in hypervisor mode, we use a construct like
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
The definition of END_FTR_SECTION_IFSET is such that the code will
be enabled (not overwritten with nops) only if all bits in the
provided mask are set.
Note that the CPU feature check in __tlbie() only needs to check the
ARCH_206 bit, not the HVMODE bit, because __tlbie() can only get called
if we are running bare-metal, i.e. in hypervisor mode.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
											
										 
											2011-06-29 00:26:11 +00:00
										 |  |  | 	mfspr	r4,SPRN_HID4 | 
					
						
							|  |  |  | 	std	r4,CS_HID4(r5) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	mfspr	r3,SPRN_HID5 | 
					
						
							|  |  |  | 	std	r3,CS_HID5(r5) | 
					
						
							| 
									
										
										
										
											2005-11-09 13:38:01 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
											  
											
												powerpc, KVM: Split HVMODE_206 cpu feature bit into separate HV and architecture bits
This replaces the single CPU_FTR_HVMODE_206 bit with two bits, one to
indicate that we have a usable hypervisor mode, and another to indicate
that the processor conforms to PowerISA version 2.06.  We also add
another bit to indicate that the processor conforms to ISA version 2.01
and set that for PPC970 and derivatives.
Some PPC970 chips (specifically those in Apple machines) have a
hypervisor mode in that MSR[HV] is always 1, but the hypervisor mode
is not useful in the sense that there is no way to run any code in
supervisor mode (HV=0 PR=0).  On these processors, the LPES0 and LPES1
bits in HID4 are always 0, and we use that as a way of detecting that
hypervisor mode is not useful.
Where we have a feature section in assembly code around code that
only applies on POWER7 in hypervisor mode, we use a construct like
END_FTR_SECTION_IFSET(CPU_FTR_HVMODE | CPU_FTR_ARCH_206)
The definition of END_FTR_SECTION_IFSET is such that the code will
be enabled (not overwritten with nops) only if all bits in the
provided mask are set.
Note that the CPU feature check in __tlbie() only needs to check the
ARCH_206 bit, not the HVMODE bit, because __tlbie() can only get called
if we are running bare-metal, i.e. in hypervisor mode.
Signed-off-by: Paul Mackerras <paulus@samba.org>
Signed-off-by: Alexander Graf <agraf@suse.de>
											
										 
											2011-06-29 00:26:11 +00:00
										 |  |  | 	/* See if we successfully set LPES1 to 1; if not we are in Apple mode */ | 
					
						
							|  |  |  | 	andi.	r4,r4,HID4_LPES1 | 
					
						
							|  |  |  | 	bnelr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | no_hv_mode: | 
					
						
							|  |  |  | 	/* Disable CPU_FTR_HVMODE and exit, since we don't have HV mode */ | 
					
						
							|  |  |  | 	ld	r5,CPU_SPEC_FEATURES(r4) | 
					
						
							|  |  |  | 	LOAD_REG_IMMEDIATE(r6,CPU_FTR_HVMODE) | 
					
						
							|  |  |  | 	andc	r5,r5,r6 | 
					
						
							|  |  |  | 	std	r5,CPU_SPEC_FEATURES(r4) | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	blr | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Called with no MMU context (typically MSR:IR/DR off) to | 
					
						
							|  |  |  |  * restore CPU state as backed up by the previous | 
					
						
							|  |  |  |  * function. This does not include cache setting | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2006-08-11 00:07:08 -05:00
										 |  |  | _GLOBAL(__restore_cpu_ppc970) | 
					
						
							|  |  |  | 	/* Do nothing if not running in HV mode */ | 
					
						
							| 
									
										
										
										
											2006-06-21 19:15:55 -04:00
										 |  |  | 	mfmsr	r0 | 
					
						
							|  |  |  | 	rldicl.	r0,r0,4,63 | 
					
						
							|  |  |  | 	beqlr | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-08-30 11:41:12 +10:00
										 |  |  | 	LOAD_REG_ADDR(r5,cpu_state_storage) | 
					
						
							| 
									
										
										
										
											2006-06-21 19:15:55 -04:00
										 |  |  | 	/* Before accessing memory, we make sure rm_ci is clear */ | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	li	r0,0 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID4 | 
					
						
							|  |  |  | 	rldimi	r3,r0,40,23	/* clear bit 23 (rm_ci) */ | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID4,r3 | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Clear interrupt prefix */ | 
					
						
							|  |  |  | 	li	r0,0 | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	mtspr	SPRN_HIOR,0 | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Restore HID0 */ | 
					
						
							|  |  |  | 	ld	r3,CS_HID0(r5) | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID0,r3 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID0 | 
					
						
							|  |  |  | 	mfspr	r3,SPRN_HID0 | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Restore HID1 */ | 
					
						
							|  |  |  | 	ld	r3,CS_HID1(r5) | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID1,r3 | 
					
						
							|  |  |  | 	mtspr	SPRN_HID1,r3 | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							| 
									
										
										
										
											2005-11-09 13:38:01 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2005-04-16 15:20:36 -07:00
										 |  |  | 	/* Restore HID4 */ | 
					
						
							|  |  |  | 	ld	r3,CS_HID4(r5) | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID4,r3 | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* Restore HID5 */ | 
					
						
							|  |  |  | 	ld	r3,CS_HID5(r5) | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	mtspr	SPRN_HID5,r3 | 
					
						
							|  |  |  | 	sync | 
					
						
							|  |  |  | 	isync | 
					
						
							|  |  |  | 	blr | 
					
						
							|  |  |  | 
 |