1*324a131eSStefano Babic/* 2*324a131eSStefano Babic * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de> 3*324a131eSStefano Babic * 4*324a131eSStefano Babic * (C) Copyright 2008-2010 Freescale Semiconductor, Inc. 5*324a131eSStefano Babic * 6*324a131eSStefano Babic * This program is free software; you can redistribute it and/or 7*324a131eSStefano Babic * modify it under the terms of the GNU General Public License as 8*324a131eSStefano Babic * published by the Free Software Foundation; either version 2 of 9*324a131eSStefano Babic * the License, or (at your option) any later version. 10*324a131eSStefano Babic * 11*324a131eSStefano Babic * This program is distributed in the hope that it will be useful, 12*324a131eSStefano Babic * but WITHOUT ANY WARRANTY; without even the implied warranty of 13*324a131eSStefano Babic * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14*324a131eSStefano Babic * GNU General Public License for more details. 15*324a131eSStefano Babic * 16*324a131eSStefano Babic * You should have received a copy of the GNU General Public License 17*324a131eSStefano Babic * along with this program; if not, write to the Free Software 18*324a131eSStefano Babic * Foundation, Inc., 59 Temple Place, Suite 330, Boston, 19*324a131eSStefano Babic * MA 02111-1307 USA 20*324a131eSStefano Babic */ 21*324a131eSStefano Babic 22*324a131eSStefano Babic/* 23*324a131eSStefano Babic * AIPS setup - Only setup MPROTx registers. 24*324a131eSStefano Babic * The PACR default values are good. 25*324a131eSStefano Babic */ 26*324a131eSStefano Babic.macro init_aips 27*324a131eSStefano Babic /* 28*324a131eSStefano Babic * Set all MPROTx to be non-bufferable, trusted for R/W, 29*324a131eSStefano Babic * not forced to user-mode. 30*324a131eSStefano Babic */ 31*324a131eSStefano Babic ldr r0, =AIPS1_BASE_ADDR 32*324a131eSStefano Babic ldr r1, =AIPS_MPR_CONFIG 33*324a131eSStefano Babic str r1, [r0, #0x00] 34*324a131eSStefano Babic str r1, [r0, #0x04] 35*324a131eSStefano Babic ldr r0, =AIPS2_BASE_ADDR 36*324a131eSStefano Babic str r1, [r0, #0x00] 37*324a131eSStefano Babic str r1, [r0, #0x04] 38*324a131eSStefano Babic 39*324a131eSStefano Babic /* 40*324a131eSStefano Babic * Clear the on and off peripheral modules Supervisor Protect bit 41*324a131eSStefano Babic * for SDMA to access them. Did not change the AIPS control registers 42*324a131eSStefano Babic * (offset 0x20) access type 43*324a131eSStefano Babic */ 44*324a131eSStefano Babic ldr r0, =AIPS1_BASE_ADDR 45*324a131eSStefano Babic ldr r1, =AIPS_OPACR_CONFIG 46*324a131eSStefano Babic str r1, [r0, #0x40] 47*324a131eSStefano Babic str r1, [r0, #0x44] 48*324a131eSStefano Babic str r1, [r0, #0x48] 49*324a131eSStefano Babic str r1, [r0, #0x4C] 50*324a131eSStefano Babic str r1, [r0, #0x50] 51*324a131eSStefano Babic ldr r0, =AIPS2_BASE_ADDR 52*324a131eSStefano Babic str r1, [r0, #0x40] 53*324a131eSStefano Babic str r1, [r0, #0x44] 54*324a131eSStefano Babic str r1, [r0, #0x48] 55*324a131eSStefano Babic str r1, [r0, #0x4C] 56*324a131eSStefano Babic str r1, [r0, #0x50] 57*324a131eSStefano Babic.endm 58*324a131eSStefano Babic 59*324a131eSStefano Babic/* MAX (Multi-Layer AHB Crossbar Switch) setup */ 60*324a131eSStefano Babic.macro init_max 61*324a131eSStefano Babic ldr r0, =MAX_BASE_ADDR 62*324a131eSStefano Babic /* MPR - priority is M4 > M2 > M3 > M5 > M0 > M1 */ 63*324a131eSStefano Babic ldr r1, =MAX_MPR_CONFIG 64*324a131eSStefano Babic str r1, [r0, #0x000] /* for S0 */ 65*324a131eSStefano Babic str r1, [r0, #0x100] /* for S1 */ 66*324a131eSStefano Babic str r1, [r0, #0x200] /* for S2 */ 67*324a131eSStefano Babic str r1, [r0, #0x300] /* for S3 */ 68*324a131eSStefano Babic str r1, [r0, #0x400] /* for S4 */ 69*324a131eSStefano Babic /* SGPCR - always park on last master */ 70*324a131eSStefano Babic ldr r1, =MAX_SGPCR_CONFIG 71*324a131eSStefano Babic str r1, [r0, #0x010] /* for S0 */ 72*324a131eSStefano Babic str r1, [r0, #0x110] /* for S1 */ 73*324a131eSStefano Babic str r1, [r0, #0x210] /* for S2 */ 74*324a131eSStefano Babic str r1, [r0, #0x310] /* for S3 */ 75*324a131eSStefano Babic str r1, [r0, #0x410] /* for S4 */ 76*324a131eSStefano Babic /* MGPCR - restore default values */ 77*324a131eSStefano Babic ldr r1, =MAX_MGPCR_CONFIG 78*324a131eSStefano Babic str r1, [r0, #0x800] /* for M0 */ 79*324a131eSStefano Babic str r1, [r0, #0x900] /* for M1 */ 80*324a131eSStefano Babic str r1, [r0, #0xA00] /* for M2 */ 81*324a131eSStefano Babic str r1, [r0, #0xB00] /* for M3 */ 82*324a131eSStefano Babic str r1, [r0, #0xC00] /* for M4 */ 83*324a131eSStefano Babic str r1, [r0, #0xD00] /* for M5 */ 84*324a131eSStefano Babic.endm 85*324a131eSStefano Babic 86*324a131eSStefano Babic/* M3IF setup */ 87*324a131eSStefano Babic.macro init_m3if 88*324a131eSStefano Babic /* Configure M3IF registers */ 89*324a131eSStefano Babic ldr r1, =M3IF_BASE_ADDR 90*324a131eSStefano Babic /* 91*324a131eSStefano Babic * M3IF Control Register (M3IFCTL) 92*324a131eSStefano Babic * MRRP[0] = L2CC0 not on priority list (0 << 0) = 0x00000000 93*324a131eSStefano Babic * MRRP[1] = L2CC1 not on priority list (0 << 0) = 0x00000000 94*324a131eSStefano Babic * MRRP[2] = MBX not on priority list (0 << 0) = 0x00000000 95*324a131eSStefano Babic * MRRP[3] = MAX1 not on priority list (0 << 0) = 0x00000000 96*324a131eSStefano Babic * MRRP[4] = SDMA not on priority list (0 << 0) = 0x00000000 97*324a131eSStefano Babic * MRRP[5] = MPEG4 not on priority list (0 << 0) = 0x00000000 98*324a131eSStefano Babic * MRRP[6] = IPU1 on priority list (1 << 6) = 0x00000040 99*324a131eSStefano Babic * MRRP[7] = IPU2 not on priority list (0 << 0) = 0x00000000 100*324a131eSStefano Babic * ------------ 101*324a131eSStefano Babic * 0x00000040 102*324a131eSStefano Babic */ 103*324a131eSStefano Babic ldr r0, =M3IF_CONFIG 104*324a131eSStefano Babic str r0, [r1] /* M3IF control reg */ 105*324a131eSStefano Babic.endm 106*324a131eSStefano Babic 107*324a131eSStefano Babic.macro core_init 108*324a131eSStefano Babic mrc 15, 0, r1, c1, c0, 0 109*324a131eSStefano Babic 110*324a131eSStefano Babic mrc 15, 0, r0, c1, c0, 1 111*324a131eSStefano Babic orr r0, r0, #7 112*324a131eSStefano Babic mcr 15, 0, r0, c1, c0, 1 113*324a131eSStefano Babic orr r1, r1, #(1<<11) 114*324a131eSStefano Babic 115*324a131eSStefano Babic /* Set unaligned access enable */ 116*324a131eSStefano Babic orr r1, r1, #(1<<22) 117*324a131eSStefano Babic 118*324a131eSStefano Babic /* Set low int latency enable */ 119*324a131eSStefano Babic orr r1, r1, #(1<<21) 120*324a131eSStefano Babic 121*324a131eSStefano Babic mcr 15, 0, r1, c1, c0, 0 122*324a131eSStefano Babic 123*324a131eSStefano Babic mov r0, #0 124*324a131eSStefano Babic 125*324a131eSStefano Babic /* Set branch prediction enable */ 126*324a131eSStefano Babic mcr 15, 0, r0, c15, c2, 4 127*324a131eSStefano Babic 128*324a131eSStefano Babic mcr 15, 0, r0, c7, c7, 0 /* invalidate I cache and D cache */ 129*324a131eSStefano Babic mcr 15, 0, r0, c8, c7, 0 /* invalidate TLBs */ 130*324a131eSStefano Babic mcr 15, 0, r0, c7, c10, 4 /* Drain the write buffer */ 131*324a131eSStefano Babic 132*324a131eSStefano Babic /* 133*324a131eSStefano Babic * initializes very early AIPS 134*324a131eSStefano Babic * Then it also initializes Multi-Layer AHB Crossbar Switch, 135*324a131eSStefano Babic * M3IF 136*324a131eSStefano Babic * Also setup the Peripheral Port Remap register inside the core 137*324a131eSStefano Babic */ 138*324a131eSStefano Babic ldr r0, =0x40000015 /* start from AIPS 2GB region */ 139*324a131eSStefano Babic mcr p15, 0, r0, c15, c2, 4 140*324a131eSStefano Babic.endm 141