1
2
3
4
5#include <linux/delay.h>
6#include <linux/dmi.h>
7#include <linux/pci.h>
8#include <linux/init.h>
9#include <asm/pci_x86.h>
10
11static void __devinit pci_fixup_i450nx(struct pci_dev *d)
12{
13
14
15
16 int pxb, reg;
17 u8 busno, suba, subb;
18
19 dev_warn(&d->dev, "Searching for i450NX host bridges\n");
20 reg = 0xd0;
21 for(pxb = 0; pxb < 2; pxb++) {
22 pci_read_config_byte(d, reg++, &busno);
23 pci_read_config_byte(d, reg++, &suba);
24 pci_read_config_byte(d, reg++, &subb);
25 dev_dbg(&d->dev, "i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno,
26 suba, subb);
27 if (busno)
28 pci_scan_bus_with_sysdata(busno);
29 if (suba < subb)
30 pci_scan_bus_with_sysdata(suba+1);
31 }
32 pcibios_last_bus = -1;
33}
34DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82451NX, pci_fixup_i450nx);
35
36static void __devinit pci_fixup_i450gx(struct pci_dev *d)
37{
38
39
40
41
42 u8 busno;
43 pci_read_config_byte(d, 0x4a, &busno);
44 dev_info(&d->dev, "i440KX/GX host bridge; secondary bus %02x\n", busno);
45 pci_scan_bus_with_sysdata(busno);
46 pcibios_last_bus = -1;
47}
48DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454GX, pci_fixup_i450gx);
49
50static void __devinit pci_fixup_umc_ide(struct pci_dev *d)
51{
52
53
54
55
56 int i;
57
58 dev_warn(&d->dev, "Fixing base address flags\n");
59 for(i = 0; i < 4; i++)
60 d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;
61}
62DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_UMC, PCI_DEVICE_ID_UMC_UM8886BF, pci_fixup_umc_ide);
63
64static void __devinit pci_fixup_ncr53c810(struct pci_dev *d)
65{
66
67
68
69
70 if (!d->class) {
71 dev_warn(&d->dev, "Fixing NCR 53C810 class code\n");
72 d->class = PCI_CLASS_STORAGE_SCSI << 8;
73 }
74}
75DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NCR, PCI_DEVICE_ID_NCR_53C810, pci_fixup_ncr53c810);
76
77static void __devinit pci_fixup_latency(struct pci_dev *d)
78{
79
80
81
82
83 dev_dbg(&d->dev, "Setting max latency to 32\n");
84 pcibios_max_latency = 32;
85}
86DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, pci_fixup_latency);
87DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5598, pci_fixup_latency);
88
89static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d)
90{
91
92
93
94 d->irq = 9;
95}
96DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, pci_fixup_piix4_acpi);
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115#define VIA_8363_KL133_REVISION_ID 0x81
116#define VIA_8363_KM133_REVISION_ID 0x84
117
118static void pci_fixup_via_northbridge_bug(struct pci_dev *d)
119{
120 u8 v;
121 int where = 0x55;
122 int mask = 0x1f;
123
124 if (d->device == PCI_DEVICE_ID_VIA_8367_0) {
125
126
127
128 pci_write_config_byte(d, PCI_LATENCY_TIMER, 0);
129
130 where = 0x95;
131
132 } else if (d->device == PCI_DEVICE_ID_VIA_8363_0 &&
133 (d->revision == VIA_8363_KL133_REVISION_ID ||
134 d->revision == VIA_8363_KM133_REVISION_ID)) {
135 mask = 0x3f;
136
137 }
138
139 pci_read_config_byte(d, where, &v);
140 if (v & ~mask) {
141 dev_warn(&d->dev, "Disabling VIA memory write queue (PCI ID %04x, rev %02x): [%02x] %02x & %02x -> %02x\n", \
142 d->device, d->revision, where, v, mask, v & mask);
143 v &= mask;
144 pci_write_config_byte(d, where, v);
145 }
146}
147DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, pci_fixup_via_northbridge_bug);
148DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8622, pci_fixup_via_northbridge_bug);
149DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8361, pci_fixup_via_northbridge_bug);
150DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8367_0, pci_fixup_via_northbridge_bug);
151DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, pci_fixup_via_northbridge_bug);
152DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8622, pci_fixup_via_northbridge_bug);
153DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8361, pci_fixup_via_northbridge_bug);
154DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8367_0, pci_fixup_via_northbridge_bug);
155
156
157
158
159
160
161
162
163
164
165static void __devinit pci_fixup_transparent_bridge(struct pci_dev *dev)
166{
167 if ((dev->device & 0xff00) == 0x2400)
168 dev->transparent = 1;
169}
170DECLARE_PCI_FIXUP_CLASS_HEADER(PCI_VENDOR_ID_INTEL, PCI_ANY_ID,
171 PCI_CLASS_BRIDGE_PCI, 8, pci_fixup_transparent_bridge);
172
173
174
175
176
177
178
179
180
181
182
183
184
185static void pci_fixup_nforce2(struct pci_dev *dev)
186{
187 u32 val;
188
189
190
191
192
193
194
195
196
197 pci_read_config_dword(dev, 0x6c, &val);
198
199
200
201
202 if ((val & 0x00FF0000) != 0x00010000) {
203 dev_warn(&dev->dev, "nForce2 C1 Halt Disconnect fixup\n");
204 pci_write_config_dword(dev, 0x6c, (val & 0xFF00FFFF) | 0x00010000);
205 }
206}
207DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2, pci_fixup_nforce2);
208DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2, pci_fixup_nforce2);
209
210
211#define MAX_PCIEROOT 6
212static int quirk_aspm_offset[MAX_PCIEROOT << 3];
213
214#define GET_INDEX(a, b) ((((a) - PCI_DEVICE_ID_INTEL_MCH_PA) << 3) + ((b) & 7))
215
216static int quirk_pcie_aspm_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
217{
218 return raw_pci_read(pci_domain_nr(bus), bus->number,
219 devfn, where, size, value);
220}
221
222
223
224
225
226static int quirk_pcie_aspm_write(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 value)
227{
228 u8 offset;
229
230 offset = quirk_aspm_offset[GET_INDEX(bus->self->device, devfn)];
231
232 if ((offset) && (where == offset))
233 value = value & 0xfffffffc;
234
235 return raw_pci_write(pci_domain_nr(bus), bus->number,
236 devfn, where, size, value);
237}
238
239static struct pci_ops quirk_pcie_aspm_ops = {
240 .read = quirk_pcie_aspm_read,
241 .write = quirk_pcie_aspm_write,
242};
243
244
245
246
247
248
249
250
251
252static void pcie_rootport_aspm_quirk(struct pci_dev *pdev)
253{
254 int cap_base, i;
255 struct pci_bus *pbus;
256 struct pci_dev *dev;
257
258 if ((pbus = pdev->subordinate) == NULL)
259 return;
260
261
262
263
264
265
266 if ((pdev->device < PCI_DEVICE_ID_INTEL_MCH_PA) ||
267 (pdev->device > PCI_DEVICE_ID_INTEL_MCH_PC1))
268 return;
269
270 if (list_empty(&pbus->devices)) {
271
272
273
274
275
276
277 for (i = GET_INDEX(pdev->device, 0); i <= GET_INDEX(pdev->device, 7); ++i)
278 quirk_aspm_offset[i] = 0;
279
280 pbus->ops = pbus->parent->ops;
281 } else {
282
283
284
285
286
287
288 list_for_each_entry(dev, &pbus->devices, bus_list) {
289
290 cap_base = pci_find_capability(dev, PCI_CAP_ID_EXP);
291 quirk_aspm_offset[GET_INDEX(pdev->device, dev->devfn)] = cap_base + 0x10;
292 }
293 pbus->ops = &quirk_pcie_aspm_ops;
294 }
295}
296DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PA, pcie_rootport_aspm_quirk);
297DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PA1, pcie_rootport_aspm_quirk);
298DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PB, pcie_rootport_aspm_quirk);
299DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PB1, pcie_rootport_aspm_quirk);
300DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC, pcie_rootport_aspm_quirk);
301DECLARE_PCI_FIXUP_FINAL(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_MCH_PC1, pcie_rootport_aspm_quirk);
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319static void __devinit pci_fixup_video(struct pci_dev *pdev)
320{
321 struct pci_dev *bridge;
322 struct pci_bus *bus;
323 u16 config;
324
325
326 bus = pdev->bus;
327 while (bus) {
328 bridge = bus->self;
329
330
331
332
333
334
335
336
337 if (bridge
338 && ((bridge->hdr_type == PCI_HEADER_TYPE_BRIDGE)
339 || (bridge->hdr_type == PCI_HEADER_TYPE_CARDBUS))) {
340 pci_read_config_word(bridge, PCI_BRIDGE_CONTROL,
341 &config);
342 if (!(config & PCI_BRIDGE_CTL_VGA))
343 return;
344 }
345 bus = bus->parent;
346 }
347 pci_read_config_word(pdev, PCI_COMMAND, &config);
348 if (config & (PCI_COMMAND_IO | PCI_COMMAND_MEMORY)) {
349 pdev->resource[PCI_ROM_RESOURCE].flags |= IORESOURCE_ROM_SHADOW;
350 dev_printk(KERN_DEBUG, &pdev->dev, "Boot video device\n");
351 }
352}
353DECLARE_PCI_FIXUP_CLASS_FINAL(PCI_ANY_ID, PCI_ANY_ID,
354 PCI_CLASS_DISPLAY_VGA, 8, pci_fixup_video);
355
356
357static const struct dmi_system_id __devinitconst msi_k8t_dmi_table[] = {
358 {
359 .ident = "MSI-K8T-Neo2Fir",
360 .matches = {
361 DMI_MATCH(DMI_SYS_VENDOR, "MSI"),
362 DMI_MATCH(DMI_PRODUCT_NAME, "MS-6702E"),
363 },
364 },
365 {}
366};
367
368
369
370
371
372
373
374
375
376
377
378static void __devinit pci_fixup_msi_k8t_onboard_sound(struct pci_dev *dev)
379{
380 unsigned char val;
381 if (!dmi_check_system(msi_k8t_dmi_table))
382 return;
383
384 pci_read_config_byte(dev, 0x50, &val);
385 if (val & 0x40) {
386 pci_write_config_byte(dev, 0x50, val & (~0x40));
387
388
389 pci_read_config_byte(dev, 0x50, &val);
390 if (val & 0x40)
391 dev_info(&dev->dev, "Detected MSI K8T Neo2-FIR; "
392 "can't enable onboard soundcard!\n");
393 else
394 dev_info(&dev->dev, "Detected MSI K8T Neo2-FIR; "
395 "enabled onboard soundcard\n");
396 }
397}
398DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237,
399 pci_fixup_msi_k8t_onboard_sound);
400DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8237,
401 pci_fixup_msi_k8t_onboard_sound);
402
403
404
405
406
407
408
409
410
411
412static u16 toshiba_line_size;
413
414static const struct dmi_system_id __devinitconst toshiba_ohci1394_dmi_table[] = {
415 {
416 .ident = "Toshiba PS5 based laptop",
417 .matches = {
418 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
419 DMI_MATCH(DMI_PRODUCT_VERSION, "PS5"),
420 },
421 },
422 {
423 .ident = "Toshiba PSM4 based laptop",
424 .matches = {
425 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
426 DMI_MATCH(DMI_PRODUCT_VERSION, "PSM4"),
427 },
428 },
429 {
430 .ident = "Toshiba A40 based laptop",
431 .matches = {
432 DMI_MATCH(DMI_SYS_VENDOR, "TOSHIBA"),
433 DMI_MATCH(DMI_PRODUCT_VERSION, "PSA40U"),
434 },
435 },
436 { }
437};
438
439static void __devinit pci_pre_fixup_toshiba_ohci1394(struct pci_dev *dev)
440{
441 if (!dmi_check_system(toshiba_ohci1394_dmi_table))
442 return;
443
444 dev->current_state = PCI_D3cold;
445 pci_read_config_word(dev, PCI_CACHE_LINE_SIZE, &toshiba_line_size);
446}
447DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_TI, 0x8032,
448 pci_pre_fixup_toshiba_ohci1394);
449
450static void __devinit pci_post_fixup_toshiba_ohci1394(struct pci_dev *dev)
451{
452 if (!dmi_check_system(toshiba_ohci1394_dmi_table))
453 return;
454
455
456 pci_write_config_word(dev, PCI_CACHE_LINE_SIZE, toshiba_line_size);
457 pci_read_config_byte(dev, PCI_INTERRUPT_LINE, (u8 *)&dev->irq);
458 pci_write_config_dword(dev, PCI_BASE_ADDRESS_0,
459 pci_resource_start(dev, 0));
460 pci_write_config_dword(dev, PCI_BASE_ADDRESS_1,
461 pci_resource_start(dev, 1));
462}
463DECLARE_PCI_FIXUP_ENABLE(PCI_VENDOR_ID_TI, 0x8032,
464 pci_post_fixup_toshiba_ohci1394);
465
466
467
468
469
470
471static void pci_early_fixup_cyrix_5530(struct pci_dev *dev)
472{
473 u8 r;
474
475 pci_read_config_byte(dev, 0x42, &r);
476 r &= 0xfd;
477 pci_write_config_byte(dev, 0x42, r);
478}
479DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
480 pci_early_fixup_cyrix_5530);
481DECLARE_PCI_FIXUP_RESUME(PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_5530_LEGACY,
482 pci_early_fixup_cyrix_5530);
483
484
485
486
487
488static void __devinit pci_siemens_interrupt_controller(struct pci_dev *dev)
489{
490 dev->resource[0].flags |= IORESOURCE_PCI_FIXED;
491}
492DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_SIEMENS, 0x0015,
493 pci_siemens_interrupt_controller);
494
495
496
497
498
499static void sb600_disable_hpet_bar(struct pci_dev *dev)
500{
501 u8 val;
502
503
504
505
506
507
508
509
510 pci_read_config_byte(dev, 0x08, &val);
511
512 if (val < 0x2F) {
513 outb(0x55, 0xCD6);
514 val = inb(0xCD7);
515
516
517 outb(0x55, 0xCD6);
518 outb(val | 0x80, 0xCD7);
519 }
520}
521DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_ATI, 0x4385, sb600_disable_hpet_bar);
522