summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRalf Baechle <ralf@linux-mips.org>2000-06-20 01:06:27 +0000
committerRalf Baechle <ralf@linux-mips.org>2000-06-20 01:06:27 +0000
commit68a1cd72aca3ddd79de33703a1760887e3dbe164 (patch)
tree128a3c32d6b8883de3fff9a70fd7a68dc643aa55
parent6d403070f28cd44860fdb3a53be5da0275c65cf4 (diff)
R3000 cache handling. flush_icache_page now actually flushes
something.
-rw-r--r--arch/mips/mm/r2300.c58
-rw-r--r--include/asm-mips/mipsregs.h6
-rw-r--r--include/asm-mips/pgtable.h5
-rw-r--r--include/asm-mips64/mipsregs.h4
-rw-r--r--include/asm-mips64/pgtable.h9
5 files changed, 41 insertions, 41 deletions
diff --git a/arch/mips/mm/r2300.c b/arch/mips/mm/r2300.c
index 2e699b416..dcf1e8a2d 100644
--- a/arch/mips/mm/r2300.c
+++ b/arch/mips/mm/r2300.c
@@ -151,15 +151,15 @@ unsigned long __init r3k_cache_size(unsigned long ca_flags)
static void __init probe_dcache(void)
{
- dcache_size = r3k_cache_size(ST0_DE);
+ dcache_size = r3k_cache_size(ST0_ISC);
printk("Primary data cache %dkb, linesize 4 bytes\n",
dcache_size >> 10);
}
static void __init probe_icache(void)
{
- icache_size = r3k_cache_size(ST0_DE|ST0_CE);
- printk("Primary instruction cache %dkb, linesize 8 bytes\n",
+ icache_size = r3k_cache_size(ST0_ISC|ST0_SWC);
+ printk("Primary instruction cache %dkb, linesize 4 bytes\n",
icache_size >> 10);
}
@@ -174,43 +174,43 @@ static void r3k_flush_icache_range(unsigned long start, unsigned long size)
save_and_cli(flags);
/* isolate cache space */
- write_32bit_cp0_register(CP0_STATUS, (ST0_DE|ST0_CE|flags)&~ST0_IEC);
+ write_32bit_cp0_register(CP0_STATUS, (ST0_ISC|ST0_SWC|flags)&~ST0_IEC);
- for (i = 0; i < size; i += 0x100) {
+ for (i = 0; i < size; i += 0x080) {
asm ( "sb\t$0,0x000(%0)\n\t"
+ "sb\t$0,0x004(%0)\n\t"
"sb\t$0,0x008(%0)\n\t"
+ "sb\t$0,0x00c(%0)\n\t"
"sb\t$0,0x010(%0)\n\t"
+ "sb\t$0,0x014(%0)\n\t"
"sb\t$0,0x018(%0)\n\t"
- "sb\t$0,0x020(%0)\n\t"
+ "sb\t$0,0x01c(%0)\n\t"
+ "sb\t$0,0x020(%0)\n\t"
+ "sb\t$0,0x024(%0)\n\t"
"sb\t$0,0x028(%0)\n\t"
+ "sb\t$0,0x02c(%0)\n\t"
"sb\t$0,0x030(%0)\n\t"
+ "sb\t$0,0x034(%0)\n\t"
"sb\t$0,0x038(%0)\n\t"
- "sb\t$0,0x040(%0)\n\t"
+ "sb\t$0,0x03c(%0)\n\t"
+ "sb\t$0,0x040(%0)\n\t"
+ "sb\t$0,0x044(%0)\n\t"
"sb\t$0,0x048(%0)\n\t"
+ "sb\t$0,0x04c(%0)\n\t"
"sb\t$0,0x050(%0)\n\t"
+ "sb\t$0,0x054(%0)\n\t"
"sb\t$0,0x058(%0)\n\t"
- "sb\t$0,0x060(%0)\n\t"
+ "sb\t$0,0x05c(%0)\n\t"
+ "sb\t$0,0x060(%0)\n\t"
+ "sb\t$0,0x064(%0)\n\t"
"sb\t$0,0x068(%0)\n\t"
+ "sb\t$0,0x06c(%0)\n\t"
"sb\t$0,0x070(%0)\n\t"
+ "sb\t$0,0x074(%0)\n\t"
"sb\t$0,0x078(%0)\n\t"
- "sb\t$0,0x080(%0)\n\t"
- "sb\t$0,0x088(%0)\n\t"
- "sb\t$0,0x090(%0)\n\t"
- "sb\t$0,0x098(%0)\n\t"
- "sb\t$0,0x0a0(%0)\n\t"
- "sb\t$0,0x0a8(%0)\n\t"
- "sb\t$0,0x0b0(%0)\n\t"
- "sb\t$0,0x0b8(%0)\n\t"
- "sb\t$0,0x0c0(%0)\n\t"
- "sb\t$0,0x0c8(%0)\n\t"
- "sb\t$0,0x0d0(%0)\n\t"
- "sb\t$0,0x0d8(%0)\n\t"
- "sb\t$0,0x0e0(%0)\n\t"
- "sb\t$0,0x0e8(%0)\n\t"
- "sb\t$0,0x0f0(%0)\n\t"
- "sb\t$0,0x0f8(%0)\n\t"
+ "sb\t$0,0x07c(%0)\n\t"
: : "r" (p) );
- p += 0x100;
+ p += 0x080;
}
restore_flags(flags);
@@ -221,13 +221,13 @@ static void r3k_flush_dcache_range(unsigned long start, unsigned long size)
unsigned long i, flags;
volatile unsigned char *p = (char *)start;
- if (size > icache_size)
- size = icache_size;
+ if (size > dcache_size)
+ size = dcache_size;
save_and_cli(flags);
/* isolate cache space */
- write_32bit_cp0_register(CP0_STATUS, (ST0_DE|flags)&~ST0_IEC);
+ write_32bit_cp0_register(CP0_STATUS, (ST0_ISC|flags)&~ST0_IEC);
for (i = 0; i < size; i += 0x080) {
asm ( "sb\t$0,0x000(%0)\n\t"
@@ -376,7 +376,7 @@ static void r3k_flush_cache_sigtramp(unsigned long addr)
save_and_cli(flags);
- write_32bit_cp0_register(CP0_STATUS, (ST0_DE|ST0_CE|flags)&~ST0_IEC);
+ write_32bit_cp0_register(CP0_STATUS, (ST0_ISC|ST0_SWC|flags)&~ST0_IEC);
asm ( "sb\t$0,0x000(%0)\n\t"
"sb\t$0,0x008(%0)\n\t"
diff --git a/include/asm-mips/mipsregs.h b/include/asm-mips/mipsregs.h
index 23ed82cfd..f7a29a81f 100644
--- a/include/asm-mips/mipsregs.h
+++ b/include/asm-mips/mipsregs.h
@@ -234,6 +234,8 @@ __BUILD_SET_CP0(config,CP0_CONFIG)
#define ST0_UX 0x00000020
#define ST0_SX 0x00000040
#define ST0_KX 0x00000080
+#define ST0_DE 0x00010000
+#define ST0_CE 0x00020000
/*
* Bitfields in the R[23]000 cp0 status register.
@@ -245,6 +247,8 @@ __BUILD_SET_CP0(config,CP0_CONFIG)
#define ST0_IEO 0x00000010
#define ST0_KUO 0x00000020
/* bits 6 & 7 are reserved on R[23]000 */
+#define ST0_ISC 0x00010000
+#define ST0_SWC 0x00020000
/*
* Bits specific to the R4640/R4650
@@ -273,8 +277,6 @@ __BUILD_SET_CP0(config,CP0_CONFIG)
#define STATUSF_IP6 (1 << 14)
#define STATUSB_IP7 15
#define STATUSF_IP7 (1 << 15)
-#define ST0_DE 0x00010000
-#define ST0_CE 0x00020000
#define ST0_CH 0x00040000
#define ST0_SR 0x00100000
#define ST0_BEV 0x00400000
diff --git a/include/asm-mips/pgtable.h b/include/asm-mips/pgtable.h
index a21e78b04..b2d3ed058 100644
--- a/include/asm-mips/pgtable.h
+++ b/include/asm-mips/pgtable.h
@@ -1,5 +1,4 @@
-/* $Id: pgtable.h,v 1.31 2000/03/02 02:37:13 ralf Exp $
- *
+/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
@@ -43,7 +42,7 @@ extern void (*_flush_page_to_ram)(struct page * page);
#define flush_page_to_ram(page) _flush_page_to_ram(page)
#define flush_icache_range(start, end) flush_cache_all()
-#define flush_icache_page(start,page) do { } while(0)
+#define flush_icache_page(start,page) flush_cache_page(vma, page)
/*
diff --git a/include/asm-mips64/mipsregs.h b/include/asm-mips64/mipsregs.h
index cddc66d39..08ef50e35 100644
--- a/include/asm-mips64/mipsregs.h
+++ b/include/asm-mips64/mipsregs.h
@@ -213,6 +213,8 @@ __BUILD_SET_CP0(config,CP0_CONFIG)
#define ST0_UX 0x00000020
#define ST0_SX 0x00000040
#define ST0_KX 0x00000080
+#define ST0_DE 0x00010000
+#define ST0_CE 0x00020000
/*
* Status register bits available in all MIPS CPUs.
@@ -234,8 +236,6 @@ __BUILD_SET_CP0(config,CP0_CONFIG)
#define STATUSF_IP6 (1 << 14)
#define STATUSB_IP7 15
#define STATUSF_IP7 (1 << 15)
-#define ST0_DE 0x00010000
-#define ST0_CE 0x00020000
#define ST0_CH 0x00040000
#define ST0_SR 0x00100000
#define ST0_TS 0x00200000
diff --git a/include/asm-mips64/pgtable.h b/include/asm-mips64/pgtable.h
index af4251f38..af8a65d0f 100644
--- a/include/asm-mips64/pgtable.h
+++ b/include/asm-mips64/pgtable.h
@@ -1,11 +1,10 @@
-/* $Id: pgtable.h,v 1.14 2000/03/02 02:37:13 ralf Exp $
- *
+/*
* This file is subject to the terms and conditions of the GNU General Public
* License. See the file "COPYING" in the main directory of this archive
* for more details.
*
- * Copyright (C) 1994 - 1999 by Ralf Baechle at alii
- * Copyright (C) 1999 Silicon Graphics, Inc.
+ * Copyright (C) 1994 - 2000 by Ralf Baechle at alii
+ * Copyright (C) 1999, 2000 Silicon Graphics, Inc.
*/
#ifndef _ASM_PGTABLE_H
#define _ASM_PGTABLE_H
@@ -44,7 +43,7 @@ extern void (*_flush_page_to_ram)(struct page * page);
#define flush_page_to_ram(page) _flush_page_to_ram(page)
#define flush_icache_range(start, end) flush_cache_all()
-#define flush_icache_page(start, page) do { } while(0)
+#define flush_icache_page(vma, page) flush_cache_page(vma, page)
/* Basically we have the same two-level (which is the logical three level