aboutsummaryrefslogtreecommitdiffstats
path: root/arch
diff options
context:
space:
mode:
authorRafaƂ Bilski <rafalbilski@interia.pl>2007-05-17 16:39:02 -0400
committerDave Jones <davej@redhat.com>2007-05-29 16:56:39 -0400
commit489dc5cb18932d3cedaef03e84890475db17a843 (patch)
tree32f97c945aa842daa8d7ffeccc6633c6377980ea /arch
parent1b11d4ca6d9d7ea3ace9d241e52cc5fe3cfe3d8f (diff)
[CPUFREQ] Longhaul - Check ACPI "BM DMA in progress" bit
It is good idea to wait for PCI bus to become idle before frequency change. Thanks to ACPI it is possible. It makes sense only when northbridge support is in use because it is only case in which we can disable arbiter after check if PCI bus is busy. Signed-off-by: Rafal Bilski <rafalbilski@interia.pl> Signed-off-by: Dave Jones <davej@redhat.com>
Diffstat (limited to 'arch')
-rw-r--r--arch/i386/kernel/cpu/cpufreq/longhaul.c18
1 files changed, 18 insertions, 0 deletions
diff --git a/arch/i386/kernel/cpu/cpufreq/longhaul.c b/arch/i386/kernel/cpu/cpufreq/longhaul.c
index 504c6c9107d5..ff4829666472 100644
--- a/arch/i386/kernel/cpu/cpufreq/longhaul.c
+++ b/arch/i386/kernel/cpu/cpufreq/longhaul.c
@@ -254,6 +254,8 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
254 struct cpufreq_freqs freqs; 254 struct cpufreq_freqs freqs;
255 unsigned long flags; 255 unsigned long flags;
256 unsigned int pic1_mask, pic2_mask; 256 unsigned int pic1_mask, pic2_mask;
257 u32 bm_status = 0;
258 u32 bm_timeout = 100000;
257 259
258 if (old_ratio == clock_ratio_index) 260 if (old_ratio == clock_ratio_index)
259 return; 261 return;
@@ -284,6 +286,18 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
284 outb(0xFF,0xA1); /* Overkill */ 286 outb(0xFF,0xA1); /* Overkill */
285 outb(0xFE,0x21); /* TMR0 only */ 287 outb(0xFE,0x21); /* TMR0 only */
286 288
289 /* Wait while PCI bus is busy. */
290 if (longhaul_flags & USE_NORTHBRIDGE
291 || ((pr != NULL) && pr->flags.bm_control)) {
292 acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
293 while (bm_status && bm_timeout) {
294 acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
295 bm_timeout--;
296 acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
297 &bm_status);
298 }
299 }
300
287 if (longhaul_flags & USE_NORTHBRIDGE) { 301 if (longhaul_flags & USE_NORTHBRIDGE) {
288 /* Disable AGP and PCI arbiters */ 302 /* Disable AGP and PCI arbiters */
289 outb(3, 0x22); 303 outb(3, 0x22);
@@ -335,6 +349,10 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
335 349
336 freqs.new = calc_speed(longhaul_get_cpu_mult()); 350 freqs.new = calc_speed(longhaul_get_cpu_mult());
337 cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE); 351 cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
352
353 if (!bm_timeout)
354 printk(KERN_INFO PFX "Warning: Timeout while waiting for "
355 "idle PCI bus.\n");
338} 356}
339 357
340/* 358/*