#include <asm/processor.h>
 #include <asm/types.h>
 #include <asm/cache.h>
+#include <platform/hardware.h>
 
 /*
  * Fixed TLB translations in the processor.
  * addresses.
  */
 
+#define ARCH_PFN_OFFSET                (PLATFORM_DEFAULT_MEM_START >> PAGE_SHIFT)
+
 #define __pa(x)                        ((unsigned long) (x) - PAGE_OFFSET)
 #define __va(x)                        ((void *)((unsigned long) (x) + PAGE_OFFSET))
-#define pfn_valid(pfn)         ((unsigned long)pfn < max_mapnr)
+#define pfn_valid(pfn)         ((pfn) >= ARCH_PFN_OFFSET && ((pfn) - ARCH_PFN_OFFSET) < max_mapnr)
 #ifdef CONFIG_DISCONTIGMEM
 # error CONFIG_DISCONTIGMEM not supported
 #endif
 
 
        /* All pages are DMA-able, so we put them all in the DMA zone. */
 
-       zones_size[ZONE_DMA] = max_low_pfn;
+       zones_size[ZONE_DMA] = max_low_pfn - ARCH_PFN_OFFSET;
        for (i = 1; i < MAX_NR_ZONES; i++)
                zones_size[i] = 0;
 
 
        memset(swapper_pg_dir, 0, PAGE_SIZE);
 
-       free_area_init(zones_size);
+       free_area_init_node(0, zones_size, ARCH_PFN_OFFSET, NULL);
 }
 
 /*
        unsigned long codesize, reservedpages, datasize, initsize;
        unsigned long highmemsize, tmp, ram;
 
-       max_mapnr = num_physpages = max_low_pfn;
-       high_memory = (void *) __va(max_mapnr << PAGE_SHIFT);
+       max_mapnr = num_physpages = max_low_pfn - ARCH_PFN_OFFSET;
+       high_memory = (void *) __va(max_low_pfn << PAGE_SHIFT);
        highmemsize = 0;
 
 #ifdef CONFIG_HIGHMEM
        totalram_pages += free_all_bootmem();
 
        reservedpages = ram = 0;
-       for (tmp = 0; tmp < max_low_pfn; tmp++) {
+       for (tmp = 0; tmp < max_mapnr; tmp++) {
                ram++;
                if (PageReserved(mem_map+tmp))
                        reservedpages++;