xref: /rk3399_rockchip-uboot/arch/arm/include/asm/arch-mx35/lowlevel_macro.S (revision 326ea986ac150acdc7656d57fca647db80b50158)
1324a131eSStefano Babic/*
2324a131eSStefano Babic * Copyright (C) 2007, Guennadi Liakhovetski <lg@denx.de>
3324a131eSStefano Babic *
4324a131eSStefano Babic * (C) Copyright 2008-2010 Freescale Semiconductor, Inc.
5324a131eSStefano Babic *
6*1a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
7324a131eSStefano Babic */
8324a131eSStefano Babic
9151d63cbSBenoît Thébaudeau#include <asm/arch/imx-regs.h>
10151d63cbSBenoît Thébaudeau#include <generated/asm-offsets.h>
11151d63cbSBenoît Thébaudeau#include <asm/macro.h>
12151d63cbSBenoît Thébaudeau
13324a131eSStefano Babic/*
14324a131eSStefano Babic * AIPS setup - Only setup MPROTx registers.
15324a131eSStefano Babic * The PACR default values are good.
16151d63cbSBenoît Thébaudeau *
17151d63cbSBenoît Thébaudeau * Default argument values:
18151d63cbSBenoît Thébaudeau *  - MPR: Set all MPROTx to be non-bufferable, trusted for R/W, not forced to
19151d63cbSBenoît Thébaudeau *    user-mode.
20151d63cbSBenoît Thébaudeau *  - OPACR: Clear the on and off peripheral modules Supervisor Protect bit for
21151d63cbSBenoît Thébaudeau *    SDMA to access them.
22324a131eSStefano Babic */
23151d63cbSBenoît Thébaudeau.macro init_aips mpr=0x77777777, opacr=0x00000000
24324a131eSStefano Babic	ldr	r0, =AIPS1_BASE_ADDR
25151d63cbSBenoît Thébaudeau	ldr	r1, =\mpr
26151d63cbSBenoît Thébaudeau	str	r1, [r0, #AIPS_MPR_0_7]
27151d63cbSBenoît Thébaudeau	str	r1, [r0, #AIPS_MPR_8_15]
28151d63cbSBenoît Thébaudeau	ldr	r2, =AIPS2_BASE_ADDR
29151d63cbSBenoît Thébaudeau	str	r1, [r2, #AIPS_MPR_0_7]
30151d63cbSBenoît Thébaudeau	str	r1, [r2, #AIPS_MPR_8_15]
31324a131eSStefano Babic
32151d63cbSBenoît Thébaudeau	/* Did not change the AIPS control registers access type. */
33151d63cbSBenoît Thébaudeau	ldr	r1, =\opacr
34151d63cbSBenoît Thébaudeau	str	r1, [r0, #AIPS_OPACR_0_7]
35151d63cbSBenoît Thébaudeau	str	r1, [r0, #AIPS_OPACR_8_15]
36151d63cbSBenoît Thébaudeau	str	r1, [r0, #AIPS_OPACR_16_23]
37151d63cbSBenoît Thébaudeau	str	r1, [r0, #AIPS_OPACR_24_31]
38151d63cbSBenoît Thébaudeau	str	r1, [r0, #AIPS_OPACR_32_39]
39151d63cbSBenoît Thébaudeau	str	r1, [r2, #AIPS_OPACR_0_7]
40151d63cbSBenoît Thébaudeau	str	r1, [r2, #AIPS_OPACR_8_15]
41151d63cbSBenoît Thébaudeau	str	r1, [r2, #AIPS_OPACR_16_23]
42151d63cbSBenoît Thébaudeau	str	r1, [r2, #AIPS_OPACR_24_31]
43151d63cbSBenoît Thébaudeau	str	r1, [r2, #AIPS_OPACR_32_39]
44324a131eSStefano Babic.endm
45324a131eSStefano Babic
46151d63cbSBenoît Thébaudeau/*
47151d63cbSBenoît Thébaudeau * MAX (Multi-Layer AHB Crossbar Switch) setup
48151d63cbSBenoît Thébaudeau *
49151d63cbSBenoît Thébaudeau * Default argument values:
50151d63cbSBenoît Thébaudeau *  - MPR: priority is M4 > M2 > M3 > M5 > M0 > M1
51151d63cbSBenoît Thébaudeau *  - SGPCR: always park on last master
52151d63cbSBenoît Thébaudeau *  - MGPCR: restore default values
53151d63cbSBenoît Thébaudeau */
54151d63cbSBenoît Thébaudeau.macro init_max mpr=0x00302154, sgpcr=0x00000010, mgpcr=0x00000000
55324a131eSStefano Babic	ldr	r0, =MAX_BASE_ADDR
56151d63cbSBenoît Thébaudeau	ldr	r1, =\mpr
57151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MPR0]	/* for S0 */
58151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MPR1]	/* for S1 */
59151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MPR2]	/* for S2 */
60151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MPR3]	/* for S3 */
61151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MPR4]	/* for S4 */
62151d63cbSBenoît Thébaudeau	ldr	r1, =\sgpcr
63151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_SGPCR0]	/* for S0 */
64151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_SGPCR1]	/* for S1 */
65151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_SGPCR2]	/* for S2 */
66151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_SGPCR3]	/* for S3 */
67151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_SGPCR4]	/* for S4 */
68151d63cbSBenoît Thébaudeau	ldr	r1, =\mgpcr
69151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MGPCR0]	/* for M0 */
70151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MGPCR1]	/* for M1 */
71151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MGPCR2]	/* for M2 */
72151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MGPCR3]	/* for M3 */
73151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MGPCR4]	/* for M4 */
74151d63cbSBenoît Thébaudeau	str	r1, [r0, #MAX_MGPCR5]	/* for M5 */
75324a131eSStefano Babic.endm
76324a131eSStefano Babic
77324a131eSStefano Babic/*
78151d63cbSBenoît Thébaudeau * M3IF setup
79151d63cbSBenoît Thébaudeau *
80151d63cbSBenoît Thébaudeau * Default argument values:
81151d63cbSBenoît Thébaudeau *  - CTL:
82324a131eSStefano Babic * MRRP[0] = L2CC0 not on priority list (0 << 0)	= 0x00000000
83151d63cbSBenoît Thébaudeau * MRRP[1] = L2CC1 not on priority list (0 << 1)	= 0x00000000
84151d63cbSBenoît Thébaudeau * MRRP[2] = MBX not on priority list (0 << 2)		= 0x00000000
85151d63cbSBenoît Thébaudeau * MRRP[3] = MAX1 not on priority list (0 << 3)		= 0x00000000
86151d63cbSBenoît Thébaudeau * MRRP[4] = SDMA not on priority list (0 << 4)		= 0x00000000
87151d63cbSBenoît Thébaudeau * MRRP[5] = MPEG4 not on priority list (0 << 5)	= 0x00000000
88324a131eSStefano Babic * MRRP[6] = IPU1 on priority list (1 << 6)		= 0x00000040
89151d63cbSBenoît Thébaudeau * MRRP[7] = IPU2 not on priority list (0 << 7)		= 0x00000000
90324a131eSStefano Babic *							------------
91324a131eSStefano Babic *							  0x00000040
92324a131eSStefano Babic */
93151d63cbSBenoît Thébaudeau.macro init_m3if ctl=0x00000040
94151d63cbSBenoît Thébaudeau	/* M3IF Control Register (M3IFCTL) */
95151d63cbSBenoît Thébaudeau	write32	M3IF_BASE_ADDR, \ctl
96324a131eSStefano Babic.endm
97324a131eSStefano Babic
98324a131eSStefano Babic.macro core_init
99151d63cbSBenoît Thébaudeau	mrc	p15, 0, r1, c1, c0, 0
100324a131eSStefano Babic
101151d63cbSBenoît Thébaudeau	/* Set branch prediction enable */
102151d63cbSBenoît Thébaudeau	mrc	p15, 0, r0, c1, c0, 1
103324a131eSStefano Babic	orr	r0, r0, #7
104151d63cbSBenoît Thébaudeau	mcr	p15, 0, r0, c1, c0, 1
105151d63cbSBenoît Thébaudeau	orr	r1, r1, #1 << 11
106324a131eSStefano Babic
107324a131eSStefano Babic	/* Set unaligned access enable */
108151d63cbSBenoît Thébaudeau	orr	r1, r1, #1 << 22
109324a131eSStefano Babic
110324a131eSStefano Babic	/* Set low int latency enable */
111151d63cbSBenoît Thébaudeau	orr	r1, r1, #1 << 21
112324a131eSStefano Babic
113151d63cbSBenoît Thébaudeau	mcr	p15, 0, r1, c1, c0, 0
114324a131eSStefano Babic
115324a131eSStefano Babic	mov	r0, #0
116324a131eSStefano Babic
117151d63cbSBenoît Thébaudeau	mcr	p15, 0, r0, c15, c2, 4
118324a131eSStefano Babic
119151d63cbSBenoît Thébaudeau	mcr	p15, 0, r0, c7, c7, 0	/* Invalidate I cache and D cache */
120151d63cbSBenoît Thébaudeau	mcr	p15, 0, r0, c8, c7, 0	/* Invalidate TLBs */
121151d63cbSBenoît Thébaudeau	mcr	p15, 0, r0, c7, c10, 4	/* Drain the write buffer */
122324a131eSStefano Babic
123151d63cbSBenoît Thébaudeau	/* Setup the Peripheral Port Memory Remap Register */
124151d63cbSBenoît Thébaudeau	ldr	r0, =0x40000015		/* Start from AIPS 2-GB region */
125324a131eSStefano Babic	mcr	p15, 0, r0, c15, c2, 4
126324a131eSStefano Babic.endm
127