diff options
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r-- | arch/powerpc/kernel/cputable.c | 13 | ||||
-rw-r--r-- | arch/powerpc/kernel/crash_dump.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/head_64.S | 39 | ||||
-rw-r--r-- | arch/powerpc/kernel/iommu.c | 69 | ||||
-rw-r--r-- | arch/powerpc/kernel/machine_kexec.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/machine_kexec_64.c | 26 | ||||
-rw-r--r-- | arch/powerpc/kernel/misc_64.S | 9 | ||||
-rw-r--r-- | arch/powerpc/kernel/pci-common.c | 3 | ||||
-rw-r--r-- | arch/powerpc/kernel/prom_init.c | 61 | ||||
-rw-r--r-- | arch/powerpc/kernel/prom_init_check.sh | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup-common.c | 7 | ||||
-rw-r--r-- | arch/powerpc/kernel/signal_64.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/udbg_16550.c | 2 |
13 files changed, 126 insertions, 111 deletions
diff --git a/arch/powerpc/kernel/cputable.c b/arch/powerpc/kernel/cputable.c index e70d0483fb4e..b1eb834bc0fc 100644 --- a/arch/powerpc/kernel/cputable.c +++ b/arch/powerpc/kernel/cputable.c | |||
@@ -1277,6 +1277,19 @@ static struct cpu_spec __initdata cpu_specs[] = { | |||
1277 | .machine_check = machine_check_4xx, | 1277 | .machine_check = machine_check_4xx, |
1278 | .platform = "ppc405", | 1278 | .platform = "ppc405", |
1279 | }, | 1279 | }, |
1280 | { | ||
1281 | /* 405EZ */ | ||
1282 | .pvr_mask = 0xffff0000, | ||
1283 | .pvr_value = 0x41510000, | ||
1284 | .cpu_name = "405EZ", | ||
1285 | .cpu_features = CPU_FTRS_40X, | ||
1286 | .cpu_user_features = PPC_FEATURE_32 | | ||
1287 | PPC_FEATURE_HAS_MMU | PPC_FEATURE_HAS_4xxMAC, | ||
1288 | .icache_bsize = 32, | ||
1289 | .dcache_bsize = 32, | ||
1290 | .machine_check = machine_check_4xx, | ||
1291 | .platform = "ppc405", | ||
1292 | }, | ||
1280 | { /* default match */ | 1293 | { /* default match */ |
1281 | .pvr_mask = 0x00000000, | 1294 | .pvr_mask = 0x00000000, |
1282 | .pvr_value = 0x00000000, | 1295 | .pvr_value = 0x00000000, |
diff --git a/arch/powerpc/kernel/crash_dump.c b/arch/powerpc/kernel/crash_dump.c index 97e056379728..19671aca6591 100644 --- a/arch/powerpc/kernel/crash_dump.c +++ b/arch/powerpc/kernel/crash_dump.c | |||
@@ -30,6 +30,7 @@ | |||
30 | /* Stores the physical address of elf header of crash image. */ | 30 | /* Stores the physical address of elf header of crash image. */ |
31 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; | 31 | unsigned long long elfcorehdr_addr = ELFCORE_ADDR_MAX; |
32 | 32 | ||
33 | #ifndef CONFIG_RELOCATABLE | ||
33 | void __init reserve_kdump_trampoline(void) | 34 | void __init reserve_kdump_trampoline(void) |
34 | { | 35 | { |
35 | lmb_reserve(0, KDUMP_RESERVE_LIMIT); | 36 | lmb_reserve(0, KDUMP_RESERVE_LIMIT); |
@@ -68,6 +69,7 @@ void __init setup_kdump_trampoline(void) | |||
68 | 69 | ||
69 | DBG(" <- setup_kdump_trampoline()\n"); | 70 | DBG(" <- setup_kdump_trampoline()\n"); |
70 | } | 71 | } |
72 | #endif /* CONFIG_RELOCATABLE */ | ||
71 | 73 | ||
72 | /* | 74 | /* |
73 | * Note: elfcorehdr_addr is not just limited to vmcore. It is also used by | 75 | * Note: elfcorehdr_addr is not just limited to vmcore. It is also used by |
diff --git a/arch/powerpc/kernel/head_64.S b/arch/powerpc/kernel/head_64.S index 84856bee33a5..69489bd3210c 100644 --- a/arch/powerpc/kernel/head_64.S +++ b/arch/powerpc/kernel/head_64.S | |||
@@ -97,6 +97,12 @@ __secondary_hold_spinloop: | |||
97 | __secondary_hold_acknowledge: | 97 | __secondary_hold_acknowledge: |
98 | .llong 0x0 | 98 | .llong 0x0 |
99 | 99 | ||
100 | /* This flag is set by purgatory if we should be a kdump kernel. */ | ||
101 | /* Do not move this variable as purgatory knows about it. */ | ||
102 | .globl __kdump_flag | ||
103 | __kdump_flag: | ||
104 | .llong 0x0 | ||
105 | |||
100 | #ifdef CONFIG_PPC_ISERIES | 106 | #ifdef CONFIG_PPC_ISERIES |
101 | /* | 107 | /* |
102 | * At offset 0x20, there is a pointer to iSeries LPAR data. | 108 | * At offset 0x20, there is a pointer to iSeries LPAR data. |
@@ -1384,7 +1390,13 @@ _STATIC(__after_prom_start) | |||
1384 | /* process relocations for the final address of the kernel */ | 1390 | /* process relocations for the final address of the kernel */ |
1385 | lis r25,PAGE_OFFSET@highest /* compute virtual base of kernel */ | 1391 | lis r25,PAGE_OFFSET@highest /* compute virtual base of kernel */ |
1386 | sldi r25,r25,32 | 1392 | sldi r25,r25,32 |
1387 | mr r3,r25 | 1393 | #ifdef CONFIG_CRASH_DUMP |
1394 | ld r7,__kdump_flag-_stext(r26) | ||
1395 | cmpldi cr0,r7,1 /* kdump kernel ? - stay where we are */ | ||
1396 | bne 1f | ||
1397 | add r25,r25,r26 | ||
1398 | #endif | ||
1399 | 1: mr r3,r25 | ||
1388 | bl .relocate | 1400 | bl .relocate |
1389 | #endif | 1401 | #endif |
1390 | 1402 | ||
@@ -1398,11 +1410,26 @@ _STATIC(__after_prom_start) | |||
1398 | li r3,0 /* target addr */ | 1410 | li r3,0 /* target addr */ |
1399 | mr. r4,r26 /* In some cases the loader may */ | 1411 | mr. r4,r26 /* In some cases the loader may */ |
1400 | beq 9f /* have already put us at zero */ | 1412 | beq 9f /* have already put us at zero */ |
1401 | lis r5,(copy_to_here - _stext)@ha | ||
1402 | addi r5,r5,(copy_to_here - _stext)@l /* # bytes of memory to copy */ | ||
1403 | li r6,0x100 /* Start offset, the first 0x100 */ | 1413 | li r6,0x100 /* Start offset, the first 0x100 */ |
1404 | /* bytes were copied earlier. */ | 1414 | /* bytes were copied earlier. */ |
1405 | 1415 | ||
1416 | #ifdef CONFIG_CRASH_DUMP | ||
1417 | /* | ||
1418 | * Check if the kernel has to be running as relocatable kernel based on the | ||
1419 | * variable __kdump_flag, if it is set the kernel is treated as relocatable | ||
1420 | * kernel, otherwise it will be moved to PHYSICAL_START | ||
1421 | */ | ||
1422 | ld r7,__kdump_flag-_stext(r26) | ||
1423 | cmpldi cr0,r7,1 | ||
1424 | bne 3f | ||
1425 | |||
1426 | li r5,__end_interrupts - _stext /* just copy interrupts */ | ||
1427 | b 5f | ||
1428 | 3: | ||
1429 | #endif | ||
1430 | lis r5,(copy_to_here - _stext)@ha | ||
1431 | addi r5,r5,(copy_to_here - _stext)@l /* # bytes of memory to copy */ | ||
1432 | |||
1406 | bl .copy_and_flush /* copy the first n bytes */ | 1433 | bl .copy_and_flush /* copy the first n bytes */ |
1407 | /* this includes the code being */ | 1434 | /* this includes the code being */ |
1408 | /* executed here. */ | 1435 | /* executed here. */ |
@@ -1411,15 +1438,15 @@ _STATIC(__after_prom_start) | |||
1411 | mtctr r8 | 1438 | mtctr r8 |
1412 | bctr | 1439 | bctr |
1413 | 1440 | ||
1441 | p_end: .llong _end - _stext | ||
1442 | |||
1414 | 4: /* Now copy the rest of the kernel up to _end */ | 1443 | 4: /* Now copy the rest of the kernel up to _end */ |
1415 | addis r5,r26,(p_end - _stext)@ha | 1444 | addis r5,r26,(p_end - _stext)@ha |
1416 | ld r5,(p_end - _stext)@l(r5) /* get _end */ | 1445 | ld r5,(p_end - _stext)@l(r5) /* get _end */ |
1417 | bl .copy_and_flush /* copy the rest */ | 1446 | 5: bl .copy_and_flush /* copy the rest */ |
1418 | 1447 | ||
1419 | 9: b .start_here_multiplatform | 1448 | 9: b .start_here_multiplatform |
1420 | 1449 | ||
1421 | p_end: .llong _end - _stext | ||
1422 | |||
1423 | /* | 1450 | /* |
1424 | * Copy routine used to copy the kernel to start at physical address 0 | 1451 | * Copy routine used to copy the kernel to start at physical address 0 |
1425 | * and flush and invalidate the caches as needed. | 1452 | * and flush and invalidate the caches as needed. |
diff --git a/arch/powerpc/kernel/iommu.c b/arch/powerpc/kernel/iommu.c index ea1ba89f9c90..3857d7e2af0c 100644 --- a/arch/powerpc/kernel/iommu.c +++ b/arch/powerpc/kernel/iommu.c | |||
@@ -458,6 +458,42 @@ void iommu_unmap_sg(struct iommu_table *tbl, struct scatterlist *sglist, | |||
458 | spin_unlock_irqrestore(&(tbl->it_lock), flags); | 458 | spin_unlock_irqrestore(&(tbl->it_lock), flags); |
459 | } | 459 | } |
460 | 460 | ||
461 | static void iommu_table_clear(struct iommu_table *tbl) | ||
462 | { | ||
463 | if (!__kdump_flag) { | ||
464 | /* Clear the table in case firmware left allocations in it */ | ||
465 | ppc_md.tce_free(tbl, tbl->it_offset, tbl->it_size); | ||
466 | return; | ||
467 | } | ||
468 | |||
469 | #ifdef CONFIG_CRASH_DUMP | ||
470 | if (ppc_md.tce_get) { | ||
471 | unsigned long index, tceval, tcecount = 0; | ||
472 | |||
473 | /* Reserve the existing mappings left by the first kernel. */ | ||
474 | for (index = 0; index < tbl->it_size; index++) { | ||
475 | tceval = ppc_md.tce_get(tbl, index + tbl->it_offset); | ||
476 | /* | ||
477 | * Freed TCE entry contains 0x7fffffffffffffff on JS20 | ||
478 | */ | ||
479 | if (tceval && (tceval != 0x7fffffffffffffffUL)) { | ||
480 | __set_bit(index, tbl->it_map); | ||
481 | tcecount++; | ||
482 | } | ||
483 | } | ||
484 | |||
485 | if ((tbl->it_size - tcecount) < KDUMP_MIN_TCE_ENTRIES) { | ||
486 | printk(KERN_WARNING "TCE table is full; freeing "); | ||
487 | printk(KERN_WARNING "%d entries for the kdump boot\n", | ||
488 | KDUMP_MIN_TCE_ENTRIES); | ||
489 | for (index = tbl->it_size - KDUMP_MIN_TCE_ENTRIES; | ||
490 | index < tbl->it_size; index++) | ||
491 | __clear_bit(index, tbl->it_map); | ||
492 | } | ||
493 | } | ||
494 | #endif | ||
495 | } | ||
496 | |||
461 | /* | 497 | /* |
462 | * Build a iommu_table structure. This contains a bit map which | 498 | * Build a iommu_table structure. This contains a bit map which |
463 | * is used to manage allocation of the tce space. | 499 | * is used to manage allocation of the tce space. |
@@ -484,38 +520,7 @@ struct iommu_table *iommu_init_table(struct iommu_table *tbl, int nid) | |||
484 | tbl->it_largehint = tbl->it_halfpoint; | 520 | tbl->it_largehint = tbl->it_halfpoint; |
485 | spin_lock_init(&tbl->it_lock); | 521 | spin_lock_init(&tbl->it_lock); |
486 | 522 | ||
487 | #ifdef CONFIG_CRASH_DUMP | 523 | iommu_table_clear(tbl); |
488 | if (ppc_md.tce_get) { | ||
489 | unsigned long index; | ||
490 | unsigned long tceval; | ||
491 | unsigned long tcecount = 0; | ||
492 | |||
493 | /* | ||
494 | * Reserve the existing mappings left by the first kernel. | ||
495 | */ | ||
496 | for (index = 0; index < tbl->it_size; index++) { | ||
497 | tceval = ppc_md.tce_get(tbl, index + tbl->it_offset); | ||
498 | /* | ||
499 | * Freed TCE entry contains 0x7fffffffffffffff on JS20 | ||
500 | */ | ||
501 | if (tceval && (tceval != 0x7fffffffffffffffUL)) { | ||
502 | __set_bit(index, tbl->it_map); | ||
503 | tcecount++; | ||
504 | } | ||
505 | } | ||
506 | if ((tbl->it_size - tcecount) < KDUMP_MIN_TCE_ENTRIES) { | ||
507 | printk(KERN_WARNING "TCE table is full; "); | ||
508 | printk(KERN_WARNING "freeing %d entries for the kdump boot\n", | ||
509 | KDUMP_MIN_TCE_ENTRIES); | ||
510 | for (index = tbl->it_size - KDUMP_MIN_TCE_ENTRIES; | ||
511 | index < tbl->it_size; index++) | ||
512 | __clear_bit(index, tbl->it_map); | ||
513 | } | ||
514 | } | ||
515 | #else | ||
516 | /* Clear the hardware table in case firmware left allocations in it */ | ||
517 | ppc_md.tce_free(tbl, tbl->it_offset, tbl->it_size); | ||
518 | #endif | ||
519 | 524 | ||
520 | if (!welcomed) { | 525 | if (!welcomed) { |
521 | printk(KERN_INFO "IOMMU table initialized, virtual merging %s\n", | 526 | printk(KERN_INFO "IOMMU table initialized, virtual merging %s\n", |
diff --git a/arch/powerpc/kernel/machine_kexec.c b/arch/powerpc/kernel/machine_kexec.c index aab76887a842..ac2a21f45c75 100644 --- a/arch/powerpc/kernel/machine_kexec.c +++ b/arch/powerpc/kernel/machine_kexec.c | |||
@@ -88,11 +88,13 @@ void __init reserve_crashkernel(void) | |||
88 | 88 | ||
89 | crash_size = crashk_res.end - crashk_res.start + 1; | 89 | crash_size = crashk_res.end - crashk_res.start + 1; |
90 | 90 | ||
91 | #ifndef CONFIG_RELOCATABLE | ||
91 | if (crashk_res.start != KDUMP_KERNELBASE) | 92 | if (crashk_res.start != KDUMP_KERNELBASE) |
92 | printk("Crash kernel location must be 0x%x\n", | 93 | printk("Crash kernel location must be 0x%x\n", |
93 | KDUMP_KERNELBASE); | 94 | KDUMP_KERNELBASE); |
94 | 95 | ||
95 | crashk_res.start = KDUMP_KERNELBASE; | 96 | crashk_res.start = KDUMP_KERNELBASE; |
97 | #endif | ||
96 | crash_size = PAGE_ALIGN(crash_size); | 98 | crash_size = PAGE_ALIGN(crash_size); |
97 | crashk_res.end = crashk_res.start + crash_size - 1; | 99 | crashk_res.end = crashk_res.start + crash_size - 1; |
98 | 100 | ||
diff --git a/arch/powerpc/kernel/machine_kexec_64.c b/arch/powerpc/kernel/machine_kexec_64.c index a168514d8609..e6efec788c4d 100644 --- a/arch/powerpc/kernel/machine_kexec_64.c +++ b/arch/powerpc/kernel/machine_kexec_64.c | |||
@@ -255,11 +255,14 @@ static union thread_union kexec_stack | |||
255 | /* Our assembly helper, in kexec_stub.S */ | 255 | /* Our assembly helper, in kexec_stub.S */ |
256 | extern NORET_TYPE void kexec_sequence(void *newstack, unsigned long start, | 256 | extern NORET_TYPE void kexec_sequence(void *newstack, unsigned long start, |
257 | void *image, void *control, | 257 | void *image, void *control, |
258 | void (*clear_all)(void)) ATTRIB_NORET; | 258 | void (*clear_all)(void), |
259 | unsigned long kdump_flag) ATTRIB_NORET; | ||
259 | 260 | ||
260 | /* too late to fail here */ | 261 | /* too late to fail here */ |
261 | void default_machine_kexec(struct kimage *image) | 262 | void default_machine_kexec(struct kimage *image) |
262 | { | 263 | { |
264 | unsigned long kdump_flag = 0; | ||
265 | |||
263 | /* prepare control code if any */ | 266 | /* prepare control code if any */ |
264 | 267 | ||
265 | /* | 268 | /* |
@@ -270,8 +273,10 @@ void default_machine_kexec(struct kimage *image) | |||
270 | * using debugger IPI. | 273 | * using debugger IPI. |
271 | */ | 274 | */ |
272 | 275 | ||
273 | if (crashing_cpu == -1) | 276 | if (crashing_cpu == -1) |
274 | kexec_prepare_cpus(); | 277 | kexec_prepare_cpus(); |
278 | else | ||
279 | kdump_flag = KDUMP_SIGNATURE; | ||
275 | 280 | ||
276 | /* switch to a staticly allocated stack. Based on irq stack code. | 281 | /* switch to a staticly allocated stack. Based on irq stack code. |
277 | * XXX: the task struct will likely be invalid once we do the copy! | 282 | * XXX: the task struct will likely be invalid once we do the copy! |
@@ -284,7 +289,7 @@ void default_machine_kexec(struct kimage *image) | |||
284 | */ | 289 | */ |
285 | kexec_sequence(&kexec_stack, image->start, image, | 290 | kexec_sequence(&kexec_stack, image->start, image, |
286 | page_address(image->control_code_page), | 291 | page_address(image->control_code_page), |
287 | ppc_md.hpte_clear_all); | 292 | ppc_md.hpte_clear_all, kdump_flag); |
288 | /* NOTREACHED */ | 293 | /* NOTREACHED */ |
289 | } | 294 | } |
290 | 295 | ||
@@ -312,11 +317,24 @@ static struct property kernel_end_prop = { | |||
312 | static void __init export_htab_values(void) | 317 | static void __init export_htab_values(void) |
313 | { | 318 | { |
314 | struct device_node *node; | 319 | struct device_node *node; |
320 | struct property *prop; | ||
315 | 321 | ||
316 | node = of_find_node_by_path("/chosen"); | 322 | node = of_find_node_by_path("/chosen"); |
317 | if (!node) | 323 | if (!node) |
318 | return; | 324 | return; |
319 | 325 | ||
326 | /* remove any stale propertys so ours can be found */ | ||
327 | prop = of_find_property(node, kernel_end_prop.name, NULL); | ||
328 | if (prop) | ||
329 | prom_remove_property(node, prop); | ||
330 | prop = of_find_property(node, htab_base_prop.name, NULL); | ||
331 | if (prop) | ||
332 | prom_remove_property(node, prop); | ||
333 | prop = of_find_property(node, htab_size_prop.name, NULL); | ||
334 | if (prop) | ||
335 | prom_remove_property(node, prop); | ||
336 | |||
337 | /* information needed by userspace when using default_machine_kexec */ | ||
320 | kernel_end = __pa(_end); | 338 | kernel_end = __pa(_end); |
321 | prom_add_property(node, &kernel_end_prop); | 339 | prom_add_property(node, &kernel_end_prop); |
322 | 340 | ||
diff --git a/arch/powerpc/kernel/misc_64.S b/arch/powerpc/kernel/misc_64.S index 3053fe5c62f2..a243fd072a77 100644 --- a/arch/powerpc/kernel/misc_64.S +++ b/arch/powerpc/kernel/misc_64.S | |||
@@ -611,10 +611,12 @@ real_mode: /* assume normal blr return */ | |||
611 | 611 | ||
612 | 612 | ||
613 | /* | 613 | /* |
614 | * kexec_sequence(newstack, start, image, control, clear_all()) | 614 | * kexec_sequence(newstack, start, image, control, clear_all(), kdump_flag) |
615 | * | 615 | * |
616 | * does the grungy work with stack switching and real mode switches | 616 | * does the grungy work with stack switching and real mode switches |
617 | * also does simple calls to other code | 617 | * also does simple calls to other code |
618 | * | ||
619 | * kdump_flag says whether the next kernel should be a kdump kernel. | ||
618 | */ | 620 | */ |
619 | 621 | ||
620 | _GLOBAL(kexec_sequence) | 622 | _GLOBAL(kexec_sequence) |
@@ -647,7 +649,7 @@ _GLOBAL(kexec_sequence) | |||
647 | mr r29,r5 /* image (virt) */ | 649 | mr r29,r5 /* image (virt) */ |
648 | mr r28,r6 /* control, unused */ | 650 | mr r28,r6 /* control, unused */ |
649 | mr r27,r7 /* clear_all() fn desc */ | 651 | mr r27,r7 /* clear_all() fn desc */ |
650 | mr r26,r8 /* spare */ | 652 | mr r26,r8 /* kdump flag */ |
651 | lhz r25,PACAHWCPUID(r13) /* get our phys cpu from paca */ | 653 | lhz r25,PACAHWCPUID(r13) /* get our phys cpu from paca */ |
652 | 654 | ||
653 | /* disable interrupts, we are overwriting kernel data next */ | 655 | /* disable interrupts, we are overwriting kernel data next */ |
@@ -709,5 +711,6 @@ _GLOBAL(kexec_sequence) | |||
709 | mr r4,r30 # start, aka phys mem offset | 711 | mr r4,r30 # start, aka phys mem offset |
710 | mtlr 4 | 712 | mtlr 4 |
711 | li r5,0 | 713 | li r5,0 |
712 | blr /* image->start(physid, image->start, 0); */ | 714 | mr r6,r26 /* kdump_flag */ |
715 | blr /* image->start(physid, image->start, 0, kdump_flag); */ | ||
713 | #endif /* CONFIG_KEXEC */ | 716 | #endif /* CONFIG_KEXEC */ |
diff --git a/arch/powerpc/kernel/pci-common.c b/arch/powerpc/kernel/pci-common.c index 3815d84a1ef4..1ec73938a00f 100644 --- a/arch/powerpc/kernel/pci-common.c +++ b/arch/powerpc/kernel/pci-common.c | |||
@@ -610,7 +610,8 @@ int pci_mmap_legacy_page_range(struct pci_bus *bus, | |||
610 | pr_debug(" -> mapping phys %llx\n", (unsigned long long)offset); | 610 | pr_debug(" -> mapping phys %llx\n", (unsigned long long)offset); |
611 | 611 | ||
612 | vma->vm_pgoff = offset >> PAGE_SHIFT; | 612 | vma->vm_pgoff = offset >> PAGE_SHIFT; |
613 | vma->vm_page_prot |= _PAGE_NO_CACHE | _PAGE_GUARDED; | 613 | vma->vm_page_prot = __pgprot(pgprot_val(vma->vm_page_prot) |
614 | | _PAGE_NO_CACHE | _PAGE_GUARDED); | ||
614 | return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, | 615 | return remap_pfn_range(vma, vma->vm_start, vma->vm_pgoff, |
615 | vma->vm_end - vma->vm_start, | 616 | vma->vm_end - vma->vm_start, |
616 | vma->vm_page_prot); | 617 | vma->vm_page_prot); |
diff --git a/arch/powerpc/kernel/prom_init.c b/arch/powerpc/kernel/prom_init.c index 2fdbc18ae94a..23e0db203329 100644 --- a/arch/powerpc/kernel/prom_init.c +++ b/arch/powerpc/kernel/prom_init.c | |||
@@ -487,67 +487,6 @@ static int __init prom_setprop(phandle node, const char *nodename, | |||
487 | return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); | 487 | return call_prom("interpret", 1, 1, (u32)(unsigned long) cmd); |
488 | } | 488 | } |
489 | 489 | ||
490 | /* We can't use the standard versions because of RELOC headaches. */ | ||
491 | #define isxdigit(c) (('0' <= (c) && (c) <= '9') \ | ||
492 | || ('a' <= (c) && (c) <= 'f') \ | ||
493 | || ('A' <= (c) && (c) <= 'F')) | ||
494 | |||
495 | #define isdigit(c) ('0' <= (c) && (c) <= '9') | ||
496 | #define islower(c) ('a' <= (c) && (c) <= 'z') | ||
497 | #define toupper(c) (islower(c) ? ((c) - 'a' + 'A') : (c)) | ||
498 | |||
499 | unsigned long prom_strtoul(const char *cp, const char **endp) | ||
500 | { | ||
501 | unsigned long result = 0, base = 10, value; | ||
502 | |||
503 | if (*cp == '0') { | ||
504 | base = 8; | ||
505 | cp++; | ||
506 | if (toupper(*cp) == 'X') { | ||
507 | cp++; | ||
508 | base = 16; | ||
509 | } | ||
510 | } | ||
511 | |||
512 | while (isxdigit(*cp) && | ||
513 | (value = isdigit(*cp) ? *cp - '0' : toupper(*cp) - 'A' + 10) < base) { | ||
514 | result = result * base + value; | ||
515 | cp++; | ||
516 | } | ||
517 | |||
518 | if (endp) | ||
519 | *endp = cp; | ||
520 | |||
521 | return result; | ||
522 | } | ||
523 | |||
524 | unsigned long prom_memparse(const char *ptr, const char **retptr) | ||
525 | { | ||
526 | unsigned long ret = prom_strtoul(ptr, retptr); | ||
527 | int shift = 0; | ||
528 | |||
529 | /* | ||
530 | * We can't use a switch here because GCC *may* generate a | ||
531 | * jump table which won't work, because we're not running at | ||
532 | * the address we're linked at. | ||
533 | */ | ||
534 | if ('G' == **retptr || 'g' == **retptr) | ||
535 | shift = 30; | ||
536 | |||
537 | if ('M' == **retptr || 'm' == **retptr) | ||
538 | shift = 20; | ||
539 | |||
540 | if ('K' == **retptr || 'k' == **retptr) | ||
541 | shift = 10; | ||
542 | |||
543 | if (shift) { | ||
544 | ret <<= shift; | ||
545 | (*retptr)++; | ||
546 | } | ||
547 | |||
548 | return ret; | ||
549 | } | ||
550 | |||
551 | /* | 490 | /* |
552 | * Early parsing of the command line passed to the kernel, used for | 491 | * Early parsing of the command line passed to the kernel, used for |
553 | * "mem=x" and the options that affect the iommu | 492 | * "mem=x" and the options that affect the iommu |
diff --git a/arch/powerpc/kernel/prom_init_check.sh b/arch/powerpc/kernel/prom_init_check.sh index 2c7e8e87f770..ea3a2ec03ffa 100644 --- a/arch/powerpc/kernel/prom_init_check.sh +++ b/arch/powerpc/kernel/prom_init_check.sh | |||
@@ -20,7 +20,7 @@ WHITELIST="add_reloc_offset __bss_start __bss_stop copy_and_flush | |||
20 | _end enter_prom memcpy memset reloc_offset __secondary_hold | 20 | _end enter_prom memcpy memset reloc_offset __secondary_hold |
21 | __secondary_hold_acknowledge __secondary_hold_spinloop __start | 21 | __secondary_hold_acknowledge __secondary_hold_spinloop __start |
22 | strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 | 22 | strcmp strcpy strlcpy strlen strncmp strstr logo_linux_clut224 |
23 | reloc_got2 kernstart_addr" | 23 | reloc_got2 kernstart_addr memstart_addr" |
24 | 24 | ||
25 | NM="$1" | 25 | NM="$1" |
26 | OBJ="$2" | 26 | OBJ="$2" |
diff --git a/arch/powerpc/kernel/setup-common.c b/arch/powerpc/kernel/setup-common.c index 5ec56ff03e86..705fc4bf3800 100644 --- a/arch/powerpc/kernel/setup-common.c +++ b/arch/powerpc/kernel/setup-common.c | |||
@@ -59,6 +59,7 @@ | |||
59 | #include <asm/mmu.h> | 59 | #include <asm/mmu.h> |
60 | #include <asm/xmon.h> | 60 | #include <asm/xmon.h> |
61 | #include <asm/cputhreads.h> | 61 | #include <asm/cputhreads.h> |
62 | #include <mm/mmu_decl.h> | ||
62 | 63 | ||
63 | #include "setup.h" | 64 | #include "setup.h" |
64 | 65 | ||
@@ -190,6 +191,12 @@ static int show_cpuinfo(struct seq_file *m, void *v) | |||
190 | if (ppc_md.show_cpuinfo != NULL) | 191 | if (ppc_md.show_cpuinfo != NULL) |
191 | ppc_md.show_cpuinfo(m); | 192 | ppc_md.show_cpuinfo(m); |
192 | 193 | ||
194 | #ifdef CONFIG_PPC32 | ||
195 | /* Display the amount of memory */ | ||
196 | seq_printf(m, "Memory\t\t: %d MB\n", | ||
197 | (unsigned int)(total_memory / (1024 * 1024))); | ||
198 | #endif | ||
199 | |||
193 | return 0; | 200 | return 0; |
194 | } | 201 | } |
195 | 202 | ||
diff --git a/arch/powerpc/kernel/signal_64.c b/arch/powerpc/kernel/signal_64.c index 65ad925c3a8f..c6a8f2326b6f 100644 --- a/arch/powerpc/kernel/signal_64.c +++ b/arch/powerpc/kernel/signal_64.c | |||
@@ -235,8 +235,6 @@ static long restore_sigcontext(struct pt_regs *regs, sigset_t *set, int sig, | |||
235 | else | 235 | else |
236 | for (i = 0; i < 32 ; i++) | 236 | for (i = 0; i < 32 ; i++) |
237 | current->thread.fpr[i][TS_VSRLOWOFFSET] = 0; | 237 | current->thread.fpr[i][TS_VSRLOWOFFSET] = 0; |
238 | |||
239 | #else | ||
240 | #endif | 238 | #endif |
241 | return err; | 239 | return err; |
242 | } | 240 | } |
diff --git a/arch/powerpc/kernel/udbg_16550.c b/arch/powerpc/kernel/udbg_16550.c index cb01ebc59387..7b7da8cfd5e8 100644 --- a/arch/powerpc/kernel/udbg_16550.c +++ b/arch/powerpc/kernel/udbg_16550.c | |||
@@ -142,7 +142,7 @@ unsigned int udbg_probe_uart_speed(void __iomem *comport, unsigned int clock) | |||
142 | speed = (clock / prescaler) / (divisor * 16); | 142 | speed = (clock / prescaler) / (divisor * 16); |
143 | 143 | ||
144 | /* sanity check */ | 144 | /* sanity check */ |
145 | if (speed < 0 || speed > (clock / 16)) | 145 | if (speed > (clock / 16)) |
146 | speed = 9600; | 146 | speed = 9600; |
147 | 147 | ||
148 | return speed; | 148 | return speed; |