diff options
Diffstat (limited to 'arch/x86/kernel/early-quirks.c')
-rw-r--r-- | arch/x86/kernel/early-quirks.c | 46 |
1 files changed, 23 insertions, 23 deletions
diff --git a/arch/x86/kernel/early-quirks.c b/arch/x86/kernel/early-quirks.c index 9f51e1ea9e82..4353cf5e6fac 100644 --- a/arch/x86/kernel/early-quirks.c +++ b/arch/x86/kernel/early-quirks.c | |||
@@ -16,10 +16,7 @@ | |||
16 | #include <asm/dma.h> | 16 | #include <asm/dma.h> |
17 | #include <asm/io_apic.h> | 17 | #include <asm/io_apic.h> |
18 | #include <asm/apic.h> | 18 | #include <asm/apic.h> |
19 | 19 | #include <asm/iommu.h> | |
20 | #ifdef CONFIG_GART_IOMMU | ||
21 | #include <asm/gart.h> | ||
22 | #endif | ||
23 | 20 | ||
24 | static void __init fix_hypertransport_config(int num, int slot, int func) | 21 | static void __init fix_hypertransport_config(int num, int slot, int func) |
25 | { | 22 | { |
@@ -50,7 +47,7 @@ static void __init fix_hypertransport_config(int num, int slot, int func) | |||
50 | static void __init via_bugs(int num, int slot, int func) | 47 | static void __init via_bugs(int num, int slot, int func) |
51 | { | 48 | { |
52 | #ifdef CONFIG_GART_IOMMU | 49 | #ifdef CONFIG_GART_IOMMU |
53 | if ((end_pfn > MAX_DMA32_PFN || force_iommu) && | 50 | if ((max_pfn > MAX_DMA32_PFN || force_iommu) && |
54 | !gart_iommu_aperture_allowed) { | 51 | !gart_iommu_aperture_allowed) { |
55 | printk(KERN_INFO | 52 | printk(KERN_INFO |
56 | "Looks like a VIA chipset. Disabling IOMMU." | 53 | "Looks like a VIA chipset. Disabling IOMMU." |
@@ -98,17 +95,6 @@ static void __init nvidia_bugs(int num, int slot, int func) | |||
98 | 95 | ||
99 | } | 96 | } |
100 | 97 | ||
101 | static void __init ati_bugs(int num, int slot, int func) | ||
102 | { | ||
103 | #ifdef CONFIG_X86_IO_APIC | ||
104 | if (timer_over_8254 == 1) { | ||
105 | timer_over_8254 = 0; | ||
106 | printk(KERN_INFO | ||
107 | "ATI board detected. Disabling timer routing over 8254.\n"); | ||
108 | } | ||
109 | #endif | ||
110 | } | ||
111 | |||
112 | #define QFLAG_APPLY_ONCE 0x1 | 98 | #define QFLAG_APPLY_ONCE 0x1 |
113 | #define QFLAG_APPLIED 0x2 | 99 | #define QFLAG_APPLIED 0x2 |
114 | #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) | 100 | #define QFLAG_DONE (QFLAG_APPLY_ONCE|QFLAG_APPLIED) |
@@ -126,14 +112,23 @@ static struct chipset early_qrk[] __initdata = { | |||
126 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs }, | 112 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, nvidia_bugs }, |
127 | { PCI_VENDOR_ID_VIA, PCI_ANY_ID, | 113 | { PCI_VENDOR_ID_VIA, PCI_ANY_ID, |
128 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs }, | 114 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, via_bugs }, |
129 | { PCI_VENDOR_ID_ATI, PCI_ANY_ID, | ||
130 | PCI_CLASS_BRIDGE_PCI, PCI_ANY_ID, QFLAG_APPLY_ONCE, ati_bugs }, | ||
131 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB, | 115 | { PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_K8_NB, |
132 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config }, | 116 | PCI_CLASS_BRIDGE_HOST, PCI_ANY_ID, 0, fix_hypertransport_config }, |
133 | {} | 117 | {} |
134 | }; | 118 | }; |
135 | 119 | ||
136 | static void __init check_dev_quirk(int num, int slot, int func) | 120 | /** |
121 | * check_dev_quirk - apply early quirks to a given PCI device | ||
122 | * @num: bus number | ||
123 | * @slot: slot number | ||
124 | * @func: PCI function | ||
125 | * | ||
126 | * Check the vendor & device ID against the early quirks table. | ||
127 | * | ||
128 | * If the device is single function, let early_quirks() know so we don't | ||
129 | * poke at this device again. | ||
130 | */ | ||
131 | static int __init check_dev_quirk(int num, int slot, int func) | ||
137 | { | 132 | { |
138 | u16 class; | 133 | u16 class; |
139 | u16 vendor; | 134 | u16 vendor; |
@@ -144,7 +139,7 @@ static void __init check_dev_quirk(int num, int slot, int func) | |||
144 | class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE); | 139 | class = read_pci_config_16(num, slot, func, PCI_CLASS_DEVICE); |
145 | 140 | ||
146 | if (class == 0xffff) | 141 | if (class == 0xffff) |
147 | return; | 142 | return -1; /* no class, treat as single function */ |
148 | 143 | ||
149 | vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID); | 144 | vendor = read_pci_config_16(num, slot, func, PCI_VENDOR_ID); |
150 | 145 | ||
@@ -167,7 +162,9 @@ static void __init check_dev_quirk(int num, int slot, int func) | |||
167 | type = read_pci_config_byte(num, slot, func, | 162 | type = read_pci_config_byte(num, slot, func, |
168 | PCI_HEADER_TYPE); | 163 | PCI_HEADER_TYPE); |
169 | if (!(type & 0x80)) | 164 | if (!(type & 0x80)) |
170 | return; | 165 | return -1; |
166 | |||
167 | return 0; | ||
171 | } | 168 | } |
172 | 169 | ||
173 | void __init early_quirks(void) | 170 | void __init early_quirks(void) |
@@ -180,6 +177,9 @@ void __init early_quirks(void) | |||
180 | /* Poor man's PCI discovery */ | 177 | /* Poor man's PCI discovery */ |
181 | for (num = 0; num < 32; num++) | 178 | for (num = 0; num < 32; num++) |
182 | for (slot = 0; slot < 32; slot++) | 179 | for (slot = 0; slot < 32; slot++) |
183 | for (func = 0; func < 8; func++) | 180 | for (func = 0; func < 8; func++) { |
184 | check_dev_quirk(num, slot, func); | 181 | /* Only probe function 0 on single fn devices */ |
182 | if (check_dev_quirk(num, slot, func)) | ||
183 | break; | ||
184 | } | ||
185 | } | 185 | } |