* [U-Boot] [PATCH 1/6] sh4: cache: correct dcache flush to invalidate with write-back
2016-08-08 18:13 [U-Boot] [PATCH 0/6] sh4: fix and simplify cache manipulation Vladimir Zapolskiy
@ 2016-08-08 18:13 ` Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 2/6] sh4: cache: correct flush_cache() to writeback and invalidate Vladimir Zapolskiy
` (4 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Vladimir Zapolskiy @ 2016-08-08 18:13 UTC (permalink / raw)
To: u-boot
In common usecases flush_cache() assumes both cache invalidation and
write-back to memory, thus in flush_dcache_range() implementation
change SH4 cache write-back only instruction 'ocbwb' with cache purge
instruction 'ocbp', according to the User's Manual there should be no
performance penalty for that.
Note that under circumstances only cache invalidation is expected from
flush_cache() call, in these occasional cases the current version of
flush_cache() works, which is a wrapper over invalidate_dcache_range()
at the moment, this will be fixed in the following change.
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
---
arch/sh/cpu/sh4/cache.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/sh/cpu/sh4/cache.c b/arch/sh/cpu/sh4/cache.c
index e1ee970..b3e5fd5 100644
--- a/arch/sh/cpu/sh4/cache.c
+++ b/arch/sh/cpu/sh4/cache.c
@@ -97,7 +97,7 @@ void flush_dcache_range(unsigned long start, unsigned long end)
start &= ~(L1_CACHE_BYTES - 1);
for (v = start; v < end; v += L1_CACHE_BYTES) {
- asm volatile ("ocbwb %0" : /* no output */
+ asm volatile ("ocbp %0" : /* no output */
: "m" (__m(v)));
}
}
--
2.8.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 2/6] sh4: cache: correct flush_cache() to writeback and invalidate
2016-08-08 18:13 [U-Boot] [PATCH 0/6] sh4: fix and simplify cache manipulation Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 1/6] sh4: cache: correct dcache flush to invalidate with write-back Vladimir Zapolskiy
@ 2016-08-08 18:13 ` Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 3/6] sh3: remove unused cache.c file from being built Vladimir Zapolskiy
` (3 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Vladimir Zapolskiy @ 2016-08-08 18:13 UTC (permalink / raw)
To: u-boot
In common usecases flush_cache() assumes both cache invalidation and
write-back to memory, instead of doing cache invalidation only with
the wrapped 'ocbi' instruction pin flush_cache() to cache invalidation
with memory write-back done by 'ocbp'.
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
---
arch/sh/cpu/sh4/cpu.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/arch/sh/cpu/sh4/cpu.c b/arch/sh/cpu/sh4/cpu.c
index e8ee0a4..e6b5c86 100644
--- a/arch/sh/cpu/sh4/cpu.c
+++ b/arch/sh/cpu/sh4/cpu.c
@@ -37,7 +37,7 @@ int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
void flush_cache (unsigned long addr, unsigned long size)
{
- invalidate_dcache_range(addr , addr + size);
+ flush_dcache_range(addr , addr + size);
}
void icache_enable (void)
--
2.8.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 3/6] sh3: remove unused cache.c file from being built
2016-08-08 18:13 [U-Boot] [PATCH 0/6] sh4: fix and simplify cache manipulation Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 1/6] sh4: cache: correct dcache flush to invalidate with write-back Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 2/6] sh4: cache: correct flush_cache() to writeback and invalidate Vladimir Zapolskiy
@ 2016-08-08 18:13 ` Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 4/6] sh: cache use jump_to_P2() and back_to_P1() from asm/system.h Vladimir Zapolskiy
` (2 subsequent siblings)
5 siblings, 0 replies; 7+ messages in thread
From: Vladimir Zapolskiy @ 2016-08-08 18:13 UTC (permalink / raw)
To: u-boot
The change is similar to commit 994b56616bae ("sh: delete an unused
source file") for SH2, however here the removed cache.c file was
built and included into an image as a dead code.
If it is needed in future the contents can be reused from a similar
arch/sh/cpu/sh4/cache.c file, which is in turn will be moved to
a shared among all core flavours location at arch/sh/lib/cache.c.
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
---
arch/sh/cpu/sh3/Makefile | 2 +-
arch/sh/cpu/sh3/cache.c | 96 ------------------------------------------------
2 files changed, 1 insertion(+), 97 deletions(-)
delete mode 100644 arch/sh/cpu/sh3/cache.c
diff --git a/arch/sh/cpu/sh3/Makefile b/arch/sh/cpu/sh3/Makefile
index 959f551..cddc15b 100644
--- a/arch/sh/cpu/sh3/Makefile
+++ b/arch/sh/cpu/sh3/Makefile
@@ -11,4 +11,4 @@
# SPDX-License-Identifier: GPL-2.0+
#
-obj-y = cpu.o interrupts.o watchdog.o cache.o
+obj-y = cpu.o interrupts.o watchdog.o
diff --git a/arch/sh/cpu/sh3/cache.c b/arch/sh/cpu/sh3/cache.c
deleted file mode 100644
index 34cbbff..0000000
--- a/arch/sh/cpu/sh3/cache.c
+++ /dev/null
@@ -1,96 +0,0 @@
-/*
- * (C) Copyright 2007
- * Yoshihiro Shimoda <shimoda.yoshihiro@renesas.com>
- *
- * (C) Copyright 2007
- * Nobobuhiro Iwamatsu <iwamatsu@nigauri.org>
- *
- * SPDX-License-Identifier: GPL-2.0+
- */
-
-#include <common.h>
-#include <command.h>
-#include <asm/processor.h>
-#include <asm/io.h>
-
-/*
- * Jump to P2 area.
- * When handling TLB or caches, we need to do it from P2 area.
- */
-#define jump_to_P2() \
- do { \
- unsigned long __dummy; \
- __asm__ __volatile__( \
- "mov.l 1f, %0\n\t" \
- "or %1, %0\n\t" \
- "jmp @%0\n\t" \
- " nop\n\t" \
- ".balign 4\n" \
- "1: .long 2f\n" \
- "2:" \
- : "=&r" (__dummy) \
- : "r" (0x20000000)); \
- } while (0)
-
-/*
- * Back to P1 area.
- */
-#define back_to_P1() \
- do { \
- unsigned long __dummy; \
- __asm__ __volatile__( \
- "nop;nop;nop;nop;nop;nop;nop\n\t" \
- "mov.l 1f, %0\n\t" \
- "jmp @%0\n\t" \
- " nop\n\t" \
- ".balign 4\n" \
- "1: .long 2f\n" \
- "2:" \
- : "=&r" (__dummy)); \
- } while (0)
-
-#define CACHE_VALID 1
-#define CACHE_UPDATED 2
-
-static inline void cache_wback_all(void)
-{
- unsigned long addr, data, i, j;
-
- jump_to_P2();
- for (i = 0; i < CACHE_OC_NUM_ENTRIES; i++) {
- for (j = 0; j < CACHE_OC_NUM_WAYS; j++) {
- addr = CACHE_OC_ADDRESS_ARRAY
- | (j << CACHE_OC_WAY_SHIFT)
- | (i << CACHE_OC_ENTRY_SHIFT);
- data = inl(addr);
- if (data & CACHE_UPDATED) {
- data &= ~CACHE_UPDATED;
- outl(data, addr);
- }
- }
- }
- back_to_P1();
-}
-
-
-#define CACHE_ENABLE 0
-#define CACHE_DISABLE 1
-
-int cache_control(unsigned int cmd)
-{
- unsigned long ccr;
-
- jump_to_P2();
- ccr = inl(CCR);
-
- if (ccr & CCR_CACHE_ENABLE)
- cache_wback_all();
-
- if (cmd == CACHE_DISABLE)
- outl(CCR_CACHE_STOP, CCR);
- else
- outl(CCR_CACHE_INIT, CCR);
- back_to_P1();
-
- return 0;
-}
--
2.8.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 4/6] sh: cache use jump_to_P2() and back_to_P1() from asm/system.h
2016-08-08 18:13 [U-Boot] [PATCH 0/6] sh4: fix and simplify cache manipulation Vladimir Zapolskiy
` (2 preceding siblings ...)
2016-08-08 18:13 ` [U-Boot] [PATCH 3/6] sh3: remove unused cache.c file from being built Vladimir Zapolskiy
@ 2016-08-08 18:13 ` Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 5/6] sh: cache: don't modify CCR from P1 area Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 6/6] sh4: cache: move exported cache manipulation functions into cache.c Vladimir Zapolskiy
5 siblings, 0 replies; 7+ messages in thread
From: Vladimir Zapolskiy @ 2016-08-08 18:13 UTC (permalink / raw)
To: u-boot
Both jump_to_P2() and back_to_P1() functions are found in asm/system.h
header file and functionally they are the same, don't redefine them.
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
---
arch/sh/cpu/sh4/cache.c | 39 ++-------------------------------------
1 file changed, 2 insertions(+), 37 deletions(-)
diff --git a/arch/sh/cpu/sh4/cache.c b/arch/sh/cpu/sh4/cache.c
index b3e5fd5..50695b6 100644
--- a/arch/sh/cpu/sh4/cache.c
+++ b/arch/sh/cpu/sh4/cache.c
@@ -7,44 +7,9 @@
#include <common.h>
#include <command.h>
-#include <asm/processor.h>
#include <asm/io.h>
-
-/*
- * Jump to P2 area.
- * When handling TLB or caches, we need to do it from P2 area.
- */
-#define jump_to_P2() \
- do { \
- unsigned long __dummy; \
- __asm__ __volatile__( \
- "mov.l 1f, %0\n\t" \
- "or %1, %0\n\t" \
- "jmp @%0\n\t" \
- " nop\n\t" \
- ".balign 4\n" \
- "1: .long 2f\n" \
- "2:" \
- : "=&r" (__dummy) \
- : "r" (0x20000000)); \
- } while (0)
-
-/*
- * Back to P1 area.
- */
-#define back_to_P1() \
- do { \
- unsigned long __dummy; \
- __asm__ __volatile__( \
- "nop;nop;nop;nop;nop;nop;nop\n\t" \
- "mov.l 1f, %0\n\t" \
- "jmp @%0\n\t" \
- " nop\n\t" \
- ".balign 4\n" \
- "1: .long 2f\n" \
- "2:" \
- : "=&r" (__dummy)); \
- } while (0)
+#include <asm/processor.h>
+#include <asm/system.h>
#define CACHE_VALID 1
#define CACHE_UPDATED 2
--
2.8.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 5/6] sh: cache: don't modify CCR from P1 area
2016-08-08 18:13 [U-Boot] [PATCH 0/6] sh4: fix and simplify cache manipulation Vladimir Zapolskiy
` (3 preceding siblings ...)
2016-08-08 18:13 ` [U-Boot] [PATCH 4/6] sh: cache use jump_to_P2() and back_to_P1() from asm/system.h Vladimir Zapolskiy
@ 2016-08-08 18:13 ` Vladimir Zapolskiy
2016-08-08 18:13 ` [U-Boot] [PATCH 6/6] sh4: cache: move exported cache manipulation functions into cache.c Vladimir Zapolskiy
5 siblings, 0 replies; 7+ messages in thread
From: Vladimir Zapolskiy @ 2016-08-08 18:13 UTC (permalink / raw)
To: u-boot
cache_wback_all() is a local function and it is called from
cache_control() only, which is in turn jumps to P2 area.
The change fixes an issue when cache_wback_all() returns from P2 to
P1, however cache_control() continues to manipulate with CCR
register, according to the User's Manual this is restricted.
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
---
arch/sh/cpu/sh4/cache.c | 8 +++-----
1 file changed, 3 insertions(+), 5 deletions(-)
diff --git a/arch/sh/cpu/sh4/cache.c b/arch/sh/cpu/sh4/cache.c
index 50695b6..7750f0f 100644
--- a/arch/sh/cpu/sh4/cache.c
+++ b/arch/sh/cpu/sh4/cache.c
@@ -18,10 +18,10 @@ static inline void cache_wback_all(void)
{
unsigned long addr, data, i, j;
- jump_to_P2();
- for (i = 0; i < CACHE_OC_NUM_ENTRIES; i++){
+ for (i = 0; i < CACHE_OC_NUM_ENTRIES; i++) {
for (j = 0; j < CACHE_OC_NUM_WAYS; j++) {
- addr = CACHE_OC_ADDRESS_ARRAY | (j << CACHE_OC_WAY_SHIFT)
+ addr = CACHE_OC_ADDRESS_ARRAY
+ | (j << CACHE_OC_WAY_SHIFT)
| (i << CACHE_OC_ENTRY_SHIFT);
data = inl(addr);
if (data & CACHE_UPDATED) {
@@ -30,10 +30,8 @@ static inline void cache_wback_all(void)
}
}
}
- back_to_P1();
}
-
#define CACHE_ENABLE 0
#define CACHE_DISABLE 1
--
2.8.1
^ permalink raw reply related [flat|nested] 7+ messages in thread
* [U-Boot] [PATCH 6/6] sh4: cache: move exported cache manipulation functions into cache.c
2016-08-08 18:13 [U-Boot] [PATCH 0/6] sh4: fix and simplify cache manipulation Vladimir Zapolskiy
` (4 preceding siblings ...)
2016-08-08 18:13 ` [U-Boot] [PATCH 5/6] sh: cache: don't modify CCR from P1 area Vladimir Zapolskiy
@ 2016-08-08 18:13 ` Vladimir Zapolskiy
5 siblings, 0 replies; 7+ messages in thread
From: Vladimir Zapolskiy @ 2016-08-08 18:13 UTC (permalink / raw)
To: u-boot
No functional change, moving cache manipulation functions into cache.c
allows to collect all of them in a single location and as a pleasant
side effect cache_control() function can be unexported now.
Signed-off-by: Vladimir Zapolskiy <vz@mleia.com>
---
arch/sh/cpu/sh4/cache.c | 39 ++++++++++++++++++++++++++++++++++++---
arch/sh/cpu/sh4/cpu.c | 34 ----------------------------------
arch/sh/include/asm/cache.h | 2 --
3 files changed, 36 insertions(+), 39 deletions(-)
diff --git a/arch/sh/cpu/sh4/cache.c b/arch/sh/cpu/sh4/cache.c
index 7750f0f..6175c67 100644
--- a/arch/sh/cpu/sh4/cache.c
+++ b/arch/sh/cpu/sh4/cache.c
@@ -1,6 +1,6 @@
/*
- * (C) Copyright 2007
- * Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
+ * (C) Copyright 2016 Vladimir Zapolskiy <vz@mleia.com>
+ * (C) Copyright 2007 Nobuhiro Iwamatsu <iwamatsu@nigauri.org>
*
* SPDX-License-Identifier: GPL-2.0+
*/
@@ -35,7 +35,7 @@ static inline void cache_wback_all(void)
#define CACHE_ENABLE 0
#define CACHE_DISABLE 1
-int cache_control(unsigned int cmd)
+static int cache_control(unsigned int cmd)
{
unsigned long ccr;
@@ -75,3 +75,36 @@ void invalidate_dcache_range(unsigned long start, unsigned long end)
: "m" (__m(v)));
}
}
+
+void flush_cache(unsigned long addr, unsigned long size)
+{
+ flush_dcache_range(addr , addr + size);
+}
+
+void icache_enable(void)
+{
+ cache_control(CACHE_ENABLE);
+}
+
+void icache_disable(void)
+{
+ cache_control(CACHE_DISABLE);
+}
+
+int icache_status(void)
+{
+ return 0;
+}
+
+void dcache_enable(void)
+{
+}
+
+void dcache_disable(void)
+{
+}
+
+int dcache_status(void)
+{
+ return 0;
+}
diff --git a/arch/sh/cpu/sh4/cpu.c b/arch/sh/cpu/sh4/cpu.c
index e6b5c86..aa8d4df 100644
--- a/arch/sh/cpu/sh4/cpu.c
+++ b/arch/sh/cpu/sh4/cpu.c
@@ -9,7 +9,6 @@
#include <command.h>
#include <netdev.h>
#include <asm/processor.h>
-#include <asm/cache.h>
int checkcpu(void)
{
@@ -35,39 +34,6 @@ int do_reset (cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])
return 0;
}
-void flush_cache (unsigned long addr, unsigned long size)
-{
- flush_dcache_range(addr , addr + size);
-}
-
-void icache_enable (void)
-{
- cache_control(0);
-}
-
-void icache_disable (void)
-{
- cache_control(1);
-}
-
-int icache_status (void)
-{
- return 0;
-}
-
-void dcache_enable (void)
-{
-}
-
-void dcache_disable (void)
-{
-}
-
-int dcache_status (void)
-{
- return 0;
-}
-
int cpu_eth_init(bd_t *bis)
{
#ifdef CONFIG_SH_ETHER
diff --git a/arch/sh/include/asm/cache.h b/arch/sh/include/asm/cache.h
index abaf405..b548a35 100644
--- a/arch/sh/include/asm/cache.h
+++ b/arch/sh/include/asm/cache.h
@@ -3,8 +3,6 @@
#if defined(CONFIG_CPU_SH4)
-int cache_control(unsigned int cmd);
-
#define L1_CACHE_BYTES 32
struct __large_struct { unsigned long buf[100]; };
--
2.8.1
^ permalink raw reply related [flat|nested] 7+ messages in thread