|
@@ -424,6 +424,38 @@ static int pcibios_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
|
|
|
return irq;
|
|
|
}
|
|
|
|
|
|
+static int __init pcibios_init_resources(int busnr, struct pci_sys_data *sys)
|
|
|
+{
|
|
|
+ int ret;
|
|
|
+ struct pci_host_bridge_window *window;
|
|
|
+
|
|
|
+ if (list_empty(&sys->resources)) {
|
|
|
+ pci_add_resource_offset(&sys->resources,
|
|
|
+ &iomem_resource, sys->mem_offset);
|
|
|
+ }
|
|
|
+
|
|
|
+ list_for_each_entry(window, &sys->resources, list) {
|
|
|
+ if (resource_type(window->res) == IORESOURCE_IO)
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ sys->io_res.start = (busnr * SZ_64K) ? : pcibios_min_io;
|
|
|
+ sys->io_res.end = (busnr + 1) * SZ_64K - 1;
|
|
|
+ sys->io_res.flags = IORESOURCE_IO;
|
|
|
+ sys->io_res.name = sys->io_res_name;
|
|
|
+ sprintf(sys->io_res_name, "PCI%d I/O", busnr);
|
|
|
+
|
|
|
+ ret = request_resource(&ioport_resource, &sys->io_res);
|
|
|
+ if (ret) {
|
|
|
+ pr_err("PCI: unable to allocate I/O port region (%d)\n", ret);
|
|
|
+ return ret;
|
|
|
+ }
|
|
|
+ pci_add_resource_offset(&sys->resources, &sys->io_res,
|
|
|
+ sys->io_offset);
|
|
|
+
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
static void __init pcibios_init_hw(struct hw_pci *hw, struct list_head *head)
|
|
|
{
|
|
|
struct pci_sys_data *sys = NULL;
|
|
@@ -446,11 +478,10 @@ static void __init pcibios_init_hw(struct hw_pci *hw, struct list_head *head)
|
|
|
ret = hw->setup(nr, sys);
|
|
|
|
|
|
if (ret > 0) {
|
|
|
- if (list_empty(&sys->resources)) {
|
|
|
- pci_add_resource_offset(&sys->resources,
|
|
|
- &ioport_resource, sys->io_offset);
|
|
|
- pci_add_resource_offset(&sys->resources,
|
|
|
- &iomem_resource, sys->mem_offset);
|
|
|
+ ret = pcibios_init_resources(nr, sys);
|
|
|
+ if (ret) {
|
|
|
+ kfree(sys);
|
|
|
+ break;
|
|
|
}
|
|
|
|
|
|
if (hw->scan)
|