1 #ifndef _ASM_POWERPC_ABS_ADDR_H 2 #define _ASM_POWERPC_ABS_ADDR_H 3 #ifdef __KERNEL__ 4 5 6 /* 7 * c 2001 PPC 64 Team, IBM Corp 8 * 9 * This program is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU General Public License 11 * as published by the Free Software Foundation; either version 12 * 2 of the License, or (at your option) any later version. 13 */ 14 15 #include <linux/memblock.h> 16 17 #include <asm/types.h> 18 #include <asm/page.h> 19 #include <asm/prom.h> 20 #include <asm/firmware.h> 21 22 struct mschunks_map { 23 unsigned long num_chunks; 24 unsigned long chunk_size; 25 unsigned long chunk_shift; 26 unsigned long chunk_mask; 27 u32 *mapping; 28 }; 29 30 extern struct mschunks_map mschunks_map; 31 32 /* Chunks are 256 KB */ 33 #define MSCHUNKS_CHUNK_SHIFT (18) 34 #define MSCHUNKS_CHUNK_SIZE (1UL << MSCHUNKS_CHUNK_SHIFT) 35 #define MSCHUNKS_OFFSET_MASK (MSCHUNKS_CHUNK_SIZE - 1) 36 chunk_to_addr(unsigned long chunk)37static inline unsigned long chunk_to_addr(unsigned long chunk) 38 { 39 return chunk << MSCHUNKS_CHUNK_SHIFT; 40 } 41 addr_to_chunk(unsigned long addr)42static inline unsigned long addr_to_chunk(unsigned long addr) 43 { 44 return addr >> MSCHUNKS_CHUNK_SHIFT; 45 } 46 phys_to_abs(unsigned long pa)47static inline unsigned long phys_to_abs(unsigned long pa) 48 { 49 unsigned long chunk; 50 51 /* This is a no-op on non-iSeries */ 52 if (!firmware_has_feature(FW_FEATURE_ISERIES)) 53 return pa; 54 55 chunk = addr_to_chunk(pa); 56 57 if (chunk < mschunks_map.num_chunks) 58 chunk = mschunks_map.mapping[chunk]; 59 60 return chunk_to_addr(chunk) + (pa & MSCHUNKS_OFFSET_MASK); 61 } 62 63 /* Convenience macros */ 64 #define virt_to_abs(va) phys_to_abs(__pa(va)) 65 #define abs_to_virt(aa) __va(aa) 66 67 /* 68 * Converts Virtual Address to Real Address for 69 * Legacy iSeries Hypervisor calls 70 */ 71 #define iseries_hv_addr(virtaddr) \ 72 (0x8000000000000000UL | virt_to_abs(virtaddr)) 73 74 #endif /* __KERNEL__ */ 75 #endif /* _ASM_POWERPC_ABS_ADDR_H */ 76