xref: /netbsd-src/sys/arch/hpcmips/stand/lcboot/start.S (revision d7fca1ab3d6278dd51b5cf2d2932695852feb160)
1*d7fca1abSandvar/* $NetBSD: start.S,v 1.4 2021/08/09 19:57:57 andvar Exp $ */
2f8bc0014Sigy
3f8bc0014Sigy/*
48f53455cSigy * Copyright (c) 2003 Naoto Shimazaki.
5f8bc0014Sigy * All rights reserved.
6f8bc0014Sigy *
7f8bc0014Sigy * Redistribution and use in source and binary forms, with or without
8f8bc0014Sigy * modification, are permitted provided that the following conditions
9f8bc0014Sigy * are met:
10f8bc0014Sigy * 1. Redistributions of source code must retain the above copyright
11f8bc0014Sigy *    notice, this list of conditions and the following disclaimer.
12f8bc0014Sigy * 2. Redistributions in binary form must reproduce the above copyright
13f8bc0014Sigy *    notice, this list of conditions and the following disclaimer in the
14f8bc0014Sigy *    documentation and/or other materials provided with the distribution.
15f8bc0014Sigy *
168f53455cSigy * THIS SOFTWARE IS PROVIDED BY NAOTO SHIMAZAKI AND CONTRIBUTORS ``AS IS''
178f53455cSigy * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
188f53455cSigy * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
198f53455cSigy * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE NAOTO OR CONTRIBUTORS BE
208f53455cSigy * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21f8bc0014Sigy * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22f8bc0014Sigy * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23f8bc0014Sigy * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24f8bc0014Sigy * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
258f53455cSigy * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
268f53455cSigy * THE POSSIBILITY OF SUCH DAMAGE.
27f8bc0014Sigy */
28f8bc0014Sigy
29f8bc0014Sigy/*
30f8bc0014Sigy * NOTE:
31f8bc0014Sigy * This code assumes some trick described below:
32f8bc0014Sigy *
33f8bc0014Sigy *	- Located at 0x80000000 by linker
34f8bc0014Sigy *	- Placed at 0xbfc00000 (by ROM writer)
35f8bc0014Sigy *	- Executed at 0xbfc00000 by CPU
36f8bc0014Sigy *
37f8bc0014Sigy * So,
38f8bc0014Sigy *
39f8bc0014Sigy *	- You cannot use 'j' and 'jal'.  Instead, you must use 'b'.
40f8bc0014Sigy *	- If you want to jump to absolute address, you must load
41f8bc0014Sigy *	  the target address to a register and jump to it with
42f8bc0014Sigy *	  'jr' or 'jalr'.
43f8bc0014Sigy *	- You never be able to write any memory before
44f8bc0014Sigy *	  the bus configuration completed.
45f8bc0014Sigy *
46f8bc0014Sigy */
47f8bc0014Sigy
48f8bc0014Sigy#include <sys/cdefs.h>
49f8bc0014Sigy#include <sys/errno.h>
50f8bc0014Sigy#include <sys/syscall.h>
51f8bc0014Sigy
52f8bc0014Sigy#include <machine/param.h>
53f8bc0014Sigy#include <mips/asm.h>
54f8bc0014Sigy#include <mips/cpuregs.h>
55f8bc0014Sigy#include <mips/trap.h>
56f8bc0014Sigy
57f8bc0014Sigy#include "extern.h"
58f8bc0014Sigy
59f8bc0014Sigy	.text
60f8bc0014Sigy	.set	noreorder
61f8bc0014Sigy	.align	2
62f8bc0014Sigy
63f8bc0014Sigy/*
64f8bc0014Sigy * macro ROMICE  - support for Kyoto-micro's PARTNER-ETII ROM-ICE
65f8bc0014Sigy *
66f8bc0014Sigy * PARTNER-ETII by Kyoto-microcomputer is a ROM based emulater.
67f8bc0014Sigy * This ICE initializes by itself the very early configurations of
68f8bc0014Sigy * the target CPU.  This macro skips that configurations.
69f8bc0014Sigy */
70f8bc0014Sigy#ifndef ROMICE
71f8bc0014Sigy	/*
72f8bc0014Sigy	 * exception vector table
73f8bc0014Sigy	 */
74f8bc0014Sigy	.org	0x0000
75f8bc0014Sigyreset_vector:
76f8bc0014Sigy	b	start		/* MUST relative jump */
77f8bc0014Sigy	nop
78f8bc0014Sigy
79f8bc0014Sigy	.org	0x0200
80f8bc0014Sigytlb_vector:
81f8bc0014Sigy	b	start
82f8bc0014Sigy	nop
83f8bc0014Sigy
84f8bc0014Sigy	.org	0x0280
85f8bc0014Sigyxtlb_vector:
86f8bc0014Sigy	b	start
87f8bc0014Sigy	nop
88f8bc0014Sigy
89f8bc0014Sigy	.org	0x0380
90f8bc0014Sigyexception_vector:
91f8bc0014Sigy	b	start
92f8bc0014Sigy	nop
93f8bc0014Sigy#endif
94f8bc0014Sigy
95f8bc0014Sigy	.org	0x1000
96f8bc0014Sigy	.globl	start
97f8bc0014Sigystart:
98f8bc0014Sigy#ifndef ROMICE
99f8bc0014Sigy	/*
100f8bc0014Sigy	 * setup CP0 CONFIG
101f8bc0014Sigy	 * EP = 0, AD = 0, K0 = 2
102f8bc0014Sigy	 */
103f8bc0014Sigy	li	t1, 0x00125482
104f8bc0014Sigy	mtc0	t1, $16
105f8bc0014Sigy
106f8bc0014Sigy	/*
107f8bc0014Sigy	 * setup CP0 STATUS
108f8bc0014Sigy	 * CU0 = 0, RE = 0, DS:BEV = 0, IM = 0, KX = SX = UX = 0,
109f8bc0014Sigy	 * KSU = 0, IE = 0, others = untouch
110f8bc0014Sigy	 */
111f8bc0014Sigy	mfc0	t1, $12
112f8bc0014Sigy	li	t2, 0x00770006
113f8bc0014Sigy	and	t1, t1, t2
114f8bc0014Sigy	li	t2, 0x00400000
115f8bc0014Sigy	or	t1, t1, t2
116f8bc0014Sigy	mtc0	t1, $12
117f8bc0014Sigy
118f8bc0014Sigy	mtc0	zero, $18		/* CP0 Watch Lo */
119f8bc0014Sigy	mtc0	zero, $11		/* CP0 compare */
120f8bc0014Sigy
121f8bc0014Sigy	/*
122f8bc0014Sigy	 * setup LED
123f8bc0014Sigy	 */
124f8bc0014Sigy	li	t0, 0xab000248		/* LEDCNTREG */
125f8bc0014Sigy	li	t1, 0x0001
126f8bc0014Sigy	sh	t1, (t0)
127f8bc0014Sigy
128f8bc0014Sigy	/*
129f8bc0014Sigy	 * reset HALTimer
130f8bc0014Sigy	 */
131f8bc0014Sigy	li	t0, 0xab0000a2
132f8bc0014Sigy	li	t1, 0x0004
133f8bc0014Sigy	sh	t1, (t0)
134f8bc0014Sigy
135f8bc0014Sigy	/*
136f8bc0014Sigy	 * initialize VR4181 bus controller
137f8bc0014Sigy	 */
138f8bc0014Sigy
139f8bc0014Sigy	/*
140f8bc0014Sigy	 * setup BCUCNTREG1
141f8bc0014Sigy	 * ROMs = 10 (64Mbit), ROMWEN0 = 1, Rtype = 01 (flash)
142f8bc0014Sigy	 * RSTOUT = 1 (inactive)
143f8bc0014Sigy	 */
144f8bc0014Sigy	li	t0, 0xaa000000		/* BCUCNTREG1 */
145f8bc0014Sigy	li	t1, 0x8013
146f8bc0014Sigy	sh	t1, (t0)
147f8bc0014Sigy
148f8bc0014Sigy	/*
149f8bc0014Sigy	 * setup BCURFCNTREG
150f8bc0014Sigy	 * BRF = refresh cycle x 1/TClock
151f8bc0014Sigy	 *     = 30.52usec x 32.768MHz
152f8bc0014Sigy	 *     = 0x3e8	(1000 TClock)
153f8bc0014Sigy	 */
154f8bc0014Sigy	li	t0, 0xaa000010		/* BCURFCNTREG */
155f8bc0014Sigy	li	t1, 0x03e8
156f8bc0014Sigy	sh	t1, (t0)
157f8bc0014Sigy
158f8bc0014Sigy	/*
159f8bc0014Sigy	 * setup BCUSPEEDREG
160f8bc0014Sigy	 * WPROM = 111 = 8.5TClock = 259ns
161f8bc0014Sigy	 * WROMA = 1000 = 9.5TClock = 290ns
162f8bc0014Sigy	 */
163f8bc0014Sigy	li	t0, 0xaa00000c		/* BCUSPEEDREG */
164f8bc0014Sigy	li	t1, 0x7008
165f8bc0014Sigy	sh	t1, (t0)
166f8bc0014Sigy
167f8bc0014Sigy	/*
168f8bc0014Sigy	 * setup SDTIMINGREG
169f8bc0014Sigy	 * BIT8 = 1 (always 1)
170f8bc0014Sigy	 * TRAS = 01 = 5SDCLK	(forced under 66, 50, 33MHz bus clock)
171f8bc0014Sigy	 * TRC  = 01 = 7SDCLK	(forced under 66, 50, 33MHz bus clock)
172f8bc0014Sigy	 * TRP  = 10 = 3SDCLK	(forced under 66, 50, 33MHz bus clock)
173f8bc0014Sigy	 * TRCP = 01 = 2SDCLK	(forced under 66, 50, 33MHz bus clock)
174f8bc0014Sigy	 */
175f8bc0014Sigy	li	t0, 0xaa00030c		/* SDTIMINGREG */
176f8bc0014Sigy	li	t1, 0x0159
177f8bc0014Sigy	sh	t1, (t0)
178f8bc0014Sigy
179f8bc0014Sigy	/*
180f8bc0014Sigy	 * To initialize 64Mbit SDRAM properly, we have to take
181f8bc0014Sigy	 * following steps:
182f8bc0014Sigy	 *
183f8bc0014Sigy	 * 	1. set MEMCFG_REG for 16Mbit SDRAM
184f8bc0014Sigy	 * 	2. setup MODE_REG
185f8bc0014Sigy	 * 	3. init SDRAM (setting MEMCFG_REG:Init to 1)
186f8bc0014Sigy	 * 	4. set MEMCFG_REG for 64Mbit SDRAM
187f8bc0014Sigy	 *
188f8bc0014Sigy	 * confirm to VR4181 users manual 6.5.2 MEMCFG_REG (page 142).
189f8bc0014Sigy	 * (the page number is for Japanese edition.  it might be
190f8bc0014Sigy	 *  at another page number for the English edition.)
191f8bc0014Sigy	 */
192f8bc0014Sigy
193f8bc0014Sigy	/*
194f8bc0014Sigy	 * first, say MEMCFG_REG that SDRAM is 16Mbit
195f8bc0014Sigy	 * Init = 0
196f8bc0014Sigy	 * B1Config = 01	(16Mbit)
197f8bc0014Sigy	 * Bstreftype = 1	(all raw refresh)
198f8bc0014Sigy	 * BstRefr = 0		(not allow burst refresh)
199*d7fca1abSandvar	 * EDOAsym = 0		(asymmetric)
200f8bc0014Sigy	 * B0Config = 01	(16Mbit)
201f8bc0014Sigy	 * EDO/SDRAM = 1	(SDRAM)
202f8bc0014Sigy	 */
203f8bc0014Sigy	li	t0, 0xaa000304		/* MEMCFG_REG <- 503 (16Mbit) */
204f8bc0014Sigy	li	t1, 0x0503
205f8bc0014Sigy	sh	t1, (t0)
206f8bc0014Sigy
207f8bc0014Sigy	/*
208f8bc0014Sigy	 * second, setup MODE_REG
209f8bc0014Sigy	 * Bit11 = 0		(always 0)
210f8bc0014Sigy	 * Bit10 = 0		(always 0)
211f8bc0014Sigy	 * BR-SW = 0		(always 0)
212f8bc0014Sigy	 * TE-Ven = 00		(always 00)
213f8bc0014Sigy	 * LTMode = 011		(3clock CAS latency)
214f8bc0014Sigy	 * WT = 0		(always 0)
215f8bc0014Sigy	 * BL = 111		(always 111)
216f8bc0014Sigy	 */
217f8bc0014Sigy	li	t0, 0xaa000308		/* MODE_REG */
218f8bc0014Sigy	li	t1, 0x0037
219f8bc0014Sigy	sh	t1, (t0)
220f8bc0014Sigy
221f8bc0014Sigy	/*
222f8bc0014Sigy	 * third, kick SDRAM initialization
223f8bc0014Sigy	 * Init = 1
224f8bc0014Sigy	 * other = untouched
225f8bc0014Sigy	 */
226f8bc0014Sigy	li	t0, 0xaa000304		/* MEMCFG_REG:Init <- 1 */
227f8bc0014Sigy	li	t1, 0x8503
228f8bc0014Sigy	sh	t1, (t0)
229f8bc0014Sigy
230f8bc0014Sigy	/*
231f8bc0014Sigy	 * final, say MEMCFG_REG that SDRAM is 16Mbit
232f8bc0014Sigy	 * Init = 0
233f8bc0014Sigy	 * B1Config = 10	(64Mbit)
234f8bc0014Sigy	 * Bstreftype = 1	(all raw refresh)
235f8bc0014Sigy	 * BstRefr = 0		(not allow burst refresh)
236*d7fca1abSandvar	 * EDOAsym = 0		(asymmetric)
237f8bc0014Sigy	 * B0Config = 10	(64Mbit)
238f8bc0014Sigy	 * EDO/SDRAM = 1	(SDRAM)
239f8bc0014Sigy	 */
240f8bc0014Sigy	li	t0, 0xaa000304		/* MEMCFG_REG */
241f8bc0014Sigy	li	t1, 0x0905
242f8bc0014Sigy	sh	t1, (t0)
243f8bc0014Sigy
244f8bc0014Sigy	/*
245f8bc0014Sigy	 * setup XISACTL
246f8bc0014Sigy	 * EXTRESULT = 1	(1 is recommended)
247f8bc0014Sigy	 * INTRESULT = 0	(0 is recommended)
248f8bc0014Sigy	 * EXBUFEN = 0		(use SYSDIR and SYSEN)
249f8bc0014Sigy	 * MEMWS = 00		(1.5 SYSCLK)
250f8bc0014Sigy	 * IOWS = 10		(2.5 SYSCLK)
251f8bc0014Sigy	 * SCLKDIV = 10		(PCLK/6)
252f8bc0014Sigy	 */
253f8bc0014Sigy	li	t0, 0xab0002c4		/* XISACTL */
254f8bc0014Sigy	li	t1, 0x0422
255f8bc0014Sigy	sh	t1, (t0)
256f8bc0014Sigy	nop
257f8bc0014Sigy
258f8bc0014Sigy
259f8bc0014Sigy	/*
260f8bc0014Sigy	 *  enable cache
261f8bc0014Sigy	 */
262f8bc0014Sigy	mfc0	t0, $16
263f8bc0014Sigy	li	t1, 0xfffffff8
264f8bc0014Sigy	and	t0, t0, t1
265f8bc0014Sigy	or	t0, t0, 0x00000003	/* K0 = 3 */
266f8bc0014Sigy	mtc0	t0, $16			/* config */
267f8bc0014Sigy	nop
268f8bc0014Sigy	nop
269f8bc0014Sigy	nop
270f8bc0014Sigy
271f8bc0014Sigy	/*
272f8bc0014Sigy	 * initialize cache
273f8bc0014Sigy	 */
274f8bc0014Sigy	mtc0	zero, $28		/* TagLo */
275f8bc0014Sigy
276f8bc0014Sigy	lui	t0, 0x8000		/* vaddr */
277f8bc0014Sigy	ori	t1, zero, 0x1000	/* cache size = 4KB */
278f8bc0014Sigycache_clear:
279f8bc0014Sigy	.set	push
280f8bc0014Sigy	.set	mips3
281f8bc0014Sigy	cache	0x00, (t0)		/* Index_Invalidate */
282f8bc0014Sigy	cache	0x09, (t0)		/* Index_Store_Tag */
283f8bc0014Sigy	.set	pop
284f8bc0014Sigy	addiu	t1, t1, -0x10
285f8bc0014Sigy	bgtz	t1, cache_clear
286f8bc0014Sigy	addiu	t0, t0, 0x10		/* increment of line size */
287f8bc0014Sigy
288f8bc0014Sigy
289f8bc0014Sigy	/* LED3 ON */
290f8bc0014Sigy	li	t0, 0xab000306
291f8bc0014Sigy	li	t1, 0x0800
292f8bc0014Sigy	sh	t1, (t0)
293f8bc0014Sigy
294f8bc0014Sigy	li	t0, 0xab000308
295f8bc0014Sigy	sh	zero, (t0)
296f8bc0014Sigy	nop
297f8bc0014Sigy	/* LED3 ON */
298f8bc0014Sigy
299f8bc0014Sigy	/*
300f8bc0014Sigy	 * now early bus configuration is done.
301f8bc0014Sigy	 */
302f8bc0014Sigy
303f8bc0014Sigy
304f8bc0014Sigy	/*
305f8bc0014Sigy	 *  copy bootloader ROM to RAM
306f8bc0014Sigy	 */
307f8bc0014Sigy	li	t1, LCBOOT_ROMSTARTADDR
308f8bc0014Sigy	la	t2, start
309f8bc0014Sigy	la	t3, edata
310f8bc0014Sigy1:
311f8bc0014Sigy	lw	t0, (t1)
312f8bc0014Sigy	nop
313f8bc0014Sigy	sw	t0, (t2)
314f8bc0014Sigy	addu	t2, t2, 4
315f8bc0014Sigy	sltu	t0, t2, t3
316f8bc0014Sigy	.set	push
317f8bc0014Sigy	.set	noreorder
318f8bc0014Sigy	.set	nomacro
319f8bc0014Sigy	bne	t0, zero, 1b
320f8bc0014Sigy	addu	t1, t1, 4
321f8bc0014Sigy	.set	pop
322f8bc0014Sigy
323f8bc0014Sigy
324f8bc0014Sigy	/* verify */
325f8bc0014Sigy	li	t1, LCBOOT_ROMSTARTADDR
326f8bc0014Sigy	la	t2, start
327f8bc0014Sigy	la	t3, edata
328f8bc0014Sigy1:
329f8bc0014Sigy	lw	t0, (t1)
330f8bc0014Sigy	lw	t4, (t2)
331f8bc0014Sigy	addu	t2, t2, 4
332f8bc0014Sigy	bne	t0, t4, 2f
333f8bc0014Sigy	sltu	t0, t2, t3
334f8bc0014Sigy	.set	push
335f8bc0014Sigy	.set	noreorder
336f8bc0014Sigy	.set	nomacro
337f8bc0014Sigy	bne	t0, zero, 1b
338f8bc0014Sigy	addu	t1, t1, 4
339f8bc0014Sigy	.set	pop
340f8bc0014Sigy	b	4f
341f8bc0014Sigy	nop
342f8bc0014Sigy2:
343f8bc0014Sigy	/* panic. stop LED */
344f8bc0014Sigy	li	t0, 0xab000248		/* LEDCNTREG */
345f8bc0014Sigy	sh	zero, (t0)
346f8bc0014Sigy3:
347f8bc0014Sigy	b	3b
348f8bc0014Sigy	nop
349f8bc0014Sigy4:
350f8bc0014Sigy	/* verify done */
351f8bc0014Sigy
352f8bc0014Sigy
353f8bc0014Sigy	/* LED4 ON */
354f8bc0014Sigy	li	t0, 0xab000306
355f8bc0014Sigy	li	t1, 0x8800
356f8bc0014Sigy	sh	t1, (t0)
357f8bc0014Sigy
358f8bc0014Sigy	li	t0, 0xab000308
359f8bc0014Sigy	sh	zero, (t0)
360f8bc0014Sigy	/* LED4 ON */
361f8bc0014Sigy
362f8bc0014Sigy	/*
363f8bc0014Sigy	 * now we've got a working RAM with cache.
364f8bc0014Sigy	 */
365f8bc0014Sigy
366f8bc0014Sigy
367f8bc0014Sigy#else /* !ROMICE */
368f8bc0014Sigy	/*
369f8bc0014Sigy	 * enable cache
370f8bc0014Sigy	 */
371f8bc0014Sigy	mfc0	t0, $16
372f8bc0014Sigy	li	t1, 0xfffffff8
373f8bc0014Sigy	and	t0, t0, t1
374f8bc0014Sigy	or	t0, t0, 0x00000003	/* K0 = 3 */
375f8bc0014Sigy	mtc0	t0, $16			/* config */
376f8bc0014Sigy	nop
377f8bc0014Sigy	nop
378f8bc0014Sigy	nop
379f8bc0014Sigy#endif /* !ROMICE */
380f8bc0014Sigy
381f8bc0014Sigy
382f8bc0014Sigy	/*
383f8bc0014Sigy	 * zero the bss
384f8bc0014Sigy	 */
385f8bc0014Sigy	la	t1, edata
386f8bc0014Sigy	la	t2, end
387f8bc0014Sigy	sw	zero, (t1)
388f8bc0014Sigy1:
389f8bc0014Sigy	addu	t1, t1, 4
390f8bc0014Sigy	.set	push
391f8bc0014Sigy	.set	mips3
392f8bc0014Sigy	.set	noreorder
393f8bc0014Sigy	.set	nomacro
394f8bc0014Sigy	sltu	t0, t1, t2
395f8bc0014Sigy	bnel	t0, zero, 1b
396f8bc0014Sigy	sw	zero, (t1)		/* delay slot */
397f8bc0014Sigy	.set	pop
398f8bc0014Sigy
399f8bc0014Sigy
400f8bc0014Sigy
401f8bc0014Sigy
402f8bc0014Sigy#ifdef DEBUG_LED
403f8bc0014Sigy	/* LED5 ON */
404f8bc0014Sigy	li	t0, 0xab000302
405f8bc0014Sigy	li	t1, 0x0002
406f8bc0014Sigy	sh	t1, (t0)
407f8bc0014Sigy
408f8bc0014Sigy	li	t0, 0xab00030a
409f8bc0014Sigy	sh	zero, (t0)
410f8bc0014Sigy	/* LED5 ON */
411f8bc0014Sigy#endif
412f8bc0014Sigy
413f8bc0014Sigy#ifdef DEBUG_LED
414f8bc0014Sigy	/* LED6 ON */
415f8bc0014Sigy	li	t0, 0xab000300
416f8bc0014Sigy	li	t1, 0x0020
417f8bc0014Sigy	sh	t1, (t0)
418f8bc0014Sigy
419f8bc0014Sigy	li	t0, 0xab00030a
420f8bc0014Sigy	sh	zero, (t0)
421f8bc0014Sigy	/* LED6 ON */
422f8bc0014Sigy#endif
423f8bc0014Sigy
424f8bc0014Sigy
425f8bc0014Sigy
426f8bc0014Sigy	/*
427f8bc0014Sigy	 * call lcboot main()
428f8bc0014Sigy	 */
429f8bc0014Sigy	move	a0, zero		/* a0:	argc = 0 */
430f8bc0014Sigy	move	a1, zero		/* a1 */
431f8bc0014Sigy	move	a2, zero		/* a2 */
432f8bc0014Sigy	move	a3, zero		/* a3 */
433f8bc0014Sigy	move	k0, zero		/* k0 */
434f8bc0014Sigy	move	k1, zero		/* k1 */
435f8bc0014Sigy	la	gp, _C_LABEL(_gp)	/* global pointer */
436f8bc0014Sigy	la	sp, start		/* stack pointer */
437f8bc0014Sigy	la	v0, main
438f8bc0014Sigy	jalr	v0
439f8bc0014Sigy	nop
440f8bc0014Sigy
441f8bc0014Sigy	.globl	start_netbsd
442f8bc0014Sigystart_netbsd:
443f8bc0014Sigy	/*
444f8bc0014Sigy	 * all LED OFF
445f8bc0014Sigy	 */
446f8bc0014Sigy	li	t0, 0xab000248		/* LEDCNTREG */
447f8bc0014Sigy	sh	zero, (t0)
448f8bc0014Sigy	li	t1, 0xffff
449f8bc0014Sigy	li	t0, 0xab000308
450f8bc0014Sigy	sh	t1, (t0)
451f8bc0014Sigy	li	t0, 0xab00030a
452f8bc0014Sigy	sh	t1, (t0)
453f8bc0014Sigy
454f8bc0014Sigy	/*
455f8bc0014Sigy	 * initialize registers
456f8bc0014Sigy	 */
457f8bc0014Sigy	li	a0, 1			/* a0:	argc = 1 */
458f8bc0014Sigy	la	a1, argv0		/* a1:	argv */
459f8bc0014Sigy	la	a2, bootinfo		/* a2:	bootinfo */
460f8bc0014Sigy	move	a3, zero		/* a3 */
461f8bc0014Sigy	move	k0, zero		/* k0 */
462f8bc0014Sigy	move	k1, zero		/* k1 */
463f8bc0014Sigy	/* no need to set grobal pointer. it set in locore.S */
464f8bc0014Sigy	la	sp, NETBSD_STARTADDR	/* stack pointer */
465f8bc0014Sigy	/*
466f8bc0014Sigy	 * call netbsd
467f8bc0014Sigy	 */
468f8bc0014Sigy	jr	sp
469f8bc0014Sigy	nop
470f8bc0014Sigy
471f8bc0014Sigy
472f8bc0014Sigy/*
473f8bc0014Sigy * arguments for mach_init()
474f8bc0014Sigy */
475f8bc0014Sigy	.data
476f8bc0014Sigyargv0:
477f8bc0014Sigy	.word	argv0c
478f8bc0014Sigyargv1:
479f8bc0014Sigy	.word	0
480f8bc0014Sigyargv0c:
481f8bc0014Sigy	.asciiz	"netbsd"
482f8bc0014Sigy
483f8bc0014Sigybootinfo:
484f8bc0014Sigy	.half	34		/* length */
485f8bc0014Sigy	.half	0		/* reserved */
486f8bc0014Sigy	.word	0x13536135	/* magic */
487f8bc0014Sigy	.word	0		/* fb_addr */
488f8bc0014Sigy	.half	0		/* fb_line_bytes */
489f8bc0014Sigy	.half	0		/* fb_width */
490f8bc0014Sigy	.half	0		/* fb_height */
491f8bc0014Sigy	.half	0		/* fb_type */
492f8bc0014Sigy	.half	2		/* BI_CNUSE_SERIAL */
493f8bc0014Sigy	.half	0		/* padding */
494f8bc0014Sigy	.word	0x04104400	/* PLATID_CPU_MIPS_VR_4181 */
495f8bc0014Sigy	.word	0x03810100	/* PLATID_MACH_LASER5_L_CARD */
496f8bc0014Sigy	.word	0		/* GMT */
497f8bc0014Sigy
498f8bc0014Sigy/*
499f8bc0014Sigy * End of start.S
500f8bc0014Sigy */
501