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