diff options
Diffstat (limited to 'arch/x86/pci/bus_numa.c')
-rw-r--r-- | arch/x86/pci/bus_numa.c | 28 |
1 files changed, 14 insertions, 14 deletions
diff --git a/arch/x86/pci/bus_numa.c b/arch/x86/pci/bus_numa.c index f939d603adfa..64a122883896 100644 --- a/arch/x86/pci/bus_numa.c +++ b/arch/x86/pci/bus_numa.c | |||
@@ -1,11 +1,11 @@ | |||
1 | #include <linux/init.h> | 1 | #include <linux/init.h> |
2 | #include <linux/pci.h> | 2 | #include <linux/pci.h> |
3 | #include <linux/range.h> | ||
3 | 4 | ||
4 | #include "bus_numa.h" | 5 | #include "bus_numa.h" |
5 | 6 | ||
6 | int pci_root_num; | 7 | int pci_root_num; |
7 | struct pci_root_info pci_root_info[PCI_ROOT_NR]; | 8 | struct pci_root_info pci_root_info[PCI_ROOT_NR]; |
8 | int found_all_numa_early; | ||
9 | 9 | ||
10 | void x86_pci_root_bus_res_quirks(struct pci_bus *b) | 10 | void x86_pci_root_bus_res_quirks(struct pci_bus *b) |
11 | { | 11 | { |
@@ -21,10 +21,6 @@ void x86_pci_root_bus_res_quirks(struct pci_bus *b) | |||
21 | if (!pci_root_num) | 21 | if (!pci_root_num) |
22 | return; | 22 | return; |
23 | 23 | ||
24 | /* for amd, if only one root bus, don't need to do anything */ | ||
25 | if (pci_root_num < 2 && found_all_numa_early) | ||
26 | return; | ||
27 | |||
28 | for (i = 0; i < pci_root_num; i++) { | 24 | for (i = 0; i < pci_root_num; i++) { |
29 | if (pci_root_info[i].bus_min == b->number) | 25 | if (pci_root_info[i].bus_min == b->number) |
30 | break; | 26 | break; |
@@ -36,13 +32,14 @@ void x86_pci_root_bus_res_quirks(struct pci_bus *b) | |||
36 | printk(KERN_DEBUG "PCI: peer root bus %02x res updated from pci conf\n", | 32 | printk(KERN_DEBUG "PCI: peer root bus %02x res updated from pci conf\n", |
37 | b->number); | 33 | b->number); |
38 | 34 | ||
35 | pci_bus_remove_resources(b); | ||
39 | info = &pci_root_info[i]; | 36 | info = &pci_root_info[i]; |
40 | for (j = 0; j < info->res_num; j++) { | 37 | for (j = 0; j < info->res_num; j++) { |
41 | struct resource *res; | 38 | struct resource *res; |
42 | struct resource *root; | 39 | struct resource *root; |
43 | 40 | ||
44 | res = &info->res[j]; | 41 | res = &info->res[j]; |
45 | b->resource[j] = res; | 42 | pci_bus_add_resource(b, res, 0); |
46 | if (res->flags & IORESOURCE_IO) | 43 | if (res->flags & IORESOURCE_IO) |
47 | root = &ioport_resource; | 44 | root = &ioport_resource; |
48 | else | 45 | else |
@@ -51,8 +48,8 @@ void x86_pci_root_bus_res_quirks(struct pci_bus *b) | |||
51 | } | 48 | } |
52 | } | 49 | } |
53 | 50 | ||
54 | void __devinit update_res(struct pci_root_info *info, size_t start, | 51 | void __devinit update_res(struct pci_root_info *info, resource_size_t start, |
55 | size_t end, unsigned long flags, int merge) | 52 | resource_size_t end, unsigned long flags, int merge) |
56 | { | 53 | { |
57 | int i; | 54 | int i; |
58 | struct resource *res; | 55 | struct resource *res; |
@@ -60,25 +57,28 @@ void __devinit update_res(struct pci_root_info *info, size_t start, | |||
60 | if (start > end) | 57 | if (start > end) |
61 | return; | 58 | return; |
62 | 59 | ||
60 | if (start == MAX_RESOURCE) | ||
61 | return; | ||
62 | |||
63 | if (!merge) | 63 | if (!merge) |
64 | goto addit; | 64 | goto addit; |
65 | 65 | ||
66 | /* try to merge it with old one */ | 66 | /* try to merge it with old one */ |
67 | for (i = 0; i < info->res_num; i++) { | 67 | for (i = 0; i < info->res_num; i++) { |
68 | size_t final_start, final_end; | 68 | resource_size_t final_start, final_end; |
69 | size_t common_start, common_end; | 69 | resource_size_t common_start, common_end; |
70 | 70 | ||
71 | res = &info->res[i]; | 71 | res = &info->res[i]; |
72 | if (res->flags != flags) | 72 | if (res->flags != flags) |
73 | continue; | 73 | continue; |
74 | 74 | ||
75 | common_start = max((size_t)res->start, start); | 75 | common_start = max(res->start, start); |
76 | common_end = min((size_t)res->end, end); | 76 | common_end = min(res->end, end); |
77 | if (common_start > common_end + 1) | 77 | if (common_start > common_end + 1) |
78 | continue; | 78 | continue; |
79 | 79 | ||
80 | final_start = min((size_t)res->start, start); | 80 | final_start = min(res->start, start); |
81 | final_end = max((size_t)res->end, end); | 81 | final_end = max(res->end, end); |
82 | 82 | ||
83 | res->start = final_start; | 83 | res->start = final_start; |
84 | res->end = final_end; | 84 | res->end = final_end; |