#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
 
        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)
 
 
 ambapp_dev_gptimer *gptimer;
 
+void *__prom_start_reloc; /* relocated prom_start address */
+
 /* for __va */
 extern int __prom_start;
 #define PAGE_OFFSET 0xf0000000
 
        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)
 
        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)
 {
        /* 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
 
 
 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)
 #endif
 #ifdef CONFIG_PS2KBD
        initr_kbd,
+#endif
+#if defined(CONFIG_SPARC)
+       prom_init,
 #endif
        run_main_loop,
 };