Add the initialization of CNTVOFF for sun8i-a83t. For boot CPU, create a new machine that handles this function's call in an "init_early" callback. We need to initialize CNTVOFF before the arch timer's initialization otherwise, it will not be taken into account and fails to boot correctly. Because of that, this function can't be called in SMP's early_initcall function which is called after timer's init. For secondary CPUs, add this function into secondary_startup assembly entry. Signed-off-by: Mylène Josserand <mylene.josserand@bootlin.com> Reviewed-by: Marc Zyngier <marc.zyngier@arm.com> Signed-off-by: Maxime Ripard <maxime.ripard@bootlin.com>
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			ArmAsm
		
	
	
	
	
	
| /* SPDX-License-Identifier: GPL-2.0
 | |
|  *
 | |
|  * Copyright (c) 2018 Chen-Yu Tsai
 | |
|  * Copyright (c) 2018 Bootlin
 | |
|  *
 | |
|  * Chen-Yu Tsai <wens@csie.org>
 | |
|  * Mylène Josserand <mylene.josserand@bootlin.com>
 | |
|  *
 | |
|  * SMP support for sunxi based systems with Cortex A7/A15
 | |
|  *
 | |
|  */
 | |
| 
 | |
| #include <linux/linkage.h>
 | |
| #include <asm/assembler.h>
 | |
| #include <asm/cputype.h>
 | |
| 
 | |
| ENTRY(sunxi_mc_smp_cluster_cache_enable)
 | |
| 	.arch	armv7-a
 | |
| 	/*
 | |
| 	 * Enable cluster-level coherency, in preparation for turning on the MMU.
 | |
| 	 *
 | |
| 	 * Also enable regional clock gating and L2 data latency settings for
 | |
| 	 * Cortex-A15. These settings are from the vendor kernel.
 | |
| 	 */
 | |
| 	mrc	p15, 0, r1, c0, c0, 0
 | |
| 	movw	r2, #(ARM_CPU_PART_MASK & 0xffff)
 | |
| 	movt	r2, #(ARM_CPU_PART_MASK >> 16)
 | |
| 	and	r1, r1, r2
 | |
| 	movw	r2, #(ARM_CPU_PART_CORTEX_A15 & 0xffff)
 | |
| 	movt	r2, #(ARM_CPU_PART_CORTEX_A15 >> 16)
 | |
| 	cmp	r1, r2
 | |
| 	bne	not_a15
 | |
| 
 | |
| 	/* The following is Cortex-A15 specific */
 | |
| 
 | |
| 	/* ACTLR2: Enable CPU regional clock gates */
 | |
| 	mrc p15, 1, r1, c15, c0, 4
 | |
| 	orr r1, r1, #(0x1 << 31)
 | |
| 	mcr p15, 1, r1, c15, c0, 4
 | |
| 
 | |
| 	/* L2ACTLR */
 | |
| 	mrc p15, 1, r1, c15, c0, 0
 | |
| 	/* Enable L2, GIC, and Timer regional clock gates */
 | |
| 	orr r1, r1, #(0x1 << 26)
 | |
| 	/* Disable clean/evict from being pushed to external */
 | |
| 	orr r1, r1, #(0x1<<3)
 | |
| 	mcr p15, 1, r1, c15, c0, 0
 | |
| 
 | |
| 	/* L2CTRL: L2 data RAM latency */
 | |
| 	mrc p15, 1, r1, c9, c0, 2
 | |
| 	bic r1, r1, #(0x7 << 0)
 | |
| 	orr r1, r1, #(0x3 << 0)
 | |
| 	mcr p15, 1, r1, c9, c0, 2
 | |
| 
 | |
| 	/* End of Cortex-A15 specific setup */
 | |
| 	not_a15:
 | |
| 
 | |
| 	/* Get value of sunxi_mc_smp_first_comer */
 | |
| 	adr	r1, first
 | |
| 	ldr	r0, [r1]
 | |
| 	ldr	r0, [r1, r0]
 | |
| 
 | |
| 	/* Skip cci_enable_port_for_self if not first comer */
 | |
| 	cmp	r0, #0
 | |
| 	bxeq	lr
 | |
| 	b	cci_enable_port_for_self
 | |
| 
 | |
| 	.align 2
 | |
| 	first: .word sunxi_mc_smp_first_comer - .
 | |
| ENDPROC(sunxi_mc_smp_cluster_cache_enable)
 | |
| 
 | |
| ENTRY(sunxi_mc_smp_secondary_startup)
 | |
| 	bl	sunxi_mc_smp_cluster_cache_enable
 | |
| 	bl	secure_cntvoff_init
 | |
| 	b	secondary_startup
 | |
| ENDPROC(sunxi_mc_smp_secondary_startup)
 | |
| 
 | |
| ENTRY(sunxi_mc_smp_resume)
 | |
| 	bl	sunxi_mc_smp_cluster_cache_enable
 | |
| 	b	cpu_resume
 | |
| ENDPROC(sunxi_mc_smp_resume)
 |