x86: change back to any_mapped
PATCH 1/1 x86: change back to any_mapped
agp check is using request_mem_region. and could fail if e820 reserved...
Signed-off-by Yinghai Lu <[email protected]>
Tested-by Kevin Winchester <[email protected]>
arch/x86/kernel/aperture_64.c +2 -2
@@ -324,8 +324,8 @@ void __init early_gart_iommu_check(void) fix =1 ;if (gart_fix_e820 && !fix && aper_enabled) { -if (!e820_all_mapped (aper_base, aper_base + aper_size, -E820_RESERVED )) { +if (e820_any_mapped (aper_base, aper_base + aper_size, +E820_RAM )) {/* reserve it, so we can reuse it in second kernel */ printk (KERN_INFO "update e820 for GART\n" );e820_add_region (aper_base, aper_size,E820_RESERVED );
PATCH 1/1 x86: add e820_remove_range
so could add real hole in e820
agp check is using request_mem_region. and could fail if e820 reserved...
Signed-off-by Yinghai Lu <[email protected]>
--- arch/x86/kernel/aperture_64.c | 4 ++-- arch/x86/kernel/e820.c | 35 +++++++++++++++++++++++++++++++++++ include/asm-x86/e820.h | 2 ++ 3 files changed, 39 insertions(+), 2 deletions(-)
arch/x86/kernel/e820.c +35 -0
@@ -429,6 +429,41 @@ u64 __init e820_update_range(u64 start,return real_updated_size; } +/* make e820 not cover the range */ +u64 __init e820_remove_range (u64 start,u64 size,unsigned old_type, +int checktype) +{ +int i; +u64 real_removed_size =0 ; + +for (i =0 ; i < e820.nr_map; i++) { +struct e820entry *ei = &e820.map[i]; +u64 final_start, final_end; + +if (checktype && ei->type != old_type) +continue ; +/* totally covered? */ +if (ei->addr >= start && + (ei->addr + ei->size) <= (start + size)) { + real_removed_size += ei->size; +memset (ei,0 ,sizeof (struct e820entry )); +continue ; + } +/* partially covered */ + final_start =max (start, ei->addr); + final_end =min (start + size, ei->addr + ei->size); +if (final_start >= final_end) +continue ; + real_removed_size += final_end - final_start; + + ei->size -= final_end - final_start; +if (ei->addr < final_start) +continue ; + ei->addr = final_end; + } +return real_removed_size; +} +void __init update_e820 (void ) {int nr_map;
include/asm-x86/e820.h +2 -0
@@ -67,6 +67,8 @@ sanitize_e820_map(struct e820entry *biosextern int copy_e820_map (struct e820entry *biosmap,int nr_map);extern u64 e820_update_range (u64 start,u64 size,unsigned old_type,unsigned new_type); +extern u64 e820_remove_range (u64 start,u64 size,unsigned old_type, +int checktype);extern void update_e820 (void );extern void e820_setup_gap (void );struct setup_data ;
arch/x86/kernel/aperture_64.c +2 -2
@@ -326,9 +326,9 @@ void __init early_gart_iommu_check(void)if (gart_fix_e820 && !fix && aper_enabled) {if (e820_any_mapped (aper_base, aper_base + aper_size,E820_RAM )) { -/* reserve it, so we can reuse it in second kernel */ +/* remove it, so we can reuse it in second kernel */ printk (KERN_INFO "update e820 for GART\n" ); -e820_add_region (aper_base, aper_size,E820_RESERVED ); +e820_remove_range (aper_base, aper_size,E820_RAM ,1 );update_e820 (); } }