ARC: Implement a function to sync and cleanup caches
authorEugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Wed, 21 Mar 2018 12:59:02 +0000 (15:59 +0300)
committerAlexey Brodkin <abrodkin@synopsys.com>
Wed, 21 Mar 2018 14:06:54 +0000 (17:06 +0300)
Implement specialized function to clenup caches (and therefore
sync instruction and data caches) which can be used for cleanup before linux
launch or to sync caches during U-Boot self-relocation.

Signed-off-by: Eugeniy Paltsev <Eugeniy.Paltsev@synopsys.com>
Signed-off-by: Alexey Brodkin <abrodkin@synopsys.com>
arch/arc/include/asm/cache.h
arch/arc/lib/bootm.c
arch/arc/lib/cache.c
arch/arc/lib/init_helpers.c

index fe75409b5c3065444ee601ce6aaccbe39254244a..2269183615fb1e8843de517ddb50d2c1a118ae90 100644 (file)
@@ -31,6 +31,7 @@
 
 void cache_init(void);
 void flush_n_invalidate_dcache_all(void);
+void sync_n_cleanup_cache_all(void);
 
 static const inline int is_ioc_enabled(void)
 {
index 4d4acff239d41ea5ceb77ae8e5a54f24f3146964..f1ab344773744a4c5f4b47fb6e15589171f8ccff 100644 (file)
@@ -4,6 +4,7 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <asm/cache.h>
 #include <common.h>
 
 DECLARE_GLOBAL_DATA_PTR;
@@ -40,8 +41,7 @@ void arch_lmb_reserve(struct lmb *lmb)
 static int cleanup_before_linux(void)
 {
        disable_interrupts();
-       flush_dcache_all();
-       invalidate_icache_all();
+       sync_n_cleanup_cache_all();
 
        return 0;
 }
index a5aae3d232d96568f8850619c54d0b2806514fe5..5d7583d86897967f5355aa0da3d66b045ac35d4f 100644 (file)
@@ -591,3 +591,26 @@ void flush_dcache_all(void)
        if (is_isa_arcv2() && !slc_data_bypass())
                __slc_entire_op(OP_FLUSH);
 }
+
+/*
+ * This is function to cleanup all caches (and therefore sync I/D caches) which
+ * can be used for cleanup before linux launch or to sync caches during
+ * relocation.
+ */
+void sync_n_cleanup_cache_all(void)
+{
+       __dc_entire_op(OP_FLUSH_N_INV);
+
+       /*
+        * If SL$ is bypassed for data it is used only for instructions,
+        * and we shouldn't flush it. So invalidate it instead of flush_n_inv.
+        */
+       if (is_isa_arcv2()) {
+               if (slc_data_bypass())
+                       __slc_entire_op(OP_INV);
+               else
+                       __slc_entire_op(OP_FLUSH_N_INV);
+       }
+
+       __ic_entire_invalidate();
+}
index dbc8d68ffb240c692eac6c3dda76404f8451a439..435fe96ef447aa0e0779cb00de34d91b93e1cbaf 100644 (file)
@@ -4,14 +4,14 @@
  * SPDX-License-Identifier:    GPL-2.0+
  */
 
+#include <asm/cache.h>
 #include <common.h>
 
 DECLARE_GLOBAL_DATA_PTR;
 
 int init_cache_f_r(void)
 {
-#ifndef CONFIG_SYS_DCACHE_OFF
-       flush_dcache_all();
-#endif
+       sync_n_cleanup_cache_all();
+
        return 0;
 }