Skip to content

Commit

Permalink
[CPUFREQ] Longhaul - Replace ACPI functions with direct I/O
Browse files Browse the repository at this point in the history
Current version of "bm status" bit test works as long as
no USB device is in use. When USB device is plugged in ACPI
function in this context is always returning 1. Until reboot.
Direct I/O is working fine even when many USB devices are
connected.
Change bm_timeout value to less annoying. 1000 is still much
more then worst case observed and it is much better when status
bit gets stuck.

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 Jun 6, 2007
1 parent ce24382 commit 275bc6b
Showing 1 changed file with 16 additions and 7 deletions.
23 changes: 16 additions & 7 deletions arch/i386/kernel/cpu/cpufreq/longhaul.c
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@ static unsigned int minmult, maxmult;
static int can_scale_voltage;
static struct acpi_processor *pr = NULL;
static struct acpi_processor_cx *cx = NULL;
static u32 acpi_regs_addr;
static u8 longhaul_flags;
static unsigned int longhaul_index;

Expand Down Expand Up @@ -247,7 +248,7 @@ static void longhaul_setstate(unsigned int table_index)
unsigned long flags;
unsigned int pic1_mask, pic2_mask;
u32 bm_status = 0;
u32 bm_timeout = 100000;
u32 bm_timeout = 1000;
unsigned int dir = 0;

clock_ratio_index = longhaul_table[table_index].index;
Expand Down Expand Up @@ -282,12 +283,13 @@ static void longhaul_setstate(unsigned int table_index)
/* 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);
bm_status = inl(acpi_regs_addr);
bm_status &= 1 << 4;
while (bm_status && bm_timeout) {
acpi_set_register(ACPI_BITREG_BUS_MASTER_STATUS, 1);
outl(1 << 4, acpi_regs_addr);
bm_timeout--;
acpi_get_register(ACPI_BITREG_BUS_MASTER_STATUS,
&bm_status);
bm_status = inl(acpi_regs_addr);
bm_status &= 1 << 4;
}
}

Expand Down Expand Up @@ -344,8 +346,7 @@ static void longhaul_setstate(unsigned int table_index)
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);

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

/*
Expand Down Expand Up @@ -713,6 +714,14 @@ static int longhaul_setup_southbridge(void)
pci_read_config_byte(dev, 0xe5, &pci_cmd);
pci_cmd |= 1 << 7;
pci_write_config_byte(dev, 0xe5, pci_cmd);
/* Get address of ACPI registers block*/
pci_read_config_byte(dev, 0x81, &pci_cmd);
if (pci_cmd & 1 << 7) {
pci_read_config_dword(dev, 0x88, &acpi_regs_addr);
acpi_regs_addr &= 0xff00;
printk(KERN_INFO PFX "ACPI I/O at 0x%x\n", acpi_regs_addr);
}

pci_dev_put(dev);
return 1;
}
Expand Down

0 comments on commit 275bc6b

Please sign in to comment.