vserver 1.9.3
[linux-2.6.git] / arch / ppc / mm / init.c
index b61a61c..cbed552 100644 (file)
@@ -104,6 +104,7 @@ extern unsigned long sysmap_size;
  * -- Cort
  */
 int __map_without_bats;
+int __map_without_ltlbs;
 
 /* max amount of RAM to use */
 unsigned long __max_memory;
@@ -118,7 +119,7 @@ void show_mem(void)
 
        printk("Mem-info:\n");
        show_free_areas();
-       printk("Free swap:       %6dkB\n",nr_swap_pages<<(PAGE_SHIFT-10));
+       printk("Free swap:       %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10));
        i = max_mapnr;
        while (i-- > 0) {
                total++;
@@ -204,6 +205,10 @@ void MMU_setup(void)
                __map_without_bats = 1;
        }
 
+       if (strstr(cmd_line, "noltlbs")) {
+               __map_without_ltlbs = 1;
+       }
+
        /* Look for mem= option on command line */
        if (strstr(cmd_line, "mem=")) {
                char *p, *q;
@@ -253,6 +258,12 @@ void __init MMU_init(void)
        if (__max_memory && total_memory > __max_memory)
                total_memory = __max_memory;
        total_lowmem = total_memory;
+#ifdef CONFIG_FSL_BOOKE
+       /* Freescale Book-E parts expect lowmem to be mapped by fixed TLB
+        * entries, so we need to adjust lowmem to match the amount we can map
+        * in the fixed entries */
+       adjust_total_lowmem();
+#endif /* CONFIG_FSL_BOOKE */
        if (total_lowmem > __max_low_memory) {
                total_lowmem = __max_low_memory;
 #ifndef CONFIG_HIGHMEM
@@ -458,7 +469,7 @@ void __init mem_init(void)
 
                        ClearPageReserved(page);
                        set_bit(PG_highmem, &page->flags);
-                       atomic_set(&page->count, 1);
+                       set_page_count(page, 1);
                        __free_page(page);
                        totalhigh_pages++;
                }
@@ -572,6 +583,16 @@ void flush_dcache_page(struct page *page)
        clear_bit(PG_arch_1, &page->flags);
 }
 
+void flush_dcache_icache_page(struct page *page)
+{
+#ifdef CONFIG_BOOKE
+       __flush_dcache_icache(kmap(page));
+       kunmap(page);
+#else
+       __flush_dcache_icache_phys(page_to_pfn(page) << PAGE_SHIFT);
+#endif
+
+}
 void clear_user_page(void *page, unsigned long vaddr, struct page *pg)
 {
        clear_page(page);
@@ -614,7 +635,7 @@ void update_mmu_cache(struct vm_area_struct *vma, unsigned long address,
                        if (vma->vm_mm == current->active_mm)
                                __flush_dcache_icache((void *) address);
                        else
-                               __flush_dcache_icache_phys(pfn << PAGE_SHIFT);
+                               flush_dcache_icache_page(page);
                        set_bit(PG_arch_1, &page->flags);
                }
        }