Skip to contentSkip to conversation

NSC Geode Companion chip workaround

PATCH In review Hiroshi MIURA 3 participants 5 messages Feb 6, 2002 – Feb 10, 2002 Kbuild

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 NSC Geode Companion chip workaround

Cyrix MediaGX/GXm or NSC Geode have PIT bug not TSC bug. but in linux kernel, if CPU is Cyrix, then TSC flag is disabled. This is not correct way, I think.

A patch atached below is originally from NetBSD kernel code. In FreeBSD bug tracking system, this was discussed.

http://www.freebsd.org/cgi/query-pr.cgi?pr=6630

Here is NetBSD patch.
http://www.netbsd.org/cgi-bin/query-pr-single.pl?number=8654

in this patch, this code is activate only if you defines CONFIG_CS5520. I've tryed several month with this patch, It seems good for me.
trial machine: Casio CASSIOPEIA FIVA 101 and Fiva 103.
MediaGX 200MHz and NSC Geode 300MHz.

arch/i386/kernel/setup.c +4 -0
diff -ur kernel-source-2.4.7/arch/i386/kernel/setup.c linux/arch/i386/kernel/setup.c
@@ -1425,14 +1425,18 @@
 		/* GXm supports extended cpuid levels 'ala' AMD */
 		if (c->cpuid_level == 2) {
 			get_model_name(c);  /* get CPU marketing name */
+#ifndef CONFIG_CS5520
 			clear_bit(X86_FEATURE_TSC, c->x86_capability);
+#endif
 			return;
 		}
 		else {  /* MediaGX */
 			Cx86_cb[2] = (dir0_lsn & 1) ? '3' : '4';
 			p = Cx86_cb+2;
 			c->x86_model = (dir1 & 0x20) ? 1 : 2;
+#ifndef CONFIG_CS5520
 			clear_bit(X86_FEATURE_TSC, &c->x86_capability);
+#endif
 		}
 		break;
 
arch/i386/kernel/time.c +64 -0

94 lines not on this page · raw message

Hiroshi Miura --- [email protected] http://www.da-cha.org/
CCNA, Oracle Silver Master, Network Specialist(JITEC) My interest: http://www.cis.com.tw/Product/WS-U50R.htm

#1 lore raw
Quoted 4 lines

in this patch, this code is activate only if you defines CONFIG_CS5520. I've tryed several month with this patch, It seems good for me.
trial machine: Casio CASSIOPEIA FIVA 101 and Fiva 103.
MediaGX 200MHz and NSC Geode 300MHz.

Interesting. That would explain a lot. Unfortunately when I first reported that problem and disabled the TSC Cyrix actually refused to believe the problem existed.

With the below it looks fixable

(The CONFIG_CS5520 we can replace I think with a check for the PCI device)

#2 lore raw
In reply to Hiroshi MIURA
Quoted 3 lines · Hiroshi MIURA

I've tryed several month with this patch, It seems good for me.
trial machine: Casio CASSIOPEIA FIVA 101 and Fiva 103.
MediaGX 200MHz and NSC Geode 300MHz.

Does the chip fail with the readback 8254 command as well? If not, it
would be a less intrusive change.

Signature · 3 lines
+  Maciej W. Rozycki, Technical University of Gdansk, Poland   +
+--------------------------------------------------------------+
+        e-mail: [email protected], PGP key available        +
#3 lore raw

In message "Re: [PATCH] NSC Geode Companion chip workaround"

    on 02/02/06, "Maciej W. Rozycki" <[email protected]> writes:
Quoted 8 lines · Hiroshi MIURA
Quoted 4 lines

I've tryed several month with this patch, It seems good for me.
trial machine: Casio CASSIOPEIA FIVA 101 and Fiva 103.
MediaGX 200MHz and NSC Geode 300MHz.

Does the chip fail with the readback 8254 command as well? If not, it
would be a less intrusive change.

OK, I want to try 8254 readback command. I will report after weekend.

Hiroshi Miura --- [email protected] http://www.da-cha.org/
CCNA, Oracle Silver Master, Network Specialist(JITEC) My interest: http://www.cis.com.tw/Product/WS-U50R.htm

#4 lore raw
In reply to Maciej W. Rozycki

the MediaGX/Geode companion chip CS5520 fails the latch with the read-back 8254 command as well as 8253 latch command.

test program: <list1>

kernel configuration: CONFIG_M586

kernel code with read-back command: <list2>

test results:
1. kernel 2.4.16 (without any fix, TSC disable)

               fails iteration: 500-1,500
               value of '(now - prev)' when fail:
                               -100 - -200 micro sec

2. kernel 2.4.16 (with my patch)
fails iteration: 35,000-70,000 error value: -10 - -20 micro sec
3. kernel 2.4.16 (with read-back command, TSC enable) fails iteration: 5,000-7,000 error value: about -20,000 micro sec
4. kernel 2.4.16 (without any fix but TSC enable) fails iteration: 5,000-7,000 error value: about -20,000 micro sec

these means 'read-back command' fails as well as 'latch command'. and my patch is better than others.

In message "Re: [PATCH] NSC Geode Companion chip workaround"

    on 02/02/09, Hiroshi MIURA <[email protected]> writes:
Quoted 4 lines

In message "Re: [PATCH] NSC Geode Companion chip workaround"

    on 02/02/06, "Maciej W. Rozycki" <[email protected]> writes:
Quoted 2 lines · Hiroshi MIURA
Quoted 8 lines
Quoted 6 lines
Quoted 3 lines

I've tryed several month with this patch, It seems good for me.
trial machine: Casio CASSIOPEIA FIVA 101 and Fiva 103.
MediaGX 200MHz and NSC Geode 300MHz.

Does the chip fail with the readback 8254 command as well? If not, it
would be a less intrusive change.

OK, I want to try 8254 readback command. I will report after weekend.

<list1>
----------------
#include <sys/time.h>
#include <time.h>
#include <assert.h>

int main(void) {
struct timeval tv[2];
struct timeval *now, *prev;
int iterations = 0;

  now = &tv[0];
  prev = &tv[1];
  gettimeofday(prev, NULL);

  for (;;) {
    struct timeval *tmp;
    gettimeofday(now, NULL);
    if (!((now->tv_sec > prev->tv_sec) ||
	   (now->tv_sec == prev->tv_sec && now->tv_usec >= prev->tv_usec)))
		printf ("Err: prev: %d,  %d, now: %d, %d, iter: %d\n", prev->tv_sec,
			prev->tv_usec, now->tv_sec, now->tv_usec, iterations);
    tmp = prev;
    prev = now;
    now = tmp;
    iterations++;

}
return iterations;
}
----------------
<list2>
----------------

usr/src/linux/arch/i386/kernel/time.c.readback renamed from usr/src/linux/arch/i386/kernel/time.c.multiread +22 -0
@@ -474,6 +474,7 @@
 #ifdef CONFIG_CS5520
 	int count1, count2, count3;
 	int n1, n2, n3;
+	int i, cont, status;
 #endif
 
 	/*
@@ -517,6 +518,26 @@
  
 	do_timer_interrupt(irq, NULL, regs);
 #else
+#if 1
+	    for (i = 0, cont = 1; cont && ( i < 3 ); i++) {
+		spin_lock(&i8253_lock);
+		outb_p(0xf2, 0x43);   /* read-back command */
+		status = inb_p(0x40);
+		count = inb_p(0x40);
+		count |= inb_p(0x40) << 8;
+		spin_unlock(&i8253_lock);
+
+		cont = status & (1 << 6);
+            }
+
+		if (cont) 
+			printk("PIT latch fails 3 times.\n");
+
+		count = ((LATCH-1) - count) * TICK_SIZE;
+		delay_at_last_interrupt = (count + LATCH/2) / LATCH;
+	}
+	do_timer_interrupt(irq, NULL, regs);
+#else
 		spin_lock(&i8253_lock);
 		outb_p(0x00, 0x43);	/* latch the count ASAP */
 /* this codes comes from FreeBSD */
@@ -568,6 +589,7 @@
 	}
 
       do_timer_interrupt(irq, NULL, regs);
+#endif
 #endif
 
 	write_unlock(&xtime_lock);
Signature · 3 lines
Hiroshi Miura  --- [email protected] http://www.da-cha.org/ 
CCNA, Oracle Silver Master, Network Specialist(JITEC)
My interest: http://www.cis.com.tw/Product/WS-U50R.htm