diff options
Diffstat (limited to 'arch/powerpc/kernel/pci_32.c')
-rw-r--r-- | arch/powerpc/kernel/pci_32.c | 42 |
1 files changed, 34 insertions, 8 deletions
diff --git a/arch/powerpc/kernel/pci_32.c b/arch/powerpc/kernel/pci_32.c index dfb165802529..beb6f0447d16 100644 --- a/arch/powerpc/kernel/pci_32.c +++ b/arch/powerpc/kernel/pci_32.c | |||
@@ -35,6 +35,9 @@ unsigned long isa_io_base = 0; | |||
35 | unsigned long pci_dram_offset = 0; | 35 | unsigned long pci_dram_offset = 0; |
36 | int pcibios_assign_bus_offset = 1; | 36 | int pcibios_assign_bus_offset = 1; |
37 | 37 | ||
38 | /* Default PCI flags is 0 */ | ||
39 | unsigned int ppc_pci_flags; | ||
40 | |||
38 | void pcibios_make_OF_bus_map(void); | 41 | void pcibios_make_OF_bus_map(void); |
39 | 42 | ||
40 | static void pcibios_fixup_resources(struct pci_dev* dev); | 43 | static void pcibios_fixup_resources(struct pci_dev* dev); |
@@ -48,7 +51,7 @@ static u8* pci_to_OF_bus_map; | |||
48 | /* By default, we don't re-assign bus numbers. We do this only on | 51 | /* By default, we don't re-assign bus numbers. We do this only on |
49 | * some pmacs | 52 | * some pmacs |
50 | */ | 53 | */ |
51 | int pci_assign_all_buses; | 54 | static int pci_assign_all_buses; |
52 | 55 | ||
53 | LIST_HEAD(hose_list); | 56 | LIST_HEAD(hose_list); |
54 | 57 | ||
@@ -174,6 +177,14 @@ void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, | |||
174 | } | 177 | } |
175 | EXPORT_SYMBOL(pcibios_bus_to_resource); | 178 | EXPORT_SYMBOL(pcibios_bus_to_resource); |
176 | 179 | ||
180 | static int skip_isa_ioresource_align(struct pci_dev *dev) | ||
181 | { | ||
182 | if ((ppc_pci_flags & PPC_PCI_CAN_SKIP_ISA_ALIGN) && | ||
183 | !(dev->bus->bridge_ctl & PCI_BRIDGE_CTL_ISA)) | ||
184 | return 1; | ||
185 | return 0; | ||
186 | } | ||
187 | |||
177 | /* | 188 | /* |
178 | * We need to avoid collisions with `mirrored' VGA ports | 189 | * We need to avoid collisions with `mirrored' VGA ports |
179 | * and other strange ISA hardware, so we always want the | 190 | * and other strange ISA hardware, so we always want the |
@@ -195,6 +206,8 @@ void pcibios_align_resource(void *data, struct resource *res, | |||
195 | if (res->flags & IORESOURCE_IO) { | 206 | if (res->flags & IORESOURCE_IO) { |
196 | resource_size_t start = res->start; | 207 | resource_size_t start = res->start; |
197 | 208 | ||
209 | if (skip_isa_ioresource_align(dev)) | ||
210 | return; | ||
198 | if (start & 0x300) { | 211 | if (start & 0x300) { |
199 | start = (start + 0x3ff) & ~0x3ff; | 212 | start = (start + 0x3ff) & ~0x3ff; |
200 | res->start = start; | 213 | res->start = start; |
@@ -251,8 +264,13 @@ pcibios_allocate_bus_resources(struct list_head *bus_list) | |||
251 | continue; | 264 | continue; |
252 | if (bus->parent == NULL) | 265 | if (bus->parent == NULL) |
253 | pr = (res->flags & IORESOURCE_IO)? | 266 | pr = (res->flags & IORESOURCE_IO)? |
254 | &ioport_resource: &iomem_resource; | 267 | &ioport_resource : &iomem_resource; |
255 | else { | 268 | else { |
269 | /* Don't bother with non-root busses when | ||
270 | * re-assigning all resources. | ||
271 | */ | ||
272 | if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC) | ||
273 | continue; | ||
256 | pr = pci_find_parent_resource(bus->self, res); | 274 | pr = pci_find_parent_resource(bus->self, res); |
257 | if (pr == res) { | 275 | if (pr == res) { |
258 | /* this happens when the generic PCI | 276 | /* this happens when the generic PCI |
@@ -720,6 +738,9 @@ pcibios_init(void) | |||
720 | 738 | ||
721 | printk(KERN_INFO "PCI: Probing PCI hardware\n"); | 739 | printk(KERN_INFO "PCI: Probing PCI hardware\n"); |
722 | 740 | ||
741 | if (ppc_pci_flags & PPC_PCI_REASSIGN_ALL_BUS) | ||
742 | pci_assign_all_buses = 1; | ||
743 | |||
723 | /* Scan all of the recorded PCI controllers. */ | 744 | /* Scan all of the recorded PCI controllers. */ |
724 | list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { | 745 | list_for_each_entry_safe(hose, tmp, &hose_list, list_node) { |
725 | if (pci_assign_all_buses) | 746 | if (pci_assign_all_buses) |
@@ -746,13 +767,18 @@ pcibios_init(void) | |||
746 | if (ppc_md.pcibios_fixup) | 767 | if (ppc_md.pcibios_fixup) |
747 | ppc_md.pcibios_fixup(); | 768 | ppc_md.pcibios_fixup(); |
748 | 769 | ||
749 | /* Allocate and assign resources */ | 770 | /* Allocate and assign resources. If we re-assign everything, then |
771 | * we skip the allocate phase | ||
772 | */ | ||
750 | pcibios_allocate_bus_resources(&pci_root_buses); | 773 | pcibios_allocate_bus_resources(&pci_root_buses); |
751 | pcibios_allocate_resources(0); | 774 | if (!(ppc_pci_flags & PPC_PCI_REASSIGN_ALL_RSRC)) { |
752 | pcibios_allocate_resources(1); | 775 | pcibios_allocate_resources(0); |
753 | 776 | pcibios_allocate_resources(1); | |
754 | DBG("PCI: Assigning unassigned resouces...\n"); | 777 | } |
755 | pci_assign_unassigned_resources(); | 778 | if (!(ppc_pci_flags & PPC_PCI_PROBE_ONLY)) { |
779 | DBG("PCI: Assigning unassigned resouces...\n"); | ||
780 | pci_assign_unassigned_resources(); | ||
781 | } | ||
756 | 782 | ||
757 | /* Call machine dependent post-init code */ | 783 | /* Call machine dependent post-init code */ |
758 | if (ppc_md.pcibios_after_init) | 784 | if (ppc_md.pcibios_after_init) |