From: Ralf Baechle <ralf@linux-mips.org>
To: Dominic Sweetman <dom@mips.com>
Cc: "Kevin D. Kissell" <KevinK@mips.com>,
S C <theansweriz42@hotmail.com>,
linux-mips@linux-mips.org
Subject: Re: Strange, strange occurence
Date: Fri, 16 Jul 2004 14:24:09 +0200 [thread overview]
Message-ID: <20040716122409.GA19192@linux-mips.org> (raw)
In-Reply-To: <16629.24775.778491.754688@arsenal.mips.com>
On Wed, Jul 14, 2004 at 05:35:19PM +0100, Dominic Sweetman wrote:
> This is fiddly, but not terribly difficult and should have a
> negligible performance impact.
>
> Does that make sense? Am I now, having named the solution,
> responsible for figuring out a patch (yeuch, I never wanted to be a
> kernel programmer again...).
No and yes - but here is a simpler solution. Below patch solves the
problem and adds just 32 bytes of code but removes the special case for
TX49/H2 entirely.
Ralf
arch/mips/mm/c-r4k.c | 59 -------------------------------------------- include/asm-mips/r4kcache.h | 18 ++++++++-----
include/asm-mips/war.h | 14 ----------
3 files changed, 13 insertions(+), 78 deletions(-)
Index: arch/mips/mm/c-r4k.c
===================================================================
RCS file: /home/cvs/linux/arch/mips/mm/c-r4k.c,v
retrieving revision 1.88
diff -u -r1.88 c-r4k.c
--- arch/mips/mm/c-r4k.c 16 Jul 2004 12:06:13 -0000 1.88
+++ arch/mips/mm/c-r4k.c 16 Jul 2004 12:17:05 -0000
@@ -96,16 +96,6 @@
r4k_blast_dcache = blast_dcache32;
}
-/* force code alignment (used for TX49XX_ICACHE_INDEX_INV_WAR) */
-#define JUMP_TO_ALIGN(order) \
- __asm__ __volatile__( \
- "b\t1f\n\t" \
- ".align\t" #order "\n\t" \
- "1:\n\t" \
- )
-#define CACHE32_UNROLL32_ALIGN JUMP_TO_ALIGN(10) /* 32 * 32 = 1024 */
-#define CACHE32_UNROLL32_ALIGN2 JUMP_TO_ALIGN(11)
-
static inline void blast_r4600_v1_icache32(void)
{
unsigned long flags;
@@ -115,27 +105,6 @@
local_irq_restore(flags);
}
-static inline void tx49_blast_icache32(void)
-{
- unsigned long start = INDEX_BASE;
- unsigned long end = start + current_cpu_data.icache.waysize;
- unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
- unsigned long ws_end = current_cpu_data.icache.ways <<
- current_cpu_data.icache.waybit;
- unsigned long ws, addr;
-
- CACHE32_UNROLL32_ALIGN2;
- /* I'm in even chunk. blast odd chunks */
- for (ws = 0; ws < ws_end; ws += ws_inc)
- for (addr = start + 0x400; addr < end; addr += 0x400 * 2)
- cache32_unroll32(addr|ws,Index_Invalidate_I);
- CACHE32_UNROLL32_ALIGN;
- /* I'm in odd chunk. blast even chunks */
- for (ws = 0; ws < ws_end; ws += ws_inc)
- for (addr = start; addr < end; addr += 0x400 * 2)
- cache32_unroll32(addr|ws,Index_Invalidate_I);
-}
-
static inline void blast_icache32_r4600_v1_page_indexed(unsigned long page)
{
unsigned long flags;
@@ -145,27 +114,6 @@
local_irq_restore(flags);
}
-static inline void tx49_blast_icache32_page_indexed(unsigned long page)
-{
- unsigned long start = page;
- unsigned long end = start + PAGE_SIZE;
- unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
- unsigned long ws_end = current_cpu_data.icache.ways <<
- current_cpu_data.icache.waybit;
- unsigned long ws, addr;
-
- CACHE32_UNROLL32_ALIGN2;
- /* I'm in even chunk. blast odd chunks */
- for (ws = 0; ws < ws_end; ws += ws_inc)
- for (addr = start + 0x400; addr < end; addr += 0x400 * 2)
- cache32_unroll32(addr|ws,Index_Invalidate_I);
- CACHE32_UNROLL32_ALIGN;
- /* I'm in odd chunk. blast even chunks */
- for (ws = 0; ws < ws_end; ws += ws_inc)
- for (addr = start; addr < end; addr += 0x400 * 2)
- cache32_unroll32(addr|ws,Index_Invalidate_I);
-}
-
static void (* r4k_blast_icache_page)(unsigned long addr);
static inline void r4k_blast_icache_page_setup(void)
@@ -190,10 +138,7 @@
if (ic_lsize == 16)
r4k_blast_icache_page_indexed = blast_icache16_page_indexed;
else if (ic_lsize == 32) {
- if (TX49XX_ICACHE_INDEX_INV_WAR)
- r4k_blast_icache_page_indexed =
- tx49_blast_icache32_page_indexed;
- else if (R4600_V1_INDEX_ICACHEOP_WAR && cpu_is_r4600_v1_x())
+ if (R4600_V1_INDEX_ICACHEOP_WAR && cpu_is_r4600_v1_x())
r4k_blast_icache_page_indexed =
blast_icache32_r4600_v1_page_indexed;
else
@@ -214,8 +159,6 @@
else if (ic_lsize == 32) {
if (R4600_V1_INDEX_ICACHEOP_WAR && cpu_is_r4600_v1_x())
r4k_blast_icache = blast_r4600_v1_icache32;
- else if (TX49XX_ICACHE_INDEX_INV_WAR)
- r4k_blast_icache = tx49_blast_icache32;
else
r4k_blast_icache = blast_icache32;
} else if (ic_lsize == 64)
Index: include/asm-mips/r4kcache.h
===================================================================
RCS file: /home/cvs/linux/include/asm-mips/r4kcache.h,v
retrieving revision 1.22
diff -u -r1.22 r4kcache.h
--- include/asm-mips/r4kcache.h 5 Jan 2004 01:56:01 -0000 1.22
+++ include/asm-mips/r4kcache.h 16 Jul 2004 12:17:05 -0000
@@ -192,7 +192,7 @@
static inline void blast_icache16(void)
{
- unsigned long start = INDEX_BASE;
+ unsigned long start = (unsigned long) &&body + 0x100;
unsigned long end = start + current_cpu_data.icache.waysize;
unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
unsigned long ws_end = current_cpu_data.icache.ways <<
@@ -200,8 +200,10 @@
unsigned long ws, addr;
for (ws = 0; ws < ws_end; ws += ws_inc)
- for (addr = start; addr < end; addr += 0x200)
+ for (addr = start; addr < end; addr += 0x200) {
+body:
cache16_unroll32(addr|ws,Index_Invalidate_I);
+ }
}
static inline void blast_icache16_page(unsigned long page)
@@ -335,7 +337,7 @@
static inline void blast_icache32(void)
{
- unsigned long start = INDEX_BASE;
+ unsigned long start = (unsigned long) &&body + 0x200;
unsigned long end = start + current_cpu_data.icache.waysize;
unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
unsigned long ws_end = current_cpu_data.icache.ways <<
@@ -343,8 +345,10 @@
unsigned long ws, addr;
for (ws = 0; ws < ws_end; ws += ws_inc)
- for (addr = start; addr < end; addr += 0x400)
+ for (addr = start; addr < end; addr += 0x400) {
+body:
cache32_unroll32(addr|ws,Index_Invalidate_I);
+ }
}
static inline void blast_icache32_page(unsigned long page)
@@ -439,7 +443,7 @@
static inline void blast_icache64(void)
{
- unsigned long start = INDEX_BASE;
+ unsigned long start = (unsigned long) &&body + 0x400;
unsigned long end = start + current_cpu_data.icache.waysize;
unsigned long ws_inc = 1UL << current_cpu_data.icache.waybit;
unsigned long ws_end = current_cpu_data.icache.ways <<
@@ -447,8 +451,10 @@
unsigned long ws, addr;
for (ws = 0; ws < ws_end; ws += ws_inc)
- for (addr = start; addr < end; addr += 0x800)
+ for (addr = start; addr < end; addr += 0x800) {
+body:
cache64_unroll32(addr|ws,Index_Invalidate_I);
+ }
}
static inline void blast_icache64_page(unsigned long page)
Index: include/asm-mips/war.h
===================================================================
RCS file: /home/cvs/linux/include/asm-mips/war.h,v
retrieving revision 1.18
diff -u -r1.18 war.h
--- include/asm-mips/war.h 5 Mar 2004 02:47:19 -0000 1.18
+++ include/asm-mips/war.h 16 Jul 2004 12:17:05 -0000
@@ -158,17 +158,6 @@
#endif
/*
- * From TX49/H2 manual: "If the instruction (i.e. CACHE) is issued for
- * the line which this instruction itself exists, the following
- * operation is not guaranteed."
- *
- * Workaround: do two phase flushing for Index_Invalidate_I
- */
-#ifdef CONFIG_CPU_TX49XX
-#define TX49XX_ICACHE_INDEX_INV_WAR 1
-#endif
-
-/*
* On the RM9000 there is a problem which makes the CreateDirtyExclusive
* cache operation unusable on SMP systems.
*/
@@ -203,9 +192,6 @@
#ifndef MIPS_CACHE_SYNC_WAR
#define MIPS_CACHE_SYNC_WAR 0
#endif
-#ifndef TX49XX_ICACHE_INDEX_INV_WAR
-#define TX49XX_ICACHE_INDEX_INV_WAR 0
-#endif
#ifndef RM9000_CDEX_SMP_WAR
#define RM9000_CDEX_SMP_WAR 0
#endif
next prev parent reply other threads:[~2004-07-16 12:24 UTC|newest]
Thread overview: 44+ messages / expand[flat|nested] mbox.gz Atom feed top
2004-07-09 18:50 Strange, strange occurence S C
2004-07-10 7:33 ` Niels Sterrenburg
2004-07-10 10:04 ` Ralf Baechle
2004-07-12 15:16 ` Kevin D. Kissell
2004-07-12 15:16 ` Kevin D. Kissell
2004-07-13 0:33 ` Ralf Baechle
2004-07-13 7:49 ` Help with MOP network boot install on DECstation 5000/240 Collin Baillie
2004-07-13 8:03 ` Jan-Benedict Glaw
2004-07-14 6:57 ` Collin Baillie
2004-07-14 9:54 ` Maciej W. Rozycki
2004-07-14 12:44 ` Jan-Benedict Glaw
2004-07-14 12:51 ` Maciej W. Rozycki
2004-07-14 13:30 ` Jan-Benedict Glaw
2004-07-15 11:33 ` Maciej W. Rozycki
2004-07-14 12:43 ` Jan-Benedict Glaw
2004-07-16 14:41 ` Collin Baillie
2004-07-16 15:04 ` Jan-Benedict Glaw
2004-07-16 15:13 ` Maciej W. Rozycki
2004-07-16 15:08 ` Maciej W. Rozycki
2004-07-16 16:31 ` Thiemo Seufer
2004-07-16 16:51 ` Maciej W. Rozycki
2004-07-16 18:56 ` Thiemo Seufer
2004-07-13 15:31 ` Strange, strange occurence Kevin D. Kissell
2004-07-13 15:31 ` Kevin D. Kissell
2004-07-14 12:02 ` Maciej W. Rozycki
2004-07-14 16:35 ` Dominic Sweetman
2004-07-14 17:45 ` Michael Uhler
2004-07-14 17:45 ` Michael Uhler
2004-07-15 1:34 ` Atsushi Nemoto
2004-07-15 1:53 ` Ralf Baechle
2004-07-16 12:24 ` Ralf Baechle [this message]
2004-07-16 16:05 ` Atsushi Nemoto
-- strict thread matches above, loose matches on Subject: below --
2004-07-12 20:49 S C
2004-07-12 21:23 S C
2004-07-12 21:48 ` Kevin D. Kissell
2004-07-12 21:48 ` Kevin D. Kissell
2004-07-12 22:25 ` Kevin D. Kissell
2004-07-12 22:25 ` Kevin D. Kissell
2004-07-12 23:13 ` Ralf Baechle
2004-07-12 23:11 ` Ralf Baechle
2004-07-12 23:00 ` Ralf Baechle
2004-07-12 23:10 S C
2004-07-30 21:06 G H
2004-07-31 5:09 ` Ralf Baechle
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20040716122409.GA19192@linux-mips.org \
--to=ralf@linux-mips.org \
--cc=KevinK@mips.com \
--cc=dom@mips.com \
--cc=linux-mips@linux-mips.org \
--cc=theansweriz42@hotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.