aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorYinghai Lu <yhlu.kernel.send@gmail.com>2008-04-14 23:40:37 -0400
committerIngo Molnar <mingo@elte.hu>2008-05-12 15:28:10 -0400
commit7677b2ef6c0c4fddc84f6473f3863f40eb71821b (patch)
tree165d77d56acf37398ff75261e80a96d763e3442b
parent8c9fd91a0dc503f085169d44f4360be025f75224 (diff)
x86_64: allocate gart aperture from 512M
because we try to reserve dma32 early, so we have chance to get aperture from 64M. with some sequence aperture allocated from RAM, could become E820_RESERVED. and then if doing a kexec with a big kernel that uncompressed size is above 64M we could have a range conflict with still using gart. So allocate gart aperture from 512M instead. Also change the fallback_aper_order to 5, because we don't have chance to get 2G or 4G aperture. Signed-off-by: Yinghai Lu <yhlu.kernel@gmail.com> Signed-off-by: Ingo Molnar <mingo@elte.hu> Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--arch/x86/kernel/aperture_64.c20
-rw-r--r--arch/x86/kernel/pci-dma.c6
2 files changed, 22 insertions, 4 deletions
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c
index 8c325b7f2d9b..c63f8d9fad3e 100644
--- a/arch/x86/kernel/aperture_64.c
+++ b/arch/x86/kernel/aperture_64.c
@@ -55,8 +55,9 @@ static u32 __init allocate_aperture(void)
55 u32 aper_size; 55 u32 aper_size;
56 void *p; 56 void *p;
57 57
58 if (fallback_aper_order > 7) 58 /* aper_size should <= 1G */
59 fallback_aper_order = 7; 59 if (fallback_aper_order > 5)
60 fallback_aper_order = 5;
60 aper_size = (32 * 1024 * 1024) << fallback_aper_order; 61 aper_size = (32 * 1024 * 1024) << fallback_aper_order;
61 62
62 /* 63 /*
@@ -65,7 +66,20 @@ static u32 __init allocate_aperture(void)
65 * memory. Unfortunately we cannot move it up because that would 66 * memory. Unfortunately we cannot move it up because that would
66 * make the IOMMU useless. 67 * make the IOMMU useless.
67 */ 68 */
68 p = __alloc_bootmem_nopanic(aper_size, aper_size, 0); 69 /*
70 * using 512M as goal, in case kexec will load kernel_big
71 * that will do the on position decompress, and could overlap with
72 * that positon with gart that is used.
73 * sequende:
74 * kernel_small
75 * ==> kexec (with kdump trigger path or previous doesn't shutdown gart)
76 * ==> kernel_small(gart area become e820_reserved)
77 * ==> kexec (with kdump trigger path or previous doesn't shutdown gart)
78 * ==> kerne_big (uncompressed size will be big than 64M or 128M)
79 * so don't use 512M below as gart iommu, leave the space for kernel
80 * code for safe
81 */
82 p = __alloc_bootmem_nopanic(aper_size, aper_size, 512ULL<<20);
69 if (!p || __pa(p)+aper_size > 0xffffffff) { 83 if (!p || __pa(p)+aper_size > 0xffffffff) {
70 printk(KERN_ERR 84 printk(KERN_ERR
71 "Cannot allocate aperture memory hole (%p,%uK)\n", 85 "Cannot allocate aperture memory hole (%p,%uK)\n",
diff --git a/arch/x86/kernel/pci-dma.c b/arch/x86/kernel/pci-dma.c
index 0c37f16b6950..1a017f00e867 100644
--- a/arch/x86/kernel/pci-dma.c
+++ b/arch/x86/kernel/pci-dma.c
@@ -77,10 +77,14 @@ void __init dma32_reserve_bootmem(void)
77 if (end_pfn <= MAX_DMA32_PFN) 77 if (end_pfn <= MAX_DMA32_PFN)
78 return; 78 return;
79 79
80 /*
81 * check aperture_64.c allocate_aperture() for reason about
82 * using 512M as goal
83 */
80 align = 64ULL<<20; 84 align = 64ULL<<20;
81 size = round_up(dma32_bootmem_size, align); 85 size = round_up(dma32_bootmem_size, align);
82 dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align, 86 dma32_bootmem_ptr = __alloc_bootmem_nopanic(size, align,
83 __pa(MAX_DMA_ADDRESS)); 87 512ULL<<20);
84 if (dma32_bootmem_ptr) 88 if (dma32_bootmem_ptr)
85 dma32_bootmem_size = size; 89 dma32_bootmem_size = size;
86 else 90 else