[U-Boot] [PATCH v1 15/21] sparc: Update PROM initialization code for generic board
Francois Retief
fgretief at spaceteq.co.za
Mon Nov 23 16:38:56 CET 2015
Fixed the prom_relocate() function in start.S file by reserving memory in
the board_init_f sequence and saving the offset to the __prom_start_reloc
variable. This value is used as the destination when relocating the PROM.
Add the prom_init() function to the end of the board_init_r sequence.
Signed-off-by: Francois Retief <fgretief at spaceteq.co.za>
---
arch/sparc/cpu/leon2/prom.c | 2 ++
arch/sparc/cpu/leon2/start.S | 28 ++++++++++++++--------------
arch/sparc/cpu/leon3/prom.c | 2 ++
arch/sparc/cpu/leon3/start.S | 28 ++++++++++++++--------------
common/board_f.c | 17 +++++++++++++++++
common/board_r.c | 7 +++++++
6 files changed, 56 insertions(+), 28 deletions(-)
diff --git a/arch/sparc/cpu/leon2/prom.c b/arch/sparc/cpu/leon2/prom.c
index cd2571f..7829e7a 100644
--- a/arch/sparc/cpu/leon2/prom.c
+++ b/arch/sparc/cpu/leon2/prom.c
@@ -25,6 +25,8 @@ extern struct linux_romvec *kernel_arg_promvec;
#define PROM_TEXT __attribute__ ((__section__ (".prom.text")))
#define PROM_DATA __attribute__ ((__section__ (".prom.data")))
+void *__prom_start_reloc; /* relocated prom_start address */
+
/* for __va */
extern int __prom_start;
#define PAGE_OFFSET 0xf0000000
diff --git a/arch/sparc/cpu/leon2/start.S b/arch/sparc/cpu/leon2/start.S
index 7362ae1..1b404da 100644
--- a/arch/sparc/cpu/leon2/start.S
+++ b/arch/sparc/cpu/leon2/start.S
@@ -414,24 +414,24 @@ fixup_got:
bcs 30b ! while (ptr < end)
nop
-#if 0 /* FIXME: Relocated PROM address should be calculated! */
-
prom_relocate:
SPARC_LOAD_ADDRESS(__prom_start, l7, g2)
SPARC_LOAD_ADDRESS(__prom_end, l7, g3)
- set CONFIG_SYS_PROM_OFFSET, %g4
-
-prom_relocate_loop:
- ldd [%g2],%l0
- ldd [%g2+8],%l2
- std %l0,[%g4]
- std %l2,[%g4+8]
- inc 16,%g2
- subcc %g3,%g2,%g0
- bne prom_relocate_loop
- inc 16,%g4
+ /*
+ * Calculated addres is stored in this variable by
+ * reserve_prom() function in common/board_f.c
+ */
+ SPARC_LOAD_ADDRESS(__prom_start_reloc, l7, g4)
+ ld [%g4], %g4
-#endif
+40: ldd [%g2], %l0
+ ldd [%g2+8], %l2
+ std %l0, [%g4]
+ std %l2, [%g4+8]
+ inc 16, %g2
+ cmp %g2, %g3
+ bcs 40b
+ inc 16, %g4
! %o0 = stack pointer (relocated)
! %o1 = global data pointer (relocated)
diff --git a/arch/sparc/cpu/leon3/prom.c b/arch/sparc/cpu/leon3/prom.c
index c391be7..1f185b7 100644
--- a/arch/sparc/cpu/leon3/prom.c
+++ b/arch/sparc/cpu/leon3/prom.c
@@ -33,6 +33,8 @@ DECLARE_GLOBAL_DATA_PTR;
ambapp_dev_gptimer *gptimer;
+void *__prom_start_reloc; /* relocated prom_start address */
+
/* for __va */
extern int __prom_start;
#define PAGE_OFFSET 0xf0000000
diff --git a/arch/sparc/cpu/leon3/start.S b/arch/sparc/cpu/leon3/start.S
index 52e82b5..1527d72 100644
--- a/arch/sparc/cpu/leon3/start.S
+++ b/arch/sparc/cpu/leon3/start.S
@@ -397,24 +397,24 @@ fixup_got:
bcs 30b ! while (ptr < end)
nop
-#if 0 /* FIXME: Relocated PROM address should be calculated! */
-
prom_relocate:
SPARC_LOAD_ADDRESS(__prom_start, l7, g2)
SPARC_LOAD_ADDRESS(__prom_end, l7, g3)
- set CONFIG_SYS_PROM_OFFSET, %g4
-
-prom_relocate_loop:
- ldd [%g2],%l0
- ldd [%g2+8],%l2
- std %l0,[%g4]
- std %l2,[%g4+8]
- inc 16,%g2
- subcc %g3,%g2,%g0
- bne prom_relocate_loop
- inc 16,%g4
+ /*
+ * Calculated addres is stored in this variable by
+ * reserve_prom() function in common/board_f.c
+ */
+ SPARC_LOAD_ADDRESS(__prom_start_reloc, l7, g4)
+ ld [%g4], %g4
-#endif
+40: ldd [%g2], %l0
+ ldd [%g2+8], %l2
+ std %l0, [%g4]
+ std %l2, [%g4+8]
+ inc 16, %g2
+ cmp %g2, %g3
+ bcs 40b
+ inc 16, %g4
! %o0 = stack pointer (relocated)
! %o1 = global data pointer (relocated)
diff --git a/common/board_f.c b/common/board_f.c
index 2dd10b9..8325dc3 100644
--- a/common/board_f.c
+++ b/common/board_f.c
@@ -357,6 +357,20 @@ static int setup_dest_addr(void)
return 0;
}
+#if defined(CONFIG_SPARC)
+static int reserve_prom(void)
+{
+ /* defined in arch/sparc/cpu/leon?/prom.c */
+ extern void *__prom_start_reloc;
+ int size = 8192; /* page table = 2k, prom = 6k */
+ gd->relocaddr -= size;
+ __prom_start_reloc = map_sysmem(gd->relocaddr + 2048, size - 2048);
+ debug("Reserving %dk for PROM and page table at %08lx\n", size,
+ gd->relocaddr);
+ return 0;
+}
+#endif
+
#if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
static int reserve_logbuffer(void)
{
@@ -909,6 +923,9 @@ static init_fnc_t init_sequence_f[] = {
/* Blackfin u-boot monitor should be on top of the ram */
reserve_uboot,
#endif
+#if defined(CONFIG_SPARC)
+ reserve_prom,
+#endif
#if defined(CONFIG_LOGBUFFER) && !defined(CONFIG_ALT_LB_ADDR)
reserve_logbuffer,
#endif
diff --git a/common/board_r.c b/common/board_r.c
index a5690ad..be8a603 100644
--- a/common/board_r.c
+++ b/common/board_r.c
@@ -66,6 +66,10 @@
DECLARE_GLOBAL_DATA_PTR;
+#if defined(CONFIG_SPARC)
+extern int prom_init(void);
+#endif
+
ulong monitor_flash_len;
__weak int board_flash_wp_on(void)
@@ -926,6 +930,9 @@ init_fnc_t init_sequence_r[] = {
#ifdef CONFIG_PS2KBD
initr_kbd,
#endif
+#if defined(CONFIG_SPARC)
+ prom_init,
+#endif
run_main_loop,
};
--
2.4.3
More information about the U-Boot
mailing list