diff options
author | Anton Blanchard <anton@samba.org> | 2013-09-22 22:04:36 -0400 |
---|---|---|
committer | Benjamin Herrenschmidt <benh@kernel.crashing.org> | 2013-10-11 01:48:26 -0400 |
commit | 12f04f2be80dd8d9da24534828f3ab3189ca5af2 (patch) | |
tree | 0cdc5e766e3c3406286f808721ccd4ab9b134a20 /arch/powerpc/mm/hash_utils_64.c | |
parent | 32ee1e188eadd7c997837649a107fd1c50feef7a (diff) |
powerpc: Book 3S MMU little endian support
Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
Diffstat (limited to 'arch/powerpc/mm/hash_utils_64.c')
-rw-r--r-- | arch/powerpc/mm/hash_utils_64.c | 38 |
1 files changed, 18 insertions, 20 deletions
diff --git a/arch/powerpc/mm/hash_utils_64.c b/arch/powerpc/mm/hash_utils_64.c index bde8b5589755..6176b3cdf579 100644 --- a/arch/powerpc/mm/hash_utils_64.c +++ b/arch/powerpc/mm/hash_utils_64.c | |||
@@ -251,19 +251,18 @@ static int __init htab_dt_scan_seg_sizes(unsigned long node, | |||
251 | void *data) | 251 | void *data) |
252 | { | 252 | { |
253 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); | 253 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); |
254 | u32 *prop; | 254 | __be32 *prop; |
255 | unsigned long size = 0; | 255 | unsigned long size = 0; |
256 | 256 | ||
257 | /* We are scanning "cpu" nodes only */ | 257 | /* We are scanning "cpu" nodes only */ |
258 | if (type == NULL || strcmp(type, "cpu") != 0) | 258 | if (type == NULL || strcmp(type, "cpu") != 0) |
259 | return 0; | 259 | return 0; |
260 | 260 | ||
261 | prop = (u32 *)of_get_flat_dt_prop(node, "ibm,processor-segment-sizes", | 261 | prop = of_get_flat_dt_prop(node, "ibm,processor-segment-sizes", &size); |
262 | &size); | ||
263 | if (prop == NULL) | 262 | if (prop == NULL) |
264 | return 0; | 263 | return 0; |
265 | for (; size >= 4; size -= 4, ++prop) { | 264 | for (; size >= 4; size -= 4, ++prop) { |
266 | if (prop[0] == 40) { | 265 | if (be32_to_cpu(prop[0]) == 40) { |
267 | DBG("1T segment support detected\n"); | 266 | DBG("1T segment support detected\n"); |
268 | cur_cpu_spec->mmu_features |= MMU_FTR_1T_SEGMENT; | 267 | cur_cpu_spec->mmu_features |= MMU_FTR_1T_SEGMENT; |
269 | return 1; | 268 | return 1; |
@@ -307,23 +306,22 @@ static int __init htab_dt_scan_page_sizes(unsigned long node, | |||
307 | void *data) | 306 | void *data) |
308 | { | 307 | { |
309 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); | 308 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); |
310 | u32 *prop; | 309 | __be32 *prop; |
311 | unsigned long size = 0; | 310 | unsigned long size = 0; |
312 | 311 | ||
313 | /* We are scanning "cpu" nodes only */ | 312 | /* We are scanning "cpu" nodes only */ |
314 | if (type == NULL || strcmp(type, "cpu") != 0) | 313 | if (type == NULL || strcmp(type, "cpu") != 0) |
315 | return 0; | 314 | return 0; |
316 | 315 | ||
317 | prop = (u32 *)of_get_flat_dt_prop(node, | 316 | prop = of_get_flat_dt_prop(node, "ibm,segment-page-sizes", &size); |
318 | "ibm,segment-page-sizes", &size); | ||
319 | if (prop != NULL) { | 317 | if (prop != NULL) { |
320 | pr_info("Page sizes from device-tree:\n"); | 318 | pr_info("Page sizes from device-tree:\n"); |
321 | size /= 4; | 319 | size /= 4; |
322 | cur_cpu_spec->mmu_features &= ~(MMU_FTR_16M_PAGE); | 320 | cur_cpu_spec->mmu_features &= ~(MMU_FTR_16M_PAGE); |
323 | while(size > 0) { | 321 | while(size > 0) { |
324 | unsigned int base_shift = prop[0]; | 322 | unsigned int base_shift = be32_to_cpu(prop[0]); |
325 | unsigned int slbenc = prop[1]; | 323 | unsigned int slbenc = be32_to_cpu(prop[1]); |
326 | unsigned int lpnum = prop[2]; | 324 | unsigned int lpnum = be32_to_cpu(prop[2]); |
327 | struct mmu_psize_def *def; | 325 | struct mmu_psize_def *def; |
328 | int idx, base_idx; | 326 | int idx, base_idx; |
329 | 327 | ||
@@ -356,8 +354,8 @@ static int __init htab_dt_scan_page_sizes(unsigned long node, | |||
356 | def->tlbiel = 0; | 354 | def->tlbiel = 0; |
357 | 355 | ||
358 | while (size > 0 && lpnum) { | 356 | while (size > 0 && lpnum) { |
359 | unsigned int shift = prop[0]; | 357 | unsigned int shift = be32_to_cpu(prop[0]); |
360 | int penc = prop[1]; | 358 | int penc = be32_to_cpu(prop[1]); |
361 | 359 | ||
362 | prop += 2; size -= 2; | 360 | prop += 2; size -= 2; |
363 | lpnum--; | 361 | lpnum--; |
@@ -390,8 +388,8 @@ static int __init htab_dt_scan_hugepage_blocks(unsigned long node, | |||
390 | const char *uname, int depth, | 388 | const char *uname, int depth, |
391 | void *data) { | 389 | void *data) { |
392 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); | 390 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); |
393 | unsigned long *addr_prop; | 391 | __be64 *addr_prop; |
394 | u32 *page_count_prop; | 392 | __be32 *page_count_prop; |
395 | unsigned int expected_pages; | 393 | unsigned int expected_pages; |
396 | long unsigned int phys_addr; | 394 | long unsigned int phys_addr; |
397 | long unsigned int block_size; | 395 | long unsigned int block_size; |
@@ -405,12 +403,12 @@ static int __init htab_dt_scan_hugepage_blocks(unsigned long node, | |||
405 | page_count_prop = of_get_flat_dt_prop(node, "ibm,expected#pages", NULL); | 403 | page_count_prop = of_get_flat_dt_prop(node, "ibm,expected#pages", NULL); |
406 | if (page_count_prop == NULL) | 404 | if (page_count_prop == NULL) |
407 | return 0; | 405 | return 0; |
408 | expected_pages = (1 << page_count_prop[0]); | 406 | expected_pages = (1 << be32_to_cpu(page_count_prop[0])); |
409 | addr_prop = of_get_flat_dt_prop(node, "reg", NULL); | 407 | addr_prop = of_get_flat_dt_prop(node, "reg", NULL); |
410 | if (addr_prop == NULL) | 408 | if (addr_prop == NULL) |
411 | return 0; | 409 | return 0; |
412 | phys_addr = addr_prop[0]; | 410 | phys_addr = be64_to_cpu(addr_prop[0]); |
413 | block_size = addr_prop[1]; | 411 | block_size = be64_to_cpu(addr_prop[1]); |
414 | if (block_size != (16 * GB)) | 412 | if (block_size != (16 * GB)) |
415 | return 0; | 413 | return 0; |
416 | printk(KERN_INFO "Huge page(16GB) memory: " | 414 | printk(KERN_INFO "Huge page(16GB) memory: " |
@@ -534,16 +532,16 @@ static int __init htab_dt_scan_pftsize(unsigned long node, | |||
534 | void *data) | 532 | void *data) |
535 | { | 533 | { |
536 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); | 534 | char *type = of_get_flat_dt_prop(node, "device_type", NULL); |
537 | u32 *prop; | 535 | __be32 *prop; |
538 | 536 | ||
539 | /* We are scanning "cpu" nodes only */ | 537 | /* We are scanning "cpu" nodes only */ |
540 | if (type == NULL || strcmp(type, "cpu") != 0) | 538 | if (type == NULL || strcmp(type, "cpu") != 0) |
541 | return 0; | 539 | return 0; |
542 | 540 | ||
543 | prop = (u32 *)of_get_flat_dt_prop(node, "ibm,pft-size", NULL); | 541 | prop = of_get_flat_dt_prop(node, "ibm,pft-size", NULL); |
544 | if (prop != NULL) { | 542 | if (prop != NULL) { |
545 | /* pft_size[0] is the NUMA CEC cookie */ | 543 | /* pft_size[0] is the NUMA CEC cookie */ |
546 | ppc64_pft_size = prop[1]; | 544 | ppc64_pft_size = be32_to_cpu(prop[1]); |
547 | return 1; | 545 | return 1; |
548 | } | 546 | } |
549 | return 0; | 547 | return 0; |