diff options
| author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-26 18:02:12 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-03-26 18:02:12 -0400 |
| commit | 08dcf29e01dcb786c13dc80045bd65f804117efb (patch) | |
| tree | d5820c2fdfd136681a836060f63cbdae9b8997de | |
| parent | 11320d17ce4ecf8002dc8f9b6f1e49cd18e45a94 (diff) | |
| parent | d546b67a940eb42a99f56b86c5cd8d47c8348c2a (diff) | |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86:
x86: fix performance drop for glx
x86: fix trim mtrr not to setup_memory two times
x86: GEODE: add missing module.h include
x86, cpufreq: fix Speedfreq-SMI call that clobbers ECX
x86: fix memoryless node oops during boot
x86: add dmi quirk for io_delay
x86: convert mtrr/generic.c to kernel-doc
x86: Documentation/i386/IO-APIC.txt: fix description
| -rw-r--r-- | Documentation/i386/IO-APIC.txt | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | 39 | ||||
| -rw-r--r-- | arch/x86/kernel/cpu/mtrr/generic.c | 42 | ||||
| -rw-r--r-- | arch/x86/kernel/io_delay.c | 8 | ||||
| -rw-r--r-- | arch/x86/kernel/mfgpt_32.c | 1 | ||||
| -rw-r--r-- | arch/x86/kernel/setup_32.c | 9 | ||||
| -rw-r--r-- | arch/x86/kernel/setup_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/mm/discontig_32.c | 1 | ||||
| -rw-r--r-- | arch/x86/mm/ioremap.c | 6 | ||||
| -rw-r--r-- | arch/x86/mm/pageattr.c | 2 | ||||
| -rw-r--r-- | include/asm-x86/pgtable.h | 2 |
11 files changed, 70 insertions, 44 deletions
diff --git a/Documentation/i386/IO-APIC.txt b/Documentation/i386/IO-APIC.txt index f95166645d29..30b4c714fbe1 100644 --- a/Documentation/i386/IO-APIC.txt +++ b/Documentation/i386/IO-APIC.txt | |||
| @@ -70,7 +70,7 @@ Every PCI card emits a PCI IRQ, which can be INTA, INTB, INTC or INTD: | |||
| 70 | 70 | ||
| 71 | These INTA-D PCI IRQs are always 'local to the card', their real meaning | 71 | These INTA-D PCI IRQs are always 'local to the card', their real meaning |
| 72 | depends on which slot they are in. If you look at the daisy chaining diagram, | 72 | depends on which slot they are in. If you look at the daisy chaining diagram, |
| 73 | a card in slot4, issuing INTA IRQ, it will end up as a signal on PIRQ2 of | 73 | a card in slot4, issuing INTA IRQ, it will end up as a signal on PIRQ4 of |
| 74 | the PCI chipset. Most cards issue INTA, this creates optimal distribution | 74 | the PCI chipset. Most cards issue INTA, this creates optimal distribution |
| 75 | between the PIRQ lines. (distributing IRQ sources properly is not a | 75 | between the PIRQ lines. (distributing IRQ sources properly is not a |
| 76 | necessity, PCI IRQs can be shared at will, but it's a good for performance | 76 | necessity, PCI IRQs can be shared at will, but it's a good for performance |
diff --git a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c index f2b5a621d27b..8a85c93bd62a 100644 --- a/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c +++ b/arch/x86/kernel/cpu/cpufreq/speedstep-smi.c | |||
| @@ -63,7 +63,7 @@ static struct cpufreq_frequency_table speedstep_freqs[] = { | |||
| 63 | */ | 63 | */ |
| 64 | static int speedstep_smi_ownership (void) | 64 | static int speedstep_smi_ownership (void) |
| 65 | { | 65 | { |
| 66 | u32 command, result, magic; | 66 | u32 command, result, magic, dummy; |
| 67 | u32 function = GET_SPEEDSTEP_OWNER; | 67 | u32 function = GET_SPEEDSTEP_OWNER; |
| 68 | unsigned char magic_data[] = "Copyright (c) 1999 Intel Corporation"; | 68 | unsigned char magic_data[] = "Copyright (c) 1999 Intel Corporation"; |
| 69 | 69 | ||
| @@ -73,8 +73,11 @@ static int speedstep_smi_ownership (void) | |||
| 73 | dprintk("trying to obtain ownership with command %x at port %x\n", command, smi_port); | 73 | dprintk("trying to obtain ownership with command %x at port %x\n", command, smi_port); |
| 74 | 74 | ||
| 75 | __asm__ __volatile__( | 75 | __asm__ __volatile__( |
| 76 | "push %%ebp\n" | ||
| 76 | "out %%al, (%%dx)\n" | 77 | "out %%al, (%%dx)\n" |
| 77 | : "=D" (result) | 78 | "pop %%ebp\n" |
| 79 | : "=D" (result), "=a" (dummy), "=b" (dummy), "=c" (dummy), "=d" (dummy), | ||
| 80 | "=S" (dummy) | ||
| 78 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), | 81 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), |
| 79 | "D" (0), "S" (magic) | 82 | "D" (0), "S" (magic) |
| 80 | : "memory" | 83 | : "memory" |
| @@ -96,7 +99,7 @@ static int speedstep_smi_ownership (void) | |||
| 96 | */ | 99 | */ |
| 97 | static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | 100 | static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) |
| 98 | { | 101 | { |
| 99 | u32 command, result = 0, edi, high_mhz, low_mhz; | 102 | u32 command, result = 0, edi, high_mhz, low_mhz, dummy; |
| 100 | u32 state=0; | 103 | u32 state=0; |
| 101 | u32 function = GET_SPEEDSTEP_FREQS; | 104 | u32 function = GET_SPEEDSTEP_FREQS; |
| 102 | 105 | ||
| @@ -109,10 +112,12 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
| 109 | 112 | ||
| 110 | dprintk("trying to determine frequencies with command %x at port %x\n", command, smi_port); | 113 | dprintk("trying to determine frequencies with command %x at port %x\n", command, smi_port); |
| 111 | 114 | ||
| 112 | __asm__ __volatile__("movl $0, %%edi\n" | 115 | __asm__ __volatile__( |
| 116 | "push %%ebp\n" | ||
| 113 | "out %%al, (%%dx)\n" | 117 | "out %%al, (%%dx)\n" |
| 114 | : "=a" (result), "=b" (high_mhz), "=c" (low_mhz), "=d" (state), "=D" (edi) | 118 | "pop %%ebp" |
| 115 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0) | 119 | : "=a" (result), "=b" (high_mhz), "=c" (low_mhz), "=d" (state), "=D" (edi), "=S" (dummy) |
| 120 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | ||
| 116 | ); | 121 | ); |
| 117 | 122 | ||
| 118 | dprintk("result %x, low_freq %u, high_freq %u\n", result, low_mhz, high_mhz); | 123 | dprintk("result %x, low_freq %u, high_freq %u\n", result, low_mhz, high_mhz); |
| @@ -135,16 +140,18 @@ static int speedstep_smi_get_freqs (unsigned int *low, unsigned int *high) | |||
| 135 | static int speedstep_get_state (void) | 140 | static int speedstep_get_state (void) |
| 136 | { | 141 | { |
| 137 | u32 function=GET_SPEEDSTEP_STATE; | 142 | u32 function=GET_SPEEDSTEP_STATE; |
| 138 | u32 result, state, edi, command; | 143 | u32 result, state, edi, command, dummy; |
| 139 | 144 | ||
| 140 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); | 145 | command = (smi_sig & 0xffffff00) | (smi_cmd & 0xff); |
| 141 | 146 | ||
| 142 | dprintk("trying to determine current setting with command %x at port %x\n", command, smi_port); | 147 | dprintk("trying to determine current setting with command %x at port %x\n", command, smi_port); |
| 143 | 148 | ||
| 144 | __asm__ __volatile__("movl $0, %%edi\n" | 149 | __asm__ __volatile__( |
| 150 | "push %%ebp\n" | ||
| 145 | "out %%al, (%%dx)\n" | 151 | "out %%al, (%%dx)\n" |
| 146 | : "=a" (result), "=b" (state), "=D" (edi) | 152 | "pop %%ebp\n" |
| 147 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), "S" (0) | 153 | : "=a" (result), "=b" (state), "=D" (edi), "=c" (dummy), "=d" (dummy), "=S" (dummy) |
| 154 | : "a" (command), "b" (function), "c" (0), "d" (smi_port), "S" (0), "D" (0) | ||
| 148 | ); | 155 | ); |
| 149 | 156 | ||
| 150 | dprintk("state is %x, result is %x\n", state, result); | 157 | dprintk("state is %x, result is %x\n", state, result); |
| @@ -160,7 +167,7 @@ static int speedstep_get_state (void) | |||
| 160 | */ | 167 | */ |
| 161 | static void speedstep_set_state (unsigned int state) | 168 | static void speedstep_set_state (unsigned int state) |
| 162 | { | 169 | { |
| 163 | unsigned int result = 0, command, new_state; | 170 | unsigned int result = 0, command, new_state, dummy; |
| 164 | unsigned long flags; | 171 | unsigned long flags; |
| 165 | unsigned int function=SET_SPEEDSTEP_STATE; | 172 | unsigned int function=SET_SPEEDSTEP_STATE; |
| 166 | unsigned int retry = 0; | 173 | unsigned int retry = 0; |
| @@ -182,10 +189,12 @@ static void speedstep_set_state (unsigned int state) | |||
| 182 | } | 189 | } |
| 183 | retry++; | 190 | retry++; |
| 184 | __asm__ __volatile__( | 191 | __asm__ __volatile__( |
| 185 | "movl $0, %%edi\n" | 192 | "push %%ebp\n" |
| 186 | "out %%al, (%%dx)\n" | 193 | "out %%al, (%%dx)\n" |
| 187 | : "=b" (new_state), "=D" (result) | 194 | "pop %%ebp" |
| 188 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0) | 195 | : "=b" (new_state), "=D" (result), "=c" (dummy), "=a" (dummy), |
| 196 | "=d" (dummy), "=S" (dummy) | ||
| 197 | : "a" (command), "b" (function), "c" (state), "d" (smi_port), "S" (0), "D" (0) | ||
| 189 | ); | 198 | ); |
| 190 | } while ((new_state != state) && (retry <= SMI_TRIES)); | 199 | } while ((new_state != state) && (retry <= SMI_TRIES)); |
| 191 | 200 | ||
| @@ -195,7 +204,7 @@ static void speedstep_set_state (unsigned int state) | |||
| 195 | if (new_state == state) { | 204 | if (new_state == state) { |
| 196 | dprintk("change to %u MHz succeeded after %u tries with result %u\n", (speedstep_freqs[new_state].frequency / 1000), retry, result); | 205 | dprintk("change to %u MHz succeeded after %u tries with result %u\n", (speedstep_freqs[new_state].frequency / 1000), retry, result); |
| 197 | } else { | 206 | } else { |
| 198 | printk(KERN_ERR "cpufreq: change failed with new_state %u and result %u\n", new_state, result); | 207 | printk(KERN_ERR "cpufreq: change to state %u failed with new_state %u and result %u\n", state, new_state, result); |
| 199 | } | 208 | } |
| 200 | 209 | ||
| 201 | return; | 210 | return; |
diff --git a/arch/x86/kernel/cpu/mtrr/generic.c b/arch/x86/kernel/cpu/mtrr/generic.c index 103d61a59b19..3e18db4cefee 100644 --- a/arch/x86/kernel/cpu/mtrr/generic.c +++ b/arch/x86/kernel/cpu/mtrr/generic.c | |||
| @@ -176,12 +176,13 @@ static inline void k8_enable_fixed_iorrs(void) | |||
| 176 | } | 176 | } |
| 177 | 177 | ||
| 178 | /** | 178 | /** |
| 179 | * Checks and updates an fixed-range MTRR if it differs from the value it | 179 | * set_fixed_range - checks & updates a fixed-range MTRR if it differs from the value it should have |
| 180 | * should have. If K8 extentions are wanted, update the K8 SYSCFG MSR also. | 180 | * @msr: MSR address of the MTTR which should be checked and updated |
| 181 | * see AMD publication no. 24593, chapter 7.8.1, page 233 for more information | 181 | * @changed: pointer which indicates whether the MTRR needed to be changed |
| 182 | * \param msr MSR address of the MTTR which should be checked and updated | 182 | * @msrwords: pointer to the MSR values which the MSR should have |
| 183 | * \param changed pointer which indicates whether the MTRR needed to be changed | 183 | * |
| 184 | * \param msrwords pointer to the MSR values which the MSR should have | 184 | * If K8 extentions are wanted, update the K8 SYSCFG MSR also. |
| 185 | * See AMD publication no. 24593, chapter 7.8.1, page 233 for more information. | ||
| 185 | */ | 186 | */ |
| 186 | sta | ||
