microblaze: branch to base vector address on reset
authorOvidiu Panait <ovidiu.panait@windriver.com>
Tue, 30 Nov 2021 16:33:57 +0000 (18:33 +0200)
committerMichal Simek <michal.simek@xilinx.com>
Wed, 5 Jan 2022 09:22:03 +0000 (10:22 +0100)
Current code assumes that the vector base address is always at 0x0.
However, this value is configurable for MicroBlaze using the
CONFIG_XILINX_MICROBLAZE0_VECTOR_BASE_ADDR Kconfig option. Update the
reset routines to branch to this location instead.

Signed-off-by: Ovidiu Panait <ovidiu.panait@windriver.com>
Link: https://lore.kernel.org/r/20211130163358.2531677-10-ovidiu.panait@windriver.com
Signed-off-by: Michal Simek <michal.simek@xilinx.com>
arch/microblaze/cpu/spl.c
drivers/sysreset/sysreset_microblaze.c

index 06d4af9..cea6d56 100644 (file)
@@ -12,6 +12,7 @@
 #include <spl.h>
 #include <asm/io.h>
 #include <asm/u-boot.h>
+#include <linux/stringify.h>
 
 bool boot_linux;
 
@@ -54,8 +55,9 @@ int spl_start_uboot(void)
 
 int do_reset(struct cmd_tbl *cmdtp, int flag, int argc, char *const argv[])
 {
-       __asm__ __volatile__ ("mts rmsr, r0;" \
-                             "bra r0");
+       __asm__ __volatile__ (
+           "mts rmsr, r0;" \
+           "brai " __stringify(CONFIG_XILINX_MICROBLAZE0_VECTOR_BASE_ADDR));
 
        return 0;
 }
index 514c958..83a7f77 100644 (file)
@@ -8,13 +8,15 @@
 #include <errno.h>
 #include <sysreset.h>
 #include <linux/err.h>
+#include <linux/stringify.h>
 
 static int microblaze_sysreset_request(struct udevice *dev,
                                       enum sysreset_t type)
 {
        puts("Microblaze soft reset sysreset\n");
-       __asm__ __volatile__ (" mts rmsr, r0;" \
-                               "bra r0");
+       __asm__ __volatile__ (
+           "mts rmsr, r0;" \
+           "brai " __stringify(CONFIG_XILINX_MICROBLAZE0_VECTOR_BASE_ADDR));
 
        return -EINPROGRESS;
 }