1
2
3
4
5
6
7
8
9
10
11
12
13
14
15#include <linux/config.h>
16#include <linux/types.h>
17#include <linux/kernel.h>
18#include <linux/pci.h>
19#include <linux/init.h>
20#include <linux/delay.h>
21
22#undef DEBUG
23
24
25
26static void __init quirk_passive_release(struct pci_dev *dev)
27{
28 struct pci_dev *d = NULL;
29 unsigned char dlc;
30
31
32
33 while ((d = pci_find_device(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, d))) {
34 pci_read_config_byte(d, 0x82, &dlc);
35 if (!(dlc & 1<<1)) {
36 printk(KERN_ERR "PCI: PIIX3: Enabling Passive Release on %s\n", d->slot_name);
37 dlc |= 1<<1;
38 pci_write_config_byte(d, 0x82, dlc);
39 }
40 }
41}
42
43
44
45
46
47
48
49
50
51int isa_dma_bridge_buggy;
52
53static void __init quirk_isa_dma_hangs(struct pci_dev *dev)
54{
55 if (!isa_dma_bridge_buggy) {
56 isa_dma_bridge_buggy=1;
57 printk(KERN_INFO "Activating ISA DMA hang workarounds.\n");
58 }
59}
60
61int pci_pci_problems;
62
63
64
65
66
67static void __init quirk_nopcipci(struct pci_dev *dev)
68{
69 if((pci_pci_problems&PCIPCI_FAIL)==0)
70 {
71 printk(KERN_INFO "Disabling direct PCI/PCI transfers.\n");
72 pci_pci_problems|=PCIPCI_FAIL;
73 }
74}
75
76
77
78
79
80static void __init quirk_triton(struct pci_dev *dev)
81{
82 if((pci_pci_problems&PCIPCI_TRITON)==0)
83 {
84 printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n");
85 pci_pci_problems|=PCIPCI_TRITON;
86 }
87}
88
89
90
91
92
93
94
95
96
97
98
99static void __init quirk_vialatency(struct pci_dev *dev)
100{
101 struct pci_dev *p;
102 u8 rev;
103 u8 busarb;
104
105
106
107 p=pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, NULL);
108 if(p!=NULL)
109 {
110 pci_read_config_byte(p, PCI_CLASS_REVISION, &rev);
111
112
113 if (rev < 0x40 || rev > 0x42)
114 return;
115 }
116 else
117 {
118 p = pci_find_device(PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8231, NULL);
119 if(p==NULL)
120 return;
121 pci_read_config_byte(p, PCI_CLASS_REVISION, &rev);
122
123 if (rev < 0x10 || rev > 0x12)
124 return;
125 }
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140 pci_read_config_byte(dev, 0x76, &busarb);
141
142
143 busarb &= ~(1<<5);
144 busarb |= (1<<4);
145 pci_write_config_byte(dev, 0x76, busarb);
146 printk(KERN_INFO "Applying VIA southbridge workaround.\n");
147}
148
149
150
151
152
153static void __init quirk_viaetbf(struct pci_dev *dev)
154{
155 if((pci_pci_problems&PCIPCI_VIAETBF)==0)
156 {
157 printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n");
158 pci_pci_problems|=PCIPCI_VIAETBF;
159 }
160}
161static void __init quirk_vsfx(struct pci_dev *dev)
162{
163 if((pci_pci_problems&PCIPCI_VSFX)==0)
164 {
165 printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n");
166 pci_pci_problems|=PCIPCI_VSFX;
167 }
168}
169
170
171
172
173
174
175
176
177static void __init quirk_alimagik(struct pci_dev *dev)
178{
179 if((pci_pci_problems&PCIPCI_ALIMAGIK)==0)
180 {
181 printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n");
182 pci_pci_problems|=PCIPCI_ALIMAGIK|PCIPCI_TRITON;
183 }
184}
185
186
187
188
189
190
191static void __init quirk_natoma(struct pci_dev *dev)
192{
193 if((pci_pci_problems&PCIPCI_NATOMA)==0)
194 {
195 printk(KERN_INFO "Limiting direct PCI/PCI transfers.\n");
196 pci_pci_problems|=PCIPCI_NATOMA;
197 }
198}
199
200
201
202
203
204
205static void __init quirk_s3_64M(struct pci_dev *dev)
206{
207 struct resource *r = &dev->resource[0];
208
209 if ((r->start & 0x3ffffff) || r->end != r->start + 0x3ffffff) {
210 r->start = 0;
211 r->end = 0x3ffffff;
212 }
213}
214
215static void __init quirk_io_region(struct pci_dev *dev, unsigned region, unsigned size, int nr)
216{
217 region &= ~(size-1);
218 if (region) {
219 struct resource *res = dev->resource + nr;
220
221 res->name = dev->name;
222 res->start = region;
223 res->end = region + size - 1;
224 res->flags = IORESOURCE_IO;
225 pci_claim_resource(dev, nr);
226 }
227}
228
229
230
231
232
233
234static void __devinit quirk_ati_exploding_mce(struct pci_dev *dev)
235{
236 printk(KERN_INFO "ATI Northbridge, reserving I/O ports 0x3b0 to 0x3bb.\n");
237 request_region(0x3b0, 0x0C, "RadeonIGP");
238 request_region(0x3d3, 0x01, "RadeonIGP");
239}
240
241
242
243
244
245
246
247
248
249
250
251
252static void __init quirk_ali7101_acpi(struct pci_dev *dev)
253{
254 u16 region;
255
256 pci_read_config_word(dev, 0xE0, ®ion);
257 quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES);
258 pci_read_config_word(dev, 0xE2, ®ion);
259 quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1);
260}
261
262
263
264
265
266
267static void __init quirk_piix4_acpi(struct pci_dev *dev)
268{
269 u32 region;
270
271 pci_read_config_dword(dev, 0x40, ®ion);
272 quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES);
273 pci_read_config_dword(dev, 0x90, ®ion);
274 quirk_io_region(dev, region, 32, PCI_BRIDGE_RESOURCES+1);
275}
276
277
278
279
280
281
282static void __devinit quirk_ich4_lpc_acpi(struct pci_dev *dev)
283{
284 u32 region;
285
286 pci_read_config_dword(dev, 0x40, ®ion);
287 quirk_io_region(dev, region, 128, PCI_BRIDGE_RESOURCES);
288
289 pci_read_config_dword(dev, 0x58, ®ion);
290 quirk_io_region(dev, region, 64, PCI_BRIDGE_RESOURCES+1);
291}
292
293
294
295
296
297static void __init quirk_vt82c586_acpi(struct pci_dev *dev)
298{
299 u8 rev;
300 u32 region;
301
302 pci_read_config_byte(dev, PCI_CLASS_REVISION, &rev);
303 if (rev & 0x10) {
304 pci_read_config_dword(dev, 0x48, ®ion);
305 region &= PCI_BASE_ADDRESS_IO_MASK;
306 quirk_io_region(dev, region, 256, PCI_BRIDGE_RESOURCES);
307 }
308}
309
310
311
312
313
314
315
316static void __init quirk_vt82c686_acpi(struct pci_dev *dev)
317{
318 u16 hm;
319 u32 smb;
320
321 quirk_vt82c586_acpi(dev);
322
323 pci_read_config_word(dev, 0x70, &hm);
324 hm &= PCI_BASE_ADDRESS_IO_MASK;
325 quirk_io_region(dev, hm, 128, PCI_BRIDGE_RESOURCES + 1);
326
327 pci_read_config_dword(dev, 0x90, &smb);
328 smb &= PCI_BASE_ADDRESS_IO_MASK;
329 quirk_io_region(dev, smb, 16, PCI_BRIDGE_RESOURCES + 2);
330}
331
332
333#ifdef CONFIG_X86_IO_APIC
334extern int nr_ioapics;
335
336
337
338
339
340
341
342
343static void __init quirk_via_ioapic(struct pci_dev *dev)
344{
345 u8 tmp;
346
347 if (nr_ioapics < 1)
348 tmp = 0;
349 else
350 tmp = 0x1f;
351
352 printk(KERN_INFO "PCI: %sbling Via external APIC routing\n",
353 tmp == 0 ? "Disa" : "Ena");
354
355
356 pci_write_config_byte (dev, 0x58, tmp);
357}
358
359#endif
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381static void __init quirk_via_acpi(struct pci_dev *d)
382{
383
384
385
386 u8 irq;
387 pci_read_config_byte(d, 0x42, &irq);
388 irq &= 0xf;
389 if (irq && (irq != 2))
390 d->irq = irq;
391}
392
393
394
395
396
397
398
399
400
401
402
403
404static void __init quirk_piix3_usb(struct pci_dev *dev)
405{
406 u16 legsup;
407
408 pci_read_config_word(dev, 0xc0, &legsup);
409 legsup &= 0x50ef;
410 pci_write_config_word(dev, 0xc0, legsup);
411}
412
413
414
415
416
417
418
419static void __init quirk_vt82c598_id(struct pci_dev *dev)
420{
421 pci_write_config_byte(dev, 0xfc, 0);
422 pci_read_config_word(dev, PCI_DEVICE_ID, &dev->device);
423}
424
425
426
427
428
429
430
431static void __init quirk_cardbus_legacy(struct pci_dev *dev)
432{
433 if ((PCI_CLASS_BRIDGE_CARDBUS << 8) ^ dev->class)
434 return;
435 pci_write_config_dword(dev, PCI_CB_LEGACY_MODE_BASE, 0);
436}
437
438
439
440
441
442
443
444
445
446
447
448static void __init quirk_amd_ioapic(struct pci_dev *dev)
449{
450 u8 rev;
451
452 pci_read_config_byte(dev, PCI_REVISION_ID, &rev);
453 if(rev >= 0x02)
454 {
455 printk(KERN_WARNING "I/O APIC: AMD Errata #22 may be present. In the event of instability try\n");
456 printk(KERN_WARNING " : booting with the \"noapic\" option.\n");
457 }
458}
459
460
461
462
463
464
465
466
467
468static void __init quirk_amd_ordering(struct pci_dev *dev)
469{
470 u32 pcic;
471 pci_read_config_dword(dev, 0x4C, &pcic);
472 if((pcic&6)!=6)
473 {
474 pcic |= 6;
475 printk(KERN_WARNING "BIOS failed to enable PCI standards compliance, fixing this error.\n");
476 pci_write_config_dword(dev, 0x4C, pcic);
477 pci_read_config_dword(dev, 0x84, &pcic);
478 pcic |= (1<<23);
479 pci_write_config_dword(dev, 0x84, pcic);
480 }
481}
482
483#ifdef CONFIG_X86_IO_APIC
484
485#define AMD8131_revA0 0x01
486#define AMD8131_revB0 0x11
487#define AMD8131_MISC 0x40
488#define AMD8131_NIOAMODE_BIT 0
489
490static void __init quirk_amd_8131_ioapic(struct pci_dev *dev)
491{
492 unsigned char revid, tmp;
493
494 if (nr_ioapics == 0)
495 return;
496
497 pci_read_config_byte(dev, PCI_REVISION_ID, &revid);
498 if (revid == AMD8131_revA0 || revid == AMD8131_revB0) {
499 printk(KERN_INFO "Fixing up AMD8131 IOAPIC mode\n");
500 pci_read_config_byte( dev, AMD8131_MISC, &tmp);
501 tmp &= ~(1 << AMD8131_NIOAMODE_BIT);
502 pci_write_config_byte( dev, AMD8131_MISC, tmp);
503 }
504}
505#endif
506
507
508
509
510
511
512
513
514
515
516static void __init quirk_dunord ( struct pci_dev * dev )
517{
518 struct resource * r = & dev -> resource [ 1 ];
519 r -> start = 0;
520 r -> end = 0xffffff;
521}
522
523static void __init quirk_transparent_bridge(struct pci_dev *dev)
524{
525 dev->transparent = 1;
526}
527
528
529
530
531
532
533
534
535static void __init quirk_mediagx_master(struct pci_dev *dev)
536{
537 u8 reg;
538 pci_read_config_byte(dev, 0x41, ®);
539 if (reg & 2) {
540 reg &= ~2;
541 printk(KERN_INFO "PCI: Fixup for MediaGX/Geode Slave Disconnect Boundary (0x41=0x%02x)\n", reg);
542 pci_write_config_byte(dev, 0x41, reg);
543 }
544}
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564static void __devinit quirk_ide_bases(struct pci_dev *dev)
565{
566 struct resource *res;
567 int first_bar = 2, last_bar = 0;
568
569 if ((dev->class >> 8) != PCI_CLASS_STORAGE_IDE)
570 return;
571
572 res = &dev->resource[0];
573
574
575 if (!(dev->class & 1) && (res[0].flags || res[1].flags)) {
576 res[0].start = res[0].end = res[0].flags = 0;
577 res[1].start = res[1].end = res[1].flags = 0;
578 first_bar = 0;
579 last_bar = 1;
580 }
581
582
583 if (!(dev->class & 4) && (res[2].flags || res[3].flags)) {
584 res[2].start = res[2].end = res[2].flags = 0;
585 res[3].start = res[3].end = res[3].flags = 0;
586 last_bar = 3;
587 }
588
589 if (!last_bar)
590 return;
591
592 printk(KERN_INFO "PCI: Ignoring BAR%d-%d of IDE controller %s\n",
593 first_bar, last_bar, dev->slot_name);
594}
595
596
597
598
599
600
601
602static void __init quirk_disable_pxb(struct pci_dev *pdev)
603{
604 u16 config;
605 u8 rev;
606
607 pci_read_config_byte(pdev, PCI_REVISION_ID, &rev);
608 if(rev != 0x04)
609 return;
610 pci_read_config_word(pdev, 0x40, &config);
611 if(config & (1<<6))
612 {
613 config &= ~(1<<6);
614 pci_write_config_word(pdev, 0x40, config);
615 printk(KERN_INFO "PCI: C0 revision 450NX. Disabling PCI restreaming.\n");
616 }
617}
618
619
620
621
622
623int via_interrupt_line_quirk;
624
625static void __init quirk_via_bridge(struct pci_dev *pdev)
626{
627 if(pdev->devfn == 0) {
628 printk(KERN_INFO "PCI: Via IRQ fixup\n");
629 via_interrupt_line_quirk = 1;
630 }
631}
632
633
634
635
636static void __init quirk_svwks_csb5ide(struct pci_dev *pdev)
637{
638 u8 prog;
639 pci_read_config_byte(pdev, PCI_CLASS_PROG, &prog);
640 if (prog & 5) {
641 prog &= ~5;
642 pdev->class &= ~5;
643 pci_write_config_byte(pdev, PCI_CLASS_PROG, prog);
644
645 quirk_ide_bases(pdev);
646 }
647}
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662static int __initdata asus_hides_smbus = 0;
663
664static void __init asus_hides_smbus_hostbridge(struct pci_dev *dev)
665{
666 if (likely(dev->subsystem_vendor != PCI_VENDOR_ID_ASUSTEK))
667 return;
668
669 if (dev->device == PCI_DEVICE_ID_INTEL_82845_HB)
670 switch(dev->subsystem_device) {
671 case 0x8070:
672 case 0x8088:
673 asus_hides_smbus = 1;
674 }
675 if ((dev->device == PCI_DEVICE_ID_INTEL_82845G_HB) &&
676 (dev->subsystem_device == 0x80b2))
677 asus_hides_smbus = 1;
678 if ((dev->device == PCI_DEVICE_ID_INTEL_82850_HB) &&
679 (dev->subsystem_device == 0x8030))
680 asus_hides_smbus = 1;
681 if ((dev->device == PCI_DEVICE_ID_INTEL_7205_0) &&
682 (dev->subsystem_device == 0x8070))
683 asus_hides_smbus = 1;
684 return;
685}
686
687static void __init asus_hides_smbus_lpc(struct pci_dev *dev)
688{
689 u16 val;
690
691 if (likely(!asus_hides_smbus))
692 return;
693
694 pci_read_config_word(dev, 0xF2, &val);
695 if (val & 0x8) {
696 pci_write_config_word(dev, 0xF2, val & (~0x8));
697 pci_read_config_word(dev, 0xF2, &val);
698 if(val & 0x8)
699 printk(KERN_INFO "PCI: i801 SMBus device continues to play 'hide and seek'! 0x%x\n", val);
700 else
701 printk(KERN_INFO "PCI: Enabled i801 SMBus device\n");
702 }
703}
704
705
706
707
708
709static struct pci_fixup pci_fixups[] __initdata = {
710 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_DUNORD, PCI_DEVICE_ID_DUNORD_I3000, quirk_dunord },
711 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_passive_release },
712 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_passive_release },
713
714
715
716
717 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_0, quirk_isa_dma_hangs },
718 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C596, quirk_isa_dma_hangs },
719 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_0, quirk_isa_dma_hangs },
720 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82454NX, quirk_disable_pxb },
721 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_868, quirk_s3_64M },
722 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_S3, PCI_DEVICE_ID_S3_968, quirk_s3_64M },
723 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437, quirk_triton },
724 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82437VX, quirk_triton },
725 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439, quirk_triton },
726 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82439TX, quirk_triton },
727 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82441, quirk_natoma },
728 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_0, quirk_natoma },
729 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443LX_1, quirk_natoma },
730 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_0, quirk_natoma },
731 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_1, quirk_natoma },
732 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82443BX_2, quirk_natoma },
733 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1647, quirk_alimagik },
734 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M1651, quirk_alimagik },
735 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_5597, quirk_nopcipci },
736 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_SI, PCI_DEVICE_ID_SI_496, quirk_nopcipci },
737 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8363_0, quirk_vialatency },
738 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8371_1, quirk_vialatency },
739 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_8361, quirk_vialatency },
740 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C576, quirk_vsfx },
741 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_viaetbf },
742 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C597_0, quirk_vt82c598_id },
743 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_vt82c586_acpi },
744 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_vt82c686_acpi },
745 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3, quirk_piix4_acpi },
746 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_12, quirk_ich4_lpc_acpi },
747 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_AL, PCI_DEVICE_ID_AL_M7101, quirk_ali7101_acpi },
748 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371SB_2, quirk_piix3_usb },
749 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_2, quirk_piix3_usb },
750 { PCI_FIXUP_HEADER, PCI_ANY_ID, PCI_ANY_ID, quirk_ide_bases },
751 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_ANY_ID, quirk_via_bridge },
752 { PCI_FIXUP_FINAL, PCI_ANY_ID, PCI_ANY_ID, quirk_cardbus_legacy },
753
754#ifdef CONFIG_X86_IO_APIC
755 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686, quirk_via_ioapic },
756#endif
757 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C586_3, quirk_via_acpi },
758 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_VIA, PCI_DEVICE_ID_VIA_82C686_4, quirk_via_acpi },
759
760 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_VIPER_7410, quirk_amd_ioapic },
761 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_FE_GATE_700C, quirk_amd_ordering },
762 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_ATI, PCI_DEVICE_ID_ATI_RADEON_IGP, quirk_ati_exploding_mce },
763
764
765
766
767
768
769 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82380FB, quirk_transparent_bridge },
770 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_TOSHIBA, 0x605, quirk_transparent_bridge },
771
772 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_CYRIX, PCI_DEVICE_ID_CYRIX_PCI_MASTER, quirk_mediagx_master },
773
774 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_CSB5IDE, quirk_svwks_csb5ide },
775
776#ifdef CONFIG_X86_IO_APIC
777 { PCI_FIXUP_FINAL, PCI_VENDOR_ID_AMD, PCI_DEVICE_ID_AMD_8131_APIC,
778 quirk_amd_8131_ioapic },
779#endif
780
781
782
783
784 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845_HB, asus_hides_smbus_hostbridge },
785 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82845G_HB, asus_hides_smbus_hostbridge },
786 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82850_HB, asus_hides_smbus_hostbridge },
787 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_7205_0, asus_hides_smbus_hostbridge },
788 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0, asus_hides_smbus_lpc },
789 { PCI_FIXUP_HEADER, PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801BA_0, asus_hides_smbus_lpc },
790
791 { 0 }
792};
793
794
795static void pci_do_fixups(struct pci_dev *dev, int pass, struct pci_fixup *f)
796{
797 while (f->pass) {
798 if (f->pass == pass &&
799 (f->vendor == dev->vendor || f->vendor == (u16) PCI_ANY_ID) &&
800 (f->device == dev->device || f->device == (u16) PCI_ANY_ID)) {
801#ifdef DEBUG
802 printk(KERN_INFO "PCI: Calling quirk %p for %s\n", f->hook, dev->slot_name);
803#endif
804 f->hook(dev);
805 }
806 f++;
807 }
808}
809
810void pci_fixup_device(int pass, struct pci_dev *dev)
811{
812 pci_do_fixups(dev, pass, pcibios_fixups);
813 pci_do_fixups(dev, pass, pci_fixups);
814}
815