1*badbb63cSNobuhiro Iwamatsu/* 2*badbb63cSNobuhiro Iwamatsu * arch/arm/cpu/armv7/rmobile/lowlevel_init_ca15.S 3*badbb63cSNobuhiro Iwamatsu * This file is lager low level initialize. 4*badbb63cSNobuhiro Iwamatsu * 5*badbb63cSNobuhiro Iwamatsu * Copyright (C) 2013, 2014 Renesas Electronics Corporation 6*badbb63cSNobuhiro Iwamatsu * 7*badbb63cSNobuhiro Iwamatsu * SPDX-License-Identifier: GPL-2.0 8*badbb63cSNobuhiro Iwamatsu */ 9*badbb63cSNobuhiro Iwamatsu 10*badbb63cSNobuhiro Iwamatsu#include <config.h> 11*badbb63cSNobuhiro Iwamatsu#include <linux/linkage.h> 12*badbb63cSNobuhiro Iwamatsu 13*badbb63cSNobuhiro IwamatsuENTRY(lowlevel_init) 14*badbb63cSNobuhiro Iwamatsu mrc p15, 0, r4, c0, c0, 5 /* mpidr */ 15*badbb63cSNobuhiro Iwamatsu orr r4, r4, r4, lsr #6 16*badbb63cSNobuhiro Iwamatsu and r4, r4, #7 /* id 0-3 = ca15.0,1,2,3 */ 17*badbb63cSNobuhiro Iwamatsu 18*badbb63cSNobuhiro Iwamatsu b do_lowlevel_init 19*badbb63cSNobuhiro Iwamatsu 20*badbb63cSNobuhiro Iwamatsu .pool 21*badbb63cSNobuhiro Iwamatsu 22*badbb63cSNobuhiro Iwamatsu/* 23*badbb63cSNobuhiro Iwamatsu * CPU ID #1-#3 come here 24*badbb63cSNobuhiro Iwamatsu */ 25*badbb63cSNobuhiro Iwamatsu .align 4 26*badbb63cSNobuhiro Iwamatsudo_cpu_waiting: 27*badbb63cSNobuhiro Iwamatsu ldr r1, =0xe6180000 /* sysc */ 28*badbb63cSNobuhiro Iwamatsu1: ldr r0, [r1, #0x20] /* sbar */ 29*badbb63cSNobuhiro Iwamatsu tst r0, r0 30*badbb63cSNobuhiro Iwamatsu beq 1b 31*badbb63cSNobuhiro Iwamatsu bx r0 32*badbb63cSNobuhiro Iwamatsu 33*badbb63cSNobuhiro Iwamatsu/* 34*badbb63cSNobuhiro Iwamatsu * Only CPU ID #0 comes here 35*badbb63cSNobuhiro Iwamatsu */ 36*badbb63cSNobuhiro Iwamatsu .align 4 37*badbb63cSNobuhiro Iwamatsudo_lowlevel_init: 38*badbb63cSNobuhiro Iwamatsu ldr r2, =0xFF000044 /* PRR */ 39*badbb63cSNobuhiro Iwamatsu ldr r1, [r2] 40*badbb63cSNobuhiro Iwamatsu and r1, r1, #0x7F00 41*badbb63cSNobuhiro Iwamatsu lsrs r1, r1, #8 42*badbb63cSNobuhiro Iwamatsu cmp r1, #0x4C /* 0x4C is ID of r8a7794 */ 43*badbb63cSNobuhiro Iwamatsu beq _enable_actlr_smp 44*badbb63cSNobuhiro Iwamatsu 45*badbb63cSNobuhiro Iwamatsu /* surpress wfe if ca15 */ 46*badbb63cSNobuhiro Iwamatsu tst r4, #4 47*badbb63cSNobuhiro Iwamatsu mrceq p15, 0, r0, c1, c0, 1 /* actlr */ 48*badbb63cSNobuhiro Iwamatsu orreq r0, r0, #(1<<7) 49*badbb63cSNobuhiro Iwamatsu mcreq p15, 0, r0, c1, c0, 1 50*badbb63cSNobuhiro Iwamatsu 51*badbb63cSNobuhiro Iwamatsu /* and set l2 latency */ 52*badbb63cSNobuhiro Iwamatsu mrc p15, 0, r0, c0, c0, 5 /* r0 = MPIDR */ 53*badbb63cSNobuhiro Iwamatsu and r0, r0, #0xf00 54*badbb63cSNobuhiro Iwamatsu lsr r0, r0, #8 55*badbb63cSNobuhiro Iwamatsu tst r0, #1 /* only need for cluster 0 */ 56*badbb63cSNobuhiro Iwamatsu bne _exit_init_l2_a15 57*badbb63cSNobuhiro Iwamatsu 58*badbb63cSNobuhiro Iwamatsu mrc p15, 1, r0, c9, c0, 2 /* r0 = L2CTLR */ 59*badbb63cSNobuhiro Iwamatsu and r1, r0, #7 60*badbb63cSNobuhiro Iwamatsu cmp r1, #3 /* has already been set up */ 61*badbb63cSNobuhiro Iwamatsu bicne r0, r0, #0xe7 62*badbb63cSNobuhiro Iwamatsu orrne r0, r0, #0x83 /* L2CTLR[7:6] + L2CTLR[2:0] */ 63*badbb63cSNobuhiro Iwamatsu#if defined(CONFIG_R8A7790) 64*badbb63cSNobuhiro Iwamatsu orrne r0, r0, #0x20 /* L2CTLR[5] */ 65*badbb63cSNobuhiro Iwamatsu#endif 66*badbb63cSNobuhiro Iwamatsu mcrne p15, 1, r0, c9, c0, 2 67*badbb63cSNobuhiro Iwamatsu 68*badbb63cSNobuhiro Iwamatsu b _exit_init_l2_a15 69*badbb63cSNobuhiro Iwamatsu 70*badbb63cSNobuhiro Iwamatsu_enable_actlr_smp: /* R8A7794 only (CA7) */ 71*badbb63cSNobuhiro Iwamatsu#ifndef CONFIG_DCACHE_OFF 72*badbb63cSNobuhiro Iwamatsu mrc p15, 0, r0, c1, c0, 1 73*badbb63cSNobuhiro Iwamatsu orr r0, r0, #0x40 74*badbb63cSNobuhiro Iwamatsu mcr p15, 0, r0, c1, c0, 1 75*badbb63cSNobuhiro Iwamatsu#endif 76*badbb63cSNobuhiro Iwamatsu 77*badbb63cSNobuhiro Iwamatsu_exit_init_l2_a15: 78*badbb63cSNobuhiro Iwamatsu ldr r3, =(CONFIG_SYS_INIT_SP_ADDR) 79*badbb63cSNobuhiro Iwamatsu sub sp, r3, #4 80*badbb63cSNobuhiro Iwamatsu str lr, [sp] 81*badbb63cSNobuhiro Iwamatsu 82*badbb63cSNobuhiro Iwamatsu /* initialize system */ 83*badbb63cSNobuhiro Iwamatsu bl s_init 84*badbb63cSNobuhiro Iwamatsu 85*badbb63cSNobuhiro Iwamatsu ldr lr, [sp] 86*badbb63cSNobuhiro Iwamatsu mov pc, lr 87*badbb63cSNobuhiro Iwamatsu nop 88*badbb63cSNobuhiro IwamatsuENDPROC(lowlevel_init) 89*badbb63cSNobuhiro Iwamatsu .ltorg 90