diff options
Diffstat (limited to 'arch/powerpc/include/asm/abs_addr.h')
-rw-r--r-- | arch/powerpc/include/asm/abs_addr.h | 75 |
1 files changed, 75 insertions, 0 deletions
diff --git a/arch/powerpc/include/asm/abs_addr.h b/arch/powerpc/include/asm/abs_addr.h new file mode 100644 index 000000000000..98324c5a8286 --- /dev/null +++ b/arch/powerpc/include/asm/abs_addr.h | |||
@@ -0,0 +1,75 @@ | |||
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/lmb.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 | |||
37 | static inline unsigned long chunk_to_addr(unsigned long chunk) | ||
38 | { | ||
39 | return chunk << MSCHUNKS_CHUNK_SHIFT; | ||
40 | } | ||
41 | |||
42 | static inline unsigned long addr_to_chunk(unsigned long addr) | ||
43 | { | ||
44 | return addr >> MSCHUNKS_CHUNK_SHIFT; | ||
45 | } | ||
46 | |||
47 | static 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 | (0x8000000000000000 | virt_to_abs(virtaddr)) | ||
73 | |||
74 | #endif /* __KERNEL__ */ | ||
75 | #endif /* _ASM_POWERPC_ABS_ADDR_H */ | ||