powerpc/fsl-booke-64: Don't limit ppc64_rma_size to one TLB entry
[firefly-linux-kernel-4.4.55.git] / arch / powerpc / mm / fsl_booke_mmu.c
index bb1f88c1037712c7651c68230e13576b165fd519..f3afe3d97f6b3bd26ef344e44611a2e2cd0d5460 100644 (file)
@@ -169,7 +169,8 @@ unsigned long calc_cam_sz(unsigned long ram, unsigned long virt,
 }
 
 static unsigned long map_mem_in_cams_addr(phys_addr_t phys, unsigned long virt,
-                                       unsigned long ram, int max_cam_idx)
+                                       unsigned long ram, int max_cam_idx,
+                                       bool dryrun)
 {
        int i;
        unsigned long amount_mapped = 0;
@@ -179,7 +180,9 @@ static unsigned long map_mem_in_cams_addr(phys_addr_t phys, unsigned long virt,
                unsigned long cam_sz;
 
                cam_sz = calc_cam_sz(ram, virt, phys);
-               settlbcam(i, virt, phys, cam_sz, pgprot_val(PAGE_KERNEL_X), 0);
+               if (!dryrun)
+                       settlbcam(i, virt, phys, cam_sz,
+                                 pgprot_val(PAGE_KERNEL_X), 0);
 
                ram -= cam_sz;
                amount_mapped += cam_sz;
@@ -187,6 +190,9 @@ static unsigned long map_mem_in_cams_addr(phys_addr_t phys, unsigned long virt,
                phys += cam_sz;
        }
 
+       if (dryrun)
+               return amount_mapped;
+
        loadcam_multi(0, i, max_cam_idx);
        tlbcam_index = i;
 
@@ -199,12 +205,12 @@ static unsigned long map_mem_in_cams_addr(phys_addr_t phys, unsigned long virt,
        return amount_mapped;
 }
 
-unsigned long map_mem_in_cams(unsigned long ram, int max_cam_idx)
+unsigned long map_mem_in_cams(unsigned long ram, int max_cam_idx, bool dryrun)
 {
        unsigned long virt = PAGE_OFFSET;
        phys_addr_t phys = memstart_addr;
 
-       return map_mem_in_cams_addr(phys, virt, ram, max_cam_idx);
+       return map_mem_in_cams_addr(phys, virt, ram, max_cam_idx, dryrun);
 }
 
 #ifdef CONFIG_PPC32
@@ -235,7 +241,7 @@ void __init adjust_total_lowmem(void)
        ram = min((phys_addr_t)__max_low_memory, (phys_addr_t)total_lowmem);
 
        i = switch_to_as1();
-       __max_low_memory = map_mem_in_cams(ram, CONFIG_LOWMEM_CAM_NUM);
+       __max_low_memory = map_mem_in_cams(ram, CONFIG_LOWMEM_CAM_NUM, false);
        restore_to_as0(i, 0, 0, 1);
 
        pr_info("Memory CAM mapping: ");
@@ -303,10 +309,12 @@ notrace void __init relocate_init(u64 dt_ptr, phys_addr_t start)
                n = switch_to_as1();
                /* map a 64M area for the second relocation */
                if (memstart_addr > start)
-                       map_mem_in_cams(0x4000000, CONFIG_LOWMEM_CAM_NUM);
+                       map_mem_in_cams(0x4000000, CONFIG_LOWMEM_CAM_NUM,
+                                       false);
                else
                        map_mem_in_cams_addr(start, PAGE_OFFSET + offset,
-                                       0x4000000, CONFIG_LOWMEM_CAM_NUM);
+                                       0x4000000, CONFIG_LOWMEM_CAM_NUM,
+                                       false);
                restore_to_as0(n, offset, __va(dt_ptr), 1);
                /* We should never reach here */
                panic("Relocation error");