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) |
