2 * host bridge related code
5 #include <linux/kernel.h>
6 #include <linux/init.h>
8 #include <linux/module.h>
12 static LIST_HEAD(pci_host_bridges);
14 void add_to_pci_host_bridges(struct pci_host_bridge *bridge)
16 list_add_tail(&bridge->list, &pci_host_bridges);
19 static struct pci_host_bridge *pci_host_bridge(struct pci_dev *dev)
22 struct pci_host_bridge *bridge;
28 list_for_each_entry(bridge, &pci_host_bridges, list) {
29 if (bridge->bus == bus)
36 static bool resource_contains(struct resource *res1, struct resource *res2)
38 return res1->start <= res2->start && res1->end >= res2->end;
41 void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region,
44 struct pci_host_bridge *bridge = pci_host_bridge(dev);
45 struct pci_host_bridge_window *window;
46 resource_size_t offset = 0;
48 list_for_each_entry(window, &bridge->windows, list) {
49 if (resource_type(res) != resource_type(window->res))
52 if (resource_contains(window->res, res)) {
53 offset = window->offset;
58 region->start = res->start - offset;
59 region->end = res->end - offset;
61 EXPORT_SYMBOL(pcibios_resource_to_bus);
63 static bool region_contains(struct pci_bus_region *region1,
64 struct pci_bus_region *region2)
66 return region1->start <= region2->start && region1->end >= region2->end;
69 void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res,
70 struct pci_bus_region *region)
72 struct pci_host_bridge *bridge = pci_host_bridge(dev);
73 struct pci_host_bridge_window *window;
74 struct pci_bus_region bus_region;
75 resource_size_t offset = 0;
77 list_for_each_entry(window, &bridge->windows, list) {
78 if (resource_type(res) != resource_type(window->res))
81 bus_region.start = window->res->start - window->offset;
82 bus_region.end = window->res->end - window->offset;
84 if (region_contains(&bus_region, region)) {
85 offset = window->offset;
90 res->start = region->start + offset;
91 res->end = region->end + offset;
93 EXPORT_SYMBOL(pcibios_bus_to_resource);