Merge branch 'for-linus' of ssh://master.kernel.org/pub/scm/linux/kernel/git/ieee1394...
[pandora-kernel.git] / arch / sh / mm / init.c
index 7154d1c..ae957a9 100644 (file)
 DEFINE_PER_CPU(struct mmu_gather, mmu_gathers);
 pgd_t swapper_pg_dir[PTRS_PER_PGD];
 
-/*
- * Cache of MMU context last used.
- */
-unsigned long mmu_context_cache = NO_CONTEXT;
-
 #ifdef CONFIG_MMU
 /* It'd be good if these lines were in the standard header file. */
 #define START_PFN      (NODE_DATA(0)->bdata->node_boot_start >> PAGE_SHIFT)
@@ -77,6 +72,7 @@ void show_mem(void)
        printk("%d pages swap cached\n",cached);
 }
 
+#ifdef CONFIG_MMU
 static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot)
 {
        pgd_t *pgd;
@@ -84,30 +80,22 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot)
        pmd_t *pmd;
        pte_t *pte;
 
-       pgd = swapper_pg_dir + pgd_index(addr);
+       pgd = pgd_offset_k(addr);
        if (pgd_none(*pgd)) {
                pgd_ERROR(*pgd);
                return;
        }
 
-       pud = pud_offset(pgd, addr);
-       if (pud_none(*pud)) {
-               pmd = (pmd_t *)get_zeroed_page(GFP_ATOMIC);
-               set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE | _PAGE_USER));
-               if (pmd != pmd_offset(pud, 0)) {
-                       pud_ERROR(*pud);
-                       return;
-               }
+       pud = pud_alloc(NULL, pgd, addr);
+       if (unlikely(!pud)) {
+               pud_ERROR(*pud);
+               return;
        }
 
-       pmd = pmd_offset(pud, addr);
-       if (pmd_none(*pmd)) {
-               pte = (pte_t *)get_zeroed_page(GFP_ATOMIC);
-               set_pmd(pmd, __pmd(__pa(pte) | _KERNPG_TABLE | _PAGE_USER));
-               if (pte != pte_offset_kernel(pmd, 0)) {
-                       pmd_ERROR(*pmd);
-                       return;
-               }
+       pmd = pmd_alloc(NULL, pud, addr);
+       if (unlikely(!pmd)) {
+               pmd_ERROR(*pmd);
+               return;
        }
 
        pte = pte_offset_kernel(pmd, addr);
@@ -118,7 +106,7 @@ static void set_pte_phys(unsigned long addr, unsigned long phys, pgprot_t prot)
 
        set_pte(pte, pfn_pte(phys >> PAGE_SHIFT, prot));
 
-       __flush_tlb_page(get_asid(), addr);
+       flush_tlb_one(get_asid(), addr);
 }
 
 /*
@@ -147,6 +135,7 @@ void __set_fixmap(enum fixed_addresses idx, unsigned long phys, pgprot_t prot)
 
        set_pte_phys(address, phys, prot);
 }
+#endif /* CONFIG_MMU */
 
 /* References to section boundaries */
 
@@ -155,9 +144,6 @@ extern char __init_begin, __init_end;
 
 /*
  * paging_init() sets up the page tables
- *
- * This routines also unmaps the page at virtual kernel address 0, so
- * that we can trap those pesky NULL-reference errors in the kernel.
  */
 void __init paging_init(void)
 {
@@ -167,7 +153,6 @@ void __init paging_init(void)
         * Setup some defaults for the zone sizes.. these should be safe
         * regardless of distcontiguous memory or MMU settings.
         */
-       zones_size[ZONE_DMA] = 0 >> PAGE_SHIFT;
        zones_size[ZONE_NORMAL] = __MEMORY_SIZE >> PAGE_SHIFT;
 #ifdef CONFIG_HIGHMEM
        zones_size[ZONE_HIGHMEM] = 0 >> PAGE_SHIFT;
@@ -179,33 +164,20 @@ void __init paging_init(void)
         * the zone sizes accordingly, in addition to turning it on.
         */
        {
-               unsigned long max_dma, low, start_pfn;
-               pgd_t *pg_dir;
-               int i;
-
-               /* We don't need kernel mapping as hardware support that. */
-               pg_dir = swapper_pg_dir;
-
-               for (i = 0; i < PTRS_PER_PGD; i++)
-                       pgd_val(pg_dir[i]) = 0;
+               /* We don't need to map the kernel through the TLB, as
+                * it is permanatly mapped using P1. So clear the
+                * entire pgd. */
+               memset(swapper_pg_dir, 0, sizeof(swapper_pg_dir));
 
                /* Turn on the MMU */
                enable_mmu();
-
-               /* Fixup the zone sizes */
-               start_pfn = START_PFN;
-               max_dma = virt_to_phys((char *)MAX_DMA_ADDRESS) >> PAGE_SHIFT;
-               low = MAX_LOW_PFN;
-
-               if (low < max_dma) {
-                       zones_size[ZONE_DMA] = low - start_pfn;
-                       zones_size[ZONE_NORMAL] = 0;
-               } else {
-                       zones_size[ZONE_DMA] = max_dma - start_pfn;
-                       zones_size[ZONE_NORMAL] = low - max_dma;
-               }
+               zones_size[ZONE_NORMAL] = MAX_LOW_PFN - START_PFN;
        }
 
+       /* Set an initial value for the MMU.TTB so we don't have to
+        * check for a null value. */
+       set_TTB(swapper_pg_dir);
+
 #elif defined(CONFIG_CPU_SH3) || defined(CONFIG_CPU_SH4)
        /*
         * If we don't have CONFIG_MMU set and the processor in question
@@ -227,7 +199,6 @@ static struct kcore_list kcore_mem, kcore_vmalloc;
 
 void __init mem_init(void)
 {
-       extern unsigned long empty_zero_page[1024];
        int codesize, reservedpages, datasize, initsize;
        int tmp;
        extern unsigned long memory_start;