From: Paul Burton <paul.burton@imgtec.com>
To: u-boot@lists.denx.de
Subject: [U-Boot] [PATCH 1/8] MIPS: avoid .set ISA for cache operations
Date: Wed, 28 Jan 2015 21:08:12 +0000 [thread overview]
Message-ID: <20150128210812.GC6116@NP-P-BURTON> (raw)
In-Reply-To: <54C949ED.3060900@gmail.com>
On Wed, Jan 28, 2015 at 09:43:25PM +0100, Daniel Schwierzeck wrote:
>
>
> Am 26.01.2015 um 16:02 schrieb Paul Burton:
> > As a step towards unifying the cache maintenance code for mips32 &
> > mips64 CPUs, stop using ".set <ISA>" directives in the more developed
> > mips32 version of the code. Instead, when present make use of the GCC
> > builtin for emitting a cache instruction. When not present, simply don't
> > bother with the .set directives since U-boot always builds with
> > -march=mips32 or higher anyway.
> >
> > Signed-off-by: Paul Burton <paul.burton@imgtec.com>
> > Cc: Daniel Schwierzeck <daniel.schwierzeck@gmail.com>
> > ---
> > arch/mips/cpu/mips32/cache.S | 18 +++++-------------
> > arch/mips/cpu/mips32/cpu.c | 40 +++++++++++++++-------------------------
> > arch/mips/include/asm/cacheops.h | 7 +++++++
> > 3 files changed, 27 insertions(+), 38 deletions(-)
> >
> > diff --git a/arch/mips/cpu/mips32/cache.S b/arch/mips/cpu/mips32/cache.S
> > index 22bd844..fb1d84b 100644
> > --- a/arch/mips/cpu/mips32/cache.S
> > +++ b/arch/mips/cpu/mips32/cache.S
> > @@ -22,14 +22,6 @@
> >
> > #define INDEX_BASE CKSEG0
> >
> > - .macro cache_op op addr
> > - .set push
> > - .set noreorder
> > - .set mips3
> > - cache \op, 0(\addr)
> > - .set pop
> > - .endm
> > -
> > .macro f_fill64 dst, offset, val
> > LONG_S \val, (\offset + 0 * LONGSIZE)(\dst)
> > LONG_S \val, (\offset + 1 * LONGSIZE)(\dst)
> > @@ -60,17 +52,17 @@ LEAF(mips_init_icache)
> > /* clear tag to invalidate */
> > PTR_LI t0, INDEX_BASE
> > PTR_ADDU t1, t0, a1
> > -1: cache_op INDEX_STORE_TAG_I t0
> > +1: cache INDEX_STORE_TAG_I, 0(t0)
> > PTR_ADDU t0, a2
> > bne t0, t1, 1b
> > /* fill once, so data field parity is correct */
> > PTR_LI t0, INDEX_BASE
> > -2: cache_op FILL t0
> > +2: cache FILL, 0(t0)
> > PTR_ADDU t0, a2
> > bne t0, t1, 2b
> > /* invalidate again - prudent but not strictly neccessary */
> > PTR_LI t0, INDEX_BASE
> > -1: cache_op INDEX_STORE_TAG_I t0
> > +1: cache INDEX_STORE_TAG_I, 0(t0)
> > PTR_ADDU t0, a2
> > bne t0, t1, 1b
> > 9: jr ra
> > @@ -85,7 +77,7 @@ LEAF(mips_init_dcache)
> > /* clear all tags */
> > PTR_LI t0, INDEX_BASE
> > PTR_ADDU t1, t0, a1
> > -1: cache_op INDEX_STORE_TAG_D t0
> > +1: cache INDEX_STORE_TAG_D, 0(t0)
> > PTR_ADDU t0, a2
> > bne t0, t1, 1b
> > /* load from each line (in cached space) */
> > @@ -95,7 +87,7 @@ LEAF(mips_init_dcache)
> > bne t0, t1, 2b
> > /* clear all tags */
> > PTR_LI t0, INDEX_BASE
> > -1: cache_op INDEX_STORE_TAG_D t0
> > +1: cache INDEX_STORE_TAG_D, 0(t0)
> > PTR_ADDU t0, a2
> > bne t0, t1, 1b
> > 9: jr ra
> > diff --git a/arch/mips/cpu/mips32/cpu.c b/arch/mips/cpu/mips32/cpu.c
> > index 278865b..3f247fb 100644
> > --- a/arch/mips/cpu/mips32/cpu.c
> > +++ b/arch/mips/cpu/mips32/cpu.c
> > @@ -12,16 +12,6 @@
> > #include <asm/cacheops.h>
> > #include <asm/reboot.h>
> >
> > -#define cache_op(op,addr) \
> > - __asm__ __volatile__( \
> > - " .set push \n" \
> > - " .set noreorder \n" \
> > - " .set mips3\n\t \n" \
> > - " cache %0, %1 \n" \
> > - " .set pop \n" \
> > - : \
> > - : "i" (op), "R" (*(unsigned char *)(addr)))
> > -
> > void __attribute__((weak)) _machine_restart(void)
> > {
> > }
> > @@ -74,20 +64,20 @@ void flush_cache(ulong start_addr, ulong size)
> > {
> > unsigned long ilsize = icache_line_size();
> > unsigned long dlsize = dcache_line_size();
> > - unsigned long addr, aend;
> > + const volatile void *addr, *aend;
>
> why do you need volatile?
>
I was just reflecting the type of the argument to __mips_builtin_cache:
https://gcc.gnu.org/onlinedocs/gcc/Other-MIPS-Built-in-Functions.html
> >
> > /* aend will be miscalculated when size is zero, so we return here */
> > if (size == 0)
> > return;
> >
> > - addr = start_addr & ~(dlsize - 1);
> > - aend = (start_addr + size - 1) & ~(dlsize - 1);
> > + addr = (void *)(start_addr & ~(dlsize - 1));
> > + aend = (void *)((start_addr + size - 1) & ~(dlsize - 1));
>
> shouldn't that be (const void *) ?
>
I don't think it really matters since the assignment is to a more
restricted type rather than from one, but I can change it if you like.
> >
> > if (ilsize == dlsize) {
> > /* flush I-cache & D-cache simultaneously */
> > while (1) {
> > - cache_op(HIT_WRITEBACK_INV_D, addr);
> > - cache_op(HIT_INVALIDATE_I, addr);
> > + mips_cache(HIT_WRITEBACK_INV_D, addr);
> > + mips_cache(HIT_INVALIDATE_I, addr);
> > if (addr == aend)
> > break;
> > addr += dlsize;
> > @@ -97,17 +87,17 @@ void flush_cache(ulong start_addr, ulong size)
> >
> > /* flush D-cache */
> > while (1) {
> > - cache_op(HIT_WRITEBACK_INV_D, addr);
> > + mips_cache(HIT_WRITEBACK_INV_D, addr);
> > if (addr == aend)
> > break;
> > addr += dlsize;
> > }
> >
> > /* flush I-cache */
> > - addr = start_addr & ~(ilsize - 1);
> > - aend = (start_addr + size - 1) & ~(ilsize - 1);
> > + addr = (void *)(start_addr & ~(ilsize - 1));
> > + aend = (void *)((start_addr + size - 1) & ~(ilsize - 1));
> > while (1) {
> > - cache_op(HIT_INVALIDATE_I, addr);
> > + mips_cache(HIT_INVALIDATE_I, addr);
> > if (addr == aend)
> > break;
> > addr += ilsize;
> > @@ -117,11 +107,11 @@ void flush_cache(ulong start_addr, ulong size)
> > void flush_dcache_range(ulong start_addr, ulong stop)
> > {
> > unsigned long lsize = dcache_line_size();
> > - unsigned long addr = start_addr & ~(lsize - 1);
> > - unsigned long aend = (stop - 1) & ~(lsize - 1);
> > + const volatile void *addr = (void *)(start_addr & ~(lsize - 1));
> > + const volatile void *aend = (void *)((stop - 1) & ~(lsize - 1));
> >
> > while (1) {
> > - cache_op(HIT_WRITEBACK_INV_D, addr);
> > + mips_cache(HIT_WRITEBACK_INV_D, addr);
> > if (addr == aend)
> > break;
> > addr += lsize;
> > @@ -131,11 +121,11 @@ void flush_dcache_range(ulong start_addr, ulong stop)
> > void invalidate_dcache_range(ulong start_addr, ulong stop)
> > {
> > unsigned long lsize = dcache_line_size();
> > - unsigned long addr = start_addr & ~(lsize - 1);
> > - unsigned long aend = (stop - 1) & ~(lsize - 1);
> > + const volatile void *addr = (void *)(start_addr & ~(lsize - 1));
> > + const volatile void *aend = (void *)((stop - 1) & ~(lsize - 1));
> >
> > while (1) {
> > - cache_op(HIT_INVALIDATE_D, addr);
> > + mips_cache(HIT_INVALIDATE_D, addr);
> > if (addr == aend)
> > break;
> > addr += lsize;
> > diff --git a/arch/mips/include/asm/cacheops.h b/arch/mips/include/asm/cacheops.h
> > index 6464250..809c966 100644
> > --- a/arch/mips/include/asm/cacheops.h
> > +++ b/arch/mips/include/asm/cacheops.h
> > @@ -11,6 +11,13 @@
> > #ifndef __ASM_CACHEOPS_H
> > #define __ASM_CACHEOPS_H
> >
> > +#ifdef __GCC_HAVE_BUILTIN_MIPS_CACHE
> > +# define mips_cache __builtin_mips_cache
> > +#else
> > +# define mips_cache(op,addr) \
>
> space after op,
>
Right you are! In my defence it was copied from the original
implementation in cpu.c ;)
Paul
> > + __asm__ __volatile__("cache %0, %1" : : "i"(op), "R"(addr))
> > +#endif
> > +
> > /*
> > * Cache Operations available on all MIPS processors with R4000-style caches
> > */
> >
>
> --
> - Daniel
next prev parent reply other threads:[~2015-01-28 21:08 UTC|newest]
Thread overview: 17+ messages / expand[flat|nested] mbox.gz Atom feed top
2015-01-26 15:02 [U-Boot] [PATCH 0/8] MIPS cache code cleanup Paul Burton
2015-01-26 15:02 ` [U-Boot] [PATCH 1/8] MIPS: avoid .set ISA for cache operations Paul Burton
2015-01-28 20:43 ` Daniel Schwierzeck
2015-01-28 21:08 ` Paul Burton [this message]
2015-01-28 21:18 ` Daniel Schwierzeck
2015-01-26 15:02 ` [U-Boot] [PATCH 2/8] MIPS: unify cache maintenance functions Paul Burton
2015-01-26 15:02 ` [U-Boot] [PATCH 3/8] MIPS: unify cache initialization code Paul Burton
2015-01-26 15:02 ` [U-Boot] [PATCH 4/8] MIPS: refactor L1 cache config reads to a macro Paul Burton
2015-01-26 15:02 ` [U-Boot] [PATCH 5/8] MIPS: refactor cache loops " Paul Burton
2015-01-26 15:02 ` [U-Boot] [PATCH 6/8] MIPS: inline mips_init_[id]cache functions Paul Burton
2015-01-26 15:02 ` [U-Boot] [PATCH 7/8] MIPS: allow systems to skip loads during cache init Paul Burton
2015-01-26 15:03 ` [U-Boot] [PATCH 8/8] MIPS: clear TagLo select 2 " Paul Burton
2015-01-28 20:57 ` Daniel Schwierzeck
2015-01-28 21:13 ` Paul Burton
2015-01-28 20:31 ` [U-Boot] [PATCH 0/8] MIPS cache code cleanup Daniel Schwierzeck
2015-01-28 21:05 ` Paul Burton
[not found] ` <54C95453.8010009@gmail.com>
2015-01-28 22:21 ` Paul Burton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20150128210812.GC6116@NP-P-BURTON \
--to=paul.burton@imgtec.com \
--cc=u-boot@lists.denx.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox