powerpc/32: Set an IBAT covering up to _einittext during init
[linux-2.6-microblaze.git] / arch / powerpc / mm / book3s32 / mmu.c
index 1794132..a96b730 100644 (file)
@@ -159,7 +159,10 @@ unsigned long __init mmu_mapin_ram(unsigned long base, unsigned long top)
 {
        unsigned long done;
        unsigned long border = (unsigned long)__init_begin - PAGE_OFFSET;
+       unsigned long size;
 
+       size = roundup_pow_of_two((unsigned long)_einittext - PAGE_OFFSET);
+       setibat(0, PAGE_OFFSET, 0, size, PAGE_KERNEL_X);
 
        if (debug_pagealloc_enabled_or_kfence()) {
                pr_debug_once("Read-Write memory mapped without BATs\n");
@@ -245,10 +248,9 @@ void mmu_mark_rodata_ro(void)
 }
 
 /*
- * Set up one of the I/D BAT (block address translation) register pairs.
+ * Set up one of the D BAT (block address translation) register pairs.
  * The parameters are not checked; in particular size must be a power
  * of 2 between 128k and 256M.
- * On 603+, only set IBAT when _PAGE_EXEC is set
  */
 void __init setbat(int index, unsigned long virt, phys_addr_t phys,
                   unsigned int size, pgprot_t prot)
@@ -284,10 +286,6 @@ void __init setbat(int index, unsigned long virt, phys_addr_t phys,
                /* G bit must be zero in IBATs */
                flags &= ~_PAGE_EXEC;
        }
-       if (flags & _PAGE_EXEC)
-               bat[0] = bat[1];
-       else
-               bat[0].batu = bat[0].batl = 0;
 
        bat_addrs[index].start = virt;
        bat_addrs[index].limit = virt + ((bl + 1) << 17) - 1;