From: Anton Blanchard From: Haren Myneni This patch contains - Removes __initdata from lmb definition (struct lmb lmb;) and modified the existing page_is_ram function. Also changed the current argument from physical address to pfn to make it compatible across architectures. Please review them and send me your comments/suggestions. If you are OK with any one patch, please include it in the mainline kernel. Signed-off-by: Anton Blanchard Signed-off-by: Andrew Morton --- 25-akpm/arch/ppc64/kernel/lmb.c | 2 +- 25-akpm/arch/ppc64/mm/init.c | 36 +++++++++++++++++++++--------------- 25-akpm/drivers/char/mem.c | 2 +- 25-akpm/include/asm-ppc64/lmb.h | 2 +- 25-akpm/include/asm-ppc64/page.h | 3 +-- 5 files changed, 25 insertions(+), 20 deletions(-) diff -puN arch/ppc64/kernel/lmb.c~ppc64-implement-page_is_ram arch/ppc64/kernel/lmb.c --- 25/arch/ppc64/kernel/lmb.c~ppc64-implement-page_is_ram 2004-09-02 21:04:22.390918368 -0700 +++ 25-akpm/arch/ppc64/kernel/lmb.c 2004-09-02 21:04:22.400916848 -0700 @@ -20,7 +20,7 @@ #include #include -struct lmb lmb __initdata; +struct lmb lmb; static unsigned long __init lmb_addrs_overlap(unsigned long base1, unsigned long size1, diff -puN arch/ppc64/mm/init.c~ppc64-implement-page_is_ram arch/ppc64/mm/init.c --- 25/arch/ppc64/mm/init.c~ppc64-implement-page_is_ram 2004-09-02 21:04:22.391918216 -0700 +++ 25-akpm/arch/ppc64/mm/init.c 2004-09-02 21:04:22.401916696 -0700 @@ -85,7 +85,6 @@ unsigned long __max_memory; /* info on what we think the IO hole is */ unsigned long io_hole_start; unsigned long io_hole_size; -unsigned long top_of_ram; void show_mem(void) { @@ -498,16 +497,12 @@ void __init mm_init_ppc64(void) * So we need some rough way to tell where your big IO hole * is. On pmac, it's between 2G and 4G, on POWER3, it's around * that area as well, on POWER4 we don't have one, etc... - * We need that to implement something approx. decent for - * page_is_ram() so that /dev/mem doesn't map cacheable IO space - * when XFree resquest some IO regions witout using O_SYNC, we - * also need that as a "hint" when sizing the TCE table on POWER3 + * We need that as a "hint" when sizing the TCE table on POWER3 * So far, the simplest way that seem work well enough for us it * to just assume that the first discontinuity in our physical * RAM layout is the IO hole. That may not be correct in the future * (and isn't on iSeries but then we don't care ;) */ - top_of_ram = lmb_end_of_DRAM(); #ifndef CONFIG_PPC_ISERIES for (i = 1; i < lmb.memory.cnt; i++) { @@ -530,22 +525,32 @@ void __init mm_init_ppc64(void) ppc64_boot_msg(0x100, "MM Init Done"); } - /* * This is called by /dev/mem to know if a given address has to * be mapped non-cacheable or not */ -int page_is_ram(unsigned long physaddr) +int page_is_ram(unsigned long pfn) { -#ifdef CONFIG_PPC_ISERIES - return 1; + int i; + unsigned long paddr = (pfn << PAGE_SHIFT); + + for (i=0; i < lmb.memory.cnt; i++) { + unsigned long base; + +#ifdef CONFIG_MSCHUNKS + base = lmb.memory.region[i].physbase; +#else + base = lmb.memory.region[i].base; #endif - if (physaddr >= top_of_ram) - return 0; - return io_hole_start == 0 || physaddr < io_hole_start || - physaddr >= (io_hole_start + io_hole_size); -} + if ((paddr >= base) && + (paddr < (base + lmb.memory.region[i].size))) { + return 1; + } + } + return 0; +} +EXPORT_SYMBOL(page_is_ram); /* * Initialize the bootmem system and give it all the memory we @@ -599,6 +604,7 @@ void __init paging_init(void) unsigned long zones_size[MAX_NR_ZONES]; unsigned long zholes_size[MAX_NR_ZONES]; unsigned long total_ram = lmb_phys_mem_size(); + unsigned long top_of_ram = lmb_end_of_DRAM(); printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", top_of_ram, total_ram); diff -puN drivers/char/mem.c~ppc64-implement-page_is_ram drivers/char/mem.c --- 25/drivers/char/mem.c~ppc64-implement-page_is_ram 2004-09-02 21:04:22.393917912 -0700 +++ 25-akpm/drivers/char/mem.c 2004-09-02 21:04:22.402916544 -0700 @@ -86,7 +86,7 @@ static inline int uncached_access(struct * above the IO hole... Ah, and of course, XFree86 doesn't pass * O_SYNC when mapping us to tap IO space. Surprised ? */ - return !page_is_ram(addr); + return !page_is_ram(addr >> PAGE_SHIFT); #else /* * Accessing memory above the top the kernel knows about or through a file pointer diff -puN include/asm-ppc64/lmb.h~ppc64-implement-page_is_ram include/asm-ppc64/lmb.h --- 25/include/asm-ppc64/lmb.h~ppc64-implement-page_is_ram 2004-09-02 21:04:22.394917760 -0700 +++ 25-akpm/include/asm-ppc64/lmb.h 2004-09-02 21:04:22.402916544 -0700 @@ -47,7 +47,7 @@ struct lmb { struct lmb_region reserved; }; -extern struct lmb lmb __initdata; +extern struct lmb lmb; extern void __init lmb_init(void); extern void __init lmb_analyze(void); diff -puN include/asm-ppc64/page.h~ppc64-implement-page_is_ram include/asm-ppc64/page.h --- 25/include/asm-ppc64/page.h~ppc64-implement-page_is_ram 2004-09-02 21:04:22.396917456 -0700 +++ 25-akpm/include/asm-ppc64/page.h 2004-09-02 21:04:22.402916544 -0700 @@ -181,8 +181,7 @@ static inline int get_order(unsigned lon #define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) -/* Not 100% correct, for use by /dev/mem only */ -extern int page_is_ram(unsigned long physaddr); +extern int page_is_ram(unsigned long pfn); #endif /* __ASSEMBLY__ */ _