ARM: 8253/1: mm: use phys_addr_t type in map_lowmem() for kernel mem region
authorGrygorii Strashko <grygorii.strashko@linaro.org>
Tue, 23 Dec 2014 18:36:55 +0000 (19:36 +0100)
committerRussell King <rmk+kernel@arm.linux.org.uk>
Wed, 7 Jan 2015 20:33:34 +0000 (20:33 +0000)
commitac08468867e99bc02b22baf4e58bc3537e9d852c
tree3fe46187278c44076667250b0118c3f5812f9607
parentcca547e9aa3a6d561fe65e75a4bb2c18d80c541a
ARM: 8253/1: mm: use phys_addr_t type in map_lowmem() for kernel mem region

Now local variables kernel_x_start and kernel_x_end defined using
'unsigned long' type which is wrong because they represent physical
memory range and will be calculated wrongly if LPAE is enabled.
As result, all following code in map_lowmem() will not work correctly.

For example, Keystone 2 boot is broken because
 kernel_x_start == 0x0000 0000
 kernel_x_end   == 0x0080 0000

instead of
 kernel_x_start == 0x0000 0008 0000 0000
 kernel_x_end   == 0x0000 0008 0080 0000
and as result whole low memory will be mapped with MT_MEMORY_RW
permissions by code (start > kernel_x_end):
} else if (start >= kernel_x_end) {
map.pfn = __phys_to_pfn(start);
map.virtual = __phys_to_virt(start);
map.length = end - start;
map.type = MT_MEMORY_RW;

create_mapping(&map);
}

Hence, fix it by using phys_addr_t type for variables kernel_x_start
and kernel_x_end.

Tested-by: Murali Karicheri <m-karicheri2@ti.com>
Signed-off-by: Grygorii Strashko <grygorii.strashko@linaro.org>
Signed-off-by: Russell King <rmk+kernel@arm.linux.org.uk>
arch/arm/mm/mmu.c