xref: /openbmc/u-boot/arch/arm/cpu/pxa/start.S (revision 9ddde3e6)
184ad6884SPeter Tyser/*
220f7b1b7SMarek Vasut *  armboot - Startup Code for XScale CPU-core
384ad6884SPeter Tyser *
484ad6884SPeter Tyser *  Copyright (C) 1998	Dan Malek <dmalek@jlc.net>
584ad6884SPeter Tyser *  Copyright (C) 1999	Magnus Damm <kieraypc01.p.y.kie.era.ericsson.se>
684ad6884SPeter Tyser *  Copyright (C) 2000	Wolfgang Denk <wd@denx.de>
784ad6884SPeter Tyser *  Copyright (C) 2001	Alex Zuepke <azu@sysgo.de>
820f7b1b7SMarek Vasut *  Copyright (C) 2001	Marius Groger <mag@sysgo.de>
920f7b1b7SMarek Vasut *  Copyright (C) 2002	Alex Zupke <azu@sysgo.de>
1020f7b1b7SMarek Vasut *  Copyright (C) 2002	Gary Jennejohn <garyj@denx.de>
1184ad6884SPeter Tyser *  Copyright (C) 2002	Kyle Harris <kharris@nexus-tech.net>
1284ad6884SPeter Tyser *  Copyright (C) 2003	Kai-Uwe Bloem <kai-uwe.bloem@auerswald.de>
1320f7b1b7SMarek Vasut *  Copyright (C) 2003	Kshitij <kshitij@ti.com>
1420f7b1b7SMarek Vasut *  Copyright (C) 2003	Richard Woodruff <r-woodruff2@ti.com>
1520f7b1b7SMarek Vasut *  Copyright (C) 2003	Robert Schwebel <r.schwebel@pengutronix.de>
1620f7b1b7SMarek Vasut *  Copyright (C) 2004	Texas Instruments <r-woodruff2@ti.com>
1720f7b1b7SMarek Vasut *  Copyright (C) 2010	Marek Vasut <marek.vasut@gmail.com>
1884ad6884SPeter Tyser *
191a459660SWolfgang Denk * SPDX-License-Identifier:	GPL-2.0+
2084ad6884SPeter Tyser */
2184ad6884SPeter Tyser
2225ddd1fbSWolfgang Denk#include <asm-offsets.h>
2384ad6884SPeter Tyser#include <config.h>
247f4cfcf4SMarek Vasut
2584ad6884SPeter Tyser/*
2620f7b1b7SMarek Vasut *************************************************************************
2720f7b1b7SMarek Vasut *
2884ad6884SPeter Tyser * Startup Code (reset vector)
2984ad6884SPeter Tyser *
3020f7b1b7SMarek Vasut * do important init only if we don't start from memory!
3120f7b1b7SMarek Vasut * setup Memory and board specific bits prior to relocation.
3220f7b1b7SMarek Vasut * relocate armboot to ram
3320f7b1b7SMarek Vasut * setup stack
3420f7b1b7SMarek Vasut *
3520f7b1b7SMarek Vasut *************************************************************************
3684ad6884SPeter Tyser */
3784ad6884SPeter Tyser
3841623c91SAlbert ARIBAUD	.globl	reset
395347f68cSHeiko Schocher
405347f68cSHeiko Schocherreset:
415347f68cSHeiko Schocher	/*
425347f68cSHeiko Schocher	 * set the cpu to SVC32 mode
435347f68cSHeiko Schocher	 */
445347f68cSHeiko Schocher	mrs	r0,cpsr
455347f68cSHeiko Schocher	bic	r0,r0,#0x1f
465347f68cSHeiko Schocher	orr	r0,r0,#0xd3
475347f68cSHeiko Schocher	msr	cpsr,r0
485347f68cSHeiko Schocher
4920f7b1b7SMarek Vasut#ifndef CONFIG_SKIP_LOWLEVEL_INIT
5020f7b1b7SMarek Vasut	bl  cpu_init_crit
5120f7b1b7SMarek Vasut#endif
525347f68cSHeiko Schocher
53abc20abaSMarek Vasut#ifdef	CONFIG_CPU_PXA25X
547f4cfcf4SMarek Vasut	bl	lock_cache_for_stack
557f4cfcf4SMarek Vasut#endif
56*9ddde3e6SVasily Khoruzhick#ifdef	CONFIG_CPU_PXA27X
57*9ddde3e6SVasily Khoruzhick	/*
58*9ddde3e6SVasily Khoruzhick	 * enable clock for SRAM
59*9ddde3e6SVasily Khoruzhick	 */
60*9ddde3e6SVasily Khoruzhick	ldr	r0,=CKEN
61*9ddde3e6SVasily Khoruzhick	ldr	r1,[r0]
62*9ddde3e6SVasily Khoruzhick	orr	r1,r1,#(1 << 20)
63*9ddde3e6SVasily Khoruzhick	str	r1,[r0]
64*9ddde3e6SVasily Khoruzhick#endif
65e05e5de7SAlbert ARIBAUD	bl	_main
665347f68cSHeiko Schocher
675347f68cSHeiko Schocher/*------------------------------------------------------------------------------*/
68e05e5de7SAlbert ARIBAUD
69e05e5de7SAlbert ARIBAUD	.globl	c_runtime_cpu_setup
70e05e5de7SAlbert ARIBAUDc_runtime_cpu_setup:
71e05e5de7SAlbert ARIBAUD
723da0e575SAlbert ARIBAUD#ifdef CONFIG_CPU_PXA25X
733da0e575SAlbert ARIBAUD	/*
743da0e575SAlbert ARIBAUD	 * Unlock (actually, disable) the cache now that board_init_f
753da0e575SAlbert ARIBAUD	 * is done. We could do this earlier but we would need to add
763da0e575SAlbert ARIBAUD	 * a new C runtime hook, whereas c_runtime_cpu_setup already
773da0e575SAlbert ARIBAUD	 * exists.
783da0e575SAlbert ARIBAUD	 * As this routine is just a call to cpu_init_crit, let us
793da0e575SAlbert ARIBAUD	 * tail-optimize and do a simple branch here.
803da0e575SAlbert ARIBAUD	 */
813da0e575SAlbert ARIBAUD	b	cpu_init_crit
823da0e575SAlbert ARIBAUD#else
83e05e5de7SAlbert ARIBAUD	bx	lr
843da0e575SAlbert ARIBAUD#endif
85e05e5de7SAlbert ARIBAUD
8620f7b1b7SMarek Vasut/*
8720f7b1b7SMarek Vasut *************************************************************************
8820f7b1b7SMarek Vasut *
8920f7b1b7SMarek Vasut * CPU_init_critical registers
9020f7b1b7SMarek Vasut *
9120f7b1b7SMarek Vasut * setup important registers
9220f7b1b7SMarek Vasut * setup memory timing
9320f7b1b7SMarek Vasut *
9420f7b1b7SMarek Vasut *************************************************************************
9520f7b1b7SMarek Vasut */
96abc20abaSMarek Vasut#if !defined(CONFIG_SKIP_LOWLEVEL_INIT) || defined(CONFIG_CPU_PXA25X)
9720f7b1b7SMarek Vasutcpu_init_crit:
9820f7b1b7SMarek Vasut	/*
9920f7b1b7SMarek Vasut	 * flush v4 I/D caches
10020f7b1b7SMarek Vasut	 */
10120f7b1b7SMarek Vasut	mov	r0, #0
10220f7b1b7SMarek Vasut	mcr	p15, 0, r0, c7, c7, 0	/* Invalidate I+D+BTB caches */
10320f7b1b7SMarek Vasut	mcr	p15, 0, r0, c8, c7, 0	/* Invalidate Unified TLB */
1042cad92fdSMarek Vasut
10520f7b1b7SMarek Vasut	/*
10620f7b1b7SMarek Vasut	 * disable MMU stuff and caches
10720f7b1b7SMarek Vasut	 */
10820f7b1b7SMarek Vasut	mrc	p15, 0, r0, c1, c0, 0
109097d86d0SMike Dunn	bic	r0, r0, #0x00003300	@ clear bits 13:12, 9:8 (--VI --RS)
11020f7b1b7SMarek Vasut	bic	r0, r0, #0x00000087	@ clear bits 7, 2:0 (B--- -CAM)
111ba10b852SYuichiro Goto	orr	r0, r0, #0x00000002	@ set bit 1 (A) Align
11220f7b1b7SMarek Vasut	mcr	p15, 0, r0, c1, c0, 0
11384ad6884SPeter Tyser
11420f7b1b7SMarek Vasut	mov	pc, lr		/* back to my caller */
115abc20abaSMarek Vasut#endif /* !CONFIG_SKIP_LOWLEVEL_INIT || CONFIG_CPU_PXA25X */
11684ad6884SPeter Tyser
1177f4cfcf4SMarek Vasut/*
1187f4cfcf4SMarek Vasut * Enable MMU to use DCache as DRAM.
1197f4cfcf4SMarek Vasut *
1207f4cfcf4SMarek Vasut * This is useful on PXA25x and PXA26x in early bootstages, where there is no
1217f4cfcf4SMarek Vasut * other possible memory available to hold stack.
1227f4cfcf4SMarek Vasut */
123abc20abaSMarek Vasut#ifdef CONFIG_CPU_PXA25X
1247f4cfcf4SMarek Vasut.macro CPWAIT reg
1257f4cfcf4SMarek Vasut	mrc	p15, 0, \reg, c2, c0, 0
1267f4cfcf4SMarek Vasut	mov	\reg, \reg
1277f4cfcf4SMarek Vasut	sub	pc, pc, #4
1287f4cfcf4SMarek Vasut.endm
1297f4cfcf4SMarek Vasutlock_cache_for_stack:
1307f4cfcf4SMarek Vasut	/* Domain access -- enable for all CPs */
1317f4cfcf4SMarek Vasut	ldr	r0, =0x0000ffff
1327f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c3, c0, 0
1337f4cfcf4SMarek Vasut
1347f4cfcf4SMarek Vasut	/* Point TTBR to MMU table */
1357f4cfcf4SMarek Vasut	ldr	r0, =mmutable
1367f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c2, c0, 0
1377f4cfcf4SMarek Vasut
1387f4cfcf4SMarek Vasut	/* Kick in MMU, ICache, DCache, BTB */
1397f4cfcf4SMarek Vasut	mrc	p15, 0, r0, c1, c0, 0
1407f4cfcf4SMarek Vasut	bic	r0, #0x1b00
1417f4cfcf4SMarek Vasut	bic	r0, #0x0087
1427f4cfcf4SMarek Vasut	orr	r0, #0x1800
1437f4cfcf4SMarek Vasut	orr	r0, #0x0005
1447f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c1, c0, 0
1457f4cfcf4SMarek Vasut	CPWAIT	r0
1467f4cfcf4SMarek Vasut
1477f4cfcf4SMarek Vasut	/* Unlock Icache, Dcache */
1487f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c9, c1, 1
1497f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c9, c2, 1
1507f4cfcf4SMarek Vasut
1517f4cfcf4SMarek Vasut	/* Flush Icache, Dcache, BTB */
1527f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c7, c7, 0
1537f4cfcf4SMarek Vasut
1547f4cfcf4SMarek Vasut	/* Unlock I-TLB, D-TLB */
1557f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c10, c4, 1
1567f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c10, c8, 1
1577f4cfcf4SMarek Vasut
1587f4cfcf4SMarek Vasut	/* Flush TLB */
1597f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c8, c7, 0
1607f4cfcf4SMarek Vasut
1617f4cfcf4SMarek Vasut	/* Allocate 4096 bytes of Dcache as RAM */
1627f4cfcf4SMarek Vasut
1637f4cfcf4SMarek Vasut	/* Drain pending loads and stores */
1647f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c7, c10, 4
1657f4cfcf4SMarek Vasut
1667f4cfcf4SMarek Vasut	mov	r4, #0x00
1677f4cfcf4SMarek Vasut	mov	r5, #0x00
1687f4cfcf4SMarek Vasut	mov	r2, #0x01
1697f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c9, c2, 0
1707f4cfcf4SMarek Vasut	CPWAIT	r0
1717f4cfcf4SMarek Vasut
1727f4cfcf4SMarek Vasut	/* 128 lines reserved (128 x 32bytes = 4096 bytes total) */
1737f4cfcf4SMarek Vasut	mov	r0, #128
1747f4cfcf4SMarek Vasut	ldr	r1, =0xfffff000
1757f4cfcf4SMarek Vasut
1767f4cfcf4SMarek Vasutalloc:
1777f4cfcf4SMarek Vasut	mcr	p15, 0, r1, c7, c2, 5
1787f4cfcf4SMarek Vasut	/* Drain pending loads and stores */
1797f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c7, c10, 4
1807f4cfcf4SMarek Vasut	strd	r4, [r1], #8
1817f4cfcf4SMarek Vasut	strd	r4, [r1], #8
1827f4cfcf4SMarek Vasut	strd	r4, [r1], #8
1837f4cfcf4SMarek Vasut	strd	r4, [r1], #8
1847f4cfcf4SMarek Vasut	subs	r0, #0x01
1857f4cfcf4SMarek Vasut	bne	alloc
1867f4cfcf4SMarek Vasut	/* Drain pending loads and stores */
1877f4cfcf4SMarek Vasut	mcr	p15, 0, r0, c7, c10, 4
1887f4cfcf4SMarek Vasut	mov	r2, #0x00
1897f4cfcf4SMarek Vasut	mcr	p15, 0, r2, c9, c2, 0
1907f4cfcf4SMarek Vasut	CPWAIT	r0
1917f4cfcf4SMarek Vasut
1927f4cfcf4SMarek Vasut	mov	pc, lr
1937f4cfcf4SMarek Vasut
1947f4cfcf4SMarek Vasut.section .mmutable, "a"
1957f4cfcf4SMarek Vasutmmutable:
1967f4cfcf4SMarek Vasut	.align	14
1977f4cfcf4SMarek Vasut	/* 0x00000000 - 0xffe00000 : 1:1, uncached mapping */
1987f4cfcf4SMarek Vasut	.set	__base, 0
1997f4cfcf4SMarek Vasut	.rept	0xfff
2007f4cfcf4SMarek Vasut	.word	(__base << 20) | 0xc12
2017f4cfcf4SMarek Vasut	.set	__base, __base + 1
2027f4cfcf4SMarek Vasut	.endr
2037f4cfcf4SMarek Vasut
2047f4cfcf4SMarek Vasut	/* 0xfff00000 : 1:1, cached mapping */
2057f4cfcf4SMarek Vasut	.word	(0xfff << 20) | 0x1c1e
206abc20abaSMarek Vasut#endif	/* CONFIG_CPU_PXA25X */
207