[PARISC] Fix parisc_setup_cache_timing to choose a better flush threshold
authorStuart Brady <sdb@parisc-linux.org>
Sat, 22 Oct 2005 02:44:14 +0000 (22:44 -0400)
committerKyle McMartin <kyle@parisc-linux.org>
Sat, 22 Oct 2005 02:44:14 +0000 (22:44 -0400)
update comment about CAFL_STRIDE

Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
Fixed a bug in parisc_setup_cache_timing() which caused it to calculate
a poor value for parisc_cache_flush_threshold.

Thanks to Joel Soete for spotting the bug.
Thanks to James Bottomley for pointing out the clean way to fix this.

Signed-off-by: Stuart Brady <sdb@parisc-linux.org>
Signed-off-by: Kyle McMartin <kyle@parisc-linux.org>
arch/parisc/kernel/cache.c

index f46a07a792187626370dd139e9496dc0551bb6f0..e15f09eaed121b4ac13810d420e79d46b9e3190f 100644 (file)
@@ -27,6 +27,7 @@
 #include <asm/page.h>
 #include <asm/pgalloc.h>
 #include <asm/processor.h>
 #include <asm/page.h>
 #include <asm/pgalloc.h>
 #include <asm/processor.h>
+#include <asm/sections.h>
 
 int split_tlb;
 int dcache_stride;
 
 int split_tlb;
 int dcache_stride;
@@ -207,6 +208,9 @@ parisc_cache_init(void)
 
        /* "New and Improved" version from Jim Hull 
         *      (1 << (cc_block-1)) * (cc_line << (4 + cnf.cc_shift))
 
        /* "New and Improved" version from Jim Hull 
         *      (1 << (cc_block-1)) * (cc_line << (4 + cnf.cc_shift))
+        * The following CAFL_STRIDE is an optimized version, see
+        * http://lists.parisc-linux.org/pipermail/parisc-linux/2004-June/023625.html
+        * http://lists.parisc-linux.org/pipermail/parisc-linux/2004-June/023671.html
         */
 #define CAFL_STRIDE(cnf) (cnf.cc_line << (3 + cnf.cc_block + cnf.cc_shift))
        dcache_stride = CAFL_STRIDE(cache_info.dc_conf);
         */
 #define CAFL_STRIDE(cnf) (cnf.cc_line << (3 + cnf.cc_block + cnf.cc_shift))
        dcache_stride = CAFL_STRIDE(cache_info.dc_conf);
@@ -339,17 +343,15 @@ int parisc_cache_flush_threshold = FLUSH_THRESHOLD;
 void parisc_setup_cache_timing(void)
 {
        unsigned long rangetime, alltime;
 void parisc_setup_cache_timing(void)
 {
        unsigned long rangetime, alltime;
-       extern char _text;      /* start of kernel code, defined by linker */
-       extern char _end;       /* end of BSS, defined by linker */
        unsigned long size;
 
        alltime = mfctl(16);
        flush_data_cache();
        alltime = mfctl(16) - alltime;
 
        unsigned long size;
 
        alltime = mfctl(16);
        flush_data_cache();
        alltime = mfctl(16) - alltime;
 
-       size = (unsigned long)(&_end - _text);
+       size = (unsigned long)(_end - _text);
        rangetime = mfctl(16);
        rangetime = mfctl(16);
-       flush_kernel_dcache_range((unsigned long)&_text, size);
+       flush_kernel_dcache_range((unsigned long)_text, size);
        rangetime = mfctl(16) - rangetime;
 
        printk(KERN_DEBUG "Whole cache flush %lu cycles, flushing %lu bytes %lu cycles\n",
        rangetime = mfctl(16) - rangetime;
 
        printk(KERN_DEBUG "Whole cache flush %lu cycles, flushing %lu bytes %lu cycles\n",