1 #include <linux/init.h>
3 #include <linux/range.h>
7 LIST_HEAD(pci_root_infos
);
9 static struct pci_root_info
*x86_find_pci_root_info(int bus
)
11 struct pci_root_info
*info
;
13 list_for_each_entry(info
, &pci_root_infos
, list
)
14 if (info
->busn
.start
== bus
)
20 int x86_pci_root_bus_node(int bus
)
22 struct pci_root_info
*info
= x86_find_pci_root_info(bus
);
30 void x86_pci_root_bus_resources(int bus
, struct list_head
*resources
)
32 struct pci_root_info
*info
= x86_find_pci_root_info(bus
);
33 struct pci_root_res
*root_res
;
34 struct resource_entry
*window
;
38 goto default_resources
;
40 printk(KERN_DEBUG
"PCI: root bus %02x: hardware-probed resources\n",
43 /* already added by acpi ? */
44 resource_list_for_each_entry(window
, resources
)
45 if (window
->res
->flags
& IORESOURCE_BUS
) {
51 pci_add_resource(resources
, &info
->busn
);
53 list_for_each_entry(root_res
, &info
->resources
, list
)
54 pci_add_resource(resources
, &root_res
->res
);
60 * We don't have any host bridge aperture information from the
61 * "native host bridge drivers," e.g., amd_bus or broadcom_bus,
62 * so fall back to the defaults historically used by pci_create_bus().
64 printk(KERN_DEBUG
"PCI: root bus %02x: using default resources\n", bus
);
65 pci_add_resource(resources
, &ioport_resource
);
66 pci_add_resource(resources
, &iomem_resource
);
69 struct pci_root_info __init
*alloc_pci_root_info(int bus_min
, int bus_max
,
72 struct pci_root_info
*info
;
74 info
= kzalloc(sizeof(*info
), GFP_KERNEL
);
79 sprintf(info
->name
, "PCI Bus #%02x", bus_min
);
81 INIT_LIST_HEAD(&info
->resources
);
82 info
->busn
.name
= info
->name
;
83 info
->busn
.start
= bus_min
;
84 info
->busn
.end
= bus_max
;
85 info
->busn
.flags
= IORESOURCE_BUS
;
89 list_add_tail(&info
->list
, &pci_root_infos
);
94 void update_res(struct pci_root_info
*info
, resource_size_t start
,
95 resource_size_t end
, unsigned long flags
, int merge
)
98 struct pci_root_res
*root_res
;
103 if (start
== MAX_RESOURCE
)
109 /* try to merge it with old one */
110 list_for_each_entry(root_res
, &info
->resources
, list
) {
111 resource_size_t final_start
, final_end
;
112 resource_size_t common_start
, common_end
;
114 res
= &root_res
->res
;
115 if (res
->flags
!= flags
)
118 common_start
= max(res
->start
, start
);
119 common_end
= min(res
->end
, end
);
120 if (common_start
> common_end
+ 1)
123 final_start
= min(res
->start
, start
);
124 final_end
= max(res
->end
, end
);
126 res
->start
= final_start
;
127 res
->end
= final_end
;
133 /* need to add that */
134 root_res
= kzalloc(sizeof(*root_res
), GFP_KERNEL
);
138 res
= &root_res
->res
;
139 res
->name
= info
->name
;
144 list_add_tail(&root_res
->list
, &info
->resources
);