diff options
Diffstat (limited to 'arch/x86/kernel/aperture_64.c')
-rw-r--r-- | arch/x86/kernel/aperture_64.c | 34 |
1 files changed, 19 insertions, 15 deletions
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index 73fb469908c6..3d2661ca6542 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
@@ -30,6 +30,22 @@ | |||
30 | #include <asm/amd_nb.h> | 30 | #include <asm/amd_nb.h> |
31 | #include <asm/x86_init.h> | 31 | #include <asm/x86_init.h> |
32 | 32 | ||
33 | /* | ||
34 | * Using 512M as goal, in case kexec will load kernel_big | ||
35 | * that will do the on-position decompress, and could overlap with | ||
36 | * with the gart aperture that is used. | ||
37 | * Sequence: | ||
38 | * kernel_small | ||
39 | * ==> kexec (with kdump trigger path or gart still enabled) | ||
40 | * ==> kernel_small (gart area become e820_reserved) | ||
41 | * ==> kexec (with kdump trigger path or gart still enabled) | ||
42 | * ==> kerne_big (uncompressed size will be big than 64M or 128M) | ||
43 | * So don't use 512M below as gart iommu, leave the space for kernel | ||
44 | * code for safe. | ||
45 | */ | ||
46 | #define GART_MIN_ADDR (512ULL << 20) | ||
47 | #define GART_MAX_ADDR (1ULL << 32) | ||
48 | |||
33 | int gart_iommu_aperture; | 49 | int gart_iommu_aperture; |
34 | int gart_iommu_aperture_disabled __initdata; | 50 | int gart_iommu_aperture_disabled __initdata; |
35 | int gart_iommu_aperture_allowed __initdata; | 51 | int gart_iommu_aperture_allowed __initdata; |
@@ -70,21 +86,9 @@ static u32 __init allocate_aperture(void) | |||
70 | * memory. Unfortunately we cannot move it up because that would | 86 | * memory. Unfortunately we cannot move it up because that would |
71 | * make the IOMMU useless. | 87 | * make the IOMMU useless. |
72 | */ | 88 | */ |
73 | /* | 89 | addr = memblock_find_in_range(GART_MIN_ADDR, GART_MAX_ADDR, |
74 | * using 512M as goal, in case kexec will load kernel_big | 90 | aper_size, aper_size); |
75 | * that will do the on position decompress, and could overlap with | 91 | if (addr == MEMBLOCK_ERROR || addr + aper_size > GART_MAX_ADDR) { |
76 | * that position with gart that is used. | ||
77 | * sequende: | ||
78 | * kernel_small | ||
79 | * ==> kexec (with kdump trigger path or previous doesn't shutdown gart) | ||
80 | * ==> kernel_small(gart area become e820_reserved) | ||
81 | * ==> kexec (with kdump trigger path or previous doesn't shutdown gart) | ||
82 | * ==> kerne_big (uncompressed size will be big than 64M or 128M) | ||
83 | * so don't use 512M below as gart iommu, leave the space for kernel | ||
84 | * code for safe | ||
85 | */ | ||
86 | addr = memblock_find_in_range(0, 1ULL<<32, aper_size, 512ULL<<20); | ||
87 | if (addr == MEMBLOCK_ERROR || addr + aper_size > 0xffffffff) { | ||
88 | printk(KERN_ERR | 92 | printk(KERN_ERR |
89 | "Cannot allocate aperture memory hole (%lx,%uK)\n", | 93 | "Cannot allocate aperture memory hole (%lx,%uK)\n", |
90 | addr, aper_size>>10); | 94 | addr, aper_size>>10); |