151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * CRISv32 kernel startup code.
351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik *
451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * Copyright (C) 2003, Axis Communications AB
551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define ASSEMBLER_MACROS_ONLY
851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik/*
1051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * The macros found in mmu_defs_asm.h uses the ## concatenation operator, so
1151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik * -traditional must not be used when assembling this file.
1251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik */
13556dcee7b829e5c350c3ffdbdb87a8b15aa3c5d3Jesper Nilsson#include <arch/memmap.h>
14c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#include <hwregs/reg_rdwr.h>
1596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#include <hwregs/intr_vect.h>
1696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#include <hwregs/asm/mmu_defs_asm.h>
1796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#include <hwregs/asm/reg_map_asm.h>
18556dcee7b829e5c350c3ffdbdb87a8b15aa3c5d3Jesper Nilsson#include <mach/startup.inc>
1951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
2051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define CRAMFS_MAGIC 0x28cd3d45
2196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#define JHEAD_MAGIC 0x1FF528A6
2296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#define JHEAD_SIZE 8
2351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define RAM_INIT_MAGIC 0x56902387
2451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#define COMMAND_LINE_MAGIC 0x87109563
2596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#define NAND_BOOT_MAGIC 0x9a9db001
2651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
2751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; NOTE: R8 and R9 carry information from the decompressor (if the
2851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; kernel was compressed). They must not be used in the code below
2951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; until they are read!
3051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
3151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Exported symbols.
3251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.global etrax_irv
3351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.global romfs_start
3451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.global romfs_length
3551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.global romfs_in_flash
3696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	.global nand_boot
3751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.global swapper_pg_dir
3851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
3951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.text
4051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starviktstart:
4151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; This is the entry point of the kernel. The CPU is currently in
4251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; supervisor mode.
4351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;;
4451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; 0x00000000 if flash.
4551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; 0x40004000 if DRAM.
4651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;;
4751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	di
4851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
4996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	START_CLOCKS
5096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
5196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	SETUP_WAIT_STATES
5296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
53f8e47cb0585c2506888b415354de27bff77be276Jesper Nilsson	GIO_INIT
54f8e47cb0585c2506888b415354de27bff77be276Jesper Nilsson
5596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#ifdef CONFIG_SMP
5696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilssonsecondary_cpu_entry: /* Entry point for secondary CPUs */
5796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	di
5851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif
5951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
6051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Setup and enable the MMU. Use same configuration for both the data
6151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; and the instruction MMU.
6251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;;
6351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Note; 3 cycles is needed for a bank-select to take effect. Further;
6451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; bank 1 is the instruction MMU, bank 2 is the data MMU.
65345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson
66345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson#ifdef CONFIG_CRIS_MACH_ARTPEC3
67345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	move.d	REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 8)	\
68345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 4)	\
69345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_FIELD(mmu, rw_mm_kbase_hi, base_d, 5)     \
70345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb), $r0
7151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#else
7251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	REG_FIELD(mmu, rw_mm_kbase_hi, base_e, 8)	\
7396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson		| REG_FIELD(mmu, rw_mm_kbase_hi, base_c, 4)	\
74d75d806cbbfb9c775e87779cd281c9c408c7aba3Jesper Nilsson		| REG_FIELD(mmu, rw_mm_kbase_hi, base_b, 0xb), $r0
7551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif
7651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
7751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Temporary map of 0x40 -> 0x40 and 0x00 -> 0x00.
7851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	REG_FIELD(mmu, rw_mm_kbase_lo, base_4, 4)  \
7951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_FIELD(mmu, rw_mm_kbase_lo, base_0, 0), $r1
8051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
8151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Enable certain page protections and setup linear mapping
8251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; for f,e,c,b,4,0.
83345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson
84345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; ARTPEC-3:
85345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; c,d used for linear kernel mapping, up to 512 MB
86345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; e used for vmalloc
87345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; f unused, but page mapped to get page faults
88345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson
89345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; ETRAX FS:
90345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; c used for linear kernel mapping, up to 256 MB
91345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; d used for vmalloc
92345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	;; e,f used for memory-mapped NOR flash
93345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson
94345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson#ifdef CONFIG_CRIS_MACH_ARTPEC3
95345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson	move.d	REG_STATE(mmu, rw_mm_cfg, we, on)		\
96345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, acc, on)		\
97345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, ex, on)		\
98345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, inv, on)            \
99345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_f, page)	\
100345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_e, page)	\
101345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_d, linear)      \
102345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_c, linear)	\
103345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_b, linear)	\
104345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_a, page)	\
105345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_9, page)	\
106345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_8, page)	\
107345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_7, page)	\
108345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_6, page)	\
109345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_5, page)	\
110345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_4, linear)	\
111345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_3, page)	\
112345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_2, page)	\
113345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_1, page)	\
114345c52e079001354809c17f84e164827e99f2aaaJesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_0, linear), $r2
11551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#else
11651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	REG_STATE(mmu, rw_mm_cfg, we, on)		\
11751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, acc, on)		\
11851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, ex, on)		\
11951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, inv, on)		\
12051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_f, linear)	\
12151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_e, linear)	\
12251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_d, page)	\
12351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_c, linear)	\
12451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_b, linear)	\
125d75d806cbbfb9c775e87779cd281c9c408c7aba3Jesper Nilsson		| REG_STATE(mmu, rw_mm_cfg, seg_a, page)	\
12651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_9, page)	\
12751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_8, page)	\
12851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_7, page)	\
12951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_6, page)	\
13051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_5, page)	\
13151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_4, linear)	\
13251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_3, page)	\
13351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_2, page)	\
13451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_1, page)	\
13551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik		| REG_STATE(mmu, rw_mm_cfg, seg_0, linear), $r2
13651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif
13751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
13851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Update instruction MMU.
13951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	1, $srs
14051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
14151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
14251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
14351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r0, $s2	; kbase_hi.
14451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r1, $s1	; kbase_lo.
14551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r2, $s0	; mm_cfg, virtual memory configuration.
14651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
14751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Update data MMU.
14851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	2, $srs
14951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
15051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
15151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
15251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r0, $s2	; kbase_hi.
15351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r1, $s1	; kbase_lo
15451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r2, $s0	; mm_cfg, virtual memory configuration.
15551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
15651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Enable data and instruction MMU.
15751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	0, $srs
15851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	moveq	0xf, $r0	;  IMMU, DMMU, DCache, Icache on
15951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
16051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
16151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
16251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r0, $s0
16351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
16451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
16551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
16651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
16751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#ifdef CONFIG_SMP
16851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Read CPU ID
16951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move    0, $srs
17051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
17151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
17251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
17396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move    $s12, $r0
17451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmpq    0, $r0
17551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	beq	master_cpu
17651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
17751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikslave_cpu:
17851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	; Time to boot-up. Get stack location provided by master CPU.
17951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d  smp_init_current_idle_thread, $r1
18051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d  [$r1], $sp
18151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	add.d	8192, $sp
18251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	ebp_start, $r0	; Defined in linker-script.
18351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r0, $ebp
18451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	jsr	smp_callin
18551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
18651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikmaster_cpu:
18796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	/* Set up entry point for secondary CPUs. The boot ROM has set up
18896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	 * EBP at start of internal memory. The CPU will get there
18996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	 * later when we issue an IPI to them... */
19096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d MEM_INTMEM_START + IPI_INTR_VECT * 4, $r0
19196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d secondary_cpu_entry, $r1
19296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d $r1, [$r0]
19351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif
19496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	; Check if starting from DRAM (network->RAM boot or unpacked
19596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	; compressed kernel), or directly from flash.
19651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	lapcq	., $r0
19751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	and.d	0x7fffffff, $r0 ; Mask off the non-cache bit.
19851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	0x10000, $r0	; Arbitrary, something above this code.
19951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	blo	_inflash0
20051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
20151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
20251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	jump	_inram		; Jump to cached RAM.
20351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
20451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
20551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Jumpgate.
20651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik_inflash0:
20751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	jump _inflash
20851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
20951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
21051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Put the following in a section so that storage for it can be
21151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; reclaimed after init is finished.
21251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.section ".init.text", "ax"
21351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
21451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik_inflash:
21551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
21651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Initialize DRAM.
21751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	RAM_INIT_MAGIC, $r8 ; Already initialized?
21851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	beq	_dram_initialized
21951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
22051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
221c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#if defined CONFIG_ETRAXFS
222c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#include "../mach-fs/dram_init.S"
223c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#elif defined CONFIG_CRIS_MACH_ARTPEC3
224c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#include "../mach-a3/dram_init.S"
225c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#else
226c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#error Only ETRAXFS and ARTPEC-3 supported!
227c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#endif
228c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson
22951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
23051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik_dram_initialized:
23151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Copy the text and data section to DRAM. This depends on that the
23251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; variables used below are correctly set up by the linker script.
23351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; The calculated value stored in R4 is used below.
23496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Leave the cramfs file system (piggybacked after the kernel) in flash.
23551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	moveq	0, $r0		; Source.
23651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	text_start, $r1	; Destination.
23751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	__vmlinux_end, $r2
23851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r2, $r4
23951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	sub.d	$r1, $r4
24051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik1:	move.w	[$r0+], $r3
24151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.w	$r3, [$r1+]
24251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	$r2, $r1
24351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	blo	1b
24451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
24551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
24696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Check for cramfs.
24751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	moveq	0, $r0
24851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_length, $r1
24951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
25051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	[$r4], $r0	; cramfs_super.magic
25151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	CRAMFS_MAGIC, $r0
25251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	bne 1f
25351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
25451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
25596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Set length and start of cramfs, set romfs_in_flash flag
25651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	addoq	+4, $r4, $acr
25751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	[$acr], $r0
25851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_length, $r1
25951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
26051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	add.d	0xf0000000, $r4	; Add cached flash start in virtual memory.
26151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_start, $r1
26251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r4, [$r1]
26351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik1:	moveq	1, $r0
26451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_in_flash, $r1
26551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
26651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
26751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	jump	_start_it	; Jump to cached code.
26851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
26951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
27051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik_inram:
27196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Check if booting from NAND flash; if so, set appropriate flags
27296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; and move on.
27396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	cmp.d	NAND_BOOT_MAGIC, $r12
27496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	bne	move_cramfs	; not nand, jump
27551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	moveq	1, $r0
27696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	nand_boot, $r1	; tell axisflashmap we're booting from NAND
27751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
27896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	moveq	0, $r0		; tell axisflashmap romfs is not in
27996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	romfs_in_flash, $r1 ; (directly accessed) flash
28096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	$r0, [$r1]
28196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	jump	_start_it	; continue with boot
28251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
28351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
28451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikmove_cramfs:
28596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; kernel is in DRAM.
28696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Must figure out if there is a piggybacked rootfs image or not.
28796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Set romfs_length to 0 => no rootfs image available by default.
28851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	moveq	0, $r0
28951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_length, $r1
29051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
29151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
29251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; The kernel could have been unpacked to DRAM by the loader, but
29396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; the cramfs image could still be in the flash immediately
29496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; following the compressed kernel image. The loader passes the address
29596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; of the byte succeeding the last compressed byte in the flash in
29651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; register R9 when starting the kernel.
29751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	0x0ffffff8, $r9
29851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	bhs	_no_romfs_in_flash ; R9 points outside the flash area.
29951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
30096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; cramfs rootfs might to be in flash. Check for it.
30151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	[$r9], $r0	; cramfs_super.magic
30251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	CRAMFS_MAGIC, $r0
30351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	bne	_no_romfs_in_flash
30451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
30551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
30696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; found cramfs in flash. set address and size, and romfs_in_flash flag.
30751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	addoq	+4, $r9, $acr
30851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	[$acr], $r0
30951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_length, $r1
31051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
31151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	add.d	0xf0000000, $r9	; Add cached flash start in virtual memory.
31251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_start, $r1
31351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r9, [$r1]
31451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	moveq	1, $r0
31551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_in_flash, $r1
31651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
31751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
31851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	jump	_start_it	; Jump to cached code.
31951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
32051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
32151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik_no_romfs_in_flash:
32296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; No romfs in flash, so look for cramfs, or jffs2 with jhead,
32396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; after kernel in RAM, as is the case with network->RAM boot.
32496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; For cramfs, partition starts with magic and length.
32596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; For jffs2, a jhead is prepended which contains with magic and length.
32696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; The jhead is not part of the jffs2 partition however.
32751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#ifndef CONFIG_ETRAXFS_SIM
328403a1c4f1380b4ec842df5f4aa86e86ba02904f3Jesper Nilsson	move.d	__bss_start, $r0
32951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#else
33051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	__end, $r0
33151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik#endif
33251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	[$r0], $r1
33396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	cmp.d	CRAMFS_MAGIC, $r1 ; cramfs magic?
33496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	beq	2f		  ; yes, jump
33596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	nop
33696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	cmp.d	JHEAD_MAGIC, $r1 ; jffs2 (jhead) magic?
33796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	bne	4f		; no, skip copy
33896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	nop
33996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	addq	4, $r0		; location of jffs2 size
34096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	[$r0+], $r2	; fetch jffs2 size -> r2
34196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson				; r0 now points to start of jffs2
34296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	ba	3f
34351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
34496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson2:
34596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	addoq	+4, $r0, $acr	; location of cramfs size
34696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	[$acr], $r2	; fetch cramfs size -> r2
34796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson				; r0 still points to start of cramfs
34896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson3:
34996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Now, move the root fs to after kernel's BSS
35051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	_end, $r1	; start of cramfs -> r1
35251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_start, $r3
35396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	$r1, [$r3]	; store at romfs_start (for axisflashmap)
35451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_length, $r3
35596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	$r2, [$r3]	; store size at romfs_length
35651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
35796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	add.d	$r2, $r0	; copy from end and downwards
35851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	add.d	$r2, $r1
35951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
36051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	lsrq	1, $r2		; Size is in bytes, we copy words.
36151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	addq    1, $r2
36251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik1:
36351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.w	[$r0], $r3
36451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.w	$r3, [$r1]
36551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	subq	2, $r0
36651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	subq	2, $r1
36751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	subq	1, $r2
36851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	bne	1b
36951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
37051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
37196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson4:
37296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; BSS move done.
37396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Clear romfs_in_flash flag, as we now know romfs is in DRAM
37496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; Also clear nand_boot flag; if we got here, we know we've not
37596e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	;; booted from NAND flash.
37651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	moveq	0, $r0
37751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	romfs_in_flash, $r1
37851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
37996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	moveq	0, $r0
38096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	nand_boot, $r1
38196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.d	$r0, [$r1]
38251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	jump	_start_it	; Jump to cached code.
38451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
38551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik_start_it:
38751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
38851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Check if kernel command line is supplied
38951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	COMMAND_LINE_MAGIC, $r10
39051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	bne	no_command_line
39151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
39251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
39351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	256, $r13
39451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d  cris_command_line, $r10
39551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	or.d	0x80000000, $r11 ; Make it virtual
39651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik1:
39796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.b  [$r11+], $r1
39896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	move.b  $r1, [$r10+]
39951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	subq	1, $r13
40051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	bne	1b
40151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
40251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
40351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikno_command_line:
40451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
40551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; The kernel stack contains a task structure for each task. This
40651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; the initial kernel stack is in the same page as the init_task,
40751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; but starts at the top of the page, i.e. + 8192 bytes.
40851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	init_thread_union + 8192, $sp
40951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	ebp_start, $r0	; Defined in linker-script.
41051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move	$r0, $ebp
41151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	etrax_irv, $r1	; Set the exception base register and pointer.
41251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	$r0, [$r1]
41351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
41451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	;; Clear the BSS region from _bss_start to _end.
41551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	__bss_start, $r0
41651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d	_end, $r1
41751533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik1:	clear.d	[$r0+]
41851533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	cmp.d	$r1, $r0
41951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	blo 1b
42051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
42151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	; Initialize registers to increase determinism
42351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	move.d __bss_start, $r0
42451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	movem [$r0], $r13
42551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
42696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#ifdef CONFIG_ETRAX_L2CACHE
42796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	jsr	l2cache_init
42896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson	nop
42996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson#endif
43096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
43151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	jump	start_kernel	; Jump to start_kernel() in init/main.c.
43251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	nop
43351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
43451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.data
43551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starviketrax_irv:
43651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.dword 0
43796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
43896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; Variables for communication with the Axis flash map driver (axisflashmap),
43996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; and for setting up memory in arch/cris/kernel/setup.c .
44096e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
44196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; romfs_start is set to the start of the root file system, if it exists
44296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; in directly accessible memory (i.e. NOR Flash when booting from Flash,
44396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; or RAM when booting directly from a network-downloaded RAM image)
44451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikromfs_start:
44551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.dword 0
44696e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
44796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; romfs_length is set to the size of the root file system image, if it exists
44896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; in directly accessible memory (see romfs_start). Otherwise it is set to 0.
44951533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikromfs_length:
45051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.dword 0
45196e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
45296e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; romfs_in_flash is set to 1 if the root file system resides in directly
45396e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; accessible flash memory (i.e. NOR flash). It is set to 0 for RAM boot
45496e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; or NAND flash boot.
45551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikromfs_in_flash:
45651533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.dword 0
45796e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson
45896e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilsson; nand_boot is set to 1 when the kernel has been booted from NAND flash
45996e476697d7ed025bfa1af4073e825901b5c6b1aJesper Nilssonnand_boot:
46051533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.dword 0
46151533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
46251533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvikswapper_pg_dir = 0xc0002000
46351533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
46451533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik	.section ".init.data", "aw"
46551533b615e605d86154ec1b4e585c8ca1b0b15b7Mikael Starvik
466c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#if defined CONFIG_ETRAXFS
467c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#include "../mach-fs/hw_settings.S"
468c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#elif defined CONFIG_CRIS_MACH_ARTPEC3
469c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#include "../mach-a3/hw_settings.S"
470c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#else
471c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#error Only ETRAXFS and ARTPEC-3 supported!
472c5ec6fb08d7806cf1a9e4fceed15f5d4a69f885eJesper Nilsson#endif
473