Linux MIPS Architecture development
 help / color / mirror / Atom feed
* End c-tx49.c's misserable existence
       [not found] <20030412163215Z8225197-1272+1264@linux-mips.org>
@ 2003-04-14  3:35 ` Atsushi Nemoto
  2003-04-14  3:50   ` Ralf Baechle
  2003-08-01 13:27   ` Atsushi Nemoto
  0 siblings, 2 replies; 8+ messages in thread
From: Atsushi Nemoto @ 2003-04-14  3:35 UTC (permalink / raw)
  To: linux-mips, ralf; +Cc: Atsushi Nemoto

>>>>> On Sat, 12 Apr 2003 17:32:09 +0100, ralf@linux-mips.org said:
ralf> Modified files:
ralf> 	include/asm-mips: Tag: linux_2_4 war.h 
ralf> 	include/asm-mips64: Tag: linux_2_4 war.h 
ralf> 	arch/mips/mm   : Tag: linux_2_4 Makefile c-r4k.c 
ralf> 	arch/mips64/mm : Tag: linux_2_4 c-r4k.c 
ralf> Removed files:
ralf> 	arch/mips/mm   : Tag: linux_2_4 c-tx49.c 

ralf> Log message:
ralf> 	End c-tx49.c's misserable existence and move it into c-r4k.c.

I'm happy to see this change and have one more request.

TOSHIBA_ICACHE_WAR can be removed.  This workaround is not needed
if kernel does not modify the cache codes itself in run-time.

When I wrote c-tx49.c I blindly followed the statement in TX49/H2
manual's statement. ("If the instruction (i.e. CACHE) is issued for
the line which this instruction itself exists, the following operation
is not guaranteed.")  Now I know this warning is only for
self-modified code.  There must be no problem if the codes is not
modified in run-time.  So please remove all TOSHIBA_ICACHE_WAR stuff
and make c-r4k.c more clean.

Thank you.
---
Atsushi Nemoto
The old PGP key (ID B6D728B1) has been revoked.  New key ID is 2874D52F.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: End c-tx49.c's misserable existence
  2003-04-14  3:35 ` End c-tx49.c's misserable existence Atsushi Nemoto
@ 2003-04-14  3:50   ` Ralf Baechle
  2003-04-14  6:29     ` Atsushi Nemoto
  2003-08-01 13:27   ` Atsushi Nemoto
  1 sibling, 1 reply; 8+ messages in thread
From: Ralf Baechle @ 2003-04-14  3:50 UTC (permalink / raw)
  To: Atsushi Nemoto; +Cc: linux-mips, Atsushi Nemoto

On Mon, Apr 14, 2003 at 12:35:14PM +0900, Atsushi Nemoto wrote:

> TOSHIBA_ICACHE_WAR can be removed.  This workaround is not needed
> if kernel does not modify the cache codes itself in run-time.
> 
> When I wrote c-tx49.c I blindly followed the statement in TX49/H2
> manual's statement. ("If the instruction (i.e. CACHE) is issued for
> the line which this instruction itself exists, the following operation
> is not guaranteed.")  Now I know this warning is only for
> self-modified code.  There must be no problem if the codes is not
> modified in run-time.  So please remove all TOSHIBA_ICACHE_WAR stuff
> and make c-r4k.c more clean.

Excellent.  This should provide a good performance boost for the TX49
also as disabling the I-cache during the flush made the operation even
slower than it has to be.

  Ralf

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: End c-tx49.c's misserable existence
  2003-04-14  3:50   ` Ralf Baechle
@ 2003-04-14  6:29     ` Atsushi Nemoto
  2003-04-14 12:47       ` Maciej W. Rozycki
  2003-04-14 15:48       ` Ralf Baechle
  0 siblings, 2 replies; 8+ messages in thread
From: Atsushi Nemoto @ 2003-04-14  6:29 UTC (permalink / raw)
  To: ralf; +Cc: nemoto, linux-mips

>>>>> On Mon, 14 Apr 2003 05:50:38 +0200, Ralf Baechle <ralf@linux-mips.org> said:
ralf> Excellent.  This should provide a good performance boost for the
ralf> TX49 also as disabling the I-cache during the flush made the
ralf> operation even slower than it has to be.

Thank you for quick response.

One more request.  Please enclose R4600_V1_HIT_CACHEOP_WAR and
R4600_V2_HIT_CACHEOP_WAR with appropriate CONFIG_CPU_XXX.  I do not
know what CPUs need this workaround... (at least TX49 does not need
this)

---
Atsushi Nemoto

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: End c-tx49.c's misserable existence
  2003-04-14  6:29     ` Atsushi Nemoto
@ 2003-04-14 12:47       ` Maciej W. Rozycki
  2003-04-14 15:48       ` Ralf Baechle
  1 sibling, 0 replies; 8+ messages in thread
From: Maciej W. Rozycki @ 2003-04-14 12:47 UTC (permalink / raw)
  To: Atsushi Nemoto; +Cc: ralf, nemoto, linux-mips

On Mon, 14 Apr 2003, Atsushi Nemoto wrote:

> One more request.  Please enclose R4600_V1_HIT_CACHEOP_WAR and
> R4600_V2_HIT_CACHEOP_WAR with appropriate CONFIG_CPU_XXX.  I do not
> know what CPUs need this workaround... (at least TX49 does not need
> this)

 Obviously R4600 CPUs only. ;-)

-- 
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: macro@ds2.pg.gda.pl, PGP key available        +

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: End c-tx49.c's misserable existence
  2003-04-14  6:29     ` Atsushi Nemoto
  2003-04-14 12:47       ` Maciej W. Rozycki
@ 2003-04-14 15:48       ` Ralf Baechle
  2003-04-15 15:15         ` Atsushi Nemoto
  1 sibling, 1 reply; 8+ messages in thread
From: Ralf Baechle @ 2003-04-14 15:48 UTC (permalink / raw)
  To: Atsushi Nemoto; +Cc: nemoto, linux-mips

On Mon, Apr 14, 2003 at 03:29:03PM +0900, Atsushi Nemoto wrote:

> >>>>> On Mon, 14 Apr 2003 05:50:38 +0200, Ralf Baechle <ralf@linux-mips.org> said:
> ralf> Excellent.  This should provide a good performance boost for the
> ralf> TX49 also as disabling the I-cache during the flush made the
> ralf> operation even slower than it has to be.
> 
> Thank you for quick response.
> 
> One more request.  Please enclose R4600_V1_HIT_CACHEOP_WAR and
> R4600_V2_HIT_CACHEOP_WAR with appropriate CONFIG_CPU_XXX.  I do not
> know what CPUs need this workaround... (at least TX49 does not need
> this)

I'll leave it unconditionally enabled for now because the Makefiles could
behave in undefined ways if multiple CONFIG_CPU_* options are selected
and quite a few systems support both the R4600 and other processors like
the Indy.  Another day.

  Ralf

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: End c-tx49.c's misserable existence
  2003-04-14 15:48       ` Ralf Baechle
@ 2003-04-15 15:15         ` Atsushi Nemoto
  2003-04-15 15:19           ` Ralf Baechle
  0 siblings, 1 reply; 8+ messages in thread
From: Atsushi Nemoto @ 2003-04-15 15:15 UTC (permalink / raw)
  To: ralf; +Cc: nemoto, linux-mips

>>>>> On Mon, 14 Apr 2003 17:48:25 +0200, Ralf Baechle <ralf@linux-mips.org> said:

>> One more request.  Please enclose R4600_V1_HIT_CACHEOP_WAR and
>> R4600_V2_HIT_CACHEOP_WAR with appropriate CONFIG_CPU_XXX.  I do not
>> know what CPUs need this workaround... (at least TX49 does not need
>> this)

ralf> I'll leave it unconditionally enabled for now because the
ralf> Makefiles could behave in undefined ways if multiple
ralf> CONFIG_CPU_* options are selected and quite a few systems
ralf> support both the R4600 and other processors like the Indy.
ralf> Another day.

I have been misunderstood that people who needs the workaround always
select CONFIG_CPU_R4X00.  But it is not true.  Now I understand.

But recent reorganization increased a number of c-r4k.c users
somewhat.  How about introducing new config macros such as
CONFIG_R4600_V1_WORKAROUNDS ?

---
Atsushi Nemoto

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: End c-tx49.c's misserable existence
  2003-04-15 15:15         ` Atsushi Nemoto
@ 2003-04-15 15:19           ` Ralf Baechle
  0 siblings, 0 replies; 8+ messages in thread
From: Ralf Baechle @ 2003-04-15 15:19 UTC (permalink / raw)
  To: Atsushi Nemoto; +Cc: nemoto, linux-mips

On Wed, Apr 16, 2003 at 12:15:09AM +0900, Atsushi Nemoto wrote:
> Date:	Wed, 16 Apr 2003 00:15:09 +0900 (JST)
> To:	ralf@linux-mips.org
> Cc:	nemoto@toshiba-tops.co.jp, linux-mips@linux-mips.org
> Subject: Re: End c-tx49.c's misserable existence
> From:	Atsushi Nemoto <anemo@mba.ocn.ne.jp>
> Content-Type: Text/Plain; charset=us-ascii
> 
> >>>>> On Mon, 14 Apr 2003 17:48:25 +0200, Ralf Baechle <ralf@linux-mips.org> said:
> 
> >> One more request.  Please enclose R4600_V1_HIT_CACHEOP_WAR and
> >> R4600_V2_HIT_CACHEOP_WAR with appropriate CONFIG_CPU_XXX.  I do not
> >> know what CPUs need this workaround... (at least TX49 does not need
> >> this)
> 
> ralf> I'll leave it unconditionally enabled for now because the
> ralf> Makefiles could behave in undefined ways if multiple
> ralf> CONFIG_CPU_* options are selected and quite a few systems
> ralf> support both the R4600 and other processors like the Indy.
> ralf> Another day.
> 
> I have been misunderstood that people who needs the workaround always
> select CONFIG_CPU_R4X00.  But it is not true.  Now I understand.
> 
> But recent reorganization increased a number of c-r4k.c users
> somewhat.  How about introducing new config macros such as
> CONFIG_R4600_V1_WORKAROUNDS ?

That's all part of the Great Plan.  For now you can control many of the
workarounds in <asm/war.h>.

  Ralf

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: End c-tx49.c's misserable existence
  2003-04-14  3:35 ` End c-tx49.c's misserable existence Atsushi Nemoto
  2003-04-14  3:50   ` Ralf Baechle
@ 2003-08-01 13:27   ` Atsushi Nemoto
  1 sibling, 0 replies; 8+ messages in thread
From: Atsushi Nemoto @ 2003-08-01 13:27 UTC (permalink / raw)
  To: ralf; +Cc: linux-mips

>>>>> On Mon, 14 Apr 2003 12:35:14 +0900 (JST), Atsushi Nemoto <anemo@mba.ocn.ne.jp> said:
anemo> TOSHIBA_ICACHE_WAR can be removed.  This workaround is not
anemo> needed if kernel does not modify the cache codes itself in
anemo> run-time.

anemo> When I wrote c-tx49.c I blindly followed the statement in
anemo> TX49/H2 manual's statement. ("If the instruction (i.e. CACHE)
anemo> is issued for the line which this instruction itself exists,
anemo> the following operation is not guaranteed.")  Now I know this
anemo> warning is only for self-modified code.  There must be no
anemo> problem if the codes is not modified in run-time.  So please
anemo> remove all TOSHIBA_ICACHE_WAR stuff and make c-r4k.c more
anemo> clean.

Very sorry, I was wrong (unfortunately).  TX49 does NOT work correctly
if CACHE instruction was issued for the line which the code exists
(even if the code was never modified in run-time).

I implemented the workaround again in another way (put the flushing
loop on an aligned place and do two phase flushing).  I did not use
"#ifdef" in c-r4k.c since gcc will be omit unnecessary codes
automatically.

This is a patch against 2.4 branch (mips version only.  mips64 is
same).  This also can be applied for 2.6 branch.  Please apply.


diff -ur linux-mips-cvs/arch/mips/mm/c-r4k.c linux.new/arch/mips/mm/c-r4k.c
--- linux-mips-cvs/arch/mips/mm/c-r4k.c	Fri Aug  1 22:03:00 2003
+++ linux.new/arch/mips/mm/c-r4k.c	Fri Aug  1 22:08:52 2003
@@ -149,6 +149,58 @@
 	goto *l;
 }
 
+/* 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 tx49_blast_icache32(void)
+{
+	unsigned long start = KSEG0;
+	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 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)
 {
 	unsigned long ic_lsize = current_cpu_data.icache.linesz;
@@ -197,11 +249,18 @@
 	blast_icache64_page_indexed(addr);
 	return;
 
+ic_32_tx49:
+	tx49_blast_icache32_page_indexed(addr);
+	return;
+
 init:
 	if (ic_lsize == 16)
 		l = &&ic_16;
 	else if (ic_lsize == 32)
-		l = &&ic_32;
+		if (TX49XX_ICACHE_INDEX_INV_WAR)
+			l = &&ic_32_tx49;
+		else
+			l = &&ic_32;
 	else if (ic_lsize == 64)
 		l = &&ic_64;
 	goto *l;
@@ -226,11 +285,18 @@
 	blast_icache64();
 	return;
 
+ic_32_tx49:
+	tx49_blast_icache32();
+	return;
+
 init:
 	if (ic_lsize == 16)
 		l = &&ic_16;
 	else if (ic_lsize == 32)
-		l = &&ic_32;
+		if (TX49XX_ICACHE_INDEX_INV_WAR)
+			l = &&ic_32_tx49;
+		else
+			l = &&ic_32;
 	else if (ic_lsize == 64)
 		l = &&ic_64;
 	goto *l;
diff -ur linux-mips-cvs/include/asm-mips/war.h linux.new/include/asm-mips/war.h
--- linux-mips-cvs/include/asm-mips/war.h	Fri Aug  1 22:01:30 2003
+++ linux.new/include/asm-mips/war.h	Fri Aug  1 21:53:39 2003
@@ -148,6 +148,17 @@
 #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
+
+/*
  * Workarounds default to off
  */
 #ifndef R4600_V1_HIT_CACHEOP_WAR
@@ -171,5 +182,8 @@
 #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
 
 #endif /* _ASM_WAR_H */
---
Atsushi Nemoto

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2003-08-01 13:26 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <20030412163215Z8225197-1272+1264@linux-mips.org>
2003-04-14  3:35 ` End c-tx49.c's misserable existence Atsushi Nemoto
2003-04-14  3:50   ` Ralf Baechle
2003-04-14  6:29     ` Atsushi Nemoto
2003-04-14 12:47       ` Maciej W. Rozycki
2003-04-14 15:48       ` Ralf Baechle
2003-04-15 15:15         ` Atsushi Nemoto
2003-04-15 15:19           ` Ralf Baechle
2003-08-01 13:27   ` Atsushi Nemoto

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox