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 |
