x86, bts: fix build error
[safe/jmp/linux-2.6] / arch / x86 / kernel / e820.c
index a5383ae..7aafeb5 100644 (file)
@@ -148,6 +148,9 @@ void __init e820_print_map(char *who)
                case E820_NVS:
                        printk(KERN_CONT "(ACPI NVS)\n");
                        break;
+               case E820_UNUSABLE:
+                       printk("(unusable)\n");
+                       break;
                default:
                        printk(KERN_CONT "type %u\n", e820.map[i].type);
                        break;
@@ -877,7 +880,8 @@ void __init early_res_to_bootmem(u64 start, u64 end)
        for (i = 0; i < MAX_EARLY_RES && early_res[i].end; i++)
                count++;
 
-       printk(KERN_INFO "(%d early reservations) ==> bootmem\n", count);
+       printk(KERN_INFO "(%d early reservations) ==> bootmem [%010llx - %010llx]\n",
+                        count, start, end);
        for (i = 0; i < count; i++) {
                struct early_res *r = &early_res[i];
                printk(KERN_INFO "  #%d [%010llx - %010llx] %16s", i,
@@ -1049,11 +1053,6 @@ u64 __init early_reserve_e820(u64 startt, u64 sizet, u64 align)
 #endif
 
 /*
- * Last pfn which the user wants to use.
- */
-unsigned long __initdata end_user_pfn = MAX_ARCH_PFN;
-
-/*
  * Find the highest page frame number we have available
  */
 static unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type)
@@ -1085,8 +1084,6 @@ static unsigned long __init e820_end_pfn(unsigned long limit_pfn, unsigned type)
 
        if (last_pfn > max_arch_pfn)
                last_pfn = max_arch_pfn;
-       if (last_pfn > end_user_pfn)
-               last_pfn = end_user_pfn;
 
        printk(KERN_INFO "last_pfn = %#lx max_arch_pfn = %#lx\n",
                         last_pfn, max_arch_pfn);
@@ -1131,12 +1128,6 @@ int __init e820_find_active_region(const struct e820entry *ei,
        if (*ei_endpfn > last_pfn)
                *ei_endpfn = last_pfn;
 
-       /* Obey end_user_pfn to save on memmap */
-       if (*ei_startpfn >= end_user_pfn)
-               return 0;
-       if (*ei_endpfn > end_user_pfn)
-               *ei_endpfn = end_user_pfn;
-
        return 1;
 }
 
@@ -1201,7 +1192,6 @@ static int __init parse_memopt(char *p)
 
        userdef = 1;
        mem_size = memparse(p, &p);
-       end_user_pfn = mem_size>>PAGE_SHIFT;
        e820_remove_range(mem_size, ULLONG_MAX - mem_size, E820_RAM, 1);
 
        return 0;
@@ -1216,7 +1206,7 @@ static int __init parse_memmap_opt(char *p)
        if (!p)
                return -EINVAL;
 
-       if (!strcmp(p, "exactmap")) {
+       if (!strncmp(p, "exactmap", 8)) {
 #ifdef CONFIG_CRASH_DUMP
                /*
                 * If we are doing a crash dump, we still need to know
@@ -1245,10 +1235,9 @@ static int __init parse_memmap_opt(char *p)
        } else if (*p == '$') {
                start_at = memparse(p+1, &p);
                e820_add_region(start_at, mem_size, E820_RESERVED);
-       } else {
-               end_user_pfn = (mem_size >> PAGE_SHIFT);
+       } else
                e820_remove_range(mem_size, ULLONG_MAX - mem_size, E820_RAM, 1);
-       }
+
        return *p == '\0' ? 0 : -EINVAL;
 }
 early_param("memmap", parse_memmap_opt);
@@ -1274,6 +1263,7 @@ static inline const char *e820_type_to_string(int e820_type)
        case E820_RAM:  return "System RAM";
        case E820_ACPI: return "ACPI Tables";
        case E820_NVS:  return "ACPI Non-volatile Storage";
+       case E820_UNUSABLE:     return "Unusable memory";
        default:        return "reserved";
        }
 }
@@ -1281,6 +1271,7 @@ static inline const char *e820_type_to_string(int e820_type)
 /*
  * Mark e820 reserved areas as busy for the resource manager.
  */
+static struct resource __initdata *e820_res;
 void __init e820_reserve_resources(void)
 {
        int i;
@@ -1288,20 +1279,28 @@ void __init e820_reserve_resources(void)
        u64 end;
 
        res = alloc_bootmem_low(sizeof(struct resource) * e820.nr_map);
+       e820_res = res;
        for (i = 0; i < e820.nr_map; i++) {
                end = e820.map[i].addr + e820.map[i].size - 1;
-#ifndef CONFIG_RESOURCES_64BIT
-               if (end > 0x100000000ULL) {
+               if (end != (resource_size_t)end) {
                        res++;
                        continue;
                }
-#endif
                res->name = e820_type_to_string(e820.map[i].type);
                res->start = e820.map[i].addr;
                res->end = end;
 
-               res->flags = IORESOURCE_MEM | IORESOURCE_BUSY;
-               insert_resource(&iomem_resource, res);
+               res->flags = IORESOURCE_MEM;
+
+               /*
+                * don't register the region that could be conflicted with
+                * pci device BAR resource and insert them later in
+                * pcibios_resource_survey()
+                */
+               if (e820.map[i].type != E820_RESERVED || res->start < (1ULL<<20)) {
+                       res->flags |= IORESOURCE_BUSY;
+                       insert_resource(&iomem_resource, res);
+               }
                res++;
        }
 
@@ -1313,10 +1312,18 @@ void __init e820_reserve_resources(void)
        }
 }
 
-/*
- * Non-standard memory setup can be specified via this quirk:
- */
-char * (*arch_memory_setup_quirk)(void);
+void __init e820_reserve_resources_late(void)
+{
+       int i;
+       struct resource *res;
+
+       res = e820_res;
+       for (i = 0; i < e820.nr_map; i++) {
+               if (!res->parent && res->end)
+                       insert_resource_expand_to_fit(&iomem_resource, res);
+               res++;
+       }
+}
 
 char *__init default_machine_specific_memory_setup(void)
 {
@@ -1358,8 +1365,8 @@ char *__init default_machine_specific_memory_setup(void)
 
 char *__init __attribute__((weak)) machine_specific_memory_setup(void)
 {
-       if (arch_memory_setup_quirk) {
-               char *who = arch_memory_setup_quirk();
+       if (x86_quirks->arch_memory_setup) {
+               char *who = x86_quirks->arch_memory_setup();
 
                if (who)
                        return who;
@@ -1382,24 +1389,3 @@ void __init setup_memory_map(void)
        printk(KERN_INFO "BIOS-provided physical RAM map:\n");
        e820_print_map(who);
 }
-
-#ifdef CONFIG_X86_64
-int __init arch_get_ram_range(int slot, u64 *addr, u64 *size)
-{
-       int i;
-
-       if (slot < 0 || slot >= e820.nr_map)
-               return -1;
-       for (i = slot; i < e820.nr_map; i++) {
-               if (e820.map[i].type != E820_RAM)
-                       continue;
-               break;
-       }
-       if (i == e820.nr_map || e820.map[i].addr > (max_pfn << PAGE_SHIFT))
-               return -1;
-       *addr = e820.map[i].addr;
-       *size = min_t(u64, e820.map[i].size + e820.map[i].addr,
-               max_pfn << PAGE_SHIFT) - *addr;
-       return i + 1;
-}
-#endif