Root/
1 | /* |
2 | * host bridge related code |
3 | */ |
4 | |
5 | #include <linux/kernel.h> |
6 | #include <linux/init.h> |
7 | #include <linux/pci.h> |
8 | #include <linux/module.h> |
9 | |
10 | #include "pci.h" |
11 | |
12 | static struct pci_bus *find_pci_root_bus(struct pci_dev *dev) |
13 | { |
14 | struct pci_bus *bus; |
15 | |
16 | bus = dev->bus; |
17 | while (bus->parent) |
18 | bus = bus->parent; |
19 | |
20 | return bus; |
21 | } |
22 | |
23 | static struct pci_host_bridge *find_pci_host_bridge(struct pci_dev *dev) |
24 | { |
25 | struct pci_bus *bus = find_pci_root_bus(dev); |
26 | |
27 | return to_pci_host_bridge(bus->bridge); |
28 | } |
29 | |
30 | void pci_set_host_bridge_release(struct pci_host_bridge *bridge, |
31 | void (*release_fn)(struct pci_host_bridge *), |
32 | void *release_data) |
33 | { |
34 | bridge->release_fn = release_fn; |
35 | bridge->release_data = release_data; |
36 | } |
37 | |
38 | static bool resource_contains(struct resource *res1, struct resource *res2) |
39 | { |
40 | return res1->start <= res2->start && res1->end >= res2->end; |
41 | } |
42 | |
43 | void pcibios_resource_to_bus(struct pci_dev *dev, struct pci_bus_region *region, |
44 | struct resource *res) |
45 | { |
46 | struct pci_host_bridge *bridge = find_pci_host_bridge(dev); |
47 | struct pci_host_bridge_window *window; |
48 | resource_size_t offset = 0; |
49 | |
50 | list_for_each_entry(window, &bridge->windows, list) { |
51 | if (resource_type(res) != resource_type(window->res)) |
52 | continue; |
53 | |
54 | if (resource_contains(window->res, res)) { |
55 | offset = window->offset; |
56 | break; |
57 | } |
58 | } |
59 | |
60 | region->start = res->start - offset; |
61 | region->end = res->end - offset; |
62 | } |
63 | EXPORT_SYMBOL(pcibios_resource_to_bus); |
64 | |
65 | static bool region_contains(struct pci_bus_region *region1, |
66 | struct pci_bus_region *region2) |
67 | { |
68 | return region1->start <= region2->start && region1->end >= region2->end; |
69 | } |
70 | |
71 | void pcibios_bus_to_resource(struct pci_dev *dev, struct resource *res, |
72 | struct pci_bus_region *region) |
73 | { |
74 | struct pci_host_bridge *bridge = find_pci_host_bridge(dev); |
75 | struct pci_host_bridge_window *window; |
76 | resource_size_t offset = 0; |
77 | |
78 | list_for_each_entry(window, &bridge->windows, list) { |
79 | struct pci_bus_region bus_region; |
80 | |
81 | if (resource_type(res) != resource_type(window->res)) |
82 | continue; |
83 | |
84 | bus_region.start = window->res->start - window->offset; |
85 | bus_region.end = window->res->end - window->offset; |
86 | |
87 | if (region_contains(&bus_region, region)) { |
88 | offset = window->offset; |
89 | break; |
90 | } |
91 | } |
92 | |
93 | res->start = region->start + offset; |
94 | res->end = region->end + offset; |
95 | } |
96 | EXPORT_SYMBOL(pcibios_bus_to_resource); |
97 |
Branches:
ben-wpan
ben-wpan-stefan
javiroman/ks7010
jz-2.6.34
jz-2.6.34-rc5
jz-2.6.34-rc6
jz-2.6.34-rc7
jz-2.6.35
jz-2.6.36
jz-2.6.37
jz-2.6.38
jz-2.6.39
jz-3.0
jz-3.1
jz-3.11
jz-3.12
jz-3.13
jz-3.15
jz-3.16
jz-3.18-dt
jz-3.2
jz-3.3
jz-3.4
jz-3.5
jz-3.6
jz-3.6-rc2-pwm
jz-3.9
jz-3.9-clk
jz-3.9-rc8
jz47xx
jz47xx-2.6.38
master
Tags:
od-2011-09-04
od-2011-09-18
v2.6.34-rc5
v2.6.34-rc6
v2.6.34-rc7
v3.9