11.2Smatt/*	$NetBSD: hdlg_start.S,v 1.2 2011/01/31 06:28:03 matt Exp $	*/
21.1Snonaka
31.1Snonaka/*
41.1Snonaka * Copyright (c) 2002 Wasabi Systems, Inc.
51.1Snonaka * All rights reserved.
61.1Snonaka *
71.1Snonaka * Written by Jason R. Thorpe for Wasabi Systems, Inc.
81.1Snonaka *
91.1Snonaka * Redistribution and use in source and binary forms, with or without
101.1Snonaka * modification, are permitted provided that the following conditions
111.1Snonaka * are met:
121.1Snonaka * 1. Redistributions of source code must retain the above copyright
131.1Snonaka *    notice, this list of conditions and the following disclaimer.
141.1Snonaka * 2. Redistributions in binary form must reproduce the above copyright
151.1Snonaka *    notice, this list of conditions and the following disclaimer in the
161.1Snonaka *    documentation and/or other materials provided with the distribution.
171.1Snonaka * 3. All advertising materials mentioning features or use of this software
181.1Snonaka *    must display the following acknowledgement:
191.1Snonaka *	This product includes software developed for the NetBSD Project by
201.1Snonaka *	Wasabi Systems, Inc.
211.1Snonaka * 4. The name of Wasabi Systems, Inc. may not be used to endorse
221.1Snonaka *    or promote products derived from this software without specific prior
231.1Snonaka *    written permission.
241.1Snonaka *
251.1Snonaka * THIS SOFTWARE IS PROVIDED BY WASABI SYSTEMS, INC. ``AS IS'' AND
261.1Snonaka * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
271.1Snonaka * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
281.1Snonaka * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL WASABI SYSTEMS, INC
291.1Snonaka * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
301.1Snonaka * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
311.1Snonaka * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
321.1Snonaka * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
331.1Snonaka * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
341.1Snonaka * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
351.1Snonaka * POSSIBILITY OF SUCH DAMAGE.
361.1Snonaka */
371.1Snonaka
381.1Snonaka#include <machine/asm.h>
391.1Snonaka#include <arm/armreg.h>
401.2Smatt#include "assym.h"
411.2Smatt
421.2SmattRCSID("$NetBSD: hdlg_start.S,v 1.2 2011/01/31 06:28:03 matt Exp $")
431.1Snonaka
441.1Snonaka	.section .start,"ax",%progbits
451.1Snonaka
461.1Snonaka	.global	_C_LABEL(hdlg_start)
471.1Snonaka_C_LABEL(hdlg_start):
481.1Snonaka	/*
491.1Snonaka	 * We will go ahead and disable the MMU here so that we don't
501.1Snonaka	 * have to worry about flushing caches, etc.
511.1Snonaka	 *
521.1Snonaka	 * Note that we may not currently be running VA==PA, which means
531.1Snonaka	 * we'll need to leap to the next insn after disabing the MMU.
541.1Snonaka	 */
551.1Snonaka	adr	r8, Lunmapped
561.1Snonaka	bic	r8, r8, #0xff000000	/* clear upper 8 bits */
571.1Snonaka	orr	r8, r8, #0xa0000000	/* OR in physical base address */
581.1Snonaka
591.1Snonaka	mrc	p15, 0, r2, c1, c0, 0
601.1Snonaka	bic	r2, r2, #CPU_CONTROL_MMU_ENABLE
611.1Snonaka	mcr	p15, 0, r2, c1, c0, 0
621.1Snonaka
631.1Snonaka	nop
641.1Snonaka	nop
651.1Snonaka	nop
661.1Snonaka
671.1Snonaka	mov	pc, r8			/* Heave-ho! */
681.1Snonaka
691.1SnonakaLunmapped:
701.1Snonaka	/* reloc */
711.1Snonaka	adr	r1, _C_LABEL(hdlg_start)
721.1Snonaka	adr	r0, .Lstart
731.1Snonaka	ldmia	r0, {r0, r2}
741.1Snonaka	bic	r0, r0, #0xff000000
751.1Snonaka	orr	r0, r0, #0xa0000000
761.1Snonaka	bic	r2, r2, #0xff000000
771.1Snonaka	orr	r2, r2, #0xa0000000
781.1Snonaka	sub	r2, r2, r0	/* size = _edata - start */
791.1Snonaka	cmp	r1, r0
801.1Snonaka	beq	.Lreloc_done	/* if (dst == src) */
811.1Snonaka	bcc	.Lreloc_backwards
821.1Snonaka
831.1Snonaka1:	ldrb	r3, [r1], #1
841.1Snonaka	strb	r3, [r0], #1
851.1Snonaka	subs	r2, r2, #1
861.1Snonaka	bne	1b
871.1Snonaka	b	.Lreloc
881.1Snonaka
891.1Snonaka.Lreloc_backwards:
901.1Snonaka	add	r0, r0, r2
911.1Snonaka	add	r1, r1, r2
921.1Snonaka	sub	r0, r0, #1
931.1Snonaka	sub	r1, r1, #1
941.1Snonaka1:	ldrb	r3, [r1], #-1
951.1Snonaka	strb	r3, [r0], #-1
961.1Snonaka	subs	r2, r2, #1
971.1Snonaka	bne	1b
981.1Snonaka
991.1Snonaka.Lreloc:
1001.1Snonaka	ldr	r0, .Lreloc_done
1011.1Snonaka	bic	r0, r0, #0xff000000
1021.1Snonaka	orr	r0, r0, #0xa0000000
1031.1Snonaka	mov	pc, r0
1041.1Snonaka
1051.1Snonaka.Lstart:
1061.1Snonaka	.word	_C_LABEL(hdlg_start)
1071.1Snonaka	.word	_edata
1081.1Snonaka
1091.1Snonaka.Lreloc_done:
1101.1Snonaka	.word	Lreloc_done
1111.1Snonaka
1121.1SnonakaLreloc_done:
1131.1Snonaka	/*
1141.1Snonaka	 * We want to construct a memory map that maps us
1151.1Snonaka	 * VA==PA (SDRAM at 0xa0000000) and also double-maps
1161.1Snonaka	 * that space at 0xc0000000 (where the kernel address
1171.1Snonaka	 * space starts).  We create these mappings uncached
1181.1Snonaka	 * and unbuffered to be safe.
1191.1Snonaka	 *
1201.1Snonaka	 * We also want to map the various devices we want to
1211.1Snonaka	 * talk to VA==PA during bootstrap.
1221.1Snonaka	 *
1231.1Snonaka	 * We just use section mappings for all of this to make it easy.
1241.1Snonaka	 *
1251.1Snonaka	 * We will put the L1 table to do all this at 0xa0004000, which
1261.1Snonaka	 * is also where RedBoot puts it.
1271.1Snonaka	 */
1281.1Snonaka
1291.1Snonaka	/*
1301.1Snonaka	 * Step 1: Map the entire address space VA==PA.
1311.1Snonaka	 */
1321.1Snonaka	adr	r0, Ltable
1331.1Snonaka	ldr	r0, [r0]			/* r0 = &l1table */
1341.1Snonaka
1351.2Smatt	mov	r3, #(L1_S_AP_KRW)
1361.1Snonaka	orr	r3, r3, #(L1_TYPE_S)
1371.1Snonaka	mov	r2, #0x100000			/* advance by 1MB */
1381.1Snonaka	mov	r1, #0x1000			/* 4096MB */
1391.1Snonaka1:
1401.1Snonaka	str	r3, [r0], #0x04
1411.1Snonaka	add	r3, r3, r2
1421.1Snonaka	subs	r1, r1, #1
1431.1Snonaka	bgt	1b
1441.1Snonaka
1451.1Snonaka	/*
1461.1Snonaka	 * Step 2: Map VA 0xc0000000->0xc7ffffff to PA 0xa0000000->0xa7ffffff.
1471.1Snonaka	 */
1481.1Snonaka	adr	r0, Ltable			/* r0 = &l1table */
1491.1Snonaka	ldr	r0, [r0]
1501.1Snonaka
1511.2Smatt	mov	r3, #(L1_S_AP_KRW)
1521.1Snonaka	orr	r3, r3, #(L1_TYPE_S)
1531.1Snonaka	orr	r3, r3, #0xa0000000
1541.1Snonaka	add	r0, r0, #(0xc00 * 4)		/* offset to 0xc00xxxxx */
1551.1Snonaka	mov	r1, #0x80			/* 128MB */
1561.1Snonaka1:
1571.1Snonaka	str	r3, [r0], #0x04
1581.1Snonaka	add	r3, r3, r2
1591.1Snonaka	subs	r1, r1, #1
1601.1Snonaka	bgt	1b
1611.1Snonaka
1621.1Snonaka	/* OK!  Page table is set up.  Give it to the CPU. */
1631.1Snonaka	adr	r0, Ltable			/* r0 = &l1table */
1641.1Snonaka	ldr	r0, [r0]
1651.1Snonaka	mcr	p15, 0, r0, c2, c0, 0
1661.1Snonaka
1671.1Snonaka	/* Flush the old TLBs, just in case. */
1681.1Snonaka	mcr	p15, 0, r0, c8, c7, 0
1691.1Snonaka
1701.1Snonaka	/* Set the Domain Access register.  Very important! */
1711.1Snonaka	mov	r0, #1
1721.1Snonaka	mcr	p15, 0, r0, c3, c0, 0
1731.1Snonaka
1741.1Snonaka	/* Get ready to jump to the "real" kernel entry point... */
1751.1Snonaka	ldr	r0, Lstart
1761.1Snonaka
1771.1Snonaka	/* OK, let's enable the MMU. */
1781.1Snonaka	mrc	p15, 0, r2, c1, c0, 0
1791.1Snonaka	orr	r2, r2, #CPU_CONTROL_MMU_ENABLE
1801.1Snonaka	mcr	p15, 0, r2, c1, c0, 0
1811.1Snonaka
1821.1Snonaka	nop
1831.1Snonaka	nop
1841.1Snonaka	nop
1851.1Snonaka
1861.1Snonaka	/* CPWAIT sequence to make sure the MMU is on... */
1871.1Snonaka	mrc	p15, 0, r2, c2, c0, 0	/* arbitrary read of CP15 */
1881.1Snonaka	mov	r2, r2			/* force it to complete */
1891.1Snonaka	mov	pc, r0			/* leap to kernel entry point! */
1901.1Snonaka
1911.1SnonakaLtable:
1921.1Snonaka	.word	0xa0004000
1931.1Snonaka
1941.1SnonakaLstart:
1951.1Snonaka	.word	start
196