xref: /netbsd/sys/arch/evbarm/gumstix/gumstix_start.S (revision 6550d01e)
1/*	$NetBSD: gumstix_start.S,v 1.9 2011/01/31 06:28:03 matt Exp $ */
2/*
3 * Copyright (C) 2005, 2006 WIDE Project and SOUM Corporation.
4 * All rights reserved.
5 *
6 * Written by Takashi Kiyohara and Susumu Miki for WIDE Project and SOUM
7 * Corporation.
8 *
9 * Redistribution and use in source and binary forms, with or without
10 * modification, are permitted provided that the following conditions
11 * are met:
12 * 1. Redistributions of source code must retain the above copyright
13 *    notice, this list of conditions and the following disclaimer.
14 * 2. Redistributions in binary form must reproduce the above copyright
15 *    notice, this list of conditions and the following disclaimer in the
16 *    documentation and/or other materials provided with the distribution.
17 * 3. Neither the name of the project nor the name of SOUM Corporation
18 *    may be used to endorse or promote products derived from this software
19 *    without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT and SOUM CORPORATION ``AS IS''
22 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
23 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
24 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT AND SOUM CORPORATION
25 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31 * POSSIBILITY OF SUCH DAMAGE.
32 */
33/*
34 * Copyright (c) 2002, 2003  Genetec Corporation.  All rights reserved.
35 * Written by Hiroyuki Bessho for Genetec Corporation.
36 *
37 * Redistribution and use in source and binary forms, with or without
38 * modification, are permitted provided that the following conditions
39 * are met:
40 * 1. Redistributions of source code must retain the above copyright
41 *    notice, this list of conditions and the following disclaimer.
42 * 2. Redistributions in binary form must reproduce the above copyright
43 *    notice, this list of conditions and the following disclaimer in the
44 *    documentation and/or other materials provided with the distribution.
45 * 3. The name of Genetec Corporation may not be used to endorse or
46 *    promote products derived from this software without specific prior
47 *    written permission.
48 *
49 * THIS SOFTWARE IS PROVIDED BY GENETEC CORPORATION ``AS IS'' AND
50 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
51 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
52 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL GENETEC CORPORATION
53 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
54 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
55 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
56 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
57 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
58 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
59 * POSSIBILITY OF SUCH DAMAGE.
60 */
61
62#include "opt_cputypes.h"
63#include "opt_gumstix.h"
64
65#include <machine/asm.h>
66#include <arm/armreg.h>
67#include "assym.h"
68
69RCSID("$NetBSD: gumstix_start.S,v 1.9 2011/01/31 06:28:03 matt Exp $")
70
71/*
72 * CPWAIT -- Canonical method to wait for CP15 update.
73 * NOTE: Clobbers the specified temp reg.
74 * copied from arm/arm/cpufunc_asm_xscale.S
75 * XXX: better be in a common header file.
76 */
77#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
78#define	CPWAIT_BRANCH							  \
79	sub	pc, pc, #4
80#else
81#define	CPWAIT_BRANCH
82#endif
83
84#define	CPWAIT(tmp)							  \
85	mrc	p15, 0, tmp, c2, c0, 0	/* arbitrary read of CP15 */	; \
86	mov	tmp, tmp		/* wait for it to complete */	; \
87	CPWAIT_BRANCH			/* branch to next insn */
88
89/*
90 * Kernel start routine for GUMSTIX
91 * this code is excuted at the very first after the kernel is loaded
92 * by U-Boot.
93 */
94	.text
95
96	.global	_C_LABEL(gumstix_start)
97_C_LABEL(gumstix_start):
98	/*
99	 * gumstix's loader is U-boot.  it's running on RAM
100	 */
101
102	/* Our page table might be cached.  Disable D-cache beforehand. */
103	mrc	p15, 0, r4, c1, c0, 0
104	bic	r4, r4, #CPU_CONTROL_DC_ENABLE
105	mcr	p15, 0, r4, c1, c0, 0
106
107	/*
108	 *  Kernel is loaded in SDRAM (0xa0200000..), and is expected to run
109	 *  in VA 0xc0200000.. (GUMSTIX)
110	 *  VA == PA if OVERO.
111	 */
112
113	/* save u-boot's args */
114	adr	r4, u_boot_args
115	nop
116	nop
117	nop
118	stmia	r4!, {r0, r1, r2, r3}
119	nop
120	nop
121	nop
122
123	/* Calculate RAM size */
124	adr	r4, ram_size
125#if defined(GUMSTIX)
126	ldr	r0, [r4]
127
128	mrc	p15, 0, r1, c0, c0, 0
129	and	r1, r1, #CPU_ID_XSCALE_COREGEN_MASK
130	cmp	r1, #0x4000
131	bne	3f			/* goto 3f, if basix or connex */
1320:
133	/* check memory size, if verdex or verdex-pro */
134	add	r3, r4, r0
135	ldr	r1, [r3]
136	cmp	r0, r1
137	beq	2f
1381:
139	add	r0, r0, r0		/* r0 <<= 1 */
140	str	r0, [r4]
141	b	0b
1422:
143	mvn	r1, r1			/* r1 ^= 0xffffffff */
144	str	r1, [r3]
145	ldr	r2, [r4]
146	cmp	r1, r2
147	beq	3f
148	str	r0, [r3]		/* restore */
149	b	1b
1503:
151#elif defined(OVERO)
152	mov	r1, #0x7f000000		/* mask */
153	orr	r1, r1, #0x00e00000	/* mask */
154	mov	r3, #0x6d000000		/* OMAP34xx SDRC */
155	add	r3, r3, #0x0080		/* CS0 MCFG */
156	ldr	r2, [r3]
157	and	r0, r1, r2, lsl #13
158	add	r3, r3, #0x0030		/* CS1 MCFG */
159	ldr	r2, [r3]
160	and	r2, r1, r2, lsl #13
161	add	r0, r0, r2
162#endif
163	str	r0, [r4]
164
165	/* Build page table from scratch */
166	ldr	r0, Lstartup_pagetable	/* pagetable */
167	adr	r4, mmu_init_table
168	b	5f
169
1704:
171	str	r3, [r0, r2]
172	add	r2, r2, #4
173	add	r3, r3, #(L1_S_SIZE)
174	adds	r1, r1, #-1
175	bhi	4b
1765:
177	ldmia	r4!, {r1, r2, r3}	/* # of sections, PA|attr, VA */
178	cmp	r1, #0
179	bne	4b
180
181	mcr	p15, 0, r0, c8, c7, 0	/* Flush TLB */
182	mcr	p15, 0, r0, c2, c0, 0	/* Set TTB */
183
184	/*
185	 * Set the Domain Access register.  Very important!
186	 * startup_pagetable puts to domain 0 now.
187	 */
188#define KERNEL_DOMAIN(x)	((x) << (PMAP_DOMAIN_KERNEL << 1))
189	mov	r0, #(KERNEL_DOMAIN(DOMAIN_CLIENT) | DOMAIN_CLIENT)
190	mcr	p15, 0, r0, c3, c0, 0
191
192	/* Enable MMU and etc. */
193	mrc	p15, 0, r0, c1, c0, 0
194#if defined(CPU_XSCALE_PXA250) || defined(CPU_XSCALE_PXA270)
195	orr	r0, r0, #CPU_CONTROL_SYST_ENABLE
196#endif
197#if defined(CPU_CORTEXA8)
198	/* Disable L2 cache beforehand. */
199	mrc	p15, 0, r1, c1, c0, 1
200	bic	r1, r1, #0x2		/* clear L2EN */
201	mcr	p15, 0, r1, c1, c0, 1
202
203	orr	r0, r0, #CPU_CONTROL_AFLT_ENABLE | CPU_CONTROL_DC_ENABLE
204	orr	r0, r0, #CPU_CONTROL_BPRD_ENABLE | CPU_CONTROL_IC_ENABLE
205#endif
206	orr	r0, r0, #CPU_CONTROL_MMU_ENABLE
207	mcr	p15, 0, r0, c1, c0, 0
208	/*
209	 * Ensure that the coprocessor has finished turning on the MMU.
210	 */
211	CPWAIT(r0)
212
213	/* Jump to kernel code in TRUE VA */
214	adr	r0, Lstart
215	ldr	pc, [r0]
216
217Lstart:
218	.word	start
219
220#ifndef STARTUP_PAGETABLE_ADDR
221#if defined(GUMSTIX)
222#define STARTUP_PAGETABLE_ADDR 0xa0000000	/* aligned 16kByte */
223#elif defined(OVERO)
224#define STARTUP_PAGETABLE_ADDR 0x80000000	/* aligned 16kByte */
225#endif
226#endif
227Lstartup_pagetable:
228	.word	STARTUP_PAGETABLE_ADDR
229
230	.globl	_C_LABEL(u_boot_args)
231u_boot_args:
232	.space	16			/* r0, r1, r2, r3 */
233
234	.globl	_C_LABEL(ram_size)
235ram_size:
236	.word	0x04000000		/* 64Mbyte */
237
238
239#define MMU_INIT(va, pa, n_sec, attr)	  \
240	.word	n_sec			; \
241	.word	(va) >> (L1_S_SHIFT-2)	; \
242	.word	(pa) | (attr)		;
243
244mmu_init_table:
245	/* fill all table VA==PA */
246	MMU_INIT(0x00000000, 0x00000000,
247	    1 << (32 - L1_S_SHIFT), L1_S_PROTO | L1_S_AP_KRW)
248
249#if defined(GUMSTIX)
250#define SDRAM_START	0xa0000000
251
252	/* map SDRAM VA==PA, write-back cacheable (first 64M only)*/
253	MMU_INIT(SDRAM_START, SDRAM_START,
254	    64, L1_S_PROTO | L1_S_C | L1_S_AP_KRW)
255
256	/* map VA 0xc0000000..0xc3ffffff to PA 0xa0000000..0xa3ffffff */
257	MMU_INIT(0xc0000000, SDRAM_START,
258	    64, L1_S_PROTO | L1_S_C | L1_S_AP_KRW)
259
260#elif defined(OVERO)
261#define SDRAM_START	0x80000000
262
263	/* Map VA to PA, write-back cacheable (first 64M only) */
264	MMU_INIT(KERNEL_BASE, SDRAM_START,
265	    64, L1_S_PROTO | L1_S_B | L1_S_C | L1_S_APv7_KRW)
266#endif
267
268	MMU_INIT(0, 0, 0, 0)		/* end of table */
269