xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-mx35/lowlevel_macro.S (revision 324a131e7cfbcc6a65cf6d7f5a455e47ff613b0c)
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