xref: /netbsd-src/sys/arch/evbarm/adi_brh/brh_start.S (revision be2de77e3b743d540707a829c17ac3c26d8f78b8)
1/*	$NetBSD: brh_start.S,v 1.3 2014/01/13 18:26:34 matt Exp $	*/
2
3/*
4 * Copyright (c) 2002 Wasabi Systems, Inc.
5 * All rights reserved.
6 *
7 * Written by Jason R. Thorpe for Wasabi Systems, Inc.
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. All advertising materials mentioning features or use of this software
18 *    must display the following acknowledgement:
19 *	This product includes software developed for the NetBSD Project by
20 *	Wasabi Systems, Inc.
21 * 4. The name of Wasabi Systems, Inc. may not be used to endorse
22 *    or promote products derived from this software without specific prior
23 *    written permission.
24 *
25 * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
26 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
27 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28 * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
29 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
30 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
33 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
35 * POSSIBILITY OF SUCH DAMAGE.
36 */
37
38
39#include <machine/asm.h>
40#include <arm/armreg.h>
41#include "assym.h"
42
43#include <arm/xscale/beccreg.h>
44
45#include <evbarm/adi_brh/brhreg.h>
46
47RCSID("$NetBSD: brh_start.S,v 1.3 2014/01/13 18:26:34 matt Exp $")
48
49	.section .start,"ax",%progbits
50
51	.global	_C_LABEL(brh_start)
52_C_LABEL(brh_start):
53	/*
54	 * Get a pointer to the LED (physical address).
55	 */
56	mov	ip, #(BRH_LED_BASE)
57
58	/*
59	 * We will go ahead and disable the MMU here so that we don't
60	 * have to worry about flushing caches, etc.
61	 *
62	 * Note that we may not currently be running VA==PA, which means
63	 * we'll need to leap to the next insn after disabing the MMU.
64	 */
65	adr	r8, .Lunmapped
66	bic	r8, r8, #0xff000000	/* clear upper 8 bits */
67	orr	r8, r8, #0xc0000000	/* OR in physical base address */
68
69	mrc	p15, 0, r2, c1, c0, 0
70	bic	r2, r2, #CPU_CONTROL_MMU_ENABLE
71	mcr	p15, 0, r2, c1, c0, 0
72
73	nop
74	nop
75	nop
76
77	mov	pc, r8			/* Heave-ho! */
78
79.Lunmapped:
80	/*
81	 * We want to construct a memory map that maps us
82	 * VA==PA (SDRAM at 0xc0000000) (which also happens
83	 * to be where the kernel address space starts).
84	 * We create these mappings uncached and unbuffered
85	 * to be safe.
86	 *
87	 * We also map various devices at their expected locations,
88	 * because we will need to talk to them during bootstrap.
89	 *
90	 * We just use section mappings for all of this to make it easy.
91	 *
92	 * We will put the L1 table to do all this at 0xc0004000.
93	 */
94
95
96	/*
97	 * Step 1: Map the entire address space VA==PA.
98	 */
99	ldr	r0, .Ltable			/* r0 = &l1table */
100
101	mov	r3, #(L1_S_AP_KRW)
102	orr	r3, r3, #(L1_TYPE_S)
103	mov	r2, #0x100000			/* advance by 1MB */
104	mov	r1, #0x1000			/* 4096MB */
1051:
106	str	r3, [r0], #0x04
107	add	r3, r3, r2
108	subs	r1, r1, #1
109	bgt	1b
110
111#if 0
112	/*
113	 * Step 2: Map the PCI configuration space (this is needed
114	 * to access some of the core logic registers).
115	 */
116	ldr	r0, .Ltable			/* r0 = &l1table */
117
118	mov	r3, #(L1_S_AP_KRW)
119	orr	r3, r3, #(L1_TYPE_S)
120	orr	r3, r3, #(BECC_PCI_CONF_BASE)
121	add	r0, r0, #((BRH_PCI_CONF_VBASE >> L1_S_SHIFT) * 4)
122	mov	r1, #(BRH_PCI_CONF_VSIZE >> L1_S_SHIFT)
1231:
124	str	r3, [r0], #0x04
125	add	r3, r3, r2
126	subs	r1, r1, #1
127	bgt	1b
128#endif
129
130	/*
131	 * Step 3: Map the BECC, UARTs, and LED display.
132	 */
133	ldr	r0, .Ltable			/* r0 = &l1table */
134
135	mov	r3, #(L1_S_AP_KRW)
136	orr	r3, r3, #(L1_TYPE_S)
137
138	orr	r3, r3, #(BECC_REG_BASE)
139	ldr	r2, .Lbrh_becc_vbase
140	str	r3, [r0, r2]
141	bic	r3, r3, #(BECC_REG_BASE)
142
143	orr	r3, r3, #(BRH_UART1_BASE)
144	ldr	r2, .Lbrh_uart1_vbase
145	str	r3, [r0, r2]
146	bic	r3, r3, #(BRH_UART1_BASE)
147
148	orr	r3, r3, #(BRH_UART2_BASE)
149	ldr	r2, .Lbrh_uart2_vbase
150	str	r3, [r0, r2]
151	bic	r3, r3, #(BRH_UART2_BASE)
152
153	orr	r3, r3, #(BRH_LED_BASE)
154	ldr	r2, .Lbrh_led_vbase
155	str	r3, [r0, r2]
156	bic	r3, r3, #(BRH_LED_BASE)
157
158	/* OK!  Page table is set up.  Give it to the CPU. */
159	ldr	r0, .Ltable
160	mcr	p15, 0, r0, c2, c0, 0
161
162	/* Flush the old TLBs, just in case. */
163	mcr	p15, 0, r0, c8, c7, 0
164
165	/* Set the Domain Access register.  Very important! */
166	mov	r0, #1
167	mcr	p15, 0, r0, c3, c0, 0
168
169	/* Get ready to jump to the "real" kernel entry point... */
170	ldr	r0, .Lstart
171
172	/* OK, let's enable the MMU. */
173	mrc	p15, 0, r2, c1, c0, 0
174	orr	r2, r2, #CPU_CONTROL_MMU_ENABLE
175	mcr	p15, 0, r2, c1, c0, 0
176
177	nop
178	nop
179	nop
180
181	/* CPWAIT sequence to make sure the MMU is on... */
182	mrc	p15, 0, r2, c2, c0, 0	/* arbitrary read of CP15 */
183	mov	r2, r2			/* force it to complete */
184	mov	pc, r0			/* leap to kernel entry point! */
185
186.Lbrh_becc_vbase:
187	.word	((BRH_BECC_VBASE >> L1_S_SHIFT) * 4)
188
189.Lbrh_uart1_vbase:
190	.word	((BRH_UART1_VBASE >> L1_S_SHIFT) * 4)
191
192.Lbrh_uart2_vbase:
193	.word	((BRH_UART2_VBASE >> L1_S_SHIFT) * 4)
194
195.Lbrh_led_vbase:
196	.word	((BRH_LED_VBASE >> L1_S_SHIFT) * 4)
197
198.Ltable:
199	.word	0xc0004000
200
201.Lstart:
202	.word	start
203