powerpc/8xx: Ensures RAM mapped with LTLB is seen as block mapped on 8xx.
authorChristophe Leroy <christophe.leroy@c-s.fr>
Wed, 12 Jul 2017 10:08:45 +0000 (12:08 +0200)
committerMichael Ellerman <mpe@ellerman.id.au>
Tue, 15 Aug 2017 12:55:52 +0000 (22:55 +1000)
On the 8xx, the RAM mapped with LTLBs must be seen as block mapped,
just like areas mapped with BATs on standard PPC32.

Signed-off-by: Christophe Leroy <christophe.leroy@c-s.fr>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
arch/powerpc/mm/8xx_mmu.c

index f4c6472f2fc4dcf39cd3d3dd495a23db90125e26..f3a00cef9c3455ce478972d6a0669daca70d0497 100644 (file)
 
 extern int __map_without_ltlbs;
 
+static unsigned long block_mapped_ram;
+
 /*
- * Return PA for this VA if it is in IMMR area, or 0
+ * Return PA for this VA if it is in an area mapped with LTLBs.
+ * Otherwise, returns 0
  */
 phys_addr_t v_block_mapped(unsigned long va)
 {
@@ -33,11 +36,13 @@ phys_addr_t v_block_mapped(unsigned long va)
                return 0;
        if (va >= VIRT_IMMR_BASE && va < VIRT_IMMR_BASE + IMMR_SIZE)
                return p + va - VIRT_IMMR_BASE;
+       if (va >= PAGE_OFFSET && va < PAGE_OFFSET + block_mapped_ram)
+               return __pa(va);
        return 0;
 }
 
 /*
- * Return VA for a given PA or 0 if not mapped
+ * Return VA for a given PA mapped with LTLBs or 0 if not mapped
  */
 unsigned long p_block_mapped(phys_addr_t pa)
 {
@@ -47,6 +52,8 @@ unsigned long p_block_mapped(phys_addr_t pa)
                return 0;
        if (pa >= p && pa < p + IMMR_SIZE)
                return VIRT_IMMR_BASE + pa - p;
+       if (pa < block_mapped_ram)
+               return (unsigned long)__va(pa);
        return 0;
 }
 
@@ -133,6 +140,8 @@ unsigned long __init mmu_mapin_ram(unsigned long top)
        if (mapped)
                memblock_set_current_limit(mapped);
 
+       block_mapped_ram = mapped;
+
        return mapped;
 }