| /* 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) |