Commit caf80e57 authored by Michael Ellerman's avatar Michael Ellerman Committed by Paul Mackerras

[PATCH] powerpc: Unconfuse htab_bolt_mapping() callers

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: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarPaul Mackerras <paulus@samba.org>
parent 2b261227
...@@ -169,7 +169,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, ...@@ -169,7 +169,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
#ifdef CONFIG_PPC_ISERIES #ifdef CONFIG_PPC_ISERIES
if (_machine == PLATFORM_ISERIES_LPAR) if (_machine == PLATFORM_ISERIES_LPAR)
ret = iSeries_hpte_insert(hpteg, va, ret = iSeries_hpte_insert(hpteg, va,
__pa(vaddr), paddr,
tmp_mode, tmp_mode,
HPTE_V_BOLTED, HPTE_V_BOLTED,
psize); psize);
...@@ -178,7 +178,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, ...@@ -178,7 +178,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
#ifdef CONFIG_PPC_PSERIES #ifdef CONFIG_PPC_PSERIES
if (_machine & PLATFORM_LPAR) if (_machine & PLATFORM_LPAR)
ret = pSeries_lpar_hpte_insert(hpteg, va, ret = pSeries_lpar_hpte_insert(hpteg, va,
virt_to_abs(paddr), paddr,
tmp_mode, tmp_mode,
HPTE_V_BOLTED, HPTE_V_BOLTED,
psize); psize);
...@@ -186,7 +186,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend, ...@@ -186,7 +186,7 @@ int htab_bolt_mapping(unsigned long vstart, unsigned long vend,
#endif #endif
#ifdef CONFIG_PPC_MULTIPLATFORM #ifdef CONFIG_PPC_MULTIPLATFORM
ret = native_hpte_insert(hpteg, va, ret = native_hpte_insert(hpteg, va,
virt_to_abs(paddr), paddr,
tmp_mode, HPTE_V_BOLTED, tmp_mode, HPTE_V_BOLTED,
psize); psize);
#endif #endif
...@@ -392,7 +392,7 @@ static unsigned long __init htab_get_table_size(void) ...@@ -392,7 +392,7 @@ static unsigned long __init htab_get_table_size(void)
#ifdef CONFIG_MEMORY_HOTPLUG #ifdef CONFIG_MEMORY_HOTPLUG
void create_section_mapping(unsigned long start, unsigned long end) 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, _PAGE_ACCESSED | _PAGE_DIRTY | _PAGE_COHERENT | PP_RWXX,
mmu_linear_psize)); mmu_linear_psize));
} }
...@@ -473,20 +473,21 @@ void __init htab_initialize(void) ...@@ -473,20 +473,21 @@ void __init htab_initialize(void)
if (dart_tablebase != 0 && dart_tablebase >= base if (dart_tablebase != 0 && dart_tablebase >= base
&& dart_tablebase < (base + size)) { && dart_tablebase < (base + size)) {
unsigned long dart_table_end = dart_tablebase + 16 * MB;
if (base != dart_tablebase) if (base != dart_tablebase)
BUG_ON(htab_bolt_mapping(base, dart_tablebase, BUG_ON(htab_bolt_mapping(base, dart_tablebase,
base, mode_rw, __pa(base), mode_rw,
mmu_linear_psize)); mmu_linear_psize));
if ((base + size) > (dart_tablebase + 16*MB)) if ((base + size) > dart_table_end)
BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB, BUG_ON(htab_bolt_mapping(dart_tablebase+16*MB,
base + size, base + size,
dart_tablebase+16*MB, __pa(dart_table_end),
mode_rw, mode_rw,
mmu_linear_psize)); mmu_linear_psize));
continue; continue;
} }
#endif /* CONFIG_U3_DART */ #endif /* CONFIG_U3_DART */
BUG_ON(htab_bolt_mapping(base, base + size, base, BUG_ON(htab_bolt_mapping(base, base + size, __pa(base),
mode_rw, mmu_linear_psize)); mode_rw, mmu_linear_psize));
} }
...@@ -505,7 +506,7 @@ void __init htab_initialize(void) ...@@ -505,7 +506,7 @@ void __init htab_initialize(void)
tce_alloc_start = base + size + 1; tce_alloc_start = base + size + 1;
BUG_ON(htab_bolt_mapping(tce_alloc_start, tce_alloc_end, BUG_ON(htab_bolt_mapping(tce_alloc_start, tce_alloc_end,
tce_alloc_start, mode_rw, __pa(tce_alloc_start), mode_rw,
mmu_linear_psize)); mmu_linear_psize));
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment