[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[microblaze-uclinux] [patch] microblaze cache handling
Hi Greg/David,
Some changes to include/asm-microblaze/pgalloc.h, to make cache handling
much less conservative. dcache flushing is removed, since microblaze
has a write-through cache, and icache_flush_XXX routines now only flushe
the necessary range, rather than the entire cache.
Significant performance improvements result :)
Thanks,
John
Index: io.h
===================================================================
RCS file: /var/cvs/uClinux-2.4.x/include/asm-microblaze/io.h,v
retrieving revision 1.5
diff -u -b -B -w -p -r1.5 io.h
--- io.h 2003/08/12 01:55:07 1.5
+++ io.h 2003/12/03 06:06:39
@@ -18,10 +18,6 @@
#include <asm/virtconvert.h>
-#ifndef __OPTIMIZE__
-#define extern static
-#endif
-
#define IO_SPACE_LIMIT 0xFFFFFFFF
#define readb(addr) \
@@ -131,9 +127,5 @@ io_outsl (unsigned long port, const void
#define ioremap_nocache(physaddr, size) (physaddr)
#define ioremap_writethrough(physaddr, size) (physaddr)
#define ioremap_fullcache(physaddr, size) (physaddr)
-
-#ifndef __OPTIMIZE__
-#undef extern
-#endif
#endif /* __MICROBLAZE_IO_H__ */
Index: pgalloc.h
===================================================================
RCS file: /var/cvs/uClinux-2.4.x/include/asm-microblaze/pgalloc.h,v
retrieving revision 1.2
diff -u -b -B -w -p -r1.2 pgalloc.h
--- pgalloc.h 2003/09/22 04:34:25 1.2
+++ pgalloc.h 2003/12/03 06:06:39
@@ -8,18 +8,21 @@
#include <asm/setup.h>
#include <asm/virtconvert.h>
+#include <asm/page.h>
/*
* Cache handling functions
*/
+/* The following hard-codes some assumptions, and needs to be cleaned up.
+ We need to get cache-description #defines into xparameters.h at least
+ and use them to drive the code below.
+*/
extern inline void __flush_cache_all(void)
{
#ifdef CONFIG_MICROBLAZE_ICACHE
unsigned int i;
- unsigned int flags;
- save_flags(flags);cli();
__disable_icache();
__disable_dcache();
@@ -29,22 +32,39 @@ extern inline void __flush_cache_all(voi
__invalidate_dcache(i+0x80000000);
}
__enable_icache();
+ __enable_dcache();
+#endif /* CONFIG_MICROBLAZE_ICACHE */
+}
+
+extern inline void __flush_cache_range(unsigned int start, unsigned int end)
+{
+#ifdef CONFIG_MICROBLAZE_ICACHE
+ unsigned int i;
+
+ __disable_icache();
+ __disable_dcache();
+
+ for(i=start;i<end;i+=4)
+ {
+ __invalidate_icache(i);
+ __invalidate_dcache(i);
+ }
+ __enable_icache();
__enable_dcache();
- restore_flags(flags);
#endif /* CONFIG_MICROBLAZE_ICACHE */
}
#define flush_cache_all() __flush_cache_all()
-#define flush_cache_mm(mm) __flush_cache_all()
-#define flush_cache_range(mm, start, end) __flush_cache_all()
-#define flush_cache_page(vma, vmaddr) __flush_cache_all()
-#define flush_page_to_ram(page) __flush_cache_all()
-#define flush_dcache_page(page) __flush_cache_all()
-#define flush_icache_range(start, end) __flush_cache_all()
+#define flush_cache_mm(mm) do { } while(0)
+#define flush_cache_range(mm, start, end) do { } while(0)
+#define flush_cache_page(vma, vmaddr) do { } while(0)
+#define flush_page_to_ram(page) do { } while(0)
+#define flush_dcache_page(page) do { } while(0)
+#define flush_icache_range(start, end) __flush_cache_range(start,end)
#define flush_icache_user_range(vma,pg,adr,len) __flush_cache_all()
#define flush_icache_page(vma,pg) __flush_cache_all()
#define flush_icache() __flush_cache_all()
-#define flush_cache_sigtramp(vaddr) __flush_cache_all()
+#define flush_cache_sigtramp(vaddr) __flush_cache_range(vaddr,vaddr+4)
/*
* DAVIDM - the rest of these are just so I can check where they happen