summaryrefslogtreecommitdiffstats
path: root/arch/nios2/cpu/start.S
diff options
context:
space:
mode:
authorThomas Chou <thomas@wytron.com.tw>2014-08-22 11:36:47 +0800
committerThomas Chou <thomas@wytron.com.tw>2014-08-24 11:28:10 +0800
commit5ff10aa7e76fc7dbd205ec13381757bfa2c99911 (patch)
treeb61f3a949766cb6cda4f537874bebe7790356c8e /arch/nios2/cpu/start.S
parent70fbc46192dfd52896560f4b31e40daa3d16b99f (diff)
downloadblackbird-obmc-uboot-5ff10aa7e76fc7dbd205ec13381757bfa2c99911.tar.gz
blackbird-obmc-uboot-5ff10aa7e76fc7dbd205ec13381757bfa2c99911.zip
nios2: add generic board support
This patch implements the generic board init as described in doc/README.generic-board. Signed-off-by: Thomas Chou <thomas@wytron.com.tw> Signed-off-by: Scott McNutt <smcnutt@psyent.com> Reviewed-by: Stefan Roese <sr@denx.de>
Diffstat (limited to 'arch/nios2/cpu/start.S')
-rw-r--r--arch/nios2/cpu/start.S34
1 files changed, 30 insertions, 4 deletions
diff --git a/arch/nios2/cpu/start.S b/arch/nios2/cpu/start.S
index 7ce0d34d7f..6af9b4e943 100644
--- a/arch/nios2/cpu/start.S
+++ b/arch/nios2/cpu/start.S
@@ -134,11 +134,12 @@ _reloc:
mov fp, sp
/*
- * Call board_init -- never returns
+ * Call board_init_f -- never returns
*/
- movhi r4, %hi(board_init@h)
- ori r4, r4, %lo(board_init@h)
- callr r4
+ mov r4, r0
+ movhi r2, %hi(board_init_f@h)
+ ori r2, r2, %lo(board_init_f@h)
+ callr r2
/* NEVER RETURNS -- but branch to the _start just
* in case ;-)
@@ -146,6 +147,31 @@ _reloc:
br _start
+
+/*
+ * relocate_code -- Nios2 handles the relocation above. But
+ * the generic board code monkeys with the heap, stack, etc.
+ * (it makes some assumptions that may not be appropriate
+ * for Nios). Nevertheless, we capitulate here.
+ *
+ * We'll call the board_init_r from here since this isn't
+ * supposed to return.
+ *
+ * void relocate_code (ulong sp, gd_t *global_data,
+ * ulong reloc_addr)
+ * __attribute__ ((noreturn));
+ */
+ .text
+ .global relocate_code
+
+relocate_code:
+ mov sp, r4 /* Set the new sp */
+ mov r4, r5
+ movhi r8, %hi(board_init_r@h)
+ ori r8, r8, %lo(board_init_r@h)
+ callr r8
+ ret
+
/*
* dly_clks -- Nios2 (like Nios1) doesn't have a timebase in
* the core. For simple delay loops, we do our best by counting
OpenPOWER on IntegriCloud