xref: /rk3399_rockchip-uboot/arch/arm/cpu/armv8/s32v234/cpu.c (revision 66669fcf809c1e3ff644b12e04e625d3737ffd8e)
19702ec00SEddy Petrișor /*
29702ec00SEddy Petrișor  * (C) Copyright 2014-2016, Freescale Semiconductor, Inc.
39702ec00SEddy Petrișor  *
49702ec00SEddy Petrișor  * SPDX-License-Identifier:	GPL-2.0+
59702ec00SEddy Petrișor  */
69702ec00SEddy Petrișor 
79702ec00SEddy Petrișor #include <common.h>
89702ec00SEddy Petrișor #include <asm/io.h>
99702ec00SEddy Petrișor #include <asm/system.h>
109702ec00SEddy Petrișor #include <asm/armv8/mmu.h>
119702ec00SEddy Petrișor #include <asm/io.h>
129702ec00SEddy Petrișor #include <asm/arch/mc_me_regs.h>
139702ec00SEddy Petrișor #include "cpu.h"
149702ec00SEddy Petrișor 
159702ec00SEddy Petrișor DECLARE_GLOBAL_DATA_PTR;
169702ec00SEddy Petrișor 
cpu_mask(void)179702ec00SEddy Petrișor u32 cpu_mask(void)
189702ec00SEddy Petrișor {
199702ec00SEddy Petrișor 	return readl(MC_ME_CS);
209702ec00SEddy Petrișor }
219702ec00SEddy Petrișor 
229702ec00SEddy Petrișor #ifndef CONFIG_SYS_DCACHE_OFF
239702ec00SEddy Petrișor 
249702ec00SEddy Petrișor #define S32V234_IRAM_BASE        0x3e800000UL
259702ec00SEddy Petrișor #define S32V234_IRAM_SIZE        0x800000UL
269702ec00SEddy Petrișor #define S32V234_DRAM_BASE1       0x80000000UL
279702ec00SEddy Petrișor #define S32V234_DRAM_SIZE1       0x40000000UL
289702ec00SEddy Petrișor #define S32V234_DRAM_BASE2       0xC0000000UL
299702ec00SEddy Petrișor #define S32V234_DRAM_SIZE2       0x20000000UL
309702ec00SEddy Petrișor #define S32V234_PERIPH_BASE      0x40000000UL
319702ec00SEddy Petrișor #define S32V234_PERIPH_SIZE      0x40000000UL
329702ec00SEddy Petrișor 
339702ec00SEddy Petrișor static struct mm_region s32v234_mem_map[] = {
349702ec00SEddy Petrișor 	{
35*cd4b0c5fSYork Sun 		.virt = S32V234_IRAM_BASE,
36*cd4b0c5fSYork Sun 		.phys = S32V234_IRAM_BASE,
379702ec00SEddy Petrișor 		.size = S32V234_IRAM_SIZE,
389702ec00SEddy Petrișor 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
399702ec00SEddy Petrișor 			 PTE_BLOCK_OUTER_SHARE
409702ec00SEddy Petrișor 	}, {
41*cd4b0c5fSYork Sun 		.virt = S32V234_DRAM_BASE1,
42*cd4b0c5fSYork Sun 		.phys = S32V234_DRAM_BASE1,
439702ec00SEddy Petrișor 		.size = S32V234_DRAM_SIZE1,
449702ec00SEddy Petrișor 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL) |
459702ec00SEddy Petrișor 			 PTE_BLOCK_OUTER_SHARE
469702ec00SEddy Petrișor 	}, {
47*cd4b0c5fSYork Sun 		.virt = S32V234_PERIPH_BASE,
48*cd4b0c5fSYork Sun 		.phys = S32V234_PERIPH_BASE,
499702ec00SEddy Petrișor 		.size = S32V234_PERIPH_SIZE,
509702ec00SEddy Petrișor 		.attrs = PTE_BLOCK_MEMTYPE(MT_DEVICE_NGNRNE) |
519702ec00SEddy Petrișor 			 PTE_BLOCK_NON_SHARE
529702ec00SEddy Petrișor 			 /* TODO: Do we need these? */
539702ec00SEddy Petrișor 			 /* | PTE_BLOCK_PXN | PTE_BLOCK_UXN */
549702ec00SEddy Petrișor 	}, {
55*cd4b0c5fSYork Sun 		.virt = S32V234_DRAM_BASE2,
56*cd4b0c5fSYork Sun 		.phys = S32V234_DRAM_BASE2,
579702ec00SEddy Petrișor 		.size = S32V234_DRAM_SIZE2,
589702ec00SEddy Petrișor 		.attrs = PTE_BLOCK_MEMTYPE(MT_NORMAL_NC) |
599702ec00SEddy Petrișor 			 PTE_BLOCK_OUTER_SHARE
609702ec00SEddy Petrișor 	}, {
619702ec00SEddy Petrișor 		/* List terminator */
629702ec00SEddy Petrișor 		0,
639702ec00SEddy Petrișor 	}
649702ec00SEddy Petrișor };
659702ec00SEddy Petrișor 
669702ec00SEddy Petrișor struct mm_region *mem_map = s32v234_mem_map;
679702ec00SEddy Petrișor 
689702ec00SEddy Petrișor #endif
699702ec00SEddy Petrișor 
709702ec00SEddy Petrișor /*
719702ec00SEddy Petrișor  * Return the number of cores on this SOC.
729702ec00SEddy Petrișor  */
cpu_numcores(void)739702ec00SEddy Petrișor int cpu_numcores(void)
749702ec00SEddy Petrișor {
759702ec00SEddy Petrișor 	int numcores;
769702ec00SEddy Petrișor 	u32 mask;
779702ec00SEddy Petrișor 
789702ec00SEddy Petrișor 	mask = cpu_mask();
799702ec00SEddy Petrișor 	numcores = hweight32(cpu_mask());
809702ec00SEddy Petrișor 
819702ec00SEddy Petrișor 	/* Verify if M4 is deactivated */
829702ec00SEddy Petrișor 	if (mask & 0x1)
839702ec00SEddy Petrișor 		numcores--;
849702ec00SEddy Petrișor 
859702ec00SEddy Petrișor 	return numcores;
869702ec00SEddy Petrișor }
879702ec00SEddy Petrișor 
889702ec00SEddy Petrișor #if defined(CONFIG_ARCH_EARLY_INIT_R)
arch_early_init_r(void)899702ec00SEddy Petrișor int arch_early_init_r(void)
909702ec00SEddy Petrișor {
919702ec00SEddy Petrișor 	int rv;
929702ec00SEddy Petrișor 	asm volatile ("dsb sy");
939702ec00SEddy Petrișor 	rv = fsl_s32v234_wake_seconday_cores();
949702ec00SEddy Petrișor 
959702ec00SEddy Petrișor 	if (rv)
969702ec00SEddy Petrișor 		printf("Did not wake secondary cores\n");
979702ec00SEddy Petrișor 
989702ec00SEddy Petrișor 	asm volatile ("sev");
999702ec00SEddy Petrișor 	return 0;
1009702ec00SEddy Petrișor }
1019702ec00SEddy Petrișor #endif /* CONFIG_ARCH_EARLY_INIT_R */
102