diff options
Diffstat (limited to 'arch')
-rw-r--r-- | arch/x86/include/asm/pci.h | 2 | ||||
-rw-r--r-- | arch/x86/kernel/pci-dma.c | 64 | ||||
-rw-r--r-- | arch/x86/kernel/setup.c | 1 | ||||
-rw-r--r-- | arch/x86/pci/direct.c | 17 | ||||
-rw-r--r-- | arch/x86/pci/irq.c | 4 | ||||
-rw-r--r-- | arch/x86/pci/mmconfig-shared.c | 10 |
6 files changed, 19 insertions, 79 deletions
diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h index 676129229630..d498943b906c 100644 --- a/arch/x86/include/asm/pci.h +++ b/arch/x86/include/asm/pci.h | |||
@@ -135,8 +135,6 @@ void default_teardown_msi_irqs(struct pci_dev *dev); | |||
135 | #include "pci_64.h" | 135 | #include "pci_64.h" |
136 | #endif | 136 | #endif |
137 | 137 | ||
138 | void dma32_reserve_bootmem(void); | ||
139 | |||
140 | /* implement the pci_ DMA API in terms of the generic device dma_ one */ | 138 | /* implement the pci_ DMA API in terms of the generic device dma_ one */ |
141 | #include <asm-generic/pci-dma-compat.h> | 139 | #include <asm-generic/pci-dma-compat.h> |
142 | 140 | ||
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c index 9ea999a4dcc1..b49d00da2aed 100644 --- a/arch/x86/kernel/pci-dma.c +++ b/arch/x86/kernel/pci-dma.c | |||
@@ -68,74 +68,10 @@ int dma_set_mask(struct device *dev, u64 mask) | |||
68 | } | 68 | } |
69 | EXPORT_SYMBOL(dma_set_mask); | 69 | EXPORT_SYMBOL(dma_set_mask); |
70 | 70 | ||
71 | #if defined(CONFIG_X86_64) && !defined(CONFIG_NUMA) | ||
72 | static __initdata void *dma32_bootmem_ptr; | ||
73 | static unsigned long dma32_bootmem_size __initdata = (128ULL<<20); | ||
74 | |||
75 | static int __init parse_dma32_size_opt(char *p) | ||
76 | { | ||
77 | if (!p) | ||
78 | return -EINVAL; | ||
79 | dma32_bootmem_size = memparse(p, &p); | ||
80 | return 0; | ||
81 | } | ||
82 | early_param("dma32_size", parse_dma32_size_opt); | ||
83 | |||
84 | void __init dma32_reserve_bootmem(void) | ||
85 | { | ||
86 | unsigned long size, align; | ||
87 | if (max_pfn <= MAX_DMA32_PFN) | ||
88 | return; | ||
89 | |||
90 | /* | ||
91 | * check aperture_64.c allocate_aperture() for reason about | ||
92 | * using 512M as goal | ||
93 | */ | ||
94 | align = 64ULL<<20; | ||
95 | size = roundup(dma32_bootmem_size, align); | ||
96 | dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align, | ||
97 | 512ULL<<20); | ||
98 | /* | ||
99 | * Kmemleak should not scan this block as it may not be mapped via the | ||
100 | * kernel direct mapping. | ||
101 | */ | ||
102 | kmemleak_ignore(dma32_bootmem_ptr); | ||
103 | if (dma32_bootmem_ptr) | ||
104 | dma32_bootmem_size = size; | ||
105 | else | ||
106 | dma32_bootmem_size = 0; | ||
107 | } | ||
108 | static void __init dma32_free_bootmem(void) | ||
109 | { | ||
110 | |||
111 | if (max_pfn <= MAX_DMA32_PFN) | ||
112 | return; | ||
113 | |||
114 | if (!dma32_bootmem_ptr) | ||
115 | return; | ||
116 | |||
117 | free_bootmem(__pa(dma32_bootmem_ptr), dma32_bootmem_size); | ||
118 | |||
119 | dma32_bootmem_ptr = NULL; | ||
120 | dma32_bootmem_size = 0; | ||
121 | } | ||
122 | #else | ||
123 | void __init dma32_reserve_bootmem(void) | ||
124 | { | ||
125 | } | ||
126 | static void __init dma32_free_bootmem(void) | ||
127 | { | ||
128 | } | ||
129 | |||
130 | #endif | ||
131 | |||
132 | void __init pci_iommu_alloc(void) | 71 | void __init pci_iommu_alloc(void) |
133 | { | 72 | { |
134 | struct iommu_table_entry *p; | 73 | struct iommu_table_entry *p; |
135 | 74 | ||
136 | /* free the range so iommu could get some range less than 4G */ | ||
137 | dma32_free_bootmem(); | ||
138 | |||
139 | sort_iommu_table(__iommu_table, __iommu_table_end); | 75 | sort_iommu_table(__iommu_table, __iommu_table_end); |
140 | check_iommu_entries(__iommu_table, __iommu_table_end); | 76 | check_iommu_entries(__iommu_table, __iommu_table_end); |
141 | 77 | ||
diff --git a/arch/x86/kernel/setup.c b/arch/x86/kernel/setup.c index c3050af9306d..605e5ae19c7f 100644 --- a/arch/x86/kernel/setup.c +++ b/arch/x86/kernel/setup.c | |||
@@ -964,7 +964,6 @@ void __init setup_arch(char **cmdline_p) | |||
964 | 964 | ||
965 | initmem_init(); | 965 | initmem_init(); |
966 | memblock_find_dma_reserve(); | 966 | memblock_find_dma_reserve(); |
967 | dma32_reserve_bootmem(); | ||
968 | 967 | ||
969 | #ifdef CONFIG_KVM_CLOCK | 968 | #ifdef CONFIG_KVM_CLOCK |
970 | kvmclock_init(); | 969 | kvmclock_init(); |
diff --git a/arch/x86/pci/direct.c b/arch/x86/pci/direct.c index bd33620b0071..e6fd8473fb7b 100644 --- a/arch/x86/pci/direct.c +++ b/arch/x86/pci/direct.c | |||
@@ -280,12 +280,9 @@ void __init pci_direct_init(int type) | |||
280 | 280 | ||
281 | int __init pci_direct_probe(void) | 281 | int __init pci_direct_probe(void) |
282 | { | 282 | { |
283 | struct resource *region, *region2; | ||
284 | |||
285 | if ((pci_probe & PCI_PROBE_CONF1) == 0) | 283 | if ((pci_probe & PCI_PROBE_CONF1) == 0) |
286 | goto type2; | 284 | goto type2; |
287 | region = request_region(0xCF8, 8, "PCI conf1"); | 285 | if (!request_region(0xCF8, 8, "PCI conf1")) |
288 | if (!region) | ||
289 | goto type2; | 286 | goto type2; |
290 | 287 | ||
291 | if (pci_check_type1()) { | 288 | if (pci_check_type1()) { |
@@ -293,16 +290,14 @@ int __init pci_direct_probe(void) | |||
293 | port_cf9_safe = true; | 290 | port_cf9_safe = true; |
294 | return 1; | 291 | return 1; |
295 | } | 292 | } |
296 | release_resource(region); | 293 | release_region(0xCF8, 8); |
297 | 294 | ||
298 | type2: | 295 | type2: |
299 | if ((pci_probe & PCI_PROBE_CONF2) == 0) | 296 | if ((pci_probe & PCI_PROBE_CONF2) == 0) |
300 | return 0; | 297 | return 0; |
301 | region = request_region(0xCF8, 4, "PCI conf2"); | 298 | if (!request_region(0xCF8, 4, "PCI conf2")) |
302 | if (!region) | ||
303 | return 0; | 299 | return 0; |
304 | region2 = request_region(0xC000, 0x1000, "PCI conf2"); | 300 | if (!request_region(0xC000, 0x1000, "PCI conf2")) |
305 | if (!region2) | ||
306 | goto fail2; | 301 | goto fail2; |
307 | 302 | ||
308 | if (pci_check_type2()) { | 303 | if (pci_check_type2()) { |
@@ -311,8 +306,8 @@ int __init pci_direct_probe(void) | |||
311 | return 2; | 306 | return 2; |
312 | } | 307 | } |
313 | 308 | ||
314 | release_resource(region2); | 309 | release_region(0xC000, 0x1000); |
315 | fail2: | 310 | fail2: |
316 | release_resource(region); | 311 | release_region(0xCF8, 4); |
317 | return 0; | 312 | return 0; |
318 | } | 313 | } |
diff --git a/arch/x86/pci/irq.c b/arch/x86/pci/irq.c index 8201165bae28..372e9b8989b3 100644 --- a/arch/x86/pci/irq.c +++ b/arch/x86/pci/irq.c | |||
@@ -602,7 +602,9 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route | |||
602 | || (device >= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN && | 602 | || (device >= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MIN && |
603 | device <= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX) | 603 | device <= PCI_DEVICE_ID_INTEL_COUGARPOINT_LPC_MAX) |
604 | || (device >= PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN && | 604 | || (device >= PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MIN && |
605 | device <= PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX)) { | 605 | device <= PCI_DEVICE_ID_INTEL_DH89XXCC_LPC_MAX) |
606 | || (device >= PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MIN && | ||
607 | device <= PCI_DEVICE_ID_INTEL_PANTHERPOINT_LPC_MAX)) { | ||
606 | r->name = "PIIX/ICH"; | 608 | r->name = "PIIX/ICH"; |
607 | r->get = pirq_piix_get; | 609 | r->get = pirq_piix_get; |
608 | r->set = pirq_piix_set; | 610 | r->set = pirq_piix_set; |
diff --git a/arch/x86/pci/mmconfig-shared.c b/arch/x86/pci/mmconfig-shared.c index e282886616a0..750c346ef50a 100644 --- a/arch/x86/pci/mmconfig-shared.c +++ b/arch/x86/pci/mmconfig-shared.c | |||
@@ -606,6 +606,16 @@ static void __init __pci_mmcfg_init(int early) | |||
606 | if (list_empty(&pci_mmcfg_list)) | 606 | if (list_empty(&pci_mmcfg_list)) |
607 | return; | 607 | return; |
608 | 608 | ||
609 | if (pcibios_last_bus < 0) { | ||
610 | const struct pci_mmcfg_region *cfg; | ||
611 | |||
612 | list_for_each_entry(cfg, &pci_mmcfg_list, list) { | ||
613 | if (cfg->segment) | ||
614 | break; | ||
615 | pcibios_last_bus = cfg->end_bus; | ||
616 | } | ||
617 | } | ||
618 | |||
609 | if (pci_mmcfg_arch_init()) | 619 | if (pci_mmcfg_arch_init()) |
610 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; | 620 | pci_probe = (pci_probe & ~PCI_PROBE_MASK) | PCI_PROBE_MMCONF; |
611 | else { | 621 | else { |