15f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen/*
25f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Startup code for use with the u-boot bootloader.
35f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen *
45f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * Copyright (C) 2004-2006 Atmel Corporation
55f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen *
65f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * This program is free software; you can redistribute it and/or modify
75f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * it under the terms of the GNU General Public License version 2 as
85f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen * published by the Free Software Foundation.
95f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen */
105f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen#include <asm/setup.h>
117a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#include <asm/thread_info.h>
127a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#include <asm/sysreg.h>
135f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
145f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/*
155f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * The kernel is loaded where we want it to be and all caches
165f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * have just been flushed. We get two parameters from u-boot:
175f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 *
185f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * r12 contains a magic number (ATAG_MAGIC)
195f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * r11 points to a tag table providing information about
205f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 *     the system.
215f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 */
225f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	.section .init.text,"ax"
235f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	.global _start
245f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen_start:
255f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/* Initialize .bss */
265f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	lddpc	r2, bss_start_addr
275f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	lddpc   r3, end_addr
285f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	mov	r0, 0
295f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	mov	r1, 0
305f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen1:      st.d    r2++, r0
315f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	cp      r2, r3
325f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	brlo    1b
335f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
347a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	/* Initialize status register */
357a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	lddpc	r0, init_sr
367a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	mtsr	SYSREG_SR, r0
377a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann
387a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	/* Set initial stack pointer */
397a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	lddpc	sp, stack_addr
407a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	sub	sp, -THREAD_SIZE
417a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann
427a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#ifdef CONFIG_FRAME_POINTER
437a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	/* Mark last stack frame */
447a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	mov	lr, 0
457a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	mov	r7, 0
467a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann#endif
477a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann
487a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	/* Check if the boot loader actually provided a tag table */
497a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	lddpc	r0, magic_number
507a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	cp.w	r12, r0
517a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	brne	no_tag_table
527a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann
535f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/*
545f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * Save the tag table address for later use. This must be done
555f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 * _after_ .bss has been initialized...
565f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	 */
575f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	lddpc	r0, tag_table_addr
585f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	st.w	r0[0], r11
595f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
605f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	/* Jump to loader-independent setup code */
615f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	rjmp	kernel_entry
625f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
635f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	.align	2
645f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenmagic_number:
655f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	.long	ATAG_MAGIC
665f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoentag_table_addr:
675f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	.long	bootloader_tags
685f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenbss_start_addr:
695f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	.long   __bss_start
705f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenend_addr:
715f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	.long   _end
727a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmanninit_sr:
737a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	.long	0x007f0000	/* Supervisor mode, everything masked */
747a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmannstack_addr:
757a2a74f4b856993218aa7cdeeb6c3103101340dbAndreas Bießmann	.long	init_thread_union
76d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmannpanic_addr:
77d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmann	.long	panic
785f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen
795f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoenno_tag_table:
805f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen	sub	r12, pc, (. - 2f)
81d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmann	/* branch to panic() which can be far away with that construct */
82d617b338bbfdd77e9cbd8e7dc949cee3dd73d575Andreas Bießmann	lddpc	pc, panic_addr
835f97f7f9400de47ae837170bb274e90ad3934386Haavard Skinnemoen2:	.asciz	"Boot loader didn't provide correct magic number\n"
84