diff options
author | Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp> | 2007-10-02 17:19:23 -0400 |
---|---|---|
committer | Greg Kroah-Hartman <gregkh@suse.de> | 2007-10-12 18:03:17 -0400 |
commit | fd6e732186ab522c812ab19c2c5e5befb8ec8115 (patch) | |
tree | dd65db780133a32476c5d68f21aa8350221d62e4 /drivers/pci | |
parent | cbf5d9e6b9bcf03291cbb51db144b3e2773a8a2d (diff) |
PCI: fix IDE legacy mode resources
I got the following error on MIPS Cobalt.
PCI: Unable to reserve I/O region #1:8@f00001f0 for device 0000:00:09.1
pata_via 0000:00:09.1: failed to request/iomap BARs for port 0 (errno=-16)
PCI: Unable to reserve I/O region #3:8@f0000170 for device 0000:00:09.1
pata_via 0000:00:09.1: failed to request/iomap BARs for port 1 (errno=-16)
pata_via 0000:00:09.1: no available native port
The legacy mode IDE resources set the following order.
pci_setup_device()
Legacy mode ATA controllers have fixed addresses.
IDE resources: 0x1F0-0x1F7, 0x3F6, 0x170-0x177, 0x376
|
V
pcibios_fixup_bus()
MIPS Cobalt PCI bus regions have the -0x10000000 offset from PCI resources.
pcibios_fixup_bus() fix PCI bus regions.
0x1F0 - 0x10000000 = 0xF00001F0
|
V
ata_pci_init_one()
PCI: Unable to reserve I/O region #1:8@f00001f0 for device 0000:00:09.1
In some architectures, PCI bus regions have the offset from PCI resources.
For this reason, pci_setup_device() should set PCI bus regions to
dev->resource[].
[akpm@linux-foundation.org: use struct initialiser]
Signed-off-by: Yoichi Yuasa <yoichi_yuasa@tripeaks.co.jp>
Cc: Alan Cox <alan@lxorguk.ukuu.org.uk>
Cc: Greg KH <greg@kroah.com>
Cc: Bartlomiej Zolnierkiewicz <bzolnier@gmail.com>
Cc: Ralf Baechle <ralf@linux-mips.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/pci')
-rw-r--r-- | drivers/pci/probe.c | 48 |
1 files changed, 36 insertions, 12 deletions
diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c index 171ca712e523..40e571d3c392 100644 --- a/drivers/pci/probe.c +++ b/drivers/pci/probe.c | |||
@@ -744,22 +744,46 @@ static int pci_setup_device(struct pci_dev * dev) | |||
744 | */ | 744 | */ |
745 | if (class == PCI_CLASS_STORAGE_IDE) { | 745 | if (class == PCI_CLASS_STORAGE_IDE) { |
746 | u8 progif; | 746 | u8 progif; |
747 | struct pci_bus_region region; | ||
748 | |||
747 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); | 749 | pci_read_config_byte(dev, PCI_CLASS_PROG, &progif); |
748 | if ((progif & 1) == 0) { | 750 | if ((progif & 1) == 0) { |
749 | dev->resource[0].start = 0x1F0; | 751 | struct resource resource = { |
750 | dev->resource[0].end = 0x1F7; | 752 | .start = 0x1F0, |
751 | dev->resource[0].flags = LEGACY_IO_RESOURCE; | 753 | .end = 0x1F7, |
752 | dev->resource[1].start = 0x3F6; | 754 | .flags = LEGACY_IO_RESOURCE, |
753 | dev->resource[1].end = 0x3F6; | 755 | }; |
754 | dev->resource[1].flags = LEGACY_IO_RESOURCE; | 756 | |
757 | pcibios_resource_to_bus(dev, ®ion, &resource); | ||
758 | dev->resource[0].start = region.start; | ||
759 | dev->resource[0].end = region.end; | ||
760 | dev->resource[0].flags = resource.flags; | ||
761 | resource.start = 0x3F6; | ||
762 | resource.end = 0x3F6; | ||
763 | resource.flags = LEGACY_IO_RESOURCE; | ||
764 | pcibios_resource_to_bus(dev, ®ion, &resource); | ||
765 | dev->resource[1].start = region.start; | ||
766 | dev->resource[1].end = region.end; | ||
767 | dev->resource[1].flags = resource.flags; | ||
755 | } | 768 | } |
756 | if ((progif & 4) == 0) { | 769 | if ((progif & 4) == 0) { |
757 | dev->resource[2].start = 0x170; | 770 | struct resource resource = { |
758 | dev->resource[2].end = 0x177; | 771 | .start = 0x170, |
759 | dev->resource[2].flags = LEGACY_IO_RESOURCE; | 772 | .end = 0x177, |
760 | dev->resource[3].start = 0x376; | 773 | .flags = LEGACY_IO_RESOURCE, |
761 | dev->resource[3].end = 0x376; | 774 | }; |
762 | dev->resource[3].flags = LEGACY_IO_RESOURCE; | 775 | |
776 | pcibios_resource_to_bus(dev, ®ion, &resource); | ||
777 | dev->resource[2].start = region.start; | ||
778 | dev->resource[2].end = region.end; | ||
779 | dev->resource[2].flags = resource.flags; | ||
780 | resource.start = 0x376; | ||
781 | resource.end = 0x376; | ||
782 | resource.flags = LEGACY_IO_RESOURCE; | ||
783 | pcibios_resource_to_bus(dev, ®ion, &resource); | ||
784 | dev->resource[3].start = region.start; | ||
785 | dev->resource[3].end = region.end; | ||
786 | dev->resource[3].flags = resource.flags; | ||
763 | } | 787 | } |
764 | } | 788 | } |
765 | break; | 789 | break; |