Initialize SVE system registers.
This patch initializes the SVE system registers if available and initializes the vector length to the maximum supported. This is done according to the SVE specification [1]. [1] https://developer.arm.com/docs/ddi0584/latest/arm-architecture-reference-manual-supplement-the-scalable-vector-extension-sve-for-armv8-a
This commit is contained in:
		
							parent
							
								
									2bbe8697d8
								
							
						
					
					
						commit
						9a7f131e0e
					
				| 
						 | 
				
			
			@ -145,6 +145,33 @@ _flat_map:
 | 
			
		|||
	dsb	sy
 | 
			
		||||
	msr	sctlr_el3, x0
 | 
			
		||||
	isb
 | 
			
		||||
 | 
			
		||||
	/* Determine if SVE is available.  */
 | 
			
		||||
       mrs      x0, id_aa64pfr0_el1
 | 
			
		||||
       tbz      x0, 32, .Lnosve
 | 
			
		||||
 | 
			
		||||
       /* set up CPTR_EL3.TZ to 1.  */
 | 
			
		||||
       mrs     x0, cptr_el3
 | 
			
		||||
 | 
			
		||||
       /* TZ is bit 8 of CPTR_EL3.  */
 | 
			
		||||
       orr     x0, x0, #0x100
 | 
			
		||||
       msr     cptr_el3, x0
 | 
			
		||||
       isb
 | 
			
		||||
 | 
			
		||||
       /* set up vector lenght in ZCR_EL3 (4 LSB).  */
 | 
			
		||||
       mov     x2, #0xF
 | 
			
		||||
 | 
			
		||||
       /* Try to set the maximum value supported by the architecture (2048).
 | 
			
		||||
	  SVE Arch.
 | 
			
		||||
 | 
			
		||||
	    "If this field is set to a value that is not supported by the
 | 
			
		||||
	    implementation then reading the register must return the highest
 | 
			
		||||
	    supported vector length that is less than the value written."  */
 | 
			
		||||
       mrs     x1, s3_6_c1_c2_0                /* mrs  x1, zcr_el3.  */
 | 
			
		||||
       bfi     x1, x2, 0, 4
 | 
			
		||||
       msr     s3_6_c1_c2_0, x1                /* msr  zcr_el3, x1.  */
 | 
			
		||||
       isb
 | 
			
		||||
.Lnosve:
 | 
			
		||||
	ret
 | 
			
		||||
 | 
			
		||||
	.data
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue