diff options
-rw-r--r-- | arch/ppc64/kernel/LparData.c | 10 | ||||
-rw-r--r-- | include/asm-ppc64/abs_addr.h | 36 | ||||
-rw-r--r-- | include/asm-ppc64/system.h | 2 |
3 files changed, 13 insertions, 35 deletions
diff --git a/arch/ppc64/kernel/LparData.c b/arch/ppc64/kernel/LparData.c index 3b9a2600fec2..0ed77b2f7d5f 100644 --- a/arch/ppc64/kernel/LparData.c +++ b/arch/ppc64/kernel/LparData.c | |||
@@ -229,24 +229,16 @@ struct ItVpdAreas itVpdAreas = { | |||
229 | struct msChunks msChunks; | 229 | struct msChunks msChunks; |
230 | EXPORT_SYMBOL(msChunks); | 230 | EXPORT_SYMBOL(msChunks); |
231 | 231 | ||
232 | /* Depending on whether this is called from iSeries or pSeries setup | ||
233 | * code, the location of the msChunks struct may or may not have | ||
234 | * to be reloc'd, so we force the caller to do that for us by passing | ||
235 | * in a pointer to the structure. | ||
236 | */ | ||
237 | unsigned long | 232 | unsigned long |
238 | msChunks_alloc(unsigned long mem, unsigned long num_chunks, unsigned long chunk_size) | 233 | msChunks_alloc(unsigned long mem, unsigned long num_chunks, unsigned long chunk_size) |
239 | { | 234 | { |
240 | unsigned long offset = reloc_offset(); | ||
241 | struct msChunks *_msChunks = PTRRELOC(&msChunks); | ||
242 | |||
243 | _msChunks->num_chunks = num_chunks; | 235 | _msChunks->num_chunks = num_chunks; |
244 | _msChunks->chunk_size = chunk_size; | 236 | _msChunks->chunk_size = chunk_size; |
245 | _msChunks->chunk_shift = __ilog2(chunk_size); | 237 | _msChunks->chunk_shift = __ilog2(chunk_size); |
246 | _msChunks->chunk_mask = (1UL<<_msChunks->chunk_shift)-1; | 238 | _msChunks->chunk_mask = (1UL<<_msChunks->chunk_shift)-1; |
247 | 239 | ||
248 | mem = _ALIGN(mem, sizeof(msChunks_entry)); | 240 | mem = _ALIGN(mem, sizeof(msChunks_entry)); |
249 | _msChunks->abs = (msChunks_entry *)(mem + offset); | 241 | _msChunks->abs = (msChunks_entry *)mem; |
250 | mem += num_chunks * sizeof(msChunks_entry); | 242 | mem += num_chunks * sizeof(msChunks_entry); |
251 | 243 | ||
252 | return mem; | 244 | return mem; |
diff --git a/include/asm-ppc64/abs_addr.h b/include/asm-ppc64/abs_addr.h index 6d4e8e787058..93dc63ed4f2f 100644 --- a/include/asm-ppc64/abs_addr.h +++ b/include/asm-ppc64/abs_addr.h | |||
@@ -29,46 +29,30 @@ struct msChunks { | |||
29 | extern struct msChunks msChunks; | 29 | extern struct msChunks msChunks; |
30 | 30 | ||
31 | extern unsigned long msChunks_alloc(unsigned long, unsigned long, unsigned long); | 31 | extern unsigned long msChunks_alloc(unsigned long, unsigned long, unsigned long); |
32 | extern unsigned long reloc_offset(void); | ||
33 | 32 | ||
34 | #ifdef CONFIG_MSCHUNKS | 33 | #ifdef CONFIG_MSCHUNKS |
35 | 34 | ||
36 | static inline unsigned long | 35 | static inline unsigned long chunk_to_addr(unsigned long chunk) |
37 | chunk_to_addr(unsigned long chunk) | ||
38 | { | 36 | { |
39 | unsigned long offset = reloc_offset(); | 37 | return chunk << msChunks.chunk_shift; |
40 | struct msChunks *_msChunks = PTRRELOC(&msChunks); | ||
41 | |||
42 | return chunk << _msChunks->chunk_shift; | ||
43 | } | 38 | } |
44 | 39 | ||
45 | static inline unsigned long | 40 | static inline unsigned long addr_to_chunk(unsigned long addr) |
46 | addr_to_chunk(unsigned long addr) | ||
47 | { | 41 | { |
48 | unsigned long offset = reloc_offset(); | 42 | return addr >> msChunks.chunk_shift; |
49 | struct msChunks *_msChunks = PTRRELOC(&msChunks); | ||
50 | |||
51 | return addr >> _msChunks->chunk_shift; | ||
52 | } | 43 | } |
53 | 44 | ||
54 | static inline unsigned long | 45 | static inline unsigned long chunk_offset(unsigned long addr) |
55 | chunk_offset(unsigned long addr) | ||
56 | { | 46 | { |
57 | unsigned long offset = reloc_offset(); | 47 | return addr & msChunks.chunk_mask; |
58 | struct msChunks *_msChunks = PTRRELOC(&msChunks); | ||
59 | |||
60 | return addr & _msChunks->chunk_mask; | ||
61 | } | 48 | } |
62 | 49 | ||
63 | static inline unsigned long | 50 | static inline unsigned long abs_chunk(unsigned long pchunk) |
64 | abs_chunk(unsigned long pchunk) | ||
65 | { | 51 | { |
66 | unsigned long offset = reloc_offset(); | 52 | if (pchunk >= msChunks.num_chunks) |
67 | struct msChunks *_msChunks = PTRRELOC(&msChunks); | ||
68 | if ( pchunk >= _msChunks->num_chunks ) { | ||
69 | return pchunk; | 53 | return pchunk; |
70 | } | 54 | |
71 | return PTRRELOC(_msChunks->abs)[pchunk]; | 55 | return msChunks.abs[pchunk]; |
72 | } | 56 | } |
73 | 57 | ||
74 | /* A macro so it can take pointers or unsigned long. */ | 58 | /* A macro so it can take pointers or unsigned long. */ |
diff --git a/include/asm-ppc64/system.h b/include/asm-ppc64/system.h index 98d120ca8a91..4104a5dedbaa 100644 --- a/include/asm-ppc64/system.h +++ b/include/asm-ppc64/system.h | |||
@@ -302,5 +302,7 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, int size) | |||
302 | 302 | ||
303 | #define arch_align_stack(x) (x) | 303 | #define arch_align_stack(x) (x) |
304 | 304 | ||
305 | extern unsigned long reloc_offset(void); | ||
306 | |||
305 | #endif /* __KERNEL__ */ | 307 | #endif /* __KERNEL__ */ |
306 | #endif | 308 | #endif |