Remove mips_cache_lock
RFC 1/1 Remove mips_cache_lock
I don't know the background why this lock added. So if I miss something, please let me know. Or I'll push this before merge window close().
========>
I don't see any reason why we have to lock cache line here. Maybe some targets require this locking, but that's completely target specific re- quirement and we should not have such things in global start codes.
---
cpu/mips/cache.S | 26 -------------------------- cpu/mips/start.S | 5 ----- 2 files changed, 0 insertions(+), 31 deletions(-)
cpu/mips/cache.S +0 -26
@@ -237,29 +237,3 @@ dcache_disable: j ra .end dcache_disable - -/******************************************************************************* -* -* mips_cache_lock - lock RAM area pointed to by a0 in cache. -* -* RETURNS: N/A -* -*/ -#if defined(CONFIG_PURPLE) -# define CACHE_LOCK_SIZE (CFG_DCACHE_SIZE/2) -#else -# define CACHE_LOCK_SIZE (CFG_DCACHE_SIZE) -#endif - .globl mips_cache_lock - .ent mips_cache_lock -mips_cache_lock: - li a1, K0BASE - CACHE_LOCK_SIZE - addu a0, a1 - li a2, CACHE_LOCK_SIZE - li a3, CFG_CACHELINE_SIZE - move a1, a2 - icacheop(a0,a1,a2,a3,0x1d) - - j ra - - .end mips_cache_lock
cpu/mips/start.S +0 -5
@@ -267,11 +267,6 @@ reset: /* Set up temporary stack. */ - li a0, CFG_INIT_SP_OFFSET - la t9, mips_cache_lock - jalr t9 - nop - li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET la sp, 0(t0)
Quoted 2 lines · In message <[email protected]> you wrote:
I don't know the background why this lock added. So if I miss something, please let me know. Or I'll push this before merge window
close().
...
cpu/mips/start.S reset: · line 274
Quoted 7 lines
cpu/mips/start.S +0
-5/* Set up temporary stack. */ - li a0, CFG_INIT_SP_OFFSET - la t9, mips_cache_lock - jalr t9 - nop -
Isn't the lock necessary to use the cache as memory for stack and initial data?
Best regards,
Wolfgang Denk
Signature · 4 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "Ahead warp factor 1" - Captain Kirk
Quoted 12 lines · Wolfgang Denk
Quoted 2 lines · In message <[email protected]> you wrote:
I don't know the background why this lock added. So if I miss something, please let me know. Or I'll push this before merge window
close()....
cpu/mips/start.S reset: · line 274
Quoted 7 lines
/* Set up temporary stack. */cpu/mips/start.S +0
-5- li a0, CFG_INIT_SP_OFFSET - la t9, mips_cache_lock - jalr t9 - nop -
Quoted 2 lines
Isn't the lock necessary to use the cache as memory for stack and initial data?
This code has some problems:
Cache locking is not consistent across MIPS implementations. Some implementations do not support locking at all. The style of locking varies - some support per line locking, others per way, etc, etc. Some parts use bits in status registers instead of the cache ops.
IIRC, some MIPS cache implementations require valid zeroed RAM to init cache parity correctly.
The cache never gets unlocked, so the code relies on whatever gets loaded after u-boot to reinitialize the cache and clear the locks.
Signature · 2 lines
Hardware, n.: The parts of a computer system that can be kicked.
Quoted 11 lines · In message <[email protected]> you…
Quoted 3 lines
Isn't the lock necessary to use the cache as memory for stack and initial data?
This code has some problems:
Cache locking is not consistent across MIPS implementations. Some implementations do not support locking at all. The style of locking varies - some support per line locking, others per way, etc, etc. Some parts use bits in status registers instead of the cache ops.
Quoted 5 lines
IIRC, some MIPS cache implementations require valid zeroed RAM to init cache parity correctly.
The cache never gets unlocked, so the code relies on whatever gets loaded after u-boot to reinitialize the cache and clear the locks.
This is most probably true. When this code was implemented first, it was most probably with a single CPU in mind.
But simply deleting it is definitely not a good idea, as it would most probably break existing board support.
Best regards,
Wolfgang Denk
Signature · 5 lines
DENX Software Engineering GmbH, MD: Wolfgang Denk & Detlev Zundel HRB 165235 Munich, Office: Kirchenstr.5, D-82194 Groebenzell, Germany Phone: (+49)-8142-66989-10 Fax: (+49)-8142-66989-80 Email: wd at denx.de "In the long run, every program becomes rococo, and then rubble." - Alan Perlis
Quoted 3 lines · Wolfgang Denk
Quoted 2 lines · In message <[email protected]> you…
Quoted 2 lines
Isn't the lock necessary to use the cache as memory for stack and initial data?
Thanks, now I understand the original concept of this locking.
But from the technical POV; looking at start.S, mips_cache_lock() is processed after lowlevel_init. SDRAM is already available at this point, therefore we can use true memory for stack. No lock is needed I think.
# The reason why we have this order is that, cache initialization needs
memory itself (this is used by Fill operation for I-cache, and load instruction for D-cache). This conflicts the original mips_cache_lock purpse, doesn't it?
Quoted 2 lines
Quoted 2 lines
IIRC, some MIPS cache implementations require valid zeroed RAM to init cache parity correctly.
Ah, summarized in 2 lines.
Quoted 2 lines
Quoted 2 lines
The cache never gets unlocked, so the code relies on whatever gets loaded after u-boot to reinitialize the cache and clear the locks.
And I have to say this is important. IMHO most U-Boot MIPS users must disable this locking due to above reasons. I've disabled for long time since 1.1.X (our boards initial porting), too.
Quoted 2 lines
But simply deleting it is definitely not a good idea, as it would most probably break existing board support.
I still think this removal will not break any existing targets, but yes agreed. I'll try to introduce a #ifdef alternative.
Thanks for your comments,
Shinya
RFC 1/1 Remove mips_cache_lock
Quoted 5 lines · Shinya Kuribayashi
Quoted 2 lines
But simply deleting it is definitely not a good idea, as it would most probably break existing board support.
I still think this removal will not break any existing targets, but yes agreed. I'll try to introduce a #ifdef alternative.
Patch attached. Any comments are still appreciated. Thanks.
================>
[MIPS] mips_cache_lock: Introduce CFG_INIT_RAM_LOCK
From: Shinya Kuribayashi <[email protected]>
We don't have to lock cache lines for stack use. Meanwhile, once U-Boot locks cache, but never gets them unlocked. So the code relies on whatever gets loaded after U-Boot to re-initialize the cache and clear the locks. For these reasons, I proposed the removal of mips_cache_lock() from the global start-up routines.
This patch makes mips_cache_lock() user-selectable so that we don't break any existing board support. Let's see how things go for a while.
---
cpu/mips/cache.S | 2 ++ cpu/mips/start.S | 2 ++ include/configs/dbau1x00.h | 1 + include/configs/gth2.h | 1 + include/configs/incaip.h | 1 + include/configs/pb1x00.h | 1 + include/configs/purple.h | 2 ++ include/configs/qemu-mips.h | 1 + include/configs/tb0229.h | 1 + 9 files changed, 12 insertions(+), 0 deletions(-)
cpu/mips/cache.S +2 -0
@@ -238,6 +238,7 @@ dcache_disable: .end dcache_disable +#ifdef CFG_INIT_RAM_LOCK /******************************************************************************* * * mips_cache_lock - lock RAM area pointed to by a0 in cache.
@@ -263,3 +264,4 @@ mips_cache_lock: j ra .end mips_cache_lock +#endif /* CFG_INIT_RAM_LOCK */
cpu/mips/start.S +2 -0
@@ -267,10 +267,12 @@ reset: /* Set up temporary stack. */ +#ifdef CFG_INIT_RAM_LOCK li a0, CFG_INIT_SP_OFFSET la t9, mips_cache_lock jalr t9 nop +#endif li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET la sp, 0(t0)
include/configs/dbau1x00.h +1 -0
@@ -187,6 +187,7 @@#define CFG_MONITOR_BASE TEXT_BASE#define CFG_MONITOR_LEN (192 << 10) +#define CFG_INIT_RAM_LOCK 1#define CFG_INIT_SP_OFFSET 0x400000/* We boot from this flash, selected with dip switch */
include/configs/gth2.h +1 -0
@@ -141,6 +141,7 @@#define CFG_MONITOR_BASE TEXT_BASE#define CFG_MONITOR_LEN (192 << 10) +#define CFG_INIT_RAM_LOCK 1#define CFG_INIT_SP_OFFSET 0x400000/* We boot from this flash, selected with dip switch */
include/configs/incaip.h +1 -0
@@ -140,6 +140,7 @@#define CFG_MONITOR_BASE TEXT_BASE#define CFG_MONITOR_LEN (192 << 10) +#define CFG_INIT_RAM_LOCK 1#define CFG_INIT_SP_OFFSET 0x400000#define CFG_FLASH_BASE PHYS_FLASH_1
include/configs/pb1x00.h +1 -0
@@ -105,6 +105,7 @@#define CFG_MONITOR_BASE TEXT_BASE#define CFG_MONITOR_LEN (192 << 10) +#define CFG_INIT_RAM_LOCK 1#define CFG_INIT_SP_OFFSET 0x4000000/* We boot from this flash, selected with dip switch */
include/configs/purple.h +2 -0
@@ -101,6 +101,8 @@#define CFG_SDRAM_BASE 0x80000000 +#define CFG_INIT_RAM_LOCK 1 +#define CFG_INIT_SP_OFFSET 0x400000#define CFG_MALLOC_LEN 128*1024
include/configs/qemu-mips.h +1 -0
@@ -142,6 +142,7 @@#define CFG_MONITOR_BASE TEXT_BASE#define CFG_MONITOR_LEN (192 << 10) +#define CFG_INIT_RAM_LOCK 1#define CFG_INIT_SP_OFFSET 0x400000/* We boot from this flash, selected with dip switch */
include/configs/tb0229.h +1 -0
@@ -143,6 +143,7 @@#define CFG_MONITOR_BASE TEXT_BASE#define CFG_MONITOR_LEN (192 << 10) +#define CFG_INIT_RAM_LOCK 1#define CFG_INIT_SP_OFFSET 0x400000#define CFG_FLASH_BASE PHYS_FLASH_1
RFC 1/1 Remove mips_cache_lock
Quoted 25 lines · Shinya Kuribayashi
Quoted 4 lines · Shinya Kuribayashi
Quoted 2 lines
But simply deleting it is definitely not a good idea, as it would most probably break existing board support.
I still think this removal will not break any existing targets, but yes agreed. I'll try to introduce a #ifdef alternative.
Patch attached. Any comments are still appreciated. Thanks.
================>
[MIPS]mips_cache_lock: IntroduceCFG_INIT_RAM_LOCKFrom: Shinya Kuribayashi <[email protected]>
We don't have to lock cache lines for stack use. Meanwhile, once U-Boot locks cache, but never gets them unlocked. So the code relies on whatever gets loaded after U-Boot to re-initialize the cache and clear the locks. For these reasons, I proposed the removal of
mips_cache_lock()from the global start-up routines.This patch makes
mips_cache_lock()user-selectable so that we don't break any existing board support. Let's see how things go for a while.Signed-off-by Shinya Kuribayashi <[email protected]>---
Quoted 10 lines
cpu/mips/cache.S | 2 ++ cpu/mips/start.S | 2 ++ include/configs/dbau1x00.h | 1 + include/configs/gth2.h | 1 + include/configs/incaip.h | 1 + include/configs/pb1x00.h | 1 + include/configs/purple.h | 2 ++ include/configs/qemu-mips.h | 1 + include/configs/tb0229.h | 1 + 9 files changed, 12 insertions(+), 0 deletions(-)
After careful thought, I changed my mind. I'd like to change the default behavior. The one who makes no regression does none of the work B-)
I hope the patche below is acceptable for the next release.
================>
[MIPS] Request for the 'mips_cache_lock()' removal
The initial intension of having mips_cache_lock() was to use the cache as memory for temporary stack use so that a C environment can be set up as early as possible.
But now mips_cache_lock() follow lowlevel_init(). We've already have the real memory initilaized at this point, therefore we could/should use it. No reason to lock at all.
Other problems:
Cache locking is not consistent across MIPS implementaions. Some imple- mentations don't support locking at all. The style of locking varies - some support per line locking, others per way, etc. Some parts use bits in status registers instead of cache ops. Current mips_cache_lock() is not necessarily general-purpose.
And this is worthy of special mention; once U-Boot/MIPS locks the lines, they are never get unlocked, so the code relies on whatever gets loaded after U-Boot to re-initialize the cache and clear the locks. We're sup- posed to have CFG_INIT_RAM_LOCK and unlock_ram_in_cache() implemented, but leave the situation as it is for a long time.
For these reasons, I proposed the removal of mips_cache_lock() from the global start-up code.
This patch adds CFG_INIT_RAM_LOCK_MIPS to make existing users aware that *things have changed*. If he wants the same behavior as before, he needs to have CFG_INIT_RAM_LOCK_MIPS in his config file.
If we don't have any regression report through several releases, then we'll remove codes entirely.
---
cpu/mips/cache.S | 2 ++ cpu/mips/start.S | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-)
cpu/mips/cache.S +2 -0
@@ -238,6 +238,7 @@ dcache_disable: .end dcache_disable +#ifdef CFG_INIT_RAM_LOCK_MIPS /******************************************************************************* * * mips_cache_lock - lock RAM area pointed to by a0 in cache.
@@ -263,3 +264,4 @@ mips_cache_lock: j ra .end mips_cache_lock +#endif /* CFG_INIT_RAM_LOCK_MIPS */
cpu/mips/start.S +2 -0
@@ -267,10 +267,12 @@ reset: /* Set up temporary stack. */ +#ifdef CFG_INIT_RAM_LOCK_MIPS li a0, CFG_INIT_SP_OFFSET la t9, mips_cache_lock jalr t9 nop +#endif li t0, CFG_SDRAM_BASE + CFG_INIT_SP_OFFSET la sp, 0(t0)
Quoted 28 lines · Shinya Kuribayashi
[MIPS] Request for the '
mips_cache_lock()' removalThe initial intension of having
mips_cache_lock()was to use the cache as memory for temporary stack use so that a C environment can be set up as early as possible.But now
mips_cache_lock()followlowlevel_init(). We've already have the real memory initilaized at this point, therefore we could/should use it. No reason to lock at all.Other problems:
Cache locking is not consistent across MIPS implementaions. Some imple- mentations don't support locking at all. The style of locking varies - some support per line locking, others per way, etc. Some parts use bits in status registers instead of cache ops. Current
mips_cache_lock()is not necessarily general-purpose.And this is worthy of special mention; once U-Boot/MIPS locks the lines, they are never get unlocked, so the code relies on whatever gets loaded after U-Boot to re-initialize the cache and clear the locks. We're sup- posed to have
CFG_INIT_RAM_LOCKandunlock_ram_in_cache()implemented, but leave the situation as it is for a long time.For these reasons, I proposed the removal of
mips_cache_lock()from the global start-up code.
Quoted 8 lines
This patch adds
CFG_INIT_RAM_LOCK_MIPSto make existing users aware that *things have changed*. If he wants the same behavior as before, he needs to haveCFG_INIT_RAM_LOCK_MIPSin his config file.If we don't have any regression report through several releases, then we'll remove codes entirely.
Signed-off-by Shinya Kuribayashi <[email protected]>
Quoted 42 lines
---
cpu/mips/cache.S | 2 ++ cpu/mips/start.S | 2 ++ 2 files changed, 4 insertions(+), 0 deletions(-)diff --git
a/cpu/mips/cache.Sb/cpu/mips/cache.S
index 443240e..67ee19f 100644
---a/cpu/mips/cache.S
+++b/cpu/mips/cache.S
@@ -238,6 +238,7 @@dcache_disable:.end
dcache_disable+#ifdef
CFG_INIT_RAM_LOCK_MIPS
/******************************************************************************* *
*mips_cache_lock- lock RAM area pointed to by a0 in cache.
@@ -263,3 +264,4 @@mips_cache_lock:
j ra.end
mips_cache_lock
+#endif /*CFG_INIT_RAM_LOCK_MIPS*/
diff --gita/cpu/mips/start.Sb/cpu/mips/start.S
index c92b162..930f9b3 100644
---a/cpu/mips/start.S
+++b/cpu/mips/start.S
@@ -267,10 +267,12 @@ reset:/* Set up temporary stack. */ +#ifdef CFG_INIT_RAM_LOCK_MIPS li a0, CFG_INIT_SP_OFFSET la t9, mips_cache_lock jalr t9nop
+#endifli t0,
CFG_SDRAM_BASE+CFG_INIT_SP_OFFSET
la sp, 0(t0)