lkml.org 
[lkml]   [2002]   [Feb]   [9]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
From
SubjectRe: [PATCH] NSC Geode Companion chip workaround
Date

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 <miura@da-cha.org> writes:
> In message "Re: [PATCH] NSC Geode Companion chip workaround"
> on 02/02/06, "Maciej W. Rozycki" <macro@ds2.pg.gda.pl> writes:
> > On Wed, 6 Feb 2002, Hiroshi MIURA wrote:
> >
> > > 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.multiread Sat Feb 9 22:24:51 2002
+++ /usr/src/linux/arch/i386/kernel/time.c.readback Sat Feb 9 20:36:41 2002
@@ -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);

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


-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

\
 
 \ /
  Last update: 2005-03-22 13:24    [W:0.087 / U:0.912 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site