nds32: split common cache access from cpu into lib
PATCH 1/1 nds32: split common cache access from cpu into lib
This commit does the following updates.
1. Split the common cache access from cpu.c into lib folder.
2. Rename the following cache api to adapt common.h
- dcache_flush_rang -> flush_dcache_rang
- icache_inval_range -> invalidate_icache_range
3. Add invalidate_dcache_range
--- arch/nds32/cpu/n1213/ag101/cpu.c | 112 ------------------------------ arch/nds32/cpu/n1213/ag102/cpu.c | 112 ------------------------------ arch/nds32/lib/Makefile | 2 +- arch/nds32/lib/cache.c | 145 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 146 insertions(+), 225 deletions(-) create mode 100644 arch/nds32/lib/cache.c
arch/nds32/cpu/n1213/ag101/cpu.c +0 -112
@@ -82,115 +82,3 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])/*NOTREACHED*/ } - -static inline unsigned long CACHE_LINE_SIZE (enum cache_t cache) -{ -if (cache ==ICACHE ) -return 8 << (((GET_ICM_CFG () &ICM_CFG_MSK_ISZ ) \ - >>ICM_CFG_OFF_ISZ ) -1 ); -else -return 8 << (((GET_DCM_CFG () &DCM_CFG_MSK_DSZ ) \ - >>DCM_CFG_OFF_DSZ ) -1 ); -} - -void dcache_flush_range (unsigned long start,unsigned long end) -{ -unsigned long line_size; - - line_size =CACHE_LINE_SIZE (DCACHE ); - -while (end > start) { - __asm__volatile ("\n\tcctl %0, L1D_VA_WB" : :"r" (start)); - __asm__volatile ("\n\tcctl %0, L1D_VA_INVAL" : :"r" (start)); - start += line_size; - } -} - -void icache_inval_range (unsigned long start,unsigned long end) -{ -unsigned long line_size; - - line_size =CACHE_LINE_SIZE (ICACHE ); -while (end > start) { - __asm__volatile ("\n\tcctl %0, L1I_VA_INVAL" : :"r" (start)); - start += line_size; - } -} - -void flush_cache (unsigned long addr,unsigned long size) -{ -dcache_flush_range (addr, addr + size); -icache_inval_range (addr, addr + size); -} - -void icache_enable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"ori $p0, $p0, 0x01\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -void icache_disable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"li $p1, ~0x01\n\t" -"and $p0, $p0, $p1\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -int icache_status (void ) -{ -int ret; - - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"andi %0, $p0, 0x01\n\t" - :"=r" (ret) - : - :"memory" - ); - -return ret; -} - -void dcache_enable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"ori $p0, $p0, 0x02\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -void dcache_disable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"li $p1, ~0x02\n\t" -"and $p0, $p0, $p1\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -int dcache_status (void ) -{ -int ret; - - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"andi %0, $p0, 0x02\n\t" - :"=r" (ret) - : - :"memory" - ); - -return ret; -}
arch/nds32/cpu/n1213/ag102/cpu.c +0 -112
115 lines not on this page · raw message
arch/nds32/lib/Makefile +1 -1
@@ -29,7 +29,7 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(ARCH).o -OBJS := board.o bootm.o interrupts.o +OBJS := board.o bootm.o cache.o interrupts.o all: $(LIB)
arch/nds32/lib/cache.c new file +145 -0
145 lines not on this page · raw message
Signature · 1 line
1.7.11.2.138.g2b53359
PATCH 1/1 nds32: split common cache access from cpu into lib
Dear Macpaul Lin,
Quoted 6 lines
This commit does the following updates.
1. Split the common cache access fromcpu.cinto lib folder.
2. Rename the following cache api to adaptcommon.h
-dcache_flush_rang->flush_dcache_rang
-icache_inval_range->invalidate_icache_range
3. Addinvalidate_dcache_range
So basically this connects it to standard cache api?
[...]
Quoted 1 line
arch/nds32/lib/cache.c +0
-0
[...]
arch/nds32/lib/cache.c line 28
Quoted 5 lines
arch/nds32/lib/cache.c +5
-0+static inline unsigned long CACHE_LINE_SIZE (enum cache_t cache) +{ +if (cache ==ICACHE ) +return 8 << (((GET_ICM_CFG () &ICM_CFG_MSK_ISZ ) \ + >>ICM_CFG_OFF_ISZ ) -1 );
These crazy macros can be probably done easier and can share some code maybe? Maybe not though, I dunno, just a thought.
Quoted 4 lines
arch/nds32/lib/cache.c +4
-0+else +return 8 << (((GET_DCM_CFG () &DCM_CFG_MSK_DSZ ) \ + >>DCM_CFG_OFF_DSZ ) -1 ); +}
arch/nds32/lib/cache.c line 42
Quoted 10 lines
arch/nds32/lib/cache.c +10
-0+ +void flush_dcache_range (unsigned long start,unsigned long end) +{ +unsigned long line_size; + + line_size =CACHE_LINE_SIZE (DCACHE ); + +while (end > start) { + __asm__volatile ("\n\tcctl %0, L1D_VA_WB" : :"r" (start)); + __asm__volatile ("\n\tcctl %0, L1D_VA_INVAL" : :"r" (start));
You probably want to do those two calls in one asm volatile () block. And this too ... use "asm volatile()" and not "__asm__ volatile" or "asm __volatile__" and similar combinations of these, just a nit ;-)
Quoted 20 lines
arch/nds32/lib/cache.c +20
-0+ start += line_size; + } +} + +void invalidate_icache_range (unsigned long start,unsigned long end) +{ +unsigned long line_size; + + line_size =CACHE_LINE_SIZE (ICACHE ); +while (end > start) { + __asm__volatile ("\n\tcctl %0, L1I_VA_INVAL" : :"r" (start)); + start += line_size; + } +} + +void invalidate_dcache_range (unsigned long start,unsigned long end) +{ +unsigned long line_size; + + line_size =CACHE_LINE_SIZE (DCACHE );
arch/nds32/lib/cache.c line 72
Quoted 10 lines
arch/nds32/lib/cache.c +10
-0+while (end > start) { + __asm__volatile ("\n\tcctl %0, L1D_VA_INVAL" : :"r" (start)); + start += line_size; + } +} + +void flush_cache (unsigned long addr,unsigned long size) +{ +flush_dcache_range (addr, addr + size); +invalidate_icache_range (addr, addr + size);
You probably want to flush dcache in here and that's it.
arch/nds32/lib/cache.c line 77
Quoted 5 lines
arch/nds32/lib/cache.c +5
-0+} + +void icache_enable (void ) +{ + __asm__ __volatile__ (
See my nit above for the rest ;-) But all in all it's good, we should be applying this around V2-V3 of this patch, for the -next release. Thanks for your patch!
PATCH 1/1 nds32: split common cache access from cpu into lib
Hi Marek,
2012/7/15 Marek Vasut <[email protected]>:
Quoted 10 lines
Dear Macpaul Lin,
Quoted 6 lines
This commit does the following updates.
1. Split the common cache access fromcpu.cinto lib folder.
2. Rename the following cache api to adaptcommon.h
-dcache_flush_rang->flush_dcache_rang
-icache_inval_range->invalidate_icache_range
3. Addinvalidate_dcache_rangeSo basically this connects it to standard cache api?
Yes! Basically this is compatible with all nds32 cpu family if they have cache inside.
The cache is configurable by the customer if they used softcore FPGA. This API could help them to figure out the hardware configuration in software level.
Quoted 12 lines
[...]
Quoted 1 line
arch/nds32/lib/cache.c +0
-0[...]
arch/nds32/lib/cache.c line 28
Quoted 5 lines
arch/nds32/lib/cache.c +5
-0+static inline unsigned long CACHE_LINE_SIZE (enum cache_t cache) +{ +if (cache ==ICACHE ) +return 8 << (((GET_ICM_CFG () &ICM_CFG_MSK_ISZ ) \ + >>ICM_CFG_OFF_ISZ ) -1 );These crazy macros can be probably done easier and can share some code maybe? Maybe not though, I dunno, just a thought.
The macro GET_ICM_CFG() is inside arch/nds32/include/cache.h
#define DEFINE_GET_SYS_REG(reg) \
static inline unsigned long GET_##reg(void) \Since the assembly is really long, rewrite them into macros should be easier to maintain and read.
I'll prefer not to modify this function to call CACHE_LINE_SIZE.
Quoted 8 lines
arch/nds32/lib/cache.c line 42
Quoted 4 lines
arch/nds32/lib/cache.c +4
-0+void flush_dcache_range (unsigned long start,unsigned long end) + while (end > start) { + __asm__volatile ("\n\tcctl %0, L1D_VA_WB" : :"r" (start)); + __asm__volatile ("\n\tcctl %0, L1D_VA_INVAL" : :"r" (start));You probably want to do those two calls in one asm volatile () block. And this too ... use "asm
volatile()" and not "__asm__volatile" or "asm__volatile__" and similar combinations of these, just a nit ;-)
Ok, it will be fixed. :)
Quoted 7 lines
arch/nds32/lib/cache.c line 72
Quoted 4 lines
arch/nds32/lib/cache.c +4
-0+void flush_cache (unsigned long addr,unsigned long size) +{ +flush_dcache_range (addr, addr + size); +invalidate_icache_range (addr, addr + size);You probably want to flush dcache in here and that's it.
Quoted 9 lines
arch/nds32/lib/cache.c line 77
Quoted 5 lines
arch/nds32/lib/cache.c +5
-0+} + +void icache_enable (void ) +{ + __asm__ __volatile__ (See my nit above for the rest ;-) But all in all it's good, we should be applying this around V2-V3 of this patch, for the -next release. Thanks for your patch!
It looks like this fix cannot be checkin before this coming rc1 or rc2. But I think it is okay for users to wait until the -next release. :)
Signature · 2 lines
Best regards, Macpaul Lin
PATCH v2 1/1 nds32: split common cache access from cpu into lib
This commit does the following updates.
1. Split the common cache access from cpu.c into lib folder.
2. Rename the following cache api to adapt common.h
- dcache_flush_rang -> flush_dcache_rang
- icache_inval_range -> invalidate_icache_range
3. Add invalidate_dcache_range
---
Changes for v2:
- flush_dcache_range: merge two asm calls into a single asm volatile() block.
- Replace __asm__ __volatile__ block into asm volatile()
arch/nds32/cpu/n1213/ag101/cpu.c | 112 --------------------------- arch/nds32/cpu/n1213/ag102/cpu.c | 112 --------------------------- arch/nds32/lib/Makefile | 2 +- arch/nds32/lib/cache.c | 157 ++++++++++++++++++++++++++++++++++++++ 4 files changed, 158 insertions(+), 225 deletions(-) create mode 100644 arch/nds32/lib/cache.c
arch/nds32/cpu/n1213/ag101/cpu.c +0 -112
@@ -82,115 +82,3 @@ int do_reset(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[])/*NOTREACHED*/ } - -static inline unsigned long CACHE_LINE_SIZE (enum cache_t cache) -{ -if (cache ==ICACHE ) -return 8 << (((GET_ICM_CFG () &ICM_CFG_MSK_ISZ ) \ - >>ICM_CFG_OFF_ISZ ) -1 ); -else -return 8 << (((GET_DCM_CFG () &DCM_CFG_MSK_DSZ ) \ - >>DCM_CFG_OFF_DSZ ) -1 ); -} - -void dcache_flush_range (unsigned long start,unsigned long end) -{ -unsigned long line_size; - - line_size =CACHE_LINE_SIZE (DCACHE ); - -while (end > start) { - __asm__volatile ("\n\tcctl %0, L1D_VA_WB" : :"r" (start)); - __asm__volatile ("\n\tcctl %0, L1D_VA_INVAL" : :"r" (start)); - start += line_size; - } -} - -void icache_inval_range (unsigned long start,unsigned long end) -{ -unsigned long line_size; - - line_size =CACHE_LINE_SIZE (ICACHE ); -while (end > start) { - __asm__volatile ("\n\tcctl %0, L1I_VA_INVAL" : :"r" (start)); - start += line_size; - } -} - -void flush_cache (unsigned long addr,unsigned long size) -{ -dcache_flush_range (addr, addr + size); -icache_inval_range (addr, addr + size); -} - -void icache_enable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"ori $p0, $p0, 0x01\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -void icache_disable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"li $p1, ~0x01\n\t" -"and $p0, $p0, $p1\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -int icache_status (void ) -{ -int ret; - - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"andi %0, $p0, 0x01\n\t" - :"=r" (ret) - : - :"memory" - ); - -return ret; -} - -void dcache_enable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"ori $p0, $p0, 0x02\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -void dcache_disable (void ) -{ - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"li $p1, ~0x02\n\t" -"and $p0, $p0, $p1\n\t" -"mtsr $p0, $mr8\n\t" -"isb\n\t" - ); -} - -int dcache_status (void ) -{ -int ret; - - __asm__ __volatile__ ( -"mfsr $p0, $mr8\n\t" -"andi %0, $p0, 0x02\n\t" - :"=r" (ret) - : - :"memory" - ); - -return ret; -}
arch/nds32/cpu/n1213/ag102/cpu.c +0 -112
115 lines not on this page · raw message
arch/nds32/lib/Makefile +1 -1
@@ -29,7 +29,7 @@ include $(TOPDIR)/config.mk LIB = $(obj)lib$(ARCH).o -OBJS := board.o bootm.o interrupts.o +OBJS := board.o bootm.o cache.o interrupts.o all: $(LIB)
arch/nds32/lib/cache.c new file +157 -0
157 lines not on this page · raw message
Signature · 1 line
1.7.9.5
PATCH v2 1/1 nds32: split common cache access from cpu into lib
Hi Macpaul,
2012/7/17 Macpaul Lin <[email protected]>
Quoted 7 lines
This commit does the following updates.
1. Split the common cache access fromcpu.cinto lib folder.
2. Rename the following cache api to adaptcommon.h
-dcache_flush_rang->flush_dcache_rang
-icache_inval_range->invalidate_icache_range
3. Addinvalidate_dcache_range
Quoted 7 lines
Signed-off-by Macpaul Lin <[email protected]>---
Changes for v2:
-flush_dcache_range: merge two asm calls into a single asmvolatile()block.
- Replace__asm____volatile__block into asmvolatile()
This commit has been applied into u-boot-nds32/master
Thanks!
PATCH 1/1 nds32: split common cache access from cpu into lib
In reply to Marek VasutQuoted 7 lines · On Sunday 15 July 2012 04:12:45 Marek Vasut wrote:
Dear Macpaul Lin,
arch/nds32/lib/cache.c line 72
Quoted 4 lines
arch/nds32/lib/cache.c new file +4
-0+void flush_cache (unsigned long addr,unsigned long size) +{ +flush_dcache_range (addr, addr + size); +invalidate_icache_range (addr, addr + size);You probably want to flush dcache in here and that's it.
i don't think so ... i think that's what flush_dcache_range() is for. and our common/cmd_*.c files assume that flush_cache() will invalidate icache (see the bootm/load funcs that write executable content into memory and then flush the regions).
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120719/9274ae24/attachment.pgp>
PATCH 1/1 nds32: split common cache access from cpu into lib
Hi Mike
2012/7/19 Mike Frysinger <[email protected]>
Quoted 9 lines · On Sunday 15 July 2012 04:12:45 Marek Vasut wrote:
Quoted 7 lines
Dear Macpaul Lin,
arch/nds32/lib/cache.c line 72
Quoted 4 lines
arch/nds32/lib/cache.c new file +4
-0+void flush_cache (unsigned long addr,unsigned long size) +{ +flush_dcache_range (addr, addr + size); +invalidate_icache_range (addr, addr + size);You probably want to flush dcache in here and that's it.
Quoted 9 lines
i don't think so ... i think that's what
flush_dcache_range()is for. and ourcommon/cmd_*.cfiles assume thatflush_cache()will invalidate icache (see the
bootm/load funcs that write executable content into memory and then flush the
regions).
-mike
Thanks for clarification.
The patch v2 I've submitted 2 days ago didn't add a dcache flush here. :-)
Signature · 2 lines
Best regards, Macpaul Lin
PATCH 1/1 nds32: split common cache access from cpu into lib
In reply to Mike FrysingerDear Mike Frysinger,
Quoted 10 lines · On Sunday 15 July 2012 04:12:45 Marek Vasut wrote:
Quoted 8 lines
Dear Macpaul Lin,
arch/nds32/lib/cache.c line 72
Quoted 4 lines
arch/nds32/lib/cache.c new file +4
-0+void flush_cache (unsigned long addr,unsigned long size) +{ +flush_dcache_range (addr, addr + size); +invalidate_icache_range (addr, addr + size);You probably want to flush dcache in here and that's it.
Quoted 4 lines
i don't think so ... i think that's what
flush_dcache_range()is for. and ourcommon/cmd_*.cfiles assume thatflush_cache()will invalidate icache (see the bootm/load funcs that write executable content into memory and then flush the regions).
Than it's borked on arm926ejs too ... ?
Best regards,
Marek Vasut
PATCH 1/1 nds32: split common cache access from cpu into lib
Quoted 10 lines · On Thursday 19 July 2012 05:02:21 Marek Vasut wrote:
Dear Mike Frysinger,
Quoted 9 lines · On Sunday 15 July 2012 04:12:45 Marek Vasut wrote:
Quoted 7 lines
Dear Macpaul Lin,
arch/nds32/lib/cache.c line 72
Quoted 4 lines
arch/nds32/lib/cache.c new file +4
-0+void flush_cache (unsigned long addr,unsigned long size) +{ +flush_dcache_range (addr, addr + size); +invalidate_icache_range (addr, addr + size);You probably want to flush dcache in here and that's it.
Quoted 6 lines
Quoted 4 lines
i don't think so ... i think that's what
flush_dcache_range()is for. and ourcommon/cmd_*.cfiles assume thatflush_cache()will invalidate icache (see the bootm/load funcs that write executable content into memory and then flush the regions).Than it's borked on arm926ejs too ... ?
if it doesn't flush icache in the flush_cache() function, then i would say so
sounds like we should rip all this cache stuff out of common.h and into like cache.h so we can document the API expectations. i think Wolfgang was against this before, but maybe that was just creating a header for one specific cache macro and not all cache stuff ?
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120719/813361dc/attachment.pgp>
PATCH 1/1 nds32: split common cache access from cpu into lib
Dear Mike Frysinger,
Quoted 20 lines · On Thursday 19 July 2012 05:02:21 Marek Vasut wrote:
Quoted 12 lines
Dear Mike Frysinger,
Quoted 10 lines · On Sunday 15 July 2012 04:12:45 Marek Vasut wrote:
Quoted 8 lines
Dear Macpaul Lin,
arch/nds32/lib/cache.c line 72
Quoted 4 lines
arch/nds32/lib/cache.c new file +4
-0+void flush_cache (unsigned long addr,unsigned long size) +{ +flush_dcache_range (addr, addr + size); +invalidate_icache_range (addr, addr + size);You probably want to flush dcache in here and that's it.
Quoted 6 lines
Quoted 4 lines
i don't think so ... i think that's what
flush_dcache_range()is for. and ourcommon/cmd_*.cfiles assume thatflush_cache()will invalidate icache (see the bootm/load funcs that write executable content into memory and then flush the regions).Than it's borked on arm926ejs too ... ?
Quoted 7 lines
if it doesn't flush icache in the
flush_cache()function, then i would say sosounds like we should rip all this cache stuff out of
common.hand into likecache.hso we can document the API expectations. i think Wolfgang was against this before, but maybe that was just creating a header for one specific cache macro and not all cache stuff ?
Certainly this sounds good. We'd also be able to add some nice instrumentation while at that, to detect problematic cases with DEBUG enabled or so. The cache stuff is starting to get really crazy.
Best regards,
Marek Vasut
PATCH 1/1 nds32: split common cache access from cpu into lib
Hi Marek and Mike,
Quoted 6 lines
sounds like we should rip all this cache stuff out of
common.hand intoQuoted 2 lines
like
cache.hso we can document the API expectations. i think Wolfgang was against this before, but maybe that was just creating a header forone
Quoted 1 line
specific cache macro and not all cache stuff ?
Quoted 9 lines
Certainly this sounds good. We'd also be able to add some nice instrumentation
while at that, to detect problematic cases with DEBUG enabled or so. The cache
stuff is starting to get really crazy.Best regards,
Marek Vasut
Since this discussion hasn't been finished,
and we haven't decide the final action about the new policy about cache.h and common.h.
I'd like to pick this patch v2 for the coming release for fixing build error for board adp-ag102.
What do you think? :-)
Signature · 2 lines
Best regards, Macpaul Lin
PATCH 1/1 nds32: split common cache access from cpu into lib
Quoted 6 lines · On Friday 20 July 2012 04:24:55 Macpaul Lin wrote:
Since this discussion hasn't been finished,
and we haven't decide the final action about the new policy aboutcache.handcommon.h.
I'd like to pick this patch v2 for the coming release for fixing build error for board adp-ag102.
What do you think? :-)
i don't think the topic of cleaning up common code impedes you merging your nds32 cache clean ups at all. they're orthogonal issues.
-mike
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 836 bytes
Desc: This is a digitally signed message part.
URL: <http://lists.denx.de/pipermail/u-boot/attachments/20120720/0d87d884/attachment.pgp>