* [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
@ 2007-07-15 12:00 TAKADA Yoshihito
2007-07-15 19:06 ` Juergen Beisert
0 siblings, 1 reply; 15+ messages in thread
From: TAKADA Yoshihito @ 2007-07-15 12:00 UTC (permalink / raw)
To: linux-kernel
Hi. I reported to remove pit_latch_buggy(http://lkml.org/lkml/2007/2/10/8).
In the report, I stated that TSC was unstable.
When I installed 2.6.21, GeodeGX's TSC is stable.
It was fixed by http://bugzilla.kernel.org/show_bug.cgi?id=8027 and follow:
commit 6b3964cde70cfe6db79d35b42137431ef7d2f7e4
Author: Thomas Gleixner <tglx@linutronix.de>
Date: Thu Mar 22 22:46:18 2007 +0100
[PATCH] i386: clockevents fix breakage on Geode/Cyrix PIT implementations
In 2.6.22, marks unstable GeodeGX's TSC. However, it is not necessary to
mark TSC is unstable.
Signed-off-by: TAKADA Yoshihito <takada@mbf.nifty.com>
diff -Narup a/arch/i386/kernel/cpu/cyrix.c b/arch/i386/kernel/cpu/cyrix.c
--- a/arch/i386/kernel/cpu/cyrix.c 2007-07-15 16:55:29.000000000 +0900
+++ b/arch/i386/kernel/cpu/cyrix.c 2007-07-15 20:21:11.000000000 +0900
@@ -6,7 +6,6 @@
#include <asm/io.h>
#include <asm/processor.h>
#include <asm/timer.h>
-#include <asm/pci-direct.h>
#include <asm/tsc.h>
#include "cpu.h"
@@ -252,8 +251,6 @@ static void __cpuinit init_cyrix(struct
case 4: /* MediaGX/GXm or Geode GXM/GXLV/GX1 */
#ifdef CONFIG_PCI
- {
- u32 vendor, device;
/* It isn't really a PCI quirk directly, but the cure is the
same. The MediaGX has deep magic SMM stuff that handles the
SB emulation. It thows away the fifo on disable_dma() which
@@ -268,21 +265,6 @@ static void __cpuinit init_cyrix(struct
printk(KERN_INFO "Working around Cyrix MediaGX virtual DMA bugs.\n");
isa_dma_bridge_buggy = 2;
-
- /* We do this before the PCI layer is running. However we
- are safe here as we know the bridge must be a Cyrix
- companion and must be present */
- vendor = read_pci_config_16(0, 0, 0x12, PCI_VENDOR_ID);
- device = read_pci_config_16(0, 0, 0x12, PCI_DEVICE_ID);
-
- /*
- * The 5510/5520 companion chips have a funky PIT.
- */
- if (vendor == PCI_VENDOR_ID_CYRIX &&
- (device == PCI_DEVICE_ID_CYRIX_5510 || device == PCI_DEVICE_ID_CYRIX_5520))
- /*mark_tsc_unstable("cyrix 5510/5520 detected");*/
- printk("cyrix 5510/5520 detected\n");
- }
#endif
c->x86_cache_size=16; /* Yep 16K integrated cache thats it */
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-15 12:00 [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable TAKADA Yoshihito
@ 2007-07-15 19:06 ` Juergen Beisert
2007-07-15 23:59 ` TAKADA Yoshihito
2007-07-19 1:02 ` Andrew Morton
0 siblings, 2 replies; 15+ messages in thread
From: Juergen Beisert @ 2007-07-15 19:06 UTC (permalink / raw)
To: TAKADA Yoshihito; +Cc: linux-kernel
[-- Attachment #1: Type: text/plain, Size: 680 bytes --]
Hi,
On Sunday 15 July 2007 14:00, TAKADA Yoshihito wrote:
> Hi. I reported to remove pit_latch_buggy(http://lkml.org/lkml/2007/2/10/8).
> In the report, I stated that TSC was unstable.
> When I installed 2.6.21, GeodeGX's TSC is stable.
GeodeGX1's TSC is stable until you activate halt/suspend feature. In
arch/i386/kernel/cpu/cyrix.c:geode_configure() it will be activated by
default. But due to a macro failure the line
setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
does nothing.
Replace the setCx86/getCx86 macros by the attached patch, and the TSC will be
unstable again!
So it makes sense to mark the TSC unstable if the halt/suspend feature is
activated.
Juergen
[-- Attachment #2: setup_correct_chipset_access_functions.patch --]
[-- Type: text/x-diff, Size: 3554 bytes --]
From: Juergen Beisert <juergen@kreuzholzen.de>
Replace NSC/Cyrix specific chipset access macros by inlined functions.
With the macros a line like this fails (and does nothing):
setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
With inlined functions this line will work as expected.
Note about a side effect: Seems on Geode GX1 based systems the
"suspend on halt power saving feature" was never enabled due to this
wrong macro expansion. With inlined functions it will be enabled, but
this will stop the TSC when the CPU runs into a HLT instruction.
Kernel output something like this:
Clocksource tsc unstable (delta = -472746897 ns)
Signed-off-by: Juergen Beisert <juergen@kreuzholzen.de>
Index: include/asm-i386/processor.h
===================================================================
--- include/asm-i386/processor.h.orig
+++ include/asm-i386/processor.h
@@ -168,17 +168,6 @@ static inline void clear_in_cr4 (unsigne
write_cr4(cr4);
}
-/*
- * NSC/Cyrix CPU indexed register access macros
- */
-
-#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86(reg, data) do { \
- outb((reg), 0x22); \
- outb((data), 0x23); \
-} while (0)
-
/* Stop speculative execution */
static inline void sync_core(void)
{
Index: include/asm-i386/processor-cyrix.h
===================================================================
--- /dev/null
+++ include/asm-i386/processor-cyrix.h
@@ -0,0 +1,20 @@
+#ifndef __ASM_I386_PROCESSOR_CYRIX_H
+#define __ASM_I386_PROCESSOR_CYRIX
+
+#include <asm/processor-flags.h>
+/*
+ * NSC/Cyrix CPU indexed register access
+ */
+static inline u8 getCx86(u8 reg)
+{
+ outb(reg, 0x22);
+ return inb(0x23);
+}
+
+static inline void setCx86(u8 reg, u8 data)
+{
+ outb(reg, 0x22);
+ outb(data, 0x23);
+}
+
+#endif
Index: arch/i386/kernel/cpu/cyrix.c
===================================================================
--- arch/i386/kernel/cpu/cyrix.c.orig
+++ arch/i386/kernel/cpu/cyrix.c
@@ -4,7 +4,7 @@
#include <linux/pci.h>
#include <asm/dma.h>
#include <asm/io.h>
-#include <asm/processor.h>
+#include <asm/processor-cyrix.h>
#include <asm/timer.h>
#include <asm/pci-direct.h>
#include <asm/tsc.h>
Index: arch/i386/kernel/cpu/mtrr/cyrix.c
===================================================================
--- arch/i386/kernel/cpu/mtrr/cyrix.c.orig
+++ arch/i386/kernel/cpu/mtrr/cyrix.c
@@ -3,6 +3,7 @@
#include <asm/mtrr.h>
#include <asm/msr.h>
#include <asm/io.h>
+#include <asm/processor-cyrix.h>
#include "mtrr.h"
int arr3_protected;
Index: arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
===================================================================
--- arch/i386/kernel/cpu/cpufreq/gx-suspmod.c.orig
+++ arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
@@ -79,7 +79,7 @@
#include <linux/smp.h>
#include <linux/cpufreq.h>
#include <linux/pci.h>
-#include <asm/processor.h>
+#include <asm/processor-cyrix.h>
#include <asm/errno.h>
/* PCI config registers, all at F0 */
Index: include/asm-x86_64/processor.h
===================================================================
--- include/asm-x86_64/processor.h.orig
+++ include/asm-x86_64/processor.h
@@ -391,17 +391,6 @@ static inline void prefetchw(void *x)
#define cpu_relax() rep_nop()
-/*
- * NSC/Cyrix CPU indexed register access macros
- */
-
-#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86(reg, data) do { \
- outb((reg), 0x22); \
- outb((data), 0x23); \
-} while (0)
-
static inline void serialize_cpu(void)
{
__asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx");
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-15 19:06 ` Juergen Beisert
@ 2007-07-15 23:59 ` TAKADA Yoshihito
2007-07-19 1:02 ` Andrew Morton
1 sibling, 0 replies; 15+ messages in thread
From: TAKADA Yoshihito @ 2007-07-15 23:59 UTC (permalink / raw)
To: Juergen Beisert; +Cc: linux-kernel
Hi.
Thanks. you are right. TSC is still unstable.
On Sun, 15 Jul 2007 21:06:27 +0200
Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> Hi,
>
> On Sunday 15 July 2007 14:00, TAKADA Yoshihito wrote:
> > Hi. I reported to remove pit_latch_buggy(http://lkml.org/lkml/2007/2/10/8).
> > In the report, I stated that TSC was unstable.
> > When I installed 2.6.21, GeodeGX's TSC is stable.
>
> GeodeGX1's TSC is stable until you activate halt/suspend feature. In
> arch/i386/kernel/cpu/cyrix.c:geode_configure() it will be activated by
> default. But due to a macro failure the line
> setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
> does nothing.
> Replace the setCx86/getCx86 macros by the attached patch, and the TSC will be
> unstable again!
>
> So it makes sense to mark the TSC unstable if the halt/suspend feature is
> activated.
>
> Juergen
--
TAKADA <takada@mbf.nifty.com>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-15 19:06 ` Juergen Beisert
2007-07-15 23:59 ` TAKADA Yoshihito
@ 2007-07-19 1:02 ` Andrew Morton
2007-07-19 6:49 ` Juergen Beisert
1 sibling, 1 reply; 15+ messages in thread
From: Andrew Morton @ 2007-07-19 1:02 UTC (permalink / raw)
To: Juergen Beisert
Cc: TAKADA Yoshihito, linux-kernel, Jordan Crouse, Andres Salomon,
Andi Kleen, Alan Cox
On Sun, 15 Jul 2007 21:06:27 +0200
Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> Replace NSC/Cyrix specific chipset access macros by inlined functions.
> With the macros a line like this fails (and does nothing):
> setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
> With inlined functions this line will work as expected.
I don't get it. Why would the macros behave differently from inlined
functions?
diff -puN /dev/null include/asm-i386/processor-cyrix.h
> --- /dev/null
> +++ a/include/asm-i386/processor-cyrix.h
> @@ -0,0 +1,20 @@
> +#ifndef __ASM_I386_PROCESSOR_CYRIX_H
> +#define __ASM_I386_PROCESSOR_CYRIX
> +
> +#include <asm/processor-flags.h>
> +/*
> + * NSC/Cyrix CPU indexed register access
> + */
> +static inline u8 getCx86(u8 reg)
> +{
> + outb(reg, 0x22);
> + return inb(0x23);
> +}
> +
> +static inline void setCx86(u8 reg, u8 data)
> +{
> + outb(reg, 0x22);
> + outb(data, 0x23);
> +}
> +
> +#endif
> diff -puN include/asm-i386/processor.h~i386-geodes-tsc-is-not-neccessary-to-mark-tu-unstable include/asm-i386/processor.h
> --- a/include/asm-i386/processor.h~i386-geodes-tsc-is-not-neccessary-to-mark-tu-unstable
> +++ a/include/asm-i386/processor.h
> @@ -168,17 +168,6 @@ static inline void clear_in_cr4 (unsigne
> write_cr4(cr4);
> }
>
> -/*
> - * NSC/Cyrix CPU indexed register access macros
> - */
> -
> -#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
> -
> -#define setCx86(reg, data) do { \
> - outb((reg), 0x22); \
> - outb((data), 0x23); \
> -} while (0)
> -
> /* Stop speculative execution */
> static inline void sync_core(void)
> {
> diff -puN include/asm-x86_64/processor.h~i386-geodes-tsc-is-not-neccessary-to-mark-tu-unstable include/asm-x86_64/processor.h
> --- a/include/asm-x86_64/processor.h~i386-geodes-tsc-is-not-neccessary-to-mark-tu-unstable
> +++ a/include/asm-x86_64/processor.h
> @@ -389,17 +389,6 @@ static inline void prefetchw(void *x)
>
> #define cpu_relax() rep_nop()
>
> -/*
> - * NSC/Cyrix CPU indexed register access macros
> - */
> -
> -#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
> -
> -#define setCx86(reg, data) do { \
> - outb((reg), 0x22); \
> - outb((data), 0x23); \
> -} while (0)
> -
> static inline void serialize_cpu(void)
> {
> __asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx");
>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 1:02 ` Andrew Morton
@ 2007-07-19 6:49 ` Juergen Beisert
2007-07-19 7:17 ` Andres Salomon
0 siblings, 1 reply; 15+ messages in thread
From: Juergen Beisert @ 2007-07-19 6:49 UTC (permalink / raw)
To: Andrew Morton
Cc: TAKADA Yoshihito, linux-kernel, Jordan Crouse, Andres Salomon,
Andi Kleen, Alan Cox
On Thursday 19 July 2007 03:02, Andrew Morton wrote:
> On Sun, 15 Jul 2007 21:06:27 +0200
>
> Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> > Replace NSC/Cyrix specific chipset access macros by inlined functions.
> > With the macros a line like this fails (and does nothing):
> > setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
> > With inlined functions this line will work as expected.
>
> I don't get it. Why would the macros behave differently from inlined
> functions?
X86 magic. The access order is important. The first access must always be the
offset at 0x22. This access enables the next access to 0x23 (data). If you do
it in wrong order, it fails. With the macros you get something like 0x22,
0x22, 0x23, 0x23. With the inline functions 0x22,0x23,0x22,0x23.
Juergen
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 6:49 ` Juergen Beisert
@ 2007-07-19 7:17 ` Andres Salomon
2007-07-19 8:22 ` Andi Kleen
2007-07-19 8:52 ` Juergen Beisert
0 siblings, 2 replies; 15+ messages in thread
From: Andres Salomon @ 2007-07-19 7:17 UTC (permalink / raw)
To: Juergen Beisert
Cc: Andrew Morton, TAKADA Yoshihito, linux-kernel, Jordan Crouse,
Andres Salomon, Andi Kleen, Alan Cox
On Thu, 19 Jul 2007 08:49:05 +0200
Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> On Thursday 19 July 2007 03:02, Andrew Morton wrote:
> > On Sun, 15 Jul 2007 21:06:27 +0200
> >
> > Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> > > Replace NSC/Cyrix specific chipset access macros by inlined functions.
> > > With the macros a line like this fails (and does nothing):
> > > setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
> > > With inlined functions this line will work as expected.
> >
> > I don't get it. Why would the macros behave differently from inlined
> > functions?
>
> X86 magic. The access order is important. The first access must always be the
> offset at 0x22. This access enables the next access to 0x23 (data). If you do
> it in wrong order, it fails. With the macros you get something like 0x22,
> 0x22, 0x23, 0x23. With the inline functions 0x22,0x23,0x22,0x23.
>
> Juergen
Wow, that's a really cool bug; nice work! Don't forget to update
arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well. It needs
to include processor-cyrix.h.
Acked-by: Andres Salomon <dilinger@debian.org>
--
Andres Salomon <dilinger@queued.net>
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 7:17 ` Andres Salomon
@ 2007-07-19 8:22 ` Andi Kleen
2007-07-19 8:52 ` Juergen Beisert
2007-07-22 16:17 ` Satyam Sharma
2007-07-19 8:52 ` Juergen Beisert
1 sibling, 2 replies; 15+ messages in thread
From: Andi Kleen @ 2007-07-19 8:22 UTC (permalink / raw)
To: Andres Salomon
Cc: Juergen Beisert, Andrew Morton, TAKADA Yoshihito, linux-kernel,
Jordan Crouse, Andres Salomon, Alan Cox
> Wow, that's a really cool bug; nice work! Don't forget to update
> arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well. It needs
> to include processor-cyrix.h.
It also needs some big fat comments
-Andi
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 7:17 ` Andres Salomon
2007-07-19 8:22 ` Andi Kleen
@ 2007-07-19 8:52 ` Juergen Beisert
1 sibling, 0 replies; 15+ messages in thread
From: Juergen Beisert @ 2007-07-19 8:52 UTC (permalink / raw)
To: Andres Salomon
Cc: Andrew Morton, TAKADA Yoshihito, linux-kernel, Jordan Crouse,
Andres Salomon, Andi Kleen, Alan Cox
[-- Attachment #1: Type: text/plain, Size: 1296 bytes --]
On Thursday 19 July 2007 09:17, Andres Salomon wrote:
> On Thu, 19 Jul 2007 08:49:05 +0200
>
> Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> > On Thursday 19 July 2007 03:02, Andrew Morton wrote:
> > > On Sun, 15 Jul 2007 21:06:27 +0200
> > >
> > > Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> > > > Replace NSC/Cyrix specific chipset access macros by inlined
> > > > functions. With the macros a line like this fails (and does nothing):
> > > > setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
> > > > With inlined functions this line will work as expected.
> > >
> > > I don't get it. Why would the macros behave differently from inlined
> > > functions?
> >
> > X86 magic. The access order is important. The first access must always be
> > the offset at 0x22. This access enables the next access to 0x23 (data).
> > If you do it in wrong order, it fails. With the macros you get something
> > like 0x22, 0x22, 0x23, 0x23. With the inline functions
> > 0x22,0x23,0x22,0x23.
> >
> > Juergen
>
> Wow, that's a really cool bug; nice work! Don't forget to update
> arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well. It
> needs to include processor-cyrix.h.
>
>
> Acked-by: Andres Salomon <dilinger@debian.org>
Missing include patch attached. Thanks.
Juergen
[-- Attachment #2: missing-include.patch --]
[-- Type: text/x-diff, Size: 322 bytes --]
Index: arch/i386/kernel/cpu/mtrr/state.c
===================================================================
--- arch/i386/kernel/cpu/mtrr/state.c
+++ arch/i386/kernel/cpu/mtrr/state.c
@@ -3,6 +3,7 @@
#include <asm/io.h>
#include <asm/mtrr.h>
#include <asm/msr.h>
+#include <asm/processor-cyrix.h>
#include "mtrr.h"
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 8:22 ` Andi Kleen
@ 2007-07-19 8:52 ` Juergen Beisert
2007-07-19 9:25 ` Andi Kleen
2007-07-22 16:17 ` Satyam Sharma
1 sibling, 1 reply; 15+ messages in thread
From: Juergen Beisert @ 2007-07-19 8:52 UTC (permalink / raw)
To: Andi Kleen
Cc: Andres Salomon, Andrew Morton, TAKADA Yoshihito, linux-kernel,
Jordan Crouse, Andres Salomon, Alan Cox
On Thursday 19 July 2007 10:22, Andi Kleen wrote:
> > Wow, that's a really cool bug; nice work! Don't forget to update
> > arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well. It
> > needs to include processor-cyrix.h.
>
> It also needs some big fat comments
No problem. Where to add?
Juergen
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 8:52 ` Juergen Beisert
@ 2007-07-19 9:25 ` Andi Kleen
2007-07-19 10:25 ` Juergen Beisert
0 siblings, 1 reply; 15+ messages in thread
From: Andi Kleen @ 2007-07-19 9:25 UTC (permalink / raw)
To: Juergen Beisert
Cc: Andres Salomon, Andrew Morton, TAKADA Yoshihito, linux-kernel,
Jordan Crouse, Andres Salomon, Alan Cox
On Thursday 19 July 2007 10:52:48 Juergen Beisert wrote:
> On Thursday 19 July 2007 10:22, Andi Kleen wrote:
> > > Wow, that's a really cool bug; nice work! Don't forget to update
> > > arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well. It
> > > needs to include processor-cyrix.h.
> >
> > It also needs some big fat comments
>
> No problem. Where to add?
Where the inlines are defined.
Also can you please resubmit full patches with full description
and Signed off lines, not incrementals? Thanks.
-Andi
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 9:25 ` Andi Kleen
@ 2007-07-19 10:25 ` Juergen Beisert
2007-07-19 13:56 ` Andi Kleen
0 siblings, 1 reply; 15+ messages in thread
From: Juergen Beisert @ 2007-07-19 10:25 UTC (permalink / raw)
To: Andi Kleen
Cc: Andres Salomon, Andrew Morton, TAKADA Yoshihito, linux-kernel,
Jordan Crouse, Alan Cox
[-- Attachment #1: Type: text/plain, Size: 651 bytes --]
Hi Andi,
On Thursday 19 July 2007 11:25, Andi Kleen wrote:
> On Thursday 19 July 2007 10:52:48 Juergen Beisert wrote:
> > On Thursday 19 July 2007 10:22, Andi Kleen wrote:
> > > > Wow, that's a really cool bug; nice work! Don't forget to update
> > > > arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well.
> > > > It needs to include processor-cyrix.h.
> > >
> > > It also needs some big fat comments
> >
> > No problem. Where to add?
>
> Where the inlines are defined.
>
> Also can you please resubmit full patches with full description
> and Signed off lines, not incrementals? Thanks.
Find attached. Hope its ok now.
Juergen
[-- Attachment #2: setup_correct_chipset_access_functions.patch --]
[-- Type: text/x-diff, Size: 4452 bytes --]
From: Juergen Beisert <juergen@kreuzholzen.de>
Replace NSC/Cyrix specific chipset access macros by inlined functions.
With the macros a line like this fails (and does nothing):
setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
With inlined functions this line will work as expected.
Note about a side effect: Seems on Geode GX1 based systems the
"suspend on halt power saving feature" was never enabled due to this
wrong macro expansion. With inlined functions it will be enabled, but
this will stop the TSC when the CPU runs into a HLT instruction.
Kernel output something like this:
Clocksource tsc unstable (delta = -472746897 ns)
This is the 3rd version of this patch.
- Adding missed arch/i386/kernel/cpu/mtrr/state.c
Thanks to Andres Salomon
- Adding some big fat comments into the new header file
Suggested by Andi Kleen
Signed-off-by: Juergen Beisert <juergen@kreuzholzen.de>
Index: include/asm-i386/processor.h
===================================================================
--- include/asm-i386/processor.h.orig
+++ include/asm-i386/processor.h
@@ -168,17 +168,6 @@ static inline void clear_in_cr4 (unsigne
write_cr4(cr4);
}
-/*
- * NSC/Cyrix CPU indexed register access macros
- */
-
-#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86(reg, data) do { \
- outb((reg), 0x22); \
- outb((data), 0x23); \
-} while (0)
-
/* Stop speculative execution */
static inline void sync_core(void)
{
Index: include/asm-i386/processor-cyrix.h
===================================================================
--- /dev/null
+++ include/asm-i386/processor-cyrix.h
@@ -0,0 +1,30 @@
+/*
+ * NSC/Cyrix CPU indexed register access. Must be inlined instead of
+ * macros to ensure correct access ordering
+ * Access order is always 0x22 (=offset), 0x23 (=value)
+ *
+ * When using the old macros a line like
+ * setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
+ * gets expanded to:
+ * do {
+ * outb((CX86_CCR2), 0x22);
+ * outb((({
+ * outb((CX86_CCR2), 0x22);
+ * inb(0x23);
+ * }) | 0x88), 0x23);
+ * } while (0);
+ *
+ * which in fact violates the access order (= 0x22, 0x22, 0x23, 0x23).
+ */
+
+static inline u8 getCx86(u8 reg)
+{
+ outb(reg, 0x22);
+ return inb(0x23);
+}
+
+static inline void setCx86(u8 reg, u8 data)
+{
+ outb(reg, 0x22);
+ outb(data, 0x23);
+}
Index: arch/i386/kernel/cpu/cyrix.c
===================================================================
--- arch/i386/kernel/cpu/cyrix.c.orig
+++ arch/i386/kernel/cpu/cyrix.c
@@ -4,7 +4,7 @@
#include <linux/pci.h>
#include <asm/dma.h>
#include <asm/io.h>
-#include <asm/processor.h>
+#include <asm/processor-cyrix.h>
#include <asm/timer.h>
#include <asm/pci-direct.h>
#include <asm/tsc.h>
Index: arch/i386/kernel/cpu/mtrr/cyrix.c
===================================================================
--- arch/i386/kernel/cpu/mtrr/cyrix.c.orig
+++ arch/i386/kernel/cpu/mtrr/cyrix.c
@@ -3,6 +3,7 @@
#include <asm/mtrr.h>
#include <asm/msr.h>
#include <asm/io.h>
+#include <asm/processor-cyrix.h>
#include "mtrr.h"
int arr3_protected;
Index: arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
===================================================================
--- arch/i386/kernel/cpu/cpufreq/gx-suspmod.c.orig
+++ arch/i386/kernel/cpu/cpufreq/gx-suspmod.c
@@ -79,7 +79,7 @@
#include <linux/smp.h>
#include <linux/cpufreq.h>
#include <linux/pci.h>
-#include <asm/processor.h>
+#include <asm/processor-cyrix.h>
#include <asm/errno.h>
/* PCI config registers, all at F0 */
Index: include/asm-x86_64/processor.h
===================================================================
--- include/asm-x86_64/processor.h.orig
+++ include/asm-x86_64/processor.h
@@ -391,17 +391,6 @@ static inline void prefetchw(void *x)
#define cpu_relax() rep_nop()
-/*
- * NSC/Cyrix CPU indexed register access macros
- */
-
-#define getCx86(reg) ({ outb((reg), 0x22); inb(0x23); })
-
-#define setCx86(reg, data) do { \
- outb((reg), 0x22); \
- outb((data), 0x23); \
-} while (0)
-
static inline void serialize_cpu(void)
{
__asm__ __volatile__ ("cpuid" : : : "ax", "bx", "cx", "dx");
Index: arch/i386/kernel/cpu/mtrr/state.c
===================================================================
--- arch/i386/kernel/cpu/mtrr/state.c.orig
+++ arch/i386/kernel/cpu/mtrr/state.c
@@ -3,6 +3,7 @@
#include <asm/io.h>
#include <asm/mtrr.h>
#include <asm/msr.h>
+#include <asm/processor-cyrix.h>
#include "mtrr.h"
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 10:25 ` Juergen Beisert
@ 2007-07-19 13:56 ` Andi Kleen
2007-07-20 18:21 ` Andrew Morton
0 siblings, 1 reply; 15+ messages in thread
From: Andi Kleen @ 2007-07-19 13:56 UTC (permalink / raw)
To: Juergen Beisert
Cc: Andres Salomon, Andrew Morton, TAKADA Yoshihito, linux-kernel,
Jordan Crouse, Alan Cox
Juergen Beisert <juergen127@kreuzholzen.de> writes:
> Hi Andi,
>
> On Thursday 19 July 2007 11:25, Andi Kleen wrote:
> > On Thursday 19 July 2007 10:52:48 Juergen Beisert wrote:
> > > On Thursday 19 July 2007 10:22, Andi Kleen wrote:
> > > > > Wow, that's a really cool bug; nice work! Don't forget to update
> > > > > arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well.
> > > > > It needs to include processor-cyrix.h.
> > > >
> > > > It also needs some big fat comments
> > >
> > > No problem. Where to add?
> >
> > Where the inlines are defined.
> >
> > Also can you please resubmit full patches with full description
> > and Signed off lines, not incrementals? Thanks.
>
> Find attached. Hope its ok now.
For future reference:
- Please send the patches inline if possible
- Generate them from top level (so path start with linux...)
I fixed it all up
-Andi
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 13:56 ` Andi Kleen
@ 2007-07-20 18:21 ` Andrew Morton
2007-07-20 21:16 ` Andi Kleen
0 siblings, 1 reply; 15+ messages in thread
From: Andrew Morton @ 2007-07-20 18:21 UTC (permalink / raw)
To: Andi Kleen
Cc: Juergen Beisert, Andres Salomon, TAKADA Yoshihito, linux-kernel,
Jordan Crouse, Alan Cox
On 19 Jul 2007 15:56:51 +0200
Andi Kleen <andi@firstfloor.org> wrote:
> Juergen Beisert <juergen127@kreuzholzen.de> writes:
>
> > Hi Andi,
> >
> > On Thursday 19 July 2007 11:25, Andi Kleen wrote:
> > > On Thursday 19 July 2007 10:52:48 Juergen Beisert wrote:
> > > > On Thursday 19 July 2007 10:22, Andi Kleen wrote:
> > > > > > Wow, that's a really cool bug; nice work! Don't forget to update
> > > > > > arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well.
> > > > > > It needs to include processor-cyrix.h.
> > > > >
> > > > > It also needs some big fat comments
> > > >
> > > > No problem. Where to add?
> > >
> > > Where the inlines are defined.
> > >
> > > Also can you please resubmit full patches with full description
> > > and Signed off lines, not incrementals? Thanks.
> >
> > Find attached. Hope its ok now.
>
> For future reference:
> - Please send the patches inline if possible
+1!
> - Generate them from top level (so path start with linux...)
+2!
>
> I fixed it all up
I have a sad little patch from Nick here which adds a new
include/asm-x86_64/processor-cyrix.h. I guess this patch broke the x86_64
build.
arch/i386/kernel/cpu/cpufreq/gx-suspmod.c | 2 +-
arch/i386/kernel/cpu/cyrix.c | 2 +-
arch/i386/kernel/cpu/mtrr/cyrix.c | 1 +
arch/i386/kernel/cpu/mtrr/state.c | 1 +
include/asm-i386/processor-cyrix.h | 30 ++++++++++++++++++++++++++++++
include/asm-i386/processor.h | 11 -----------
include/asm-x86_64/processor.h | 11 -----------
Some of those .c files will be used by x86_64 too.
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-20 18:21 ` Andrew Morton
@ 2007-07-20 21:16 ` Andi Kleen
0 siblings, 0 replies; 15+ messages in thread
From: Andi Kleen @ 2007-07-20 21:16 UTC (permalink / raw)
To: Andrew Morton
Cc: Andi Kleen, Juergen Beisert, Andres Salomon, TAKADA Yoshihito,
linux-kernel, Jordan Crouse, Alan Cox
> > I fixed it all up
>
> I have a sad little patch from Nick here which adds a new
> include/asm-x86_64/processor-cyrix.h. I guess this patch broke the x86_64
> build.
I fixed that up too, but in a different way (just included asm-i386/processor-cyrix.h)
-Andi
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable
2007-07-19 8:22 ` Andi Kleen
2007-07-19 8:52 ` Juergen Beisert
@ 2007-07-22 16:17 ` Satyam Sharma
1 sibling, 0 replies; 15+ messages in thread
From: Satyam Sharma @ 2007-07-22 16:17 UTC (permalink / raw)
To: Andi Kleen
Cc: Andres Salomon, Juergen Beisert, Andrew Morton, TAKADA Yoshihito,
linux-kernel, Jordan Crouse, Andres Salomon, Alan Cox
> > > On Sun, 15 Jul 2007 21:06:27 +0200
> > > Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> > > > Replace NSC/Cyrix specific chipset access macros by inlined functions.
> > > > With the macros a line like this fails (and does nothing):
> > > > setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x88);
> > > > With inlined functions this line will work as expected.
> > On Thursday 19 July 2007 03:02, Andrew Morton wrote:
> > >
> > > I don't get it. Why would the macros behave differently from inlined
> > > functions?
> On Thu, 19 Jul 2007 08:49:05 +0200
> Juergen Beisert <juergen127@kreuzholzen.de> wrote:
> >
> > X86 magic. The access order is important. The first access must always be the
> > offset at 0x22. This access enables the next access to 0x23 (data). If you do
> > it in wrong order, it fails. With the macros you get something like 0x22,
> > 0x22, 0x23, 0x23. With the inline functions 0x22,0x23,0x22,0x23.
On 7/19/07, Andres Salomon <dilinger@queued.net> wrote:
>
> Wow, that's a really cool bug; nice work! Don't forget to update
> arch/i386/kernel/cpu/mtrr/state.c, though; it uses setCx86() as well. It needs
> to include processor-cyrix.h.
On 7/19/07, Andi Kleen <ak@suse.de> wrote:
>
> It also needs some big fat comments
Ok, I was discussing macros-in-C on some other thread and got
reminded about this one. Anyway, I don't really think there was
anything weird / surprising about this case at all -- it's just another
manifestation of the same age-old time-tested advise all our respective
grandmothers have always given us:
Never pass arguments that have side-effects to macros.
Of course, ideally the user shouldn't even know that the API call he's
using is a macro or a function -- which puts the onus upon the person
who *wrote* that API to ensure that he doesn't write macros for what
could, and should, easily be functions. Macros are generally evil and
always horrible, all IMHO, of course.
Satyam
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2007-07-22 16:17 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2007-07-15 12:00 [PATCH 1/1] i386: Geode's TSC is not neccessary to mark tu unstable TAKADA Yoshihito
2007-07-15 19:06 ` Juergen Beisert
2007-07-15 23:59 ` TAKADA Yoshihito
2007-07-19 1:02 ` Andrew Morton
2007-07-19 6:49 ` Juergen Beisert
2007-07-19 7:17 ` Andres Salomon
2007-07-19 8:22 ` Andi Kleen
2007-07-19 8:52 ` Juergen Beisert
2007-07-19 9:25 ` Andi Kleen
2007-07-19 10:25 ` Juergen Beisert
2007-07-19 13:56 ` Andi Kleen
2007-07-20 18:21 ` Andrew Morton
2007-07-20 21:16 ` Andi Kleen
2007-07-22 16:17 ` Satyam Sharma
2007-07-19 8:52 ` Juergen Beisert
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).