ftp://ftp.kernel.org/pub/linux/kernel/v2.6/linux-2.6.6.tar.bz2
[linux-2.6.git] / arch / i386 / pci / fixup.c
1 /*
2  * Exceptions for specific devices. Usually work-arounds for fatal design flaws.
3  */
4
5 #include <linux/pci.h>
6 #include <linux/init.h>
7 #include "pci.h"
8
9
10 static void __devinit pci_fixup_i450nx(struct pci_dev *d)
11 {
12         /*
13          * i450NX -- Find and scan all secondary buses on all PXB's.
14          */
15         int pxb, reg;
16         u8 busno, suba, subb;
17
18         printk(KERN_WARNING "PCI: Searching for i450NX host bridges on %s\n", pci_name(d));
19         reg = 0xd0;
20         for(pxb=0; pxb<2; pxb++) {
21                 pci_read_config_byte(d, reg++, &busno);
22                 pci_read_config_byte(d, reg++, &suba);
23                 pci_read_config_byte(d, reg++, &subb);
24                 DBG("i450NX PXB %d: %02x/%02x/%02x\n", pxb, busno, suba, subb);
25                 if (busno)
26                         pci_scan_bus(busno, &pci_root_ops, NULL);       /* Bus A */
27                 if (suba < subb)
28                         pci_scan_bus(suba+1, &pci_root_ops, NULL);      /* Bus B */
29         }
30         pcibios_last_bus = -1;
31 }
32
33 static void __devinit pci_fixup_i450gx(struct pci_dev *d)
34 {
35         /*
36          * i450GX and i450KX -- Find and scan all secondary buses.
37          * (called separately for each PCI bridge found)
38          */
39         u8 busno;
40         pci_read_config_byte(d, 0x4a, &busno);
41         printk(KERN_INFO "PCI: i440KX/GX host bridge %s: secondary bus %02x\n", pci_name(d), busno);
42         pci_scan_bus(busno, &pci_root_ops, NULL);
43         pcibios_last_bus = -1;
44 }
45
46 static void __devinit  pci_fixup_umc_ide(struct pci_dev *d)
47 {
48         /*
49          * UM8886BF IDE controller sets region type bits incorrectly,
50          * therefore they look like memory despite of them being I/O.
51          */
52         int i;
53
54         printk(KERN_WARNING "PCI: Fixing base address flags for device %s\n", pci_name(d));
55         for(i=0; i<4; i++)
56                 d->resource[i].flags |= PCI_BASE_ADDRESS_SPACE_IO;
57 }
58
59 static void __devinit  pci_fixup_ncr53c810(struct pci_dev *d)
60 {
61         /*
62          * NCR 53C810 returns class code 0 (at least on some systems).
63          * Fix class to be PCI_CLASS_STORAGE_SCSI
64          */
65         if (!d->class) {
66                 printk(KERN_WARNING "PCI: fixing NCR 53C810 class code for %s\n", pci_name(d));
67                 d->class = PCI_CLASS_STORAGE_SCSI << 8;
68         }
69 }
70
71 static void __devinit pci_fixup_ide_bases(struct pci_dev *d)
72 {
73         int i;
74
75         /*
76          * PCI IDE controllers use non-standard I/O port decoding, respect it.
77          */
78         if ((d->class >> 8) != PCI_CLASS_STORAGE_IDE)
79                 return;
80         DBG("PCI: IDE base address fixup for %s\n", pci_name(d));
81         for(i=0; i<4; i++) {
82                 struct resource *r = &d->resource[i];
83                 if ((r->start & ~0x80) == 0x374) {
84                         r->start |= 2;
85                         r->end = r->start;
86                 }
87         }
88 }
89
90 static void __devinit  pci_fixup_ide_trash(struct pci_dev *d)
91 {
92         int i;
93
94         /*
95          * There exist PCI IDE controllers which have utter garbage
96          * in first four base registers. Ignore that.
97          */
98         DBG("PCI: IDE base address trash cleared for %s\n", pci_name(d));
99         for(i=0; i<4; i++)
100                 d->resource[i].start = d->resource[i].end = d->resource[i].flags = 0;
101 }
102
103 static void __devinit  pci_fixup_latency(struct pci_dev *d)
104 {
105         /*
106          *  SiS 5597 and 5598 chipsets require latency timer set to
107          *  at most 32 to avoid lockups.
108          */
109         DBG("PCI: Setting max latency to 32\n");
110         pcibios_max_latency = 32;
111 }
112
113 static void __devinit pci_fixup_piix4_acpi(struct pci_dev *d)
114 {
115         /*
116          * PIIX4 ACPI device: hardwired IRQ9
117          */
118         d->irq = 9;
119 }
120
121 /*
122  * Addresses issues with problems in the memory write queue timer in
123  * certain VIA Northbridges.  This bugfix is per VIA's specifications,
124  * except for the KL133/KM133: clearing bit 5 on those Northbridges seems
125  * to trigger a bug in its integrated ProSavage video card, which
126  * causes screen corruption.  We only clear bits 6 and 7 for that chipset,
127  * until VIA can provide us with definitive information on why screen
128  * corruption occurs, and what exactly those bits do.
129  *
130  * VIA 8363,8622,8361 Northbridges:
131  *  - bits  5, 6, 7 at offset 0x55 need to be turned off
132  * VIA 8367 (KT266x) Northbridges:
133  *  - bits  5, 6, 7 at offset 0x95 need to be turned off
134  * VIA 8363 rev 0x81/0x84 (KL133/KM133) Northbridges:
135  *  - bits     6, 7 at offset 0x55 need to be turned off
136  */
137
138 #define VIA_8363_KL133_REVISION_ID 0x81
139 #define VIA_8363_KM133_REVISION_ID 0x84
140
141 static void __devinit pci_fixup_via_northbridge_bug(struct pci_dev *d)
142 {
143         u8 v;
144         u8 revision;
145         int where = 0x55;
146         int mask = 0x1f; /* clear bits 5, 6, 7 by default */
147
148         pci_read_config_byte(d, PCI_REVISION_ID, &revision);
149
150         if (d->device == PCI_DEVICE_ID_VIA_8367_0) {
151                 /* fix pci bus latency issues resulted by NB bios error
152                    it appears on bug free^Wreduced kt266x's bios forces
153                    NB latency to zero */
154                 pci_write_config_byte(d, PCI_LATENCY_TIMER, 0);
155
156                 where = 0x95; /* the memory write queue timer register is 
157                                 different for the KT266x's: 0x95 not 0x55 */
158         } else if (d->device == PCI_DEVICE_ID_VIA_8363_0 &&
159                         (revision == VIA_8363_KL133_REVISION_ID || 
160                         revision == VIA_8363_KM133_REVISION_ID)) {
161                         mask = 0x3f; /* clear only bits 6 and 7; clearing bit 5
162                                         causes screen corruption on the KL133/KM133 */
163         }
164
165         pci_read_config_byte(d, where, &v);
166         if (v & ~mask) {
167                 printk(KERN_WARNING "Disabling VIA memory write queue (PCI ID %04x, rev %02x): [%02x] %02x & %02x -> %02x\n", \
168                         d->device, revision, where, v, mask, v & mask);
169                 v &= mask;
170                 pci_write_config_byte(d, where, v);
171         }
172 }
173
174 /*
175  * For some reasons Intel decided that certain parts of their
176  * 815, 845 and some other chipsets must look like PCI-to-PCI bridges
177  * while they are obviously not. The 82801 family (AA, AB, BAM/CAM,
178  * BA/CA/DB and E) PCI bridges are actually HUB-to-PCI ones, according
179  * to Intel terminology. These devices do forward all addresses from
180  * system to PCI bus no matter what are their window settings, so they are
181  * "transparent" (or subtractive decoding) from programmers point of view.
182  */
183 static void __devinit pci_fixup_transparent_bridge(struct pci_dev *dev)
184 {
185         if ((dev->class >> 8) == PCI_CLASS_BRIDGE_PCI &&
186             (dev->device & 0xff00) == 0x2400)
187                 dev->transparent = 1;
188 }
189
190 /*
191  * Fixup for C1 Halt Disconnect problem on nForce2 systems.
192  *
193  * From information provided by "Allen Martin" <AMartin@nvidia.com>:
194  *
195  * A hang is caused when the CPU generates a very fast CONNECT/HALT cycle
196  * sequence.  Workaround is to set the SYSTEM_IDLE_TIMEOUT to 80 ns.
197  * This allows the state-machine and timer to return to a proper state within
198  * 80 ns of the CONNECT and probe appearing together.  Since the CPU will not
199  * issue another HALT within 80 ns of the initial HALT, the failure condition
200  * is avoided.
201  */
202 static void __init pci_fixup_nforce2(struct pci_dev *dev)
203 {
204         u32 val, fixed_val;
205         u8 rev;
206
207         pci_read_config_byte(dev, PCI_REVISION_ID, &rev);
208
209         /*
210          * Chip  Old value   New value
211          * C17   0x1F0FFF01  0x1F01FF01
212          * C18D  0x9F0FFF01  0x9F01FF01
213          *
214          * Northbridge chip version may be determined by
215          * reading the PCI revision ID (0xC1 or greater is C18D).
216          */
217         fixed_val = rev < 0xC1 ? 0x1F01FF01 : 0x9F01FF01;
218
219         pci_read_config_dword(dev, 0x6c, &val);
220         if (val != fixed_val) {
221                 printk(KERN_WARNING "PCI: nForce2 C1 Halt Disconnect fixup\n");
222                 pci_write_config_dword(dev, 0x6c, fixed_val);
223         }
224 }
225
226 struct pci_fixup pcibios_fixups[] = {
227         {
228                 .pass           = PCI_FIXUP_HEADER,
229                 .vendor         = PCI_VENDOR_ID_INTEL,
230                 .device         = PCI_DEVICE_ID_INTEL_82451NX,
231                 .hook           = pci_fixup_i450nx
232         },
233         {
234                 .pass           = PCI_FIXUP_HEADER,
235                 .vendor         = PCI_VENDOR_ID_INTEL,
236                 .device         = PCI_DEVICE_ID_INTEL_82454GX,
237                 .hook           = pci_fixup_i450gx
238         },
239         {
240                 .pass           = PCI_FIXUP_HEADER,
241                 .vendor         = PCI_VENDOR_ID_UMC,
242                 .device         = PCI_DEVICE_ID_UMC_UM8886BF,
243                 .hook           = pci_fixup_umc_ide
244         },
245         {
246                 .pass           = PCI_FIXUP_HEADER,
247                 .vendor         = PCI_VENDOR_ID_SI,
248                 .device         = PCI_DEVICE_ID_SI_5513,
249                 .hook           = pci_fixup_ide_trash
250         },
251         {
252                 .pass           = PCI_FIXUP_HEADER,
253                 .vendor         = PCI_ANY_ID,
254                 .device         = PCI_ANY_ID,
255                 .hook           = pci_fixup_ide_bases
256         },
257         {
258                 .pass           = PCI_FIXUP_HEADER,
259                 .vendor         = PCI_VENDOR_ID_SI,
260                 .device         = PCI_DEVICE_ID_SI_5597,
261                 .hook           = pci_fixup_latency
262         },
263         {
264                 .pass           = PCI_FIXUP_HEADER,
265                 .vendor         = PCI_VENDOR_ID_SI,
266                 .device         = PCI_DEVICE_ID_SI_5598,
267                 .hook           = pci_fixup_latency
268         },
269         {
270                 .pass           = PCI_FIXUP_HEADER,
271                 .vendor         = PCI_VENDOR_ID_INTEL,
272                 .device         = PCI_DEVICE_ID_INTEL_82371AB_3,
273                 .hook           = pci_fixup_piix4_acpi
274         },
275         {
276                 .pass           = PCI_FIXUP_HEADER,
277                 .vendor         = PCI_VENDOR_ID_INTEL,
278                 .device         = PCI_DEVICE_ID_INTEL_82801CA_10,
279                 .hook           = pci_fixup_ide_trash
280         },
281         {
282                 .pass           = PCI_FIXUP_HEADER,
283                 .vendor         = PCI_VENDOR_ID_INTEL,
284                 .device         = PCI_DEVICE_ID_INTEL_82801CA_11,
285                 .hook           = pci_fixup_ide_trash
286         },
287         {
288                 .pass           = PCI_FIXUP_HEADER,
289                 .vendor         = PCI_VENDOR_ID_INTEL,
290                 .device         = PCI_DEVICE_ID_INTEL_82801DB_9,
291                 .hook           = pci_fixup_ide_trash
292         },
293         {
294                 .pass           = PCI_FIXUP_HEADER,
295                 .vendor         = PCI_VENDOR_ID_VIA,
296                 .device         = PCI_DEVICE_ID_VIA_8363_0,
297                 .hook           = pci_fixup_via_northbridge_bug
298         },
299         {
300                 .pass           = PCI_FIXUP_HEADER,
301                 .vendor         = PCI_VENDOR_ID_VIA,
302                 .device         = PCI_DEVICE_ID_VIA_8622,
303                 .hook           = pci_fixup_via_northbridge_bug
304         },
305         {
306                 .pass           = PCI_FIXUP_HEADER,
307                 .vendor         = PCI_VENDOR_ID_VIA,
308                 .device         = PCI_DEVICE_ID_VIA_8361,
309                 .hook           = pci_fixup_via_northbridge_bug
310         },
311         {
312                 .pass           = PCI_FIXUP_HEADER,
313                 .vendor         = PCI_VENDOR_ID_VIA,
314                 .device         = PCI_DEVICE_ID_VIA_8367_0,
315                 .hook           = pci_fixup_via_northbridge_bug
316         },
317         {
318                 .pass           = PCI_FIXUP_HEADER,
319                 .vendor         = PCI_VENDOR_ID_NCR,
320                 .device         = PCI_DEVICE_ID_NCR_53C810,
321                 .hook           = pci_fixup_ncr53c810
322         },
323         {
324                 .pass           = PCI_FIXUP_HEADER,
325                 .vendor         = PCI_VENDOR_ID_INTEL,
326                 .device         = PCI_ANY_ID,
327                 .hook           = pci_fixup_transparent_bridge
328         },
329         {
330                 .pass           = PCI_FIXUP_HEADER,
331                 .vendor         = PCI_VENDOR_ID_NVIDIA,
332                 .device         = PCI_DEVICE_ID_NVIDIA_NFORCE2,
333                 .hook           = pci_fixup_nforce2
334         },
335         { .pass = 0 }
336 };