powerpc/mm/32: Use page_is_ram to check for RAM
On systems where there is MMIO space between different blocks of RAM in the physical address space, __ioremap_caller did not allow mapping these MMIO areas, because they were below the end RAM and thus considered RAM as well. Use the memblock-based page_is_ram function, which returns false for such MMIO holes. v2: Keep the check for p < virt_to_phys(high_memory). On 32-bit systems with high memory (memory above physical address 4GiB), the high memory is expected to be available though ioremap. The high_memory variable marks the end of low memory; comparing against it means that only ioremap requests for low RAM will be denied. Reported by Michael Ellerman. Signed-off-by: Jonathan Neuschäfer <j.neuschaefer@gmx.net> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
f65e67c7e3
commit
2bbf63264a
|
@ -148,6 +148,7 @@ __ioremap_caller(phys_addr_t addr, unsigned long size, unsigned long flags,
|
||||||
* mem_init() sets high_memory so only do the check after that.
|
* mem_init() sets high_memory so only do the check after that.
|
||||||
*/
|
*/
|
||||||
if (slab_is_available() && (p < virt_to_phys(high_memory)) &&
|
if (slab_is_available() && (p < virt_to_phys(high_memory)) &&
|
||||||
|
page_is_ram(__phys_to_pfn(p)) &&
|
||||||
!(__allow_ioremap_reserved && memblock_is_region_reserved(p, size))) {
|
!(__allow_ioremap_reserved && memblock_is_region_reserved(p, size))) {
|
||||||
printk("__ioremap(): phys addr 0x%llx is RAM lr %ps\n",
|
printk("__ioremap(): phys addr 0x%llx is RAM lr %ps\n",
|
||||||
(unsigned long long)p, __builtin_return_address(0));
|
(unsigned long long)p, __builtin_return_address(0));
|
||||||
|
|
Loading…
Reference in a new issue