[PATCH] powerpc: Unconfuse htab_bolt_mapping() callers
authorMichael Ellerman <michael@ellerman.id.au>
Tue, 21 Mar 2006 09:45:51 +0000 (20:45 +1100)
committerPaul Mackerras <paulus@samba.org>
Wed, 22 Mar 2006 04:04:09 +0000 (15:04 +1100)
htab_bolt_mapping() takes a vstart and pstart parameter, but all but one of
its callers actually pass it vstart and vstart. Luckily before it passes
paddr (calculated from paddr) to the hpte_insert routines it calls
virt_to_abs() (aka. __pa()) on the address, so there isn't actually a bug.

map_io_page() however does pass pstart properly, so currently it's broken
AFAICT because we're calling __pa(paddr) which will get us something very
large. Presumably no one's calling map_io_page() in the right context.

Anyway, change htab_bolt_mapping() callers to properly pass pstart, and then
use it properly in htab_bolt_mapping(), ie. don't call __pa() on it again.

Booted on p5 LPAR, iSeries and Power3.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Paul Mackerras <paulus@samba.org>
arch/powerpc/mm/hash_utils_64.c

index 7d9ce9a482192fbaec93a978907705b7a36311da..7b4eccffd002275f5d0aff0a0c731e50469eb091 100644 (file)
@@ -169,7 +169,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
 #ifdef CONFIG_PPC_ISERIES
                if (_machine == PLATFORM_ISERIES_LPAR)
                        ret = iSeries_hpte_insert(hpteg, va,
-                                                 __pa(vaddr),
+                                                 paddr,
                                                  tmp_mode,
                                                  HPTE_V_BOLTED,
                                                  psize);
@@ -178,7 +178,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
 #ifdef CONFIG_PPC_PSERIES
                if (_machine & PLATFORM_LPAR)
                        ret = pSeries_lpar_hpte_insert(hpteg, va,
-                                                      virt_to_abs(paddr),
+                                                      paddr,
                                                       tmp_mode,
                                                       HPTE_V_BOLTED,
                                                       psize);
@@ -186,7 +186,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
 #endif
 #ifdef CONFIG_PPC_MULTIPLATFORM
                        ret = native_hpte_insert(hpteg, va,
-                                                virt_to_abs(paddr),
+                                                paddr,
                                                 tmp_mode, HPTE_V_BOLTED,
                                                 psize);
 #endif
@@ -392,7 +392,7 @@ static unsigned long __init htab_get_table_size(void)
 #ifdef CONFIG_MEMORY_HOTPLUG
 void create_section_mapping(unsigned long start, unsigned long end)
 {
-               BUG_ON(htab_bolt_mapping(start, end, start,
+               BUG_ON(htab_bolt_mapping(start, end, __pa(start),
                        _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX,
                        mmu_linear_psize));
 }
@@ -473,21 +473,22 @@ void __init htab_initialize(void)
 
                if (dart_tablebase != 0 && dart_tablebase >= base
                    && dart_tablebase < (base + size)) {
+                       unsigned long dart_table_end = dart_tablebase + 16 * MB;
                        if (base != dart_tablebase)
                                BUG_ON(htab_bolt_mapping(base, dart_tablebase,
-                                                        base, mode_rw,
-                                                        mmu_linear_psize));
-                       if ((base + size) > (dart_tablebase + 16*MB))
+                                                       __pa(base), mode_rw,
+                                                       mmu_linear_psize));
+                       if ((base + size) > dart_table_end)
                                BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB,
-                                                        base + size,
-                                                        dart_tablebase+16*MB,
+                                                       base + size,
+                                                       __pa(dart_table_end),
                                                         mode_rw,
                                                         mmu_linear_psize));
                        continue;
                }
 #endif /* CONFIG_U3_DART */
-               BUG_ON(htab_bolt_mapping(base, base + size, base,
-                                        mode_rw, mmu_linear_psize));
+               BUG_ON(htab_bolt_mapping(base, base + size, __pa(base),
+                                       mode_rw, mmu_linear_psize));
        }
 
        /*
@@ -504,8 +505,8 @@ void __init htab_initialize(void)
                if (base + size >= tce_alloc_start)
                        tce_alloc_start = base + size + 1;
 
-               BUG_ON(htab_bolt_mapping(tce_alloc_start, tce_alloc_end,
-                                        tce_alloc_start, mode_rw,
+               BUG_ON(htab_bolt_mapping(tce_alloc_start, tce_alloc_end,
+                                        __pa(tce_alloc_start), mode_rw,
                                         mmu_linear_psize));
        }