Merge git://git.denx.de/u-boot-riscv
authorTom Rini <trini@konsulko.com>
Wed, 16 Jan 2019 03:05:05 +0000 (22:05 -0500)
committerTom Rini <trini@konsulko.com>
Wed, 16 Jan 2019 03:05:05 +0000 (22:05 -0500)
1. Improve cache implementation.
2. Fix and improve standalone applications

arch/riscv/config.mk
arch/riscv/cpu/ax25/cache.c
arch/riscv/lib/cache.c
arch/riscv/lib/interrupts.c
examples/standalone/riscv.lds [deleted file]
examples/standalone/stubs.c
include/configs/qemu-riscv.h

index ff4fe6400170c4adbab8ceec7e76871af30c8d77..84654eb3ed87e72a153f43ee3831377f323f0755 100644 (file)
@@ -23,8 +23,7 @@ PLATFORM_LDFLAGS      += -m $(64bit-emul)
 EFI_LDS                        := elf_riscv64_efi.lds
 endif
 
-CONFIG_STANDALONE_LOAD_ADDR = 0x00000000
-LDFLAGS_STANDALONE += -T $(srctree)/examples/standalone/riscv.lds
+CONFIG_STANDALONE_LOAD_ADDR ?= 0x00000000
 
 PLATFORM_CPPFLAGS      += -ffixed-gp -fpic
 PLATFORM_RELFLAGS      += -fno-common -gdwarf-2 -ffunction-sections \
index 8d6ae170b8c5a02463c14f6a0e7eacc28a40eab4..228fc55f56bc9bf9667a400474d87c66e1e8d2e4 100644 (file)
@@ -6,6 +6,28 @@
 
 #include <common.h>
 
+void flush_dcache_all(void)
+{
+       /*
+        * Andes' AX25 does not have a coherence agent. U-Boot must use data
+        * cache flush and invalidate functions to keep data in the system
+        * coherent.
+        * The implementation of the fence instruction in the AX25 flushes the
+        * data cache and is used for this purpose.
+        */
+       asm volatile ("fence" ::: "memory");
+}
+
+void flush_dcache_range(unsigned long start, unsigned long end)
+{
+       flush_dcache_all();
+}
+
+void invalidate_dcache_range(unsigned long start, unsigned long end)
+{
+       flush_dcache_all();
+}
+
 void icache_enable(void)
 {
 #ifndef CONFIG_SYS_ICACHE_OFF
index ae5c60716ffdd82742dc783095eebd54a0dde7eb..5437a122a100480881b3c66f8e1c24cf12eb3a58 100644 (file)
@@ -11,13 +11,12 @@ void invalidate_icache_all(void)
        asm volatile ("fence.i" ::: "memory");
 }
 
-void flush_dcache_all(void)
+__weak void flush_dcache_all(void)
 {
-       asm volatile ("fence" :::"memory");
 }
-void flush_dcache_range(unsigned long start, unsigned long end)
+
+__weak void flush_dcache_range(unsigned long start, unsigned long end)
 {
-       flush_dcache_all();
 }
 
 void invalidate_icache_range(unsigned long start, unsigned long end)
@@ -29,9 +28,8 @@ void invalidate_icache_range(unsigned long start, unsigned long end)
        invalidate_icache_all();
 }
 
-void invalidate_dcache_range(unsigned long start, unsigned long end)
+__weak void invalidate_dcache_range(unsigned long start, unsigned long end)
 {
-       flush_dcache_all();
 }
 
 void cache_flush(void)
@@ -42,8 +40,8 @@ void cache_flush(void)
 
 void flush_cache(unsigned long addr, unsigned long size)
 {
-       invalidate_icache_all();
-       flush_dcache_all();
+       invalidate_icache_range(addr, addr + size);
+       flush_dcache_range(addr, addr + size);
 }
 
 __weak void icache_enable(void)
index e185933b01ef04cde12988058d137dda9bd363cd..74c1e561c713b04c456ff2cade618817ad805c10 100644 (file)
@@ -37,7 +37,8 @@ static void _exit_trap(ulong code, ulong epc, struct pt_regs *regs)
                printf("exception code: %ld , %s , epc %lx , ra %lx\n",
                       code, exception_code[code], epc, regs->ra);
        } else {
-               printf("Reserved\n");
+               printf("reserved exception code: %ld , epc %lx , ra %lx\n",
+                      code, epc, regs->ra);
        }
 
        hang();
diff --git a/examples/standalone/riscv.lds b/examples/standalone/riscv.lds
deleted file mode 100644 (file)
index 9a25861..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0+ */
-/*
- * Copyright (C) 2017 Andes Technology Corporation
- * Rick Chen, Andes Technology Corporation <rick@andestech.com>
- */
-
-OUTPUT_ARCH(riscv)
-ENTRY(_start)
-SECTIONS
-{
-    . = ALIGN(4);
-    .text :
-    {
-        *(.text)
-    }
-
-    . = ALIGN(4);
-    .data : {
-                       __global_pointer$ = . + 0x800;
-                       *(.data)
-               }
-
-    . = ALIGN(4);
-
-    .got : {
-        __got_start = .;
-        *(.got)
-        __got_end = .;
-    }
-
-     . = ALIGN(4);
-    __bss_start = .;
-    .bss : { *(.bss) }
-    __bss_end = .;
-
-    . = ALIGN(4);
-    .rela.text : { *(.rela.text .rela.text.* .rela.gnu.linkonce.t.*) }
-
-    _end = .;
-}
index fadde669fa94ff185b97d594427d3072a73006f5..0827bde35e581b27b9b7d081fef35ae296c4f698 100644 (file)
@@ -174,16 +174,27 @@ gd_t *global_data;
        : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "$r16");
 #elif defined(CONFIG_RISCV)
 /*
- * t7 holds the pointer to the global_data. gp is call clobbered.
+ * gp holds the pointer to the global_data. t0 is call clobbered.
  */
+#ifdef CONFIG_ARCH_RV64I
 #define EXPORT_FUNC(f, a, x, ...)      \
        asm volatile (                  \
 "      .globl " #x "\n"                \
 #x ":\n"                               \
-"      lw      x19, %0(gp)\n"          \
-"      lw      x19, %1(x19)\n"         \
-"      jr      x19\n"                  \
-       : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "x19");
+"      ld      t0, %0(gp)\n"           \
+"      ld      t0, %1(t0)\n"           \
+"      jr      t0\n"                   \
+       : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "t0");
+#else
+#define EXPORT_FUNC(f, a, x, ...)      \
+       asm volatile (                  \
+"      .globl " #x "\n"                \
+#x ":\n"                               \
+"      lw      t0, %0(gp)\n"           \
+"      lw      t0, %1(t0)\n"           \
+"      jr      t0\n"                   \
+       : : "i"(offsetof(gd_t, jt)), "i"(FO(x)) : "t0");
+#endif
 #elif defined(CONFIG_ARC)
 /*
  * r25 holds the pointer to the global_data. r10 is call clobbered.
index b29d155d095c4704655ba9c974329fee8c169a52..2588c5a0b25d917f5f37a003bec7d298d59837cc 100644 (file)
@@ -17,6 +17,8 @@
 
 #define CONFIG_SYS_BOOTM_LEN           SZ_16M
 
+#define CONFIG_STANDALONE_LOAD_ADDR    0x80200000
+
 /* Environment options */
 #define CONFIG_ENV_SIZE                        SZ_4K