Skip to content

Commit

Permalink
[CPUFREQ] Longhaul - Check ACPI "BM DMA in progress" bit
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Rafał Bilski authored and Dave Jones committed May 29, 2007
1 parent 1b11d4c commit 489dc5c
Showing 1 changed file with 18 additions and 0 deletions.
18 changes: 18 additions & 0 deletions arch/i386/kernel/cpu/cpufreq/longhaul.c
Original file line number Diff line number Diff line change
Expand Up @@ -254,6 +254,8 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
struct cpufreq_freqs freqs;
unsigned long flags;
unsigned int pic1_mask, pic2_mask;
u32 bm_status = 0;
u32 bm_timeout = 100000;

if (old_ratio == clock_ratio_index)
return;
Expand Down Expand Up @@ -284,6 +286,18 @@ static void longhaul_setstate(unsigned int clock_ratio_index)
outb(0xFF,0xA1); /* Overkill */
outb(0xFE,0x21); /* TMR0 only */

/* Wait while PCI bus is busy. */
if (longhaul_flags & USE_NORTHBRIDGE
|| ((pr != NULL) && pr->flags.bm_control)) {
acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS, &bm_status);
while (bm_status && bm_timeout) {
acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
bm_timeout--;
acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
&bm_status);
}
}

if (longhaul_flags & USE_NORTHBRIDGE) {
/* Disable AGP and PCI arbiters */
outb(3, 0x22);
Expand Down Expand Up @@ -335,6 +349,10 @@ static void longhaul_setstate(unsigned int clock_ratio_index)

freqs.new = calc_speed(longhaul_get_cpu_mult());
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);

if (!bm_timeout)
printk(KERN_INFO PFX "Warning: Timeout while waiting for "
"idle PCI bus.\n");
}

/*
Expand Down

0 comments on commit 489dc5c

Please sign in to comment.