diff options
-rw-r--r-- | arch/ppc64/kernel/LparData.c | 18 | ||||
-rw-r--r-- | arch/ppc64/kernel/iSeries_setup.c | 20 | ||||
-rw-r--r-- | include/asm-ppc64/abs_addr.h | 15 |
3 files changed, 27 insertions, 26 deletions
diff --git a/arch/ppc64/kernel/LparData.c b/arch/ppc64/kernel/LparData.c index 0ed77b2f7d5f..0a9c23ca2f0c 100644 --- a/arch/ppc64/kernel/LparData.c +++ b/arch/ppc64/kernel/LparData.c | |||
@@ -225,21 +225,3 @@ struct ItVpdAreas itVpdAreas = { | |||
225 | 0,0 | 225 | 0,0 |
226 | } | 226 | } |
227 | }; | 227 | }; |
228 | |||
229 | struct msChunks msChunks; | ||
230 | EXPORT_SYMBOL(msChunks); | ||
231 | |||
232 | unsigned long | ||
233 | msChunks_alloc(unsigned long mem, unsigned long num_chunks, unsigned long chunk_size) | ||
234 | { | ||
235 | _msChunks->num_chunks = num_chunks; | ||
236 | _msChunks->chunk_size = chunk_size; | ||
237 | _msChunks->chunk_shift = __ilog2(chunk_size); | ||
238 | _msChunks->chunk_mask = (1UL<<_msChunks->chunk_shift)-1; | ||
239 | |||
240 | mem = _ALIGN(mem, sizeof(msChunks_entry)); | ||
241 | _msChunks->abs = (msChunks_entry *)mem; | ||
242 | mem += num_chunks * sizeof(msChunks_entry); | ||
243 | |||
244 | return mem; | ||
245 | } | ||
diff --git a/arch/ppc64/kernel/iSeries_setup.c b/arch/ppc64/kernel/iSeries_setup.c index 460e7df681a1..e47984ba7c7c 100644 --- a/arch/ppc64/kernel/iSeries_setup.c +++ b/arch/ppc64/kernel/iSeries_setup.c | |||
@@ -415,6 +415,22 @@ static void __init iSeries_init_early(void) | |||
415 | DBG(" <- iSeries_init_early()\n"); | 415 | DBG(" <- iSeries_init_early()\n"); |
416 | } | 416 | } |
417 | 417 | ||
418 | struct msChunks msChunks = { | ||
419 | /* XXX We don't use these, but Piranha might need them. */ | ||
420 | .chunk_size = MSCHUNKS_CHUNK_SIZE, | ||
421 | .chunk_shift = MSCHUNKS_CHUNK_SHIFT, | ||
422 | .chunk_mask = MSCHUNKS_OFFSET_MASK, | ||
423 | }; | ||
424 | EXPORT_SYMBOL(msChunks); | ||
425 | |||
426 | void msChunks_alloc(unsigned long num_chunks) | ||
427 | { | ||
428 | klimit = _ALIGN(klimit, sizeof(u32)); | ||
429 | msChunks.abs = (u32 *)klimit; | ||
430 | klimit += num_chunks * sizeof(u32); | ||
431 | msChunks.num_chunks = num_chunks; | ||
432 | } | ||
433 | |||
418 | /* | 434 | /* |
419 | * The iSeries may have very large memories ( > 128 GB ) and a partition | 435 | * The iSeries may have very large memories ( > 128 GB ) and a partition |
420 | * may get memory in "chunks" that may be anywhere in the 2**52 real | 436 | * may get memory in "chunks" that may be anywhere in the 2**52 real |
@@ -452,7 +468,7 @@ static void __init build_iSeries_Memory_Map(void) | |||
452 | 468 | ||
453 | /* Chunk size on iSeries is 256K bytes */ | 469 | /* Chunk size on iSeries is 256K bytes */ |
454 | totalChunks = (u32)HvLpConfig_getMsChunks(); | 470 | totalChunks = (u32)HvLpConfig_getMsChunks(); |
455 | klimit = msChunks_alloc(klimit, totalChunks, 1UL << 18); | 471 | msChunks_alloc(totalChunks); |
456 | 472 | ||
457 | /* | 473 | /* |
458 | * Get absolute address of our load area | 474 | * Get absolute address of our load area |
@@ -498,7 +514,7 @@ static void __init build_iSeries_Memory_Map(void) | |||
498 | */ | 514 | */ |
499 | hptFirstChunk = (u32)addr_to_chunk(HvCallHpt_getHptAddress()); | 515 | hptFirstChunk = (u32)addr_to_chunk(HvCallHpt_getHptAddress()); |
500 | hptSizePages = (u32)HvCallHpt_getHptPages(); | 516 | hptSizePages = (u32)HvCallHpt_getHptPages(); |
501 | hptSizeChunks = hptSizePages >> (msChunks.chunk_shift - PAGE_SHIFT); | 517 | hptSizeChunks = hptSizePages >> (MSCHUNKS_CHUNK_SHIFT - PAGE_SHIFT); |
502 | hptLastChunk = hptFirstChunk + hptSizeChunks - 1; | 518 | hptLastChunk = hptFirstChunk + hptSizeChunks - 1; |
503 | 519 | ||
504 | printk("HPT absolute addr = %016lx, size = %dK\n", | 520 | printk("HPT absolute addr = %016lx, size = %dK\n", |
diff --git a/include/asm-ppc64/abs_addr.h b/include/asm-ppc64/abs_addr.h index 93dc63ed4f2f..2276567f133a 100644 --- a/include/asm-ppc64/abs_addr.h +++ b/include/asm-ppc64/abs_addr.h | |||
@@ -17,34 +17,37 @@ | |||
17 | #include <asm/prom.h> | 17 | #include <asm/prom.h> |
18 | #include <asm/lmb.h> | 18 | #include <asm/lmb.h> |
19 | 19 | ||
20 | typedef u32 msChunks_entry; | ||
21 | struct msChunks { | 20 | struct msChunks { |
22 | unsigned long num_chunks; | 21 | unsigned long num_chunks; |
23 | unsigned long chunk_size; | 22 | unsigned long chunk_size; |
24 | unsigned long chunk_shift; | 23 | unsigned long chunk_shift; |
25 | unsigned long chunk_mask; | 24 | unsigned long chunk_mask; |
26 | msChunks_entry *abs; | 25 | u32 *abs; |
27 | }; | 26 | }; |
28 | 27 | ||
29 | extern struct msChunks msChunks; | 28 | extern struct msChunks msChunks; |
30 | 29 | ||
31 | extern unsigned long msChunks_alloc(unsigned long, unsigned long, unsigned long); | ||
32 | 30 | ||
33 | #ifdef CONFIG_MSCHUNKS | 31 | #ifdef CONFIG_MSCHUNKS |
34 | 32 | ||
33 | /* Chunks are 256 KB */ | ||
34 | #define MSCHUNKS_CHUNK_SHIFT (18) | ||
35 | #define MSCHUNKS_CHUNK_SIZE (1UL << MSCHUNKS_CHUNK_SHIFT) | ||
36 | #define MSCHUNKS_OFFSET_MASK (MSCHUNKS_CHUNK_SIZE - 1) | ||
37 | |||
35 | static inline unsigned long chunk_to_addr(unsigned long chunk) | 38 | static inline unsigned long chunk_to_addr(unsigned long chunk) |
36 | { | 39 | { |
37 | return chunk << msChunks.chunk_shift; | 40 | return chunk << MSCHUNKS_CHUNK_SHIFT; |
38 | } | 41 | } |
39 | 42 | ||
40 | static inline unsigned long addr_to_chunk(unsigned long addr) | 43 | static inline unsigned long addr_to_chunk(unsigned long addr) |
41 | { | 44 | { |
42 | return addr >> msChunks.chunk_shift; | 45 | return addr >> MSCHUNKS_CHUNK_SHIFT; |
43 | } | 46 | } |
44 | 47 | ||
45 | static inline unsigned long chunk_offset(unsigned long addr) | 48 | static inline unsigned long chunk_offset(unsigned long addr) |
46 | { | 49 | { |
47 | return addr & msChunks.chunk_mask; | 50 | return addr & MSCHUNKS_OFFSET_MASK; |
48 | } | 51 | } |
49 | 52 | ||
50 | static inline unsigned long abs_chunk(unsigned long pchunk) | 53 | static inline unsigned long abs_chunk(unsigned long pchunk) |