summaryrefslogtreecommitdiffstats
path: root/arch/arm/include/asm/arch-mx35/lowlevel_macro.S
blob: bc6dbea665558f8fb2d05f6420cd27ec47b77381 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
/*
 * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
 *
 * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
 * MA 02111-1307 USA
 */

#include <asm/arch/imx-regs.h>
#include <generated/asm-offsets.h>
#include <asm/macro.h>

/*
 * AIPS setup - Only setup MPROTx registers.
 * The PACR default values are good.
 *
 * Default argument values:
 *  - MPR: Set all MPROTx to be non-bufferable, trusted for R/W, not forced to
 *    user-mode.
 *  - OPACR: Clear the on and off peripheral modules Supervisor Protect bit for
 *    SDMA to access them.
 */
.macro init_aips mpr=0x77777777, opacr=0x00000000
	ldr	r0, =AIPS1_BASE_ADDR
	ldr	r1, =\mpr
	str	r1, [r0, #AIPS_MPR_0_7]
	str	r1, [r0, #AIPS_MPR_8_15]
	ldr	r2, =AIPS2_BASE_ADDR
	str	r1, [r2, #AIPS_MPR_0_7]
	str	r1, [r2, #AIPS_MPR_8_15]

	/* Did not change the AIPS control registers access type. */
	ldr	r1, =\opacr
	str	r1, [r0, #AIPS_OPACR_0_7]
	str	r1, [r0, #AIPS_OPACR_8_15]
	str	r1, [r0, #AIPS_OPACR_16_23]
	str	r1, [r0, #AIPS_OPACR_24_31]
	str	r1, [r0, #AIPS_OPACR_32_39]
	str	r1, [r2, #AIPS_OPACR_0_7]
	str	r1, [r2, #AIPS_OPACR_8_15]
	str	r1, [r2, #AIPS_OPACR_16_23]
	str	r1, [r2, #AIPS_OPACR_24_31]
	str	r1, [r2, #AIPS_OPACR_32_39]
.endm

/*
 * MAX (Multi-Layer AHB Crossbar Switch) setup
 *
 * Default argument values:
 *  - MPR: priority is M4 > M2 > M3 > M5 > M0 > M1
 *  - SGPCR: always park on last master
 *  - MGPCR: restore default values
 */
.macro init_max mpr=0x00302154, sgpcr=0x00000010, mgpcr=0x00000000
	ldr	r0, =MAX_BASE_ADDR
	ldr	r1, =\mpr
	str	r1, [r0, #MAX_MPR0]	/* for S0 */
	str	r1, [r0, #MAX_MPR1]	/* for S1 */
	str	r1, [r0, #MAX_MPR2]	/* for S2 */
	str	r1, [r0, #MAX_MPR3]	/* for S3 */
	str	r1, [r0, #MAX_MPR4]	/* for S4 */
	ldr	r1, =\sgpcr
	str	r1, [r0, #MAX_SGPCR0]	/* for S0 */
	str	r1, [r0, #MAX_SGPCR1]	/* for S1 */
	str	r1, [r0, #MAX_SGPCR2]	/* for S2 */
	str	r1, [r0, #MAX_SGPCR3]	/* for S3 */
	str	r1, [r0, #MAX_SGPCR4]	/* for S4 */
	ldr	r1, =\mgpcr
	str	r1, [r0, #MAX_MGPCR0]	/* for M0 */
	str	r1, [r0, #MAX_MGPCR1]	/* for M1 */
	str	r1, [r0, #MAX_MGPCR2]	/* for M2 */
	str	r1, [r0, #MAX_MGPCR3]	/* for M3 */
	str	r1, [r0, #MAX_MGPCR4]	/* for M4 */
	str	r1, [r0, #MAX_MGPCR5]	/* for M5 */
.endm

/*
 * M3IF setup
 *
 * Default argument values:
 *  - CTL:
 * MRRP[0] = L2CC0 not on priority list (0 << 0)	= 0x00000000
 * MRRP[1] = L2CC1 not on priority list (0 << 1)	= 0x00000000
 * MRRP[2] = MBX not on priority list (0 << 2)		= 0x00000000
 * MRRP[3] = MAX1 not on priority list (0 << 3)		= 0x00000000
 * MRRP[4] = SDMA not on priority list (0 << 4)		= 0x00000000
 * MRRP[5] = MPEG4 not on priority list (0 << 5)	= 0x00000000
 * MRRP[6] = IPU1 on priority list (1 << 6)		= 0x00000040
 * MRRP[7] = IPU2 not on priority list (0 << 7)		= 0x00000000
 *							------------
 *							  0x00000040
 */
.macro init_m3if ctl=0x00000040
	/* M3IF Control Register (M3IFCTL) */
	write32	M3IF_BASE_ADDR, \ctl
.endm

.macro core_init
	mrc	p15, 0, r1, c1, c0, 0

	/* Set branch prediction enable */
	mrc	p15, 0, r0, c1, c0, 1
	orr	r0, r0, #7
	mcr	p15, 0, r0, c1, c0, 1
	orr	r1, r1, #1 << 11

	/* Set unaligned access enable */
	orr	r1, r1, #1 << 22

	/* Set low int latency enable */
	orr	r1, r1, #1 << 21

	mcr	p15, 0, r1, c1, c0, 0

	mov	r0, #0

	mcr	p15, 0, r0, c15, c2, 4

	mcr	p15, 0, r0, c7, c7, 0	/* Invalidate I cache and D cache */
	mcr	p15, 0, r0, c8, c7, 0	/* Invalidate TLBs */
	mcr	p15, 0, r0, c7, c10, 4	/* Drain the write buffer */

	/* Setup the Peripheral Port Memory Remap Register */
	ldr	r0, =0x40000015		/* Start from AIPS 2-GB region */
	mcr	p15, 0, r0, c15, c2, 4
.endm
OpenPOWER on IntegriCloud