* create boot_abs_to_virt() and boot_virt_to_abs() to use __boot_pa() and __boot_va() for early boot code. * change a lot of code to use __boot variants in early boot. * switch rtas_call() and create_pte_mapping() to use __boot or variants based on system_state variable * compute first page on the node in show_mem() with pfn_to_page(), not node_mem_map Signed-off-by: Joel Schopp --- diff -puN arch/ppc64/kernel/prom.c~p00021_G1-nonlinear-ppc64-daveh arch/ppc64/kernel/prom.c --- 2.6.9-rc3/arch/ppc64/kernel/prom.c~p00021_G1-nonlinear-ppc64-daveh 2004-10-01 11:17:27.000000000 -0500 +++ 2.6.9-rc3-jschopp/arch/ppc64/kernel/prom.c 2004-10-01 11:17:27.000000000 -0500 @@ -568,7 +568,7 @@ void __init finish_device_tree(void) /* Finish device-tree (pre-parsing some properties etc...) */ size = finish_node(allnodes, 0, NULL, 0, 0, 1); - mem = (unsigned long)abs_to_virt(lmb_alloc(size, 128)); + mem = (unsigned long)boot_abs_to_virt(lmb_alloc(size, 128)); if (finish_node(allnodes, mem, NULL, 0, 0, 0) != mem + size) BUG(); @@ -802,7 +802,7 @@ void __init unflatten_device_tree(void) DBG(" size is %lx, allocating...\n", size); /* Allocate memory for the expanded device tree */ - mem = (unsigned long)abs_to_virt(lmb_alloc(size, + mem = (unsigned long)boot_abs_to_virt(lmb_alloc(size, __alignof__(struct device_node))); DBG(" unflattening...\n", mem); diff -puN arch/ppc64/kernel/rtas.c~p00021_G1-nonlinear-ppc64-daveh arch/ppc64/kernel/rtas.c --- 2.6.9-rc3/arch/ppc64/kernel/rtas.c~p00021_G1-nonlinear-ppc64-daveh 2004-10-01 11:17:27.000000000 -0500 +++ 2.6.9-rc3-jschopp/arch/ppc64/kernel/rtas.c 2004-10-01 11:17:27.000000000 -0500 @@ -60,7 +60,7 @@ call_rtas_display_status(unsigned char c args->rets = (rtas_arg_t *)&(args->args[1]); args->args[0] = (int)c; - enter_rtas(__pa(args)); + enter_rtas(virt_to_phys(args)); spin_unlock_irqrestore(&rtas.lock, s); } @@ -148,6 +148,7 @@ int rtas_call(int token, int nargs, int struct rtas_args *rtas_args; char * buff_copy = NULL; int ret; + unsigned long rtas_args_paddr; PPCDBG(PPCDBG_RTAS, "Entering rtas_call\n"); PPCDBG(PPCDBG_RTAS, "\ttoken = 0x%x\n", token); @@ -175,9 +176,13 @@ int rtas_call(int token, int nargs, int for (i = 0; i < nret; ++i) rtas_args->rets[i] = 0; - PPCDBG(PPCDBG_RTAS, "\tentering rtas with 0x%lx\n", - __pa(rtas_args)); - enter_rtas(__pa(rtas_args)); + if (likely(system_state >= SYSTEM_RUNNING)) + rtas_args_paddr = virt_to_phys(rtas_args); + else + rtas_args_paddr = __boot_pa(rtas_args); + + PPCDBG(PPCDBG_RTAS, "\tentering rtas with 0x%lx\n", rtas_args_paddr); + enter_rtas(rtas_args_paddr); PPCDBG(PPCDBG_RTAS, "\treturned from rtas ...\n"); /* A -1 return code indicates that the last command couldn't @@ -345,7 +350,7 @@ rtas_flash_firmware(void) */ rtas_firmware_flash_list.num_blocks = 0; flist = (struct flash_block_list *)&rtas_firmware_flash_list; - rtas_block_list = virt_to_abs(flist); + rtas_block_list = boot_virt_to_abs(flist); if (rtas_block_list >= 4UL*1024*1024*1024) { printk(KERN_ALERT "FLASH: kernel bug...flash list header addr above 4GB\n"); return; @@ -357,13 +362,13 @@ rtas_flash_firmware(void) for (f = flist; f; f = next) { /* Translate data addrs to absolute */ for (i = 0; i < f->num_blocks; i++) { - f->blocks[i].data = (char *)virt_to_abs(f->blocks[i].data); + f->blocks[i].data = (char *)boot_virt_to_abs(f->blocks[i].data); image_size += f->blocks[i].length; } next = f->next; /* Don't translate NULL pointer for last entry */ if (f->next) - f->next = (struct flash_block_list *)virt_to_abs(f->next); + f->next = (struct flash_block_list *)boot_virt_to_abs(f->next); else f->next = NULL; /* make num_blocks into the version/length field */ @@ -443,7 +448,7 @@ void rtas_os_term(char *str) do { status = rtas_call(rtas_token("ibm,os-term"), 1, 1, NULL, - __pa(rtas_os_term_buf)); + virt_to_phys(rtas_os_term_buf)); if (status == RTAS_BUSY) udelay(1); diff -puN arch/ppc64/kernel/smp.c~p00021_G1-nonlinear-ppc64-daveh arch/ppc64/kernel/smp.c --- 2.6.9-rc3/arch/ppc64/kernel/smp.c~p00021_G1-nonlinear-ppc64-daveh 2004-10-01 11:17:27.000000000 -0500 +++ 2.6.9-rc3-jschopp/arch/ppc64/kernel/smp.c 2004-10-01 14:50:49.000000000 -0500 @@ -463,7 +463,7 @@ static void vpa_init(int cpu) /* Register the Virtual Processor Area (VPA) */ flags = 1UL << (63 - 18); - register_vpa(flags, pcpu, __pa((unsigned long)&(paca[cpu].lppaca))); + register_vpa(flags, pcpu, __boot_pa((unsigned long)&(paca[cpu].lppaca))); } static inline void smp_xics_do_message(int cpu, int msg) @@ -872,7 +872,10 @@ int __devinit __cpu_up(unsigned int cpu) tmp = &stab_array[PAGE_SIZE * cpu]; memset(tmp, 0, PAGE_SIZE); paca[cpu].stab_addr = (unsigned long)tmp; - paca[cpu].stab_real = virt_to_abs(tmp); + if(system_state <= SYSTEM_BOOTING) + paca[cpu].stab_real = boot_virt_to_abs(tmp); + else + paca[cpu].stab_real = virt_to_abs(tmp); } /* The information for processor bringup must diff -puN arch/ppc64/mm/hash_utils.c~p00021_G1-nonlinear-ppc64-daveh arch/ppc64/mm/hash_utils.c --- 2.6.9-rc3/arch/ppc64/mm/hash_utils.c~p00021_G1-nonlinear-ppc64-daveh 2004-10-01 11:17:27.000000000 -0500 +++ 2.6.9-rc3-jschopp/arch/ppc64/mm/hash_utils.c 2004-10-01 14:50:49.000000000 -0500 @@ -105,8 +105,15 @@ static inline void create_pte_mapping(un unsigned long vpn, hash, hpteg; unsigned long vsid = get_kernel_vsid(addr); unsigned long va = (vsid << 28) | (addr & 0xfffffff); + unsigned long abs_page_nr, abs_page_addr; int ret; + if (system_state >= SYSTEM_RUNNING) + abs_page_addr = virt_to_abs((void *)addr); + else + abs_page_addr = boot_virt_to_abs(addr); + abs_page_nr = abs_page_addr >> PAGE_SHIFT; + if (large) vpn = va >> HPAGE_SHIFT; else @@ -120,12 +127,12 @@ static inline void create_pte_mapping(un if (systemcfg->platform & PLATFORM_LPAR) ret = pSeries_lpar_hpte_insert(hpteg, va, virt_to_abs(addr) >> PAGE_SHIFT, - 0, mode, 1, large); + abs_page_nr, mode, 1, large); else #endif /* CONFIG_PPC_PSERIES */ ret = native_hpte_insert(hpteg, va, virt_to_abs(addr) >> PAGE_SHIFT, - 0, mode, 1, large); + abs_page_nr, mode, 1, large); if (ret == -1) { ppc64_terminate_msg(0x20, "create_pte_mapping"); @@ -176,7 +183,7 @@ void __init htab_initialize(void) ppc64_terminate_msg(0x20, "hpt space"); loop_forever(); } - htab_data.htab = abs_to_virt(table); + htab_data.htab = boot_abs_to_virt(table); /* htab absolute addr + encoded htabsize */ _SDR1 = table + __ilog2(pteg_count) - 11; diff -puN arch/ppc64/mm/init.c~p00021_G1-nonlinear-ppc64-daveh arch/ppc64/mm/init.c --- 2.6.9-rc3/arch/ppc64/mm/init.c~p00021_G1-nonlinear-ppc64-daveh 2004-10-01 11:17:27.000000000 -0500 +++ 2.6.9-rc3-jschopp/arch/ppc64/mm/init.c 2004-10-01 14:44:59.000000000 -0500 @@ -98,7 +98,7 @@ void show_mem(void) printk("Free swap: %6ldkB\n", nr_swap_pages<<(PAGE_SHIFT-10)); for_each_pgdat(pgdat) { for (i = 0; i < pgdat->node_spanned_pages; i++) { - page = pgdat->node_mem_map + i; + page = pfn_to_page(i); total++; if (PageReserved(page)) reserved++; @@ -446,8 +446,8 @@ void free_initmem(void) addr = (unsigned long)__init_begin; for (; addr < (unsigned long)__init_end; addr += PAGE_SIZE) { - ClearPageReserved(virt_to_page(addr)); - set_page_count(virt_to_page(addr), 1); + ClearPageReserved(virt_to_page((void *)addr)); + set_page_count(virt_to_page((void *)addr), 1); free_page(addr); totalram_pages++; } @@ -461,8 +461,8 @@ void free_initrd_mem(unsigned long start if (start < end) printk ("Freeing initrd memory: %ldk freed\n", (end - start) >> 10); for (; start < end; start += PAGE_SIZE) { - ClearPageReserved(virt_to_page(start)); - set_page_count(virt_to_page(start), 1); + ClearPageReserved(virt_to_page((void*)start)); + set_page_count(virt_to_page((void*)start), 1); free_page(start); totalram_pages++; } @@ -646,6 +646,7 @@ void __init paging_init(void) unsigned long zholes_size[MAX_NR_ZONES]; unsigned long total_ram = lmb_phys_mem_size(); unsigned long top_of_ram = lmb_end_of_DRAM(); + unsigned long top_pfn = top_of_ram >> PAGE_SHIFT; printk(KERN_INFO "Top of RAM: 0x%lx, Total RAM: 0x%lx\n", top_of_ram, total_ram); @@ -657,7 +658,7 @@ void __init paging_init(void) memset(zones_size, 0, sizeof(zones_size)); memset(zholes_size, 0, sizeof(zholes_size)); - zones_size[ZONE_DMA] = top_of_ram >> PAGE_SHIFT; + zones_size[ZONE_DMA] = top_pfn; zholes_size[ZONE_DMA] = (top_of_ram - total_ram) >> PAGE_SHIFT; free_area_init_node(0, &contig_page_data, zones_size, diff -puN include/asm-ppc64/abs_addr.h~p00021_G1-nonlinear-ppc64-daveh include/asm-ppc64/abs_addr.h --- 2.6.9-rc3/include/asm-ppc64/abs_addr.h~p00021_G1-nonlinear-ppc64-daveh 2004-10-01 11:17:27.000000000 -0500 +++ 2.6.9-rc3-jschopp/include/asm-ppc64/abs_addr.h 2004-10-01 11:17:27.000000000 -0500 @@ -102,7 +102,9 @@ physRpn_to_absRpn(unsigned long rpn) #endif /* !CONFIG_MSCHUNKS */ /* Convenience macros */ -#define virt_to_abs(va) phys_to_abs(__pa(va)) -#define abs_to_virt(aa) __va(abs_to_phys(aa)) +#define virt_to_abs(va) phys_to_abs(virt_to_phys(va)) +#define abs_to_virt(aa) phys_to_virt(abs_to_phys(aa)) +#define boot_virt_to_abs(va) phys_to_abs(__boot_pa(va)) +#define boot_abs_to_virt(aa) __boot_va(abs_to_phys(aa)) #endif /* _ABS_ADDR_H */ diff -puN include/asm-ppc64/page.h~p00021_G1-nonlinear-ppc64-daveh include/asm-ppc64/page.h --- 2.6.9-rc3/include/asm-ppc64/page.h~p00021_G1-nonlinear-ppc64-daveh 2004-10-01 11:17:27.000000000 -0500 +++ 2.6.9-rc3-jschopp/include/asm-ppc64/page.h 2004-10-01 11:45:58.000000000 -0500 @@ -180,7 +180,11 @@ static inline int get_order(unsigned lon return order; } -#define __pa(x) ((unsigned long)(x)-PAGE_OFFSET) +#define __boot_pa(x) ((unsigned long)(x)-PAGE_OFFSET) +#define __boot_va(x) ((void *)((unsigned long)(x) + KERNELBASE)) +#define __pa(x) __boot_pa(x) +#define __va(x) __boot_va(x) + extern int page_is_ram(unsigned long pfn); @@ -213,11 +217,9 @@ extern int page_is_ram(unsigned long pfn #define USER_REGION_ID (0UL) #define REGION_ID(X) (((unsigned long)(X))>>REGION_SHIFT) -#define __bpn_to_ba(x) ((((unsigned long)(x))<> PAGE_SHIFT) -#define __va(x) ((void *)((unsigned long)(x) + KERNELBASE)) - #ifdef CONFIG_DISCONTIGMEM #define page_to_pfn(page) discontigmem_page_to_pfn(page) #define pfn_to_page(pfn) discontigmem_pfn_to_page(pfn) @@ -228,10 +230,11 @@ extern int page_is_ram(unsigned long pfn #define pfn_valid(pfn) ((pfn) < max_mapnr) #endif -#define virt_to_page(kaddr) pfn_to_page(__pa(kaddr) >> PAGE_SHIFT) -#define pfn_to_kaddr(pfn) __va((pfn) << PAGE_SHIFT) +#define virt_to_page(kaddr) pfn_to_page(virt_to_phys(kaddr) >> PAGE_SHIFT) +#define pfn_to_kaddr(pfn) phys_to_virt((pfn) << PAGE_SHIFT) + +#define virt_addr_valid(kaddr) pfn_valid(virt_to_phys(kaddr) >> PAGE_SHIFT) -#define virt_addr_valid(kaddr) pfn_valid(__pa(kaddr) >> PAGE_SHIFT) #define VM_DATA_DEFAULT_FLAGS (VM_READ | VM_WRITE | VM_EXEC | \ VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC) _