diff options
author | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@ppc970.osdl.org> | 2005-04-16 18:20:36 -0400 |
commit | 1da177e4c3f41524e886b7f1b8a0c1fc7321cac2 (patch) | |
tree | 0bba044c4ce775e45a88a51686b5d9f90697ea9d /drivers/ide/setup-pci.c |
Linux-2.6.12-rc2v2.6.12-rc2
Initial git repository build. I'm not bothering with the full history,
even though we have it. We can create a separate "historical" git
archive of that later if we want to, and in the meantime it's about
3.2GB when imported into git - space that would just make the early
git days unnecessarily complicated, when we don't have a lot of good
infrastructure for it.
Let it rip!
Diffstat (limited to 'drivers/ide/setup-pci.c')
-rw-r--r-- | drivers/ide/setup-pci.c | 901 |
1 files changed, 901 insertions, 0 deletions
diff --git a/drivers/ide/setup-pci.c b/drivers/ide/setup-pci.c new file mode 100644 index 000000000000..e501675ad72e --- /dev/null +++ b/drivers/ide/setup-pci.c | |||
@@ -0,0 +1,901 @@ | |||
1 | /* | ||
2 | * linux/drivers/ide/setup-pci.c Version 1.10 2002/08/19 | ||
3 | * | ||
4 | * Copyright (c) 1998-2000 Andre Hedrick <andre@linux-ide.org> | ||
5 | * | ||
6 | * Copyright (c) 1995-1998 Mark Lord | ||
7 | * May be copied or modified under the terms of the GNU General Public License | ||
8 | * | ||
9 | * Recent Changes | ||
10 | * Split the set up function into multiple functions | ||
11 | * Use pci_set_master | ||
12 | * Fix misreporting of I/O v MMIO problems | ||
13 | * Initial fixups for simplex devices | ||
14 | */ | ||
15 | |||
16 | /* | ||
17 | * This module provides support for automatic detection and | ||
18 | * configuration of all PCI IDE interfaces present in a system. | ||
19 | */ | ||
20 | |||
21 | #include <linux/config.h> | ||
22 | #include <linux/module.h> | ||
23 | #include <linux/types.h> | ||
24 | #include <linux/kernel.h> | ||
25 | #include <linux/pci.h> | ||
26 | #include <linux/init.h> | ||
27 | #include <linux/timer.h> | ||
28 | #include <linux/mm.h> | ||
29 | #include <linux/interrupt.h> | ||
30 | #include <linux/ide.h> | ||
31 | #include <linux/dma-mapping.h> | ||
32 | |||
33 | #include <asm/io.h> | ||
34 | #include <asm/irq.h> | ||
35 | |||
36 | |||
37 | /** | ||
38 | * ide_match_hwif - match a PCI IDE against an ide_hwif | ||
39 | * @io_base: I/O base of device | ||
40 | * @bootable: set if its bootable | ||
41 | * @name: name of device | ||
42 | * | ||
43 | * Match a PCI IDE port against an entry in ide_hwifs[], | ||
44 | * based on io_base port if possible. Return the matching hwif, | ||
45 | * or a new hwif. If we find an error (clashing, out of devices, etc) | ||
46 | * return NULL | ||
47 | * | ||
48 | * FIXME: we need to handle mmio matches here too | ||
49 | */ | ||
50 | |||
51 | static ide_hwif_t *ide_match_hwif(unsigned long io_base, u8 bootable, const char *name) | ||
52 | { | ||
53 | int h; | ||
54 | ide_hwif_t *hwif; | ||
55 | |||
56 | /* | ||
57 | * Look for a hwif with matching io_base specified using | ||
58 | * parameters to ide_setup(). | ||
59 | */ | ||
60 | for (h = 0; h < MAX_HWIFS; ++h) { | ||
61 | hwif = &ide_hwifs[h]; | ||
62 | if (hwif->io_ports[IDE_DATA_OFFSET] == io_base) { | ||
63 | if (hwif->chipset == ide_forced) | ||
64 | return hwif; /* a perfect match */ | ||
65 | } | ||
66 | } | ||
67 | /* | ||
68 | * Look for a hwif with matching io_base default value. | ||
69 | * If chipset is "ide_unknown", then claim that hwif slot. | ||
70 | * Otherwise, some other chipset has already claimed it.. :( | ||
71 | */ | ||
72 | for (h = 0; h < MAX_HWIFS; ++h) { | ||
73 | hwif = &ide_hwifs[h]; | ||
74 | if (hwif->io_ports[IDE_DATA_OFFSET] == io_base) { | ||
75 | if (hwif->chipset == ide_unknown) | ||
76 | return hwif; /* match */ | ||
77 | printk(KERN_ERR "%s: port 0x%04lx already claimed by %s\n", | ||
78 | name, io_base, hwif->name); | ||
79 | return NULL; /* already claimed */ | ||
80 | } | ||
81 | } | ||
82 | /* | ||
83 | * Okay, there is no hwif matching our io_base, | ||
84 | * so we'll just claim an unassigned slot. | ||
85 | * Give preference to claiming other slots before claiming ide0/ide1, | ||
86 | * just in case there's another interface yet-to-be-scanned | ||
87 | * which uses ports 1f0/170 (the ide0/ide1 defaults). | ||
88 | * | ||
89 | * Unless there is a bootable card that does not use the standard | ||
90 | * ports 1f0/170 (the ide0/ide1 defaults). The (bootable) flag. | ||
91 | */ | ||
92 | if (bootable) { | ||
93 | for (h = 0; h < MAX_HWIFS; ++h) { | ||
94 | hwif = &ide_hwifs[h]; | ||
95 | if (hwif->chipset == ide_unknown) | ||
96 | return hwif; /* pick an unused entry */ | ||
97 | } | ||
98 | } else { | ||
99 | for (h = 2; h < MAX_HWIFS; ++h) { | ||
100 | hwif = ide_hwifs + h; | ||
101 | if (hwif->chipset == ide_unknown) | ||
102 | return hwif; /* pick an unused entry */ | ||
103 | } | ||
104 | } | ||
105 | for (h = 0; h < 2; ++h) { | ||
106 | hwif = ide_hwifs + h; | ||
107 | if (hwif->chipset == ide_unknown) | ||
108 | return hwif; /* pick an unused entry */ | ||
109 | } | ||
110 | printk(KERN_ERR "%s: too many IDE interfaces, no room in table\n", name); | ||
111 | return NULL; | ||
112 | } | ||
113 | |||
114 | /** | ||
115 | * ide_setup_pci_baseregs - place a PCI IDE controller native | ||
116 | * @dev: PCI device of interface to switch native | ||
117 | * @name: Name of interface | ||
118 | * | ||
119 | * We attempt to place the PCI interface into PCI native mode. If | ||
120 | * we succeed the BARs are ok and the controller is in PCI mode. | ||
121 | * Returns 0 on success or an errno code. | ||
122 | * | ||
123 | * FIXME: if we program the interface and then fail to set the BARS | ||
124 | * we don't switch it back to legacy mode. Do we actually care ?? | ||
125 | */ | ||
126 | |||
127 | static int ide_setup_pci_baseregs (struct pci_dev *dev, const char *name) | ||
128 | { | ||
129 | u8 progif = 0; | ||
130 | |||
131 | /* | ||
132 | * Place both IDE interfaces into PCI "native" mode: | ||
133 | */ | ||
134 | if (pci_read_config_byte(dev, PCI_CLASS_PROG, &progif) || | ||
135 | (progif & 5) != 5) { | ||
136 | if ((progif & 0xa) != 0xa) { | ||
137 | printk(KERN_INFO "%s: device not capable of full " | ||
138 | "native PCI mode\n", name); | ||
139 | return -EOPNOTSUPP; | ||
140 | } | ||
141 | printk("%s: placing both ports into native PCI mode\n", name); | ||
142 | (void) pci_write_config_byte(dev, PCI_CLASS_PROG, progif|5); | ||
143 | if (pci_read_config_byte(dev, PCI_CLASS_PROG, &progif) || | ||
144 | (progif & 5) != 5) { | ||
145 | printk(KERN_ERR "%s: rewrite of PROGIF failed, wanted " | ||
146 | "0x%04x, got 0x%04x\n", | ||
147 | name, progif|5, progif); | ||
148 | return -EOPNOTSUPP; | ||
149 | } | ||
150 | } | ||
151 | return 0; | ||
152 | } | ||
153 | |||
154 | #ifdef CONFIG_BLK_DEV_IDEDMA_PCI | ||
155 | |||
156 | #ifdef CONFIG_BLK_DEV_IDEDMA_FORCED | ||
157 | /* | ||
158 | * Long lost data from 2.0.34 that is now in 2.0.39 | ||
159 | * | ||
160 | * This was used in ./drivers/block/triton.c to do DMA Base address setup | ||
161 | * when PnP failed. Oh the things we forget. I believe this was part | ||
162 | * of SFF-8038i that has been withdrawn from public access... :-(( | ||
163 | */ | ||
164 | #define DEFAULT_BMIBA 0xe800 /* in case BIOS did not init it */ | ||
165 | #define DEFAULT_BMCRBA 0xcc00 /* VIA's default value */ | ||
166 | #define DEFAULT_BMALIBA 0xd400 /* ALI's default value */ | ||
167 | #endif /* CONFIG_BLK_DEV_IDEDMA_FORCED */ | ||
168 | |||
169 | /** | ||
170 | * ide_get_or_set_dma_base - setup BMIBA | ||
171 | * @hwif: Interface | ||
172 | * | ||
173 | * Fetch the DMA Bus-Master-I/O-Base-Address (BMIBA) from PCI space: | ||
174 | * If need be we set up the DMA base. Where a device has a partner that | ||
175 | * is already in DMA mode we check and enforce IDE simplex rules. | ||
176 | */ | ||
177 | |||
178 | static unsigned long ide_get_or_set_dma_base (ide_hwif_t *hwif) | ||
179 | { | ||
180 | unsigned long dma_base = 0; | ||
181 | struct pci_dev *dev = hwif->pci_dev; | ||
182 | |||
183 | #ifdef CONFIG_BLK_DEV_IDEDMA_FORCED | ||
184 | int second_chance = 0; | ||
185 | |||
186 | second_chance_to_dma: | ||
187 | #endif /* CONFIG_BLK_DEV_IDEDMA_FORCED */ | ||
188 | |||
189 | if (hwif->mmio) | ||
190 | return hwif->dma_base; | ||
191 | |||
192 | if (hwif->mate && hwif->mate->dma_base) { | ||
193 | dma_base = hwif->mate->dma_base - (hwif->channel ? 0 : 8); | ||
194 | } else { | ||
195 | dma_base = pci_resource_start(dev, 4); | ||
196 | if (!dma_base) { | ||
197 | printk(KERN_ERR "%s: dma_base is invalid\n", | ||
198 | hwif->cds->name); | ||
199 | } | ||
200 | } | ||
201 | |||
202 | #ifdef CONFIG_BLK_DEV_IDEDMA_FORCED | ||
203 | /* FIXME - should use pci_assign_resource surely */ | ||
204 | if ((!dma_base) && (!second_chance)) { | ||
205 | unsigned long set_bmiba = 0; | ||
206 | second_chance++; | ||
207 | switch(dev->vendor) { | ||
208 | case PCI_VENDOR_ID_AL: | ||
209 | set_bmiba = DEFAULT_BMALIBA; break; | ||
210 | case PCI_VENDOR_ID_VIA: | ||
211 | set_bmiba = DEFAULT_BMCRBA; break; | ||
212 | case PCI_VENDOR_ID_INTEL: | ||
213 | set_bmiba = DEFAULT_BMIBA; break; | ||
214 | default: | ||
215 | return dma_base; | ||
216 | } | ||
217 | pci_write_config_dword(dev, 0x20, set_bmiba|1); | ||
218 | goto second_chance_to_dma; | ||
219 | } | ||
220 | #endif /* CONFIG_BLK_DEV_IDEDMA_FORCED */ | ||
221 | |||
222 | if (dma_base) { | ||
223 | u8 simplex_stat = 0; | ||
224 | dma_base += hwif->channel ? 8 : 0; | ||
225 | |||
226 | switch(dev->device) { | ||
227 | case PCI_DEVICE_ID_AL_M5219: | ||
228 | case PCI_DEVICE_ID_AL_M5229: | ||
229 | case PCI_DEVICE_ID_AMD_VIPER_7409: | ||
230 | case PCI_DEVICE_ID_CMD_643: | ||
231 | case PCI_DEVICE_ID_SERVERWORKS_CSB5IDE: | ||
232 | simplex_stat = hwif->INB(dma_base + 2); | ||
233 | hwif->OUTB((simplex_stat&0x60),(dma_base + 2)); | ||
234 | simplex_stat = hwif->INB(dma_base + 2); | ||
235 | if (simplex_stat & 0x80) { | ||
236 | printk(KERN_INFO "%s: simplex device: " | ||
237 | "DMA forced\n", | ||
238 | hwif->cds->name); | ||
239 | } | ||
240 | break; | ||
241 | default: | ||
242 | /* | ||
243 | * If the device claims "simplex" DMA, | ||
244 | * this means only one of the two interfaces | ||
245 | * can be trusted with DMA at any point in time. | ||
246 | * So we should enable DMA only on one of the | ||
247 | * two interfaces. | ||
248 | */ | ||
249 | simplex_stat = hwif->INB(dma_base + 2); | ||
250 | if (simplex_stat & 0x80) { | ||
251 | /* simplex device? */ | ||
252 | /* | ||
253 | * At this point we haven't probed the drives so we can't make the | ||
254 | * appropriate decision. Really we should defer this problem | ||
255 | * until we tune the drive then try to grab DMA ownership if we want | ||
256 | * to be the DMA end. This has to be become dynamic to handle hot | ||
257 | * plug. | ||
258 | */ | ||
259 | if (hwif->mate && hwif->mate->dma_base) { | ||
260 | printk(KERN_INFO "%s: simplex device: " | ||
261 | "DMA disabled\n", | ||
262 | hwif->cds->name); | ||
263 | dma_base = 0; | ||
264 | } | ||
265 | } | ||
266 | } | ||
267 | } | ||
268 | return dma_base; | ||
269 | } | ||
270 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI */ | ||
271 | |||
272 | void ide_setup_pci_noise (struct pci_dev *dev, ide_pci_device_t *d) | ||
273 | { | ||
274 | printk(KERN_INFO "%s: IDE controller at PCI slot %s\n", | ||
275 | d->name, pci_name(dev)); | ||
276 | } | ||
277 | |||
278 | EXPORT_SYMBOL_GPL(ide_setup_pci_noise); | ||
279 | |||
280 | |||
281 | /** | ||
282 | * ide_pci_enable - do PCI enables | ||
283 | * @dev: PCI device | ||
284 | * @d: IDE pci device data | ||
285 | * | ||
286 | * Enable the IDE PCI device. We attempt to enable the device in full | ||
287 | * but if that fails then we only need BAR4 so we will enable that. | ||
288 | * | ||
289 | * Returns zero on success or an error code | ||
290 | */ | ||
291 | |||
292 | static int ide_pci_enable(struct pci_dev *dev, ide_pci_device_t *d) | ||
293 | { | ||
294 | int ret; | ||
295 | |||
296 | if (pci_enable_device(dev)) { | ||
297 | ret = pci_enable_device_bars(dev, 1 << 4); | ||
298 | if (ret < 0) { | ||
299 | printk(KERN_WARNING "%s: (ide_setup_pci_device:) " | ||
300 | "Could not enable device.\n", d->name); | ||
301 | goto out; | ||
302 | } | ||
303 | printk(KERN_WARNING "%s: BIOS configuration fixed.\n", d->name); | ||
304 | } | ||
305 | |||
306 | /* | ||
307 | * assume all devices can do 32-bit dma for now. we can add a | ||
308 | * dma mask field to the ide_pci_device_t if we need it (or let | ||
309 | * lower level driver set the dma mask) | ||
310 | */ | ||
311 | ret = pci_set_dma_mask(dev, DMA_32BIT_MASK); | ||
312 | if (ret < 0) { | ||
313 | printk(KERN_ERR "%s: can't set dma mask\n", d->name); | ||
314 | goto out; | ||
315 | } | ||
316 | |||
317 | /* FIXME: Temporary - until we put in the hotplug interface logic | ||
318 | Check that the bits we want are not in use by someone else. */ | ||
319 | ret = pci_request_region(dev, 4, "ide_tmp"); | ||
320 | if (ret < 0) | ||
321 | goto out; | ||
322 | |||
323 | pci_release_region(dev, 4); | ||
324 | out: | ||
325 | return ret; | ||
326 | } | ||
327 | |||
328 | /** | ||
329 | * ide_pci_configure - configure an unconfigured device | ||
330 | * @dev: PCI device | ||
331 | * @d: IDE pci device data | ||
332 | * | ||
333 | * Enable and configure the PCI device we have been passed. | ||
334 | * Returns zero on success or an error code. | ||
335 | */ | ||
336 | |||
337 | static int ide_pci_configure(struct pci_dev *dev, ide_pci_device_t *d) | ||
338 | { | ||
339 | u16 pcicmd = 0; | ||
340 | /* | ||
341 | * PnP BIOS was *supposed* to have setup this device, but we | ||
342 | * can do it ourselves, so long as the BIOS has assigned an IRQ | ||
343 | * (or possibly the device is using a "legacy header" for IRQs). | ||
344 | * Maybe the user deliberately *disabled* the device, | ||
345 | * but we'll eventually ignore it again if no drives respond. | ||
346 | */ | ||
347 | if (ide_setup_pci_baseregs(dev, d->name) || pci_write_config_word(dev, PCI_COMMAND, pcicmd|PCI_COMMAND_IO)) | ||
348 | { | ||
349 | printk(KERN_INFO "%s: device disabled (BIOS)\n", d->name); | ||
350 | return -ENODEV; | ||
351 | } | ||
352 | if (pci_read_config_word(dev, PCI_COMMAND, &pcicmd)) { | ||
353 | printk(KERN_ERR "%s: error accessing PCI regs\n", d->name); | ||
354 | return -EIO; | ||
355 | } | ||
356 | if (!(pcicmd & PCI_COMMAND_IO)) { | ||
357 | printk(KERN_ERR "%s: unable to enable IDE controller\n", d->name); | ||
358 | return -ENXIO; | ||
359 | } | ||
360 | return 0; | ||
361 | } | ||
362 | |||
363 | /** | ||
364 | * ide_pci_check_iomem - check a register is I/O | ||
365 | * @dev: pci device | ||
366 | * @d: ide_pci_device | ||
367 | * @bar: bar number | ||
368 | * | ||
369 | * Checks if a BAR is configured and points to MMIO space. If so | ||
370 | * print an error and return an error code. Otherwise return 0 | ||
371 | */ | ||
372 | |||
373 | static int ide_pci_check_iomem(struct pci_dev *dev, ide_pci_device_t *d, int bar) | ||
374 | { | ||
375 | ulong flags = pci_resource_flags(dev, bar); | ||
376 | |||
377 | /* Unconfigured ? */ | ||
378 | if (!flags || pci_resource_len(dev, bar) == 0) | ||
379 | return 0; | ||
380 | |||
381 | /* I/O space */ | ||
382 | if(flags & PCI_BASE_ADDRESS_IO_MASK) | ||
383 | return 0; | ||
384 | |||
385 | /* Bad */ | ||
386 | printk(KERN_ERR "%s: IO baseregs (BIOS) are reported " | ||
387 | "as MEM, report to " | ||
388 | "<andre@linux-ide.org>.\n", d->name); | ||
389 | return -EINVAL; | ||
390 | } | ||
391 | |||
392 | /** | ||
393 | * ide_hwif_configure - configure an IDE interface | ||
394 | * @dev: PCI device holding interface | ||
395 | * @d: IDE pci data | ||
396 | * @mate: Paired interface if any | ||
397 | * | ||
398 | * Perform the initial set up for the hardware interface structure. This | ||
399 | * is done per interface port rather than per PCI device. There may be | ||
400 | * more than one port per device. | ||
401 | * | ||
402 | * Returns the new hardware interface structure, or NULL on a failure | ||
403 | */ | ||
404 | |||
405 | static ide_hwif_t *ide_hwif_configure(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *mate, int port, int irq) | ||
406 | { | ||
407 | unsigned long ctl = 0, base = 0; | ||
408 | ide_hwif_t *hwif; | ||
409 | |||
410 | if ((d->flags & IDEPCI_FLAG_ISA_PORTS) == 0) { | ||
411 | /* Possibly we should fail if these checks report true */ | ||
412 | ide_pci_check_iomem(dev, d, 2*port); | ||
413 | ide_pci_check_iomem(dev, d, 2*port+1); | ||
414 | |||
415 | ctl = pci_resource_start(dev, 2*port+1); | ||
416 | base = pci_resource_start(dev, 2*port); | ||
417 | if ((ctl && !base) || (base && !ctl)) { | ||
418 | printk(KERN_ERR "%s: inconsistent baseregs (BIOS) " | ||
419 | "for port %d, skipping\n", d->name, port); | ||
420 | return NULL; | ||
421 | } | ||
422 | } | ||
423 | if (!ctl) | ||
424 | { | ||
425 | /* Use default values */ | ||
426 | ctl = port ? 0x374 : 0x3f4; | ||
427 | base = port ? 0x170 : 0x1f0; | ||
428 | } | ||
429 | if ((hwif = ide_match_hwif(base, d->bootable, d->name)) == NULL) | ||
430 | return NULL; /* no room in ide_hwifs[] */ | ||
431 | if (hwif->io_ports[IDE_DATA_OFFSET] != base || | ||
432 | hwif->io_ports[IDE_CONTROL_OFFSET] != (ctl | 2)) { | ||
433 | memset(&hwif->hw, 0, sizeof(hwif->hw)); | ||
434 | #ifndef IDE_ARCH_OBSOLETE_INIT | ||
435 | ide_std_init_ports(&hwif->hw, base, (ctl | 2)); | ||
436 | hwif->hw.io_ports[IDE_IRQ_OFFSET] = 0; | ||
437 | #else | ||
438 | ide_init_hwif_ports(&hwif->hw, base, (ctl | 2), NULL); | ||
439 | #endif | ||
440 | memcpy(hwif->io_ports, hwif->hw.io_ports, sizeof(hwif->io_ports)); | ||
441 | hwif->noprobe = !hwif->io_ports[IDE_DATA_OFFSET]; | ||
442 | } | ||
443 | hwif->chipset = ide_pci; | ||
444 | hwif->pci_dev = dev; | ||
445 | hwif->cds = (struct ide_pci_device_s *) d; | ||
446 | hwif->channel = port; | ||
447 | |||
448 | if (!hwif->irq) | ||
449 | hwif->irq = irq; | ||
450 | if (mate) { | ||
451 | hwif->mate = mate; | ||
452 | mate->mate = hwif; | ||
453 | } | ||
454 | return hwif; | ||
455 | } | ||
456 | |||
457 | /** | ||
458 | * ide_hwif_setup_dma - configure DMA interface | ||
459 | * @dev: PCI device | ||
460 | * @d: IDE pci data | ||
461 | * @hwif: Hardware interface we are configuring | ||
462 | * | ||
463 | * Set up the DMA base for the interface. Enable the master bits as | ||
464 | * necessary and attempt to bring the device DMA into a ready to use | ||
465 | * state | ||
466 | */ | ||
467 | |||
468 | #ifndef CONFIG_BLK_DEV_IDEDMA_PCI | ||
469 | static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif) | ||
470 | { | ||
471 | } | ||
472 | #else | ||
473 | static void ide_hwif_setup_dma(struct pci_dev *dev, ide_pci_device_t *d, ide_hwif_t *hwif) | ||
474 | { | ||
475 | u16 pcicmd; | ||
476 | pci_read_config_word(dev, PCI_COMMAND, &pcicmd); | ||
477 | |||
478 | if ((d->autodma == AUTODMA) || | ||
479 | ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && | ||
480 | (dev->class & 0x80))) { | ||
481 | unsigned long dma_base = ide_get_or_set_dma_base(hwif); | ||
482 | if (dma_base && !(pcicmd & PCI_COMMAND_MASTER)) { | ||
483 | /* | ||
484 | * Set up BM-DMA capability | ||
485 | * (PnP BIOS should have done this) | ||
486 | */ | ||
487 | /* default DMA off if we had to configure it here */ | ||
488 | hwif->autodma = 0; | ||
489 | pci_set_master(dev); | ||
490 | if (pci_read_config_word(dev, PCI_COMMAND, &pcicmd) || !(pcicmd & PCI_COMMAND_MASTER)) { | ||
491 | printk(KERN_ERR "%s: %s error updating PCICMD\n", | ||
492 | hwif->name, d->name); | ||
493 | dma_base = 0; | ||
494 | } | ||
495 | } | ||
496 | if (dma_base) { | ||
497 | if (d->init_dma) { | ||
498 | d->init_dma(hwif, dma_base); | ||
499 | } else { | ||
500 | ide_setup_dma(hwif, dma_base, 8); | ||
501 | } | ||
502 | } else { | ||
503 | printk(KERN_INFO "%s: %s Bus-Master DMA disabled " | ||
504 | "(BIOS)\n", hwif->name, d->name); | ||
505 | } | ||
506 | } | ||
507 | } | ||
508 | |||
509 | #ifndef CONFIG_IDEDMA_PCI_AUTO | ||
510 | #warning CONFIG_IDEDMA_PCI_AUTO=n support is obsolete, and will be removed soon. | ||
511 | #endif | ||
512 | |||
513 | #endif /* CONFIG_BLK_DEV_IDEDMA_PCI*/ | ||
514 | |||
515 | /** | ||
516 | * ide_setup_pci_controller - set up IDE PCI | ||
517 | * @dev: PCI device | ||
518 | * @d: IDE PCI data | ||
519 | * @noisy: verbose flag | ||
520 | * @config: returned as 1 if we configured the hardware | ||
521 | * | ||
522 | * Set up the PCI and controller side of the IDE interface. This brings | ||
523 | * up the PCI side of the device, checks that the device is enabled | ||
524 | * and enables it if need be | ||
525 | */ | ||
526 | |||
527 | static int ide_setup_pci_controller(struct pci_dev *dev, ide_pci_device_t *d, int noisy, int *config) | ||
528 | { | ||
529 | int ret; | ||
530 | u32 class_rev; | ||
531 | u16 pcicmd; | ||
532 | |||
533 | if (noisy) | ||
534 | ide_setup_pci_noise(dev, d); | ||
535 | |||
536 | ret = ide_pci_enable(dev, d); | ||
537 | if (ret < 0) | ||
538 | goto out; | ||
539 | |||
540 | ret = pci_read_config_word(dev, PCI_COMMAND, &pcicmd); | ||
541 | if (ret < 0) { | ||
542 | printk(KERN_ERR "%s: error accessing PCI regs\n", d->name); | ||
543 | goto out; | ||
544 | } | ||
545 | if (!(pcicmd & PCI_COMMAND_IO)) { /* is device disabled? */ | ||
546 | ret = ide_pci_configure(dev, d); | ||
547 | if (ret < 0) | ||
548 | goto out; | ||
549 | *config = 1; | ||
550 | printk(KERN_INFO "%s: device enabled (Linux)\n", d->name); | ||
551 | } | ||
552 | |||
553 | pci_read_config_dword(dev, PCI_CLASS_REVISION, &class_rev); | ||
554 | class_rev &= 0xff; | ||
555 | if (noisy) | ||
556 | printk(KERN_INFO "%s: chipset revision %d\n", d->name, class_rev); | ||
557 | out: | ||
558 | return ret; | ||
559 | } | ||
560 | |||
561 | /** | ||
562 | * ide_pci_setup_ports - configure ports/devices on PCI IDE | ||
563 | * @dev: PCI device | ||
564 | * @d: IDE pci device info | ||
565 | * @pciirq: IRQ line | ||
566 | * @index: ata index to update | ||
567 | * | ||
568 | * Scan the interfaces attached to this device and do any | ||
569 | * necessary per port setup. Attach the devices and ask the | ||
570 | * generic DMA layer to do its work for us. | ||
571 | * | ||
572 | * Normally called automaticall from do_ide_pci_setup_device, | ||
573 | * but is also used directly as a helper function by some controllers | ||
574 | * where the chipset setup is not the default PCI IDE one. | ||
575 | */ | ||
576 | |||
577 | void ide_pci_setup_ports(struct pci_dev *dev, ide_pci_device_t *d, int pciirq, ata_index_t *index) | ||
578 | { | ||
579 | int port; | ||
580 | int at_least_one_hwif_enabled = 0; | ||
581 | ide_hwif_t *hwif, *mate = NULL; | ||
582 | static int secondpdc = 0; | ||
583 | u8 tmp; | ||
584 | |||
585 | index->all = 0xf0f0; | ||
586 | |||
587 | /* | ||
588 | * Set up the IDE ports | ||
589 | */ | ||
590 | |||
591 | for (port = 0; port <= 1; ++port) { | ||
592 | ide_pci_enablebit_t *e = &(d->enablebits[port]); | ||
593 | |||
594 | /* | ||
595 | * If this is a Promise FakeRaid controller, | ||
596 | * the 2nd controller will be marked as | ||
597 | * disabled while it is actually there and enabled | ||
598 | * by the bios for raid purposes. | ||
599 | * Skip the normal "is it enabled" test for those. | ||
600 | */ | ||
601 | if ((d->flags & IDEPCI_FLAG_FORCE_PDC) && | ||
602 | (secondpdc++==1) && (port==1)) | ||
603 | goto controller_ok; | ||
604 | |||
605 | if (e->reg && (pci_read_config_byte(dev, e->reg, &tmp) || | ||
606 | (tmp & e->mask) != e->val)) | ||
607 | continue; /* port not enabled */ | ||
608 | controller_ok: | ||
609 | |||
610 | if (d->channels <= port) | ||
611 | break; | ||
612 | |||
613 | if ((hwif = ide_hwif_configure(dev, d, mate, port, pciirq)) == NULL) | ||
614 | continue; | ||
615 | |||
616 | /* setup proper ancestral information */ | ||
617 | hwif->gendev.parent = &dev->dev; | ||
618 | |||
619 | if (hwif->channel) { | ||
620 | index->b.high = hwif->index; | ||
621 | } else { | ||
622 | index->b.low = hwif->index; | ||
623 | } | ||
624 | |||
625 | |||
626 | if (d->init_iops) | ||
627 | d->init_iops(hwif); | ||
628 | |||
629 | if (d->autodma == NODMA) | ||
630 | goto bypass_legacy_dma; | ||
631 | |||
632 | if(d->init_setup_dma) | ||
633 | d->init_setup_dma(dev, d, hwif); | ||
634 | else | ||
635 | ide_hwif_setup_dma(dev, d, hwif); | ||
636 | bypass_legacy_dma: | ||
637 | if (d->init_hwif) | ||
638 | /* Call chipset-specific routine | ||
639 | * for each enabled hwif | ||
640 | */ | ||
641 | d->init_hwif(hwif); | ||
642 | |||
643 | mate = hwif; | ||
644 | at_least_one_hwif_enabled = 1; | ||
645 | } | ||
646 | if (!at_least_one_hwif_enabled) | ||
647 | printk(KERN_INFO "%s: neither IDE port enabled (BIOS)\n", d->name); | ||
648 | } | ||
649 | |||
650 | EXPORT_SYMBOL_GPL(ide_pci_setup_ports); | ||
651 | |||
652 | /* | ||
653 | * ide_setup_pci_device() looks at the primary/secondary interfaces | ||
654 | * on a PCI IDE device and, if they are enabled, prepares the IDE driver | ||
655 | * for use with them. This generic code works for most PCI chipsets. | ||
656 | * | ||
657 | * One thing that is not standardized is the location of the | ||
658 | * primary/secondary interface "enable/disable" bits. For chipsets that | ||
659 | * we "know" about, this information is in the ide_pci_device_t struct; | ||
660 | * for all other chipsets, we just assume both interfaces are enabled. | ||
661 | */ | ||
662 | static int do_ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d, | ||
663 | ata_index_t *index, u8 noisy) | ||
664 | { | ||
665 | static ata_index_t ata_index = { .b = { .low = 0xff, .high = 0xff } }; | ||
666 | int tried_config = 0; | ||
667 | int pciirq, ret; | ||
668 | |||
669 | ret = ide_setup_pci_controller(dev, d, noisy, &tried_config); | ||
670 | if (ret < 0) | ||
671 | goto out; | ||
672 | |||
673 | /* | ||
674 | * Can we trust the reported IRQ? | ||
675 | */ | ||
676 | pciirq = dev->irq; | ||
677 | |||
678 | /* Is it an "IDE storage" device in non-PCI mode? */ | ||
679 | if ((dev->class >> 8) == PCI_CLASS_STORAGE_IDE && (dev->class & 5) != 5) { | ||
680 | if (noisy) | ||
681 | printk(KERN_INFO "%s: not 100%% native mode: " | ||
682 | "will probe irqs later\n", d->name); | ||
683 | /* | ||
684 | * This allows offboard ide-pci cards the enable a BIOS, | ||
685 | * verify interrupt settings of split-mirror pci-config | ||
686 | * space, place chipset into init-mode, and/or preserve | ||
687 | * an interrupt if the card is not native ide support. | ||
688 | */ | ||
689 | ret = d->init_chipset ? d->init_chipset(dev, d->name) : 0; | ||
690 | if (ret < 0) | ||
691 | goto out; | ||
692 | pciirq = ret; | ||
693 | } else if (tried_config) { | ||
694 | if (noisy) | ||
695 | printk(KERN_INFO "%s: will probe irqs later\n", d->name); | ||
696 | pciirq = 0; | ||
697 | } else if (!pciirq) { | ||
698 | if (noisy) | ||
699 | printk(KERN_WARNING "%s: bad irq (%d): will probe later\n", | ||
700 | d->name, pciirq); | ||
701 | pciirq = 0; | ||
702 | } else { | ||
703 | if (d->init_chipset) { | ||
704 | ret = d->init_chipset(dev, d->name); | ||
705 | if (ret < 0) | ||
706 | goto out; | ||
707 | } | ||
708 | if (noisy) | ||
709 | #ifdef __sparc__ | ||
710 | printk(KERN_INFO "%s: 100%% native mode on irq %s\n", | ||
711 | d->name, __irq_itoa(pciirq)); | ||
712 | #else | ||
713 | printk(KERN_INFO "%s: 100%% native mode on irq %d\n", | ||
714 | d->name, pciirq); | ||
715 | #endif | ||
716 | } | ||
717 | |||
718 | /* FIXME: silent failure can happen */ | ||
719 | |||
720 | *index = ata_index; | ||
721 | ide_pci_setup_ports(dev, d, pciirq, index); | ||
722 | out: | ||
723 | return ret; | ||
724 | } | ||
725 | |||
726 | int ide_setup_pci_device(struct pci_dev *dev, ide_pci_device_t *d) | ||
727 | { | ||
728 | ata_index_t index_list; | ||
729 | int ret; | ||
730 | |||
731 | ret = do_ide_setup_pci_device(dev, d, &index_list, 1); | ||
732 | if (ret < 0) | ||
733 | goto out; | ||
734 | |||
735 | if ((index_list.b.low & 0xf0) != 0xf0) | ||
736 | probe_hwif_init_with_fixup(&ide_hwifs[index_list.b.low], d->fixup); | ||
737 | if ((index_list.b.high & 0xf0) != 0xf0) | ||
738 | probe_hwif_init_with_fixup(&ide_hwifs[index_list.b.high], d->fixup); | ||
739 | |||
740 | create_proc_ide_interfaces(); | ||
741 | out: | ||
742 | return ret; | ||
743 | } | ||
744 | |||
745 | EXPORT_SYMBOL_GPL(ide_setup_pci_device); | ||
746 | |||
747 | int ide_setup_pci_devices(struct pci_dev *dev1, struct pci_dev *dev2, | ||
748 | ide_pci_device_t *d) | ||
749 | { | ||
750 | struct pci_dev *pdev[] = { dev1, dev2 }; | ||
751 | ata_index_t index_list[2]; | ||
752 | int ret, i; | ||
753 | |||
754 | for (i = 0; i < 2; i++) { | ||
755 | ret = do_ide_setup_pci_device(pdev[i], d, index_list + i, !i); | ||
756 | /* | ||
757 | * FIXME: Mom, mom, they stole me the helper function to undo | ||
758 | * do_ide_setup_pci_device() on the first device! | ||
759 | */ | ||
760 | if (ret < 0) | ||
761 | goto out; | ||
762 | } | ||
763 | |||
764 | for (i = 0; i < 2; i++) { | ||
765 | u8 idx[2] = { index_list[i].b.low, index_list[i].b.high }; | ||
766 | int j; | ||
767 | |||
768 | for (j = 0; j < 2; j++) { | ||
769 | if ((idx[j] & 0xf0) != 0xf0) | ||
770 | probe_hwif_init(ide_hwifs + idx[j]); | ||
771 | } | ||
772 | } | ||
773 | |||
774 | create_proc_ide_interfaces(); | ||
775 | out: | ||
776 | return ret; | ||
777 | } | ||
778 | |||
779 | EXPORT_SYMBOL_GPL(ide_setup_pci_devices); | ||
780 | |||
781 | /* | ||
782 | * Module interfaces | ||
783 | */ | ||
784 | |||
785 | static int pre_init = 1; /* Before first ordered IDE scan */ | ||
786 | static LIST_HEAD(ide_pci_drivers); | ||
787 | |||
788 | /* | ||
789 | * ide_register_pci_driver - attach IDE driver | ||
790 | * @driver: pci driver | ||
791 | * | ||
792 | * Registers a driver with the IDE layer. The IDE layer arranges that | ||
793 | * boot time setup is done in the expected device order and then | ||
794 | * hands the controllers off to the core PCI code to do the rest of | ||
795 | * the work. | ||
796 | * | ||
797 | * The driver_data of the driver table must point to an ide_pci_device_t | ||
798 | * describing the interface. | ||
799 | * | ||
800 | * Returns are the same as for pci_register_driver | ||
801 | */ | ||
802 | |||
803 | int ide_pci_register_driver(struct pci_driver *driver) | ||
804 | { | ||
805 | if(!pre_init) | ||
806 | return pci_module_init(driver); | ||
807 | list_add_tail(&driver->node, &ide_pci_drivers); | ||
808 | return 0; | ||
809 | } | ||
810 | |||
811 | EXPORT_SYMBOL_GPL(ide_pci_register_driver); | ||
812 | |||
813 | /** | ||
814 | * ide_unregister_pci_driver - unregister an IDE driver | ||
815 | * @driver: driver to remove | ||
816 | * | ||
817 | * Unregister a currently installed IDE driver. Returns are the same | ||
818 | * as for pci_unregister_driver | ||
819 | */ | ||
820 | |||
821 | void ide_pci_unregister_driver(struct pci_driver *driver) | ||
822 | { | ||
823 | if(!pre_init) | ||
824 | pci_unregister_driver(driver); | ||
825 | else | ||
826 | list_del(&driver->node); | ||
827 | } | ||
828 | |||
829 | EXPORT_SYMBOL_GPL(ide_pci_unregister_driver); | ||
830 | |||
831 | /** | ||
832 | * ide_scan_pcidev - find an IDE driver for a device | ||
833 | * @dev: PCI device to check | ||
834 | * | ||
835 | * Look for an IDE driver to handle the device we are considering. | ||
836 | * This is only used during boot up to get the ordering correct. After | ||
837 | * boot up the pci layer takes over the job. | ||
838 | */ | ||
839 | |||
840 | static int __init ide_scan_pcidev(struct pci_dev *dev) | ||
841 | { | ||
842 | struct list_head *l; | ||
843 | struct pci_driver *d; | ||
844 | |||
845 | list_for_each(l, &ide_pci_drivers) | ||
846 | { | ||
847 | d = list_entry(l, struct pci_driver, node); | ||
848 | if(d->id_table) | ||
849 | { | ||
850 | const struct pci_device_id *id = pci_match_device(d->id_table, dev); | ||
851 | if(id != NULL) | ||
852 | { | ||
853 | if(d->probe(dev, id) >= 0) | ||
854 | { | ||
855 | dev->driver = d; | ||
856 | return 1; | ||
857 | } | ||
858 | } | ||
859 | } | ||
860 | } | ||
861 | return 0; | ||
862 | } | ||
863 | |||
864 | /** | ||
865 | * ide_scan_pcibus - perform the initial IDE driver scan | ||
866 | * @scan_direction: set for reverse order scanning | ||
867 | * | ||
868 | * Perform the initial bus rather than driver ordered scan of the | ||
869 | * PCI drivers. After this all IDE pci handling becomes standard | ||
870 | * module ordering not traditionally ordered. | ||
871 | */ | ||
872 | |||
873 | void __init ide_scan_pcibus (int scan_direction) | ||
874 | { | ||
875 | struct pci_dev *dev = NULL; | ||
876 | struct pci_driver *d; | ||
877 | struct list_head *l, *n; | ||
878 | |||
879 | pre_init = 0; | ||
880 | if (!scan_direction) { | ||
881 | while ((dev = pci_find_device(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | ||
882 | ide_scan_pcidev(dev); | ||
883 | } | ||
884 | } else { | ||
885 | while ((dev = pci_find_device_reverse(PCI_ANY_ID, PCI_ANY_ID, dev)) != NULL) { | ||
886 | ide_scan_pcidev(dev); | ||
887 | } | ||
888 | } | ||
889 | |||
890 | /* | ||
891 | * Hand the drivers over to the PCI layer now we | ||
892 | * are post init. | ||
893 | */ | ||
894 | |||
895 | list_for_each_safe(l, n, &ide_pci_drivers) | ||
896 | { | ||
897 | list_del(l); | ||
898 | d = list_entry(l, struct pci_driver, node); | ||
899 | pci_register_driver(d); | ||
900 | } | ||
901 | } | ||