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