>From 96e88773601fff1edd61cec88095c60252be1343 Mon Sep 17 00:00:00 2001 From: Angelo Dureghello Date: Sun, 27 Aug 2017 02:42:42 +0200 Subject: [PATCH 2/2] m68k: fix mmu for coldfire mcf5441x This patch fixes mmu not working for CPU's that has the base of the physical memory mapped at a non-zero address. Signed-off-by: Angelo Dureghello --- arch/m68k/include/asm/page_mm.h | 4 +++- arch/m68k/mm/init.c | 14 ++++++++++++-- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/arch/m68k/include/asm/page_mm.h b/arch/m68k/include/asm/page_mm.h index e7a1946455a8..6c3b8c5181f9 100644 --- a/arch/m68k/include/asm/page_mm.h +++ b/arch/m68k/include/asm/page_mm.h @@ -142,7 +142,9 @@ static inline __attribute_const__ int __virt_to_node_shift(void) return shift; } -#define __virt_to_node(addr) (pg_data_table[(unsigned long)(addr) >> __virt_to_node_shift()]) +#define __virt_to_node(addr) \ + pg_data_table[((unsigned long)(addr) - PAGE_OFFSET) \ + >> __virt_to_node_shift()] #endif #define virt_to_page(addr) ({ \ diff --git a/arch/m68k/mm/init.c b/arch/m68k/mm/init.c index a6ffead9bef5..17254e6c3f9a 100644 --- a/arch/m68k/mm/init.c +++ b/arch/m68k/mm/init.c @@ -62,14 +62,24 @@ void __init m68k_setup_node(int node) struct m68k_mem_info *info = m68k_memory + node; int i, end; - i = (unsigned long)phys_to_virt(info->addr) >> __virt_to_node_shift(); - end = (unsigned long)phys_to_virt(info->addr + info->size - 1) >> __virt_to_node_shift(); + i = (unsigned long)phys_to_virt(info->addr - PAGE_OFFSET) + >> __virt_to_node_shift(); + end = ((unsigned long)phys_to_virt(info->addr - PAGE_OFFSET) + + info->size - 1) >> __virt_to_node_shift(); for (; i <= end; i++) { if (pg_data_table[i]) pr_warn("overlap at %u for chunk %u\n", i, node); pg_data_table[i] = pg_data_map + node; } #endif + /* + * alloc_node_mem_map() in mm/page_alloc.c will setup + * node_mem_map member only if it is set to 0, + * otherwise it is considered already set properly + * before (i.e. as per ia64). + * So we need to zero node data here. + */ + memset(NODE_DATA(node), 0, sizeof(pg_data_t)); pg_data_map[node].bdata = bootmem_node_data + node; node_set_online(node); } -- 2.14.1