1619cca292
Commit 66759a01ad
introduced the fix for
time ticking too fast on some boards by disabling one of the doubly
connected timer pins on ATI boards.
However, it ends up being _much_ too broad a brush, and that just makes
some other ATI boards not work at all since they now have no timer
source.
So disable the automatic ATI southbridge detection, and just rely on
people who see this problem disabling it by hand with the option
"disable_timer_pin_1" on the kernel command line.
Maybe somebody can figure out the proper tests at a later date.
Acked-by: Peter Osterlund <petero2@telia.com>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
52 lines
1.1 KiB
C
52 lines
1.1 KiB
C
/*
|
|
* Do early PCI probing for bug detection when the main PCI subsystem is
|
|
* not up yet.
|
|
*/
|
|
#include <linux/init.h>
|
|
#include <linux/kernel.h>
|
|
#include <linux/pci.h>
|
|
#include <asm/pci-direct.h>
|
|
#include <asm/acpi.h>
|
|
|
|
static int __init check_bridge(int vendor, int device)
|
|
{
|
|
/* According to Nvidia all timer overrides are bogus. Just ignore
|
|
them all. */
|
|
if (vendor == PCI_VENDOR_ID_NVIDIA) {
|
|
acpi_skip_timer_override = 1;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void __init check_acpi_pci(void)
|
|
{
|
|
int num, slot, func;
|
|
|
|
/* Assume the machine supports type 1. If not it will
|
|
always read ffffffff and should not have any side effect. */
|
|
|
|
/* Poor man's PCI discovery */
|
|
for (num = 0; num < 32; num++) {
|
|
for (slot = 0; slot < 32; slot++) {
|
|
for (func = 0; func < 8; func++) {
|
|
u32 class;
|
|
u32 vendor;
|
|
class = read_pci_config(num, slot, func,
|
|
PCI_CLASS_REVISION);
|
|
if (class == 0xffffffff)
|
|
break;
|
|
|
|
if ((class >> 16) != PCI_CLASS_BRIDGE_PCI)
|
|
continue;
|
|
|
|
vendor = read_pci_config(num, slot, func,
|
|
PCI_VENDOR_ID);
|
|
|
|
if (check_bridge(vendor & 0xffff, vendor >> 16))
|
|
return;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|