Skip to contentSkip to conversation

nds32: split common cache access from cpu into lib

PATCH New Macpaul Lin 3 participants 12 messages Jul 15, 2012 – Jul 20, 2012

lore
Share & tools
lore
#0 lore raw

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
index c2636b1..a9991e7 100644
@@ -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
index e5c31c3..581a2e7 100644
@@ -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
#1 lore raw

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 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

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!

#2 lore raw

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 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

So 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
#3 lore raw

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
index c2636b1..a9991e7 100644
@@ -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
index e5c31c3..581a2e7 100644
@@ -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
#4 lore raw

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 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

Quoted 7 lines

---
Changes for v2:
- flush_dcache_range: merge two asm calls into a single asm volatile() block.
- Replace __asm__ __volatile__ block into asm volatile()

This commit has been applied into u-boot-nds32/master

Thanks!

#5 lore raw

PATCH 1/1 nds32: split common cache access from cpu into lib

In reply to Marek Vasut
Quoted 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>

#6 lore raw

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 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

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
#7 lore raw

PATCH 1/1 nds32: split common cache access from cpu into lib

In reply to Mike Frysinger

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 4 lines

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).

Than it's borked on arm926ejs too ... ?

Best regards,
Marek Vasut

#8 lore raw

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 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).

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>

#9 lore raw

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 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).

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 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 ?

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

#10 lore raw

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.h and into

Quoted 2 lines

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

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
#11 lore raw

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 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? :-)

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>