diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-21 10:48:56 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-10-21 10:48:56 -0400 |
commit | dc303408a716e865099fcb3f83a90d9c51184c02 (patch) | |
tree | 5995a029e75a4955a6e1cfa38b5889422469cdb2 /arch/powerpc/kernel | |
parent | c4301c32663438afb8eac96db01944ad95c00260 (diff) | |
parent | e89dafb5ca5022d3bc63602018adfc766c73bc2b (diff) |
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux
Pull more powerpc updates from Michael Ellerman:
"Here's some more updates for powerpc for 3.18.
They are a bit late I know, though must are actually bug fixes. In my
defence I nearly cut the top of my finger off last weekend in a
gruesome bike maintenance accident, so I spent a good part of the week
waiting around for doctors. True story, I can send photos if you like :)
Probably the most interesting fix is the sys_call_table one, which
enables syscall tracing for powerpc. There's a fix for HMI handling
for old firmware, more endian fixes for firmware interfaces, more EEH
fixes, Anton fixed our routine that gets the current stack pointer,
and a few other misc bits"
* 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/mpe/linux: (22 commits)
powerpc: Only do dynamic DMA zone limits on platforms that need it
powerpc: sync pseries_le_defconfig with pseries_defconfig
powerpc: Add printk levels to setup_system output
powerpc/vphn: NUMA node code expects big-endian
powerpc/msi: Use WARN_ON() in msi bitmap selftests
powerpc/msi: Fix the msi bitmap alignment tests
powerpc/eeh: Block CFG upon frozen Shiner adapter
powerpc/eeh: Don't collect logs on PE with blocked config space
powerpc/eeh: Block PCI config access upon frozen PE
powerpc/pseries: Drop config requests in EEH accessors
powerpc/powernv: Drop config requests in EEH accessors
powerpc/eeh: Rename flag EEH_PE_RESET to EEH_PE_CFG_BLOCKED
powerpc/eeh: Fix condition for isolated state
powerpc/pseries: Make CPU hotplug path endian safe
powerpc/pseries: Use dump_stack instead of show_stack
powerpc: Rename __get_SP() to current_stack_pointer()
powerpc: Reimplement __get_SP() as a function not a define
powerpc/numa: Add ability to disable and debug topology updates
powerpc/numa: check error return from proc_create
powerpc/powernv: Fallback to old HMI handling behavior for old firmware
...
Diffstat (limited to 'arch/powerpc/kernel')
-rw-r--r-- | arch/powerpc/kernel/dma.c | 8 | ||||
-rw-r--r-- | arch/powerpc/kernel/eeh.c | 19 | ||||
-rw-r--r-- | arch/powerpc/kernel/eeh_driver.c | 12 | ||||
-rw-r--r-- | arch/powerpc/kernel/eeh_pe.c | 10 | ||||
-rw-r--r-- | arch/powerpc/kernel/exceptions-64s.S | 5 | ||||
-rw-r--r-- | arch/powerpc/kernel/irq.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/misc.S | 4 | ||||
-rw-r--r-- | arch/powerpc/kernel/ppc_ksyms.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/process.c | 2 | ||||
-rw-r--r-- | arch/powerpc/kernel/rtas_pci.c | 30 | ||||
-rw-r--r-- | arch/powerpc/kernel/setup_64.c | 32 | ||||
-rw-r--r-- | arch/powerpc/kernel/stacktrace.c | 2 |
12 files changed, 72 insertions, 56 deletions
diff --git a/arch/powerpc/kernel/dma.c b/arch/powerpc/kernel/dma.c index adac9dc54aee..484b2d4462c1 100644 --- a/arch/powerpc/kernel/dma.c +++ b/arch/powerpc/kernel/dma.c | |||
@@ -53,9 +53,16 @@ void *dma_direct_alloc_coherent(struct device *dev, size_t size, | |||
53 | #else | 53 | #else |
54 | struct page *page; | 54 | struct page *page; |
55 | int node = dev_to_node(dev); | 55 | int node = dev_to_node(dev); |
56 | #ifdef CONFIG_FSL_SOC | ||
56 | u64 pfn = get_pfn_limit(dev); | 57 | u64 pfn = get_pfn_limit(dev); |
57 | int zone; | 58 | int zone; |
58 | 59 | ||
60 | /* | ||
61 | * This code should be OK on other platforms, but we have drivers that | ||
62 | * don't set coherent_dma_mask. As a workaround we just ifdef it. This | ||
63 | * whole routine needs some serious cleanup. | ||
64 | */ | ||
65 | |||
59 | zone = dma_pfn_limit_to_zone(pfn); | 66 | zone = dma_pfn_limit_to_zone(pfn); |
60 | if (zone < 0) { | 67 | if (zone < 0) { |
61 | dev_err(dev, "%s: No suitable zone for pfn %#llx\n", | 68 | dev_err(dev, "%s: No suitable zone for pfn %#llx\n", |
@@ -73,6 +80,7 @@ void *dma_direct_alloc_coherent(struct device *dev, size_t size, | |||
73 | break; | 80 | break; |
74 | #endif | 81 | #endif |
75 | }; | 82 | }; |
83 | #endif /* CONFIG_FSL_SOC */ | ||
76 | 84 | ||
77 | /* ignore region specifiers */ | 85 | /* ignore region specifiers */ |
78 | flag &= ~(__GFP_HIGHMEM); | 86 | flag &= ~(__GFP_HIGHMEM); |
diff --git a/arch/powerpc/kernel/eeh.c b/arch/powerpc/kernel/eeh.c index d543e4179c18..2248a1999c64 100644 --- a/arch/powerpc/kernel/eeh.c +++ b/arch/powerpc/kernel/eeh.c | |||
@@ -257,6 +257,13 @@ static void *eeh_dump_pe_log(void *data, void *flag) | |||
257 | struct eeh_dev *edev, *tmp; | 257 | struct eeh_dev *edev, *tmp; |
258 | size_t *plen = flag; | 258 | size_t *plen = flag; |
259 | 259 | ||
260 | /* If the PE's config space is blocked, 0xFF's will be | ||
261 | * returned. It's pointless to collect the log in this | ||
262 | * case. | ||
263 | */ | ||
264 | if (pe->state & EEH_PE_CFG_BLOCKED) | ||
265 | return NULL; | ||
266 | |||
260 | eeh_pe_for_each_dev(pe, edev, tmp) | 267 | eeh_pe_for_each_dev(pe, edev, tmp) |
261 | *plen += eeh_dump_dev_log(edev, pci_regs_buf + *plen, | 268 | *plen += eeh_dump_dev_log(edev, pci_regs_buf + *plen, |
262 | EEH_PCI_REGS_LOG_LEN - *plen); | 269 | EEH_PCI_REGS_LOG_LEN - *plen); |
@@ -673,18 +680,18 @@ int pcibios_set_pcie_reset_state(struct pci_dev *dev, enum pcie_reset_state stat | |||
673 | switch (state) { | 680 | switch (state) { |
674 | case pcie_deassert_reset: | 681 | case pcie_deassert_reset: |
675 | eeh_ops->reset(pe, EEH_RESET_DEACTIVATE); | 682 | eeh_ops->reset(pe, EEH_RESET_DEACTIVATE); |
676 | eeh_pe_state_clear(pe, EEH_PE_RESET); | 683 | eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED); |
677 | break; | 684 | break; |
678 | case pcie_hot_reset: | 685 | case pcie_hot_reset: |
679 | eeh_pe_state_mark(pe, EEH_PE_RESET); | 686 | eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED); |
680 | eeh_ops->reset(pe, EEH_RESET_HOT); | 687 | eeh_ops->reset(pe, EEH_RESET_HOT); |
681 | break; | 688 | break; |
682 | case pcie_warm_reset: | 689 | case pcie_warm_reset: |
683 | eeh_pe_state_mark(pe, EEH_PE_RESET); | 690 | eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED); |
684 | eeh_ops->reset(pe, EEH_RESET_FUNDAMENTAL); | 691 | eeh_ops->reset(pe, EEH_RESET_FUNDAMENTAL); |
685 | break; | 692 | break; |
686 | default: | 693 | default: |
687 | eeh_pe_state_clear(pe, EEH_PE_RESET); | 694 | eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED); |
688 | return -EINVAL; | 695 | return -EINVAL; |
689 | }; | 696 | }; |
690 | 697 | ||
@@ -1523,7 +1530,7 @@ int eeh_pe_reset(struct eeh_pe *pe, int option) | |||
1523 | switch (option) { | 1530 | switch (option) { |
1524 | case EEH_RESET_DEACTIVATE: | 1531 | case EEH_RESET_DEACTIVATE: |
1525 | ret = eeh_ops->reset(pe, option); | 1532 | ret = eeh_ops->reset(pe, option); |
1526 | eeh_pe_state_clear(pe, EEH_PE_RESET); | 1533 | eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED); |
1527 | if (ret) | 1534 | if (ret) |
1528 | break; | 1535 | break; |
1529 | 1536 | ||
@@ -1538,7 +1545,7 @@ int eeh_pe_reset(struct eeh_pe *pe, int option) | |||
1538 | */ | 1545 | */ |
1539 | eeh_ops->set_option(pe, EEH_OPT_FREEZE_PE); | 1546 | eeh_ops->set_option(pe, EEH_OPT_FREEZE_PE); |
1540 | 1547 | ||
1541 | eeh_pe_state_mark(pe, EEH_PE_RESET); | 1548 | eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED); |
1542 | ret = eeh_ops->reset(pe, option); | 1549 | ret = eeh_ops->reset(pe, option); |
1543 | break; | 1550 | break; |
1544 | default: | 1551 | default: |
diff --git a/arch/powerpc/kernel/eeh_driver.c b/arch/powerpc/kernel/eeh_driver.c index 3fd514f8e4b2..6535936bdf27 100644 --- a/arch/powerpc/kernel/eeh_driver.c +++ b/arch/powerpc/kernel/eeh_driver.c | |||
@@ -528,13 +528,13 @@ int eeh_pe_reset_and_recover(struct eeh_pe *pe) | |||
528 | eeh_pe_dev_traverse(pe, eeh_report_error, &result); | 528 | eeh_pe_dev_traverse(pe, eeh_report_error, &result); |
529 | 529 | ||
530 | /* Issue reset */ | 530 | /* Issue reset */ |
531 | eeh_pe_state_mark(pe, EEH_PE_RESET); | 531 | eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED); |
532 | ret = eeh_reset_pe(pe); | 532 | ret = eeh_reset_pe(pe); |
533 | if (ret) { | 533 | if (ret) { |
534 | eeh_pe_state_clear(pe, EEH_PE_RECOVERING | EEH_PE_RESET); | 534 | eeh_pe_state_clear(pe, EEH_PE_RECOVERING | EEH_PE_CFG_BLOCKED); |
535 | return ret; | 535 | return ret; |
536 | } | 536 | } |
537 | eeh_pe_state_clear(pe, EEH_PE_RESET); | 537 | eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED); |
538 | 538 | ||
539 | /* Unfreeze the PE */ | 539 | /* Unfreeze the PE */ |
540 | ret = eeh_clear_pe_frozen_state(pe, true); | 540 | ret = eeh_clear_pe_frozen_state(pe, true); |
@@ -601,10 +601,10 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus) | |||
601 | * config accesses. So we prefer to block them. However, controlled | 601 | * config accesses. So we prefer to block them. However, controlled |
602 | * PCI config accesses initiated from EEH itself are allowed. | 602 | * PCI config accesses initiated from EEH itself are allowed. |
603 | */ | 603 | */ |
604 | eeh_pe_state_mark(pe, EEH_PE_RESET); | 604 | eeh_pe_state_mark(pe, EEH_PE_CFG_BLOCKED); |
605 | rc = eeh_reset_pe(pe); | 605 | rc = eeh_reset_pe(pe); |
606 | if (rc) { | 606 | if (rc) { |
607 | eeh_pe_state_clear(pe, EEH_PE_RESET); | 607 | eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED); |
608 | return rc; | 608 | return rc; |
609 | } | 609 | } |
610 | 610 | ||
@@ -613,7 +613,7 @@ static int eeh_reset_device(struct eeh_pe *pe, struct pci_bus *bus) | |||
613 | /* Restore PE */ | 613 | /* Restore PE */ |
614 | eeh_ops->configure_bridge(pe); | 614 | eeh_ops->configure_bridge(pe); |
615 | eeh_pe_restore_bars(pe); | 615 | eeh_pe_restore_bars(pe); |
616 | eeh_pe_state_clear(pe, EEH_PE_RESET); | 616 | eeh_pe_state_clear(pe, EEH_PE_CFG_BLOCKED); |
617 | 617 | ||
618 | /* Clear frozen state */ | 618 | /* Clear frozen state */ |
619 | rc = eeh_clear_pe_frozen_state(pe, false); | 619 | rc = eeh_clear_pe_frozen_state(pe, false); |
diff --git a/arch/powerpc/kernel/eeh_pe.c b/arch/powerpc/kernel/eeh_pe.c index 53dd0915e690..5a63e2b0f65b 100644 --- a/arch/powerpc/kernel/eeh_pe.c +++ b/arch/powerpc/kernel/eeh_pe.c | |||
@@ -525,7 +525,7 @@ static void *__eeh_pe_state_mark(void *data, void *flag) | |||
525 | pe->state |= state; | 525 | pe->state |= state; |
526 | 526 | ||
527 | /* Offline PCI devices if applicable */ | 527 | /* Offline PCI devices if applicable */ |
528 | if (state != EEH_PE_ISOLATED) | 528 | if (!(state & EEH_PE_ISOLATED)) |
529 | return NULL; | 529 | return NULL; |
530 | 530 | ||
531 | eeh_pe_for_each_dev(pe, edev, tmp) { | 531 | eeh_pe_for_each_dev(pe, edev, tmp) { |
@@ -534,6 +534,10 @@ static void *__eeh_pe_state_mark(void *data, void *flag) | |||
534 | pdev->error_state = pci_channel_io_frozen; | 534 | pdev->error_state = pci_channel_io_frozen; |
535 | } | 535 | } |
536 | 536 | ||
537 | /* Block PCI config access if required */ | ||
538 | if (pe->state & EEH_PE_CFG_RESTRICTED) | ||
539 | pe->state |= EEH_PE_CFG_BLOCKED; | ||
540 | |||
537 | return NULL; | 541 | return NULL; |
538 | } | 542 | } |
539 | 543 | ||
@@ -611,6 +615,10 @@ static void *__eeh_pe_state_clear(void *data, void *flag) | |||
611 | pdev->error_state = pci_channel_io_normal; | 615 | pdev->error_state = pci_channel_io_normal; |
612 | } | 616 | } |
613 | 617 | ||
618 | /* Unblock PCI config access if required */ | ||
619 | if (pe->state & EEH_PE_CFG_RESTRICTED) | ||
620 | pe->state &= ~EEH_PE_CFG_BLOCKED; | ||
621 | |||
614 | return NULL; | 622 | return NULL; |
615 | } | 623 | } |
616 | 624 | ||
diff --git a/arch/powerpc/kernel/exceptions-64s.S b/arch/powerpc/kernel/exceptions-64s.S index 050f79a4a168..72e783ea0681 100644 --- a/arch/powerpc/kernel/exceptions-64s.S +++ b/arch/powerpc/kernel/exceptions-64s.S | |||
@@ -1270,11 +1270,6 @@ hmi_exception_early: | |||
1270 | addi r3,r1,STACK_FRAME_OVERHEAD | 1270 | addi r3,r1,STACK_FRAME_OVERHEAD |
1271 | bl hmi_exception_realmode | 1271 | bl hmi_exception_realmode |
1272 | /* Windup the stack. */ | 1272 | /* Windup the stack. */ |
1273 | /* Clear MSR_RI before setting SRR0 and SRR1. */ | ||
1274 | li r0,MSR_RI | ||
1275 | mfmsr r9 /* get MSR value */ | ||
1276 | andc r9,r9,r0 | ||
1277 | mtmsrd r9,1 /* Clear MSR_RI */ | ||
1278 | /* Move original HSRR0 and HSRR1 into the respective regs */ | 1273 | /* Move original HSRR0 and HSRR1 into the respective regs */ |
1279 | ld r9,_MSR(r1) | 1274 | ld r9,_MSR(r1) |
1280 | mtspr SPRN_HSRR1,r9 | 1275 | mtspr SPRN_HSRR1,r9 |
diff --git a/arch/powerpc/kernel/irq.c b/arch/powerpc/kernel/irq.c index 8eb857f216c1..c14383575fe8 100644 --- a/arch/powerpc/kernel/irq.c +++ b/arch/powerpc/kernel/irq.c | |||
@@ -466,7 +466,7 @@ static inline void check_stack_overflow(void) | |||
466 | #ifdef CONFIG_DEBUG_STACKOVERFLOW | 466 | #ifdef CONFIG_DEBUG_STACKOVERFLOW |
467 | long sp; | 467 | long sp; |
468 | 468 | ||
469 | sp = __get_SP() & (THREAD_SIZE-1); | 469 | sp = current_stack_pointer() & (THREAD_SIZE-1); |
470 | 470 | ||
471 | /* check for stack overflow: is there less than 2KB free? */ | 471 | /* check for stack overflow: is there less than 2KB free? */ |
472 | if (unlikely(sp < (sizeof(struct thread_info) + 2048))) { | 472 | if (unlikely(sp < (sizeof(struct thread_info) + 2048))) { |
diff --git a/arch/powerpc/kernel/misc.S b/arch/powerpc/kernel/misc.S index 7ce26d45777e..0d432194c018 100644 --- a/arch/powerpc/kernel/misc.S +++ b/arch/powerpc/kernel/misc.S | |||
@@ -114,3 +114,7 @@ _GLOBAL(longjmp) | |||
114 | mtlr r0 | 114 | mtlr r0 |
115 | mr r3,r4 | 115 | mr r3,r4 |
116 | blr | 116 | blr |
117 | |||
118 | _GLOBAL(current_stack_pointer) | ||
119 | PPC_LL r3,0(r1) | ||
120 | blr | ||
diff --git a/arch/powerpc/kernel/ppc_ksyms.c b/arch/powerpc/kernel/ppc_ksyms.c index c4dfff6c2719..202963ee013a 100644 --- a/arch/powerpc/kernel/ppc_ksyms.c +++ b/arch/powerpc/kernel/ppc_ksyms.c | |||
@@ -41,3 +41,5 @@ EXPORT_SYMBOL(giveup_spe); | |||
41 | #ifdef CONFIG_EPAPR_PARAVIRT | 41 | #ifdef CONFIG_EPAPR_PARAVIRT |
42 | EXPORT_SYMBOL(epapr_hypercall_start); | 42 | EXPORT_SYMBOL(epapr_hypercall_start); |
43 | #endif | 43 | #endif |
44 | |||
45 | EXPORT_SYMBOL(current_stack_pointer); | ||
diff --git a/arch/powerpc/kernel/process.c b/arch/powerpc/kernel/process.c index aa1df89c8b2a..923cd2daba89 100644 --- a/arch/powerpc/kernel/process.c +++ b/arch/powerpc/kernel/process.c | |||
@@ -1545,7 +1545,7 @@ void show_stack(struct task_struct *tsk, unsigned long *stack) | |||
1545 | tsk = current; | 1545 | tsk = current; |
1546 | if (sp == 0) { | 1546 | if (sp == 0) { |
1547 | if (tsk == current) | 1547 | if (tsk == current) |
1548 | asm("mr %0,1" : "=r" (sp)); | 1548 | sp = current_stack_pointer(); |
1549 | else | 1549 | else |
1550 | sp = tsk->thread.ksp; | 1550 | sp = tsk->thread.ksp; |
1551 | } | 1551 | } |
diff --git a/arch/powerpc/kernel/rtas_pci.c b/arch/powerpc/kernel/rtas_pci.c index c168337aef9d..7c55b86206b3 100644 --- a/arch/powerpc/kernel/rtas_pci.c +++ b/arch/powerpc/kernel/rtas_pci.c | |||
@@ -66,6 +66,11 @@ int rtas_read_config(struct pci_dn *pdn, int where, int size, u32 *val) | |||
66 | return PCIBIOS_DEVICE_NOT_FOUND; | 66 | return PCIBIOS_DEVICE_NOT_FOUND; |
67 | if (!config_access_valid(pdn, where)) | 67 | if (!config_access_valid(pdn, where)) |
68 | return PCIBIOS_BAD_REGISTER_NUMBER; | 68 | return PCIBIOS_BAD_REGISTER_NUMBER; |
69 | #ifdef CONFIG_EEH | ||
70 | if (pdn->edev && pdn->edev->pe && | ||
71 | (pdn->edev->pe->state & EEH_PE_CFG_BLOCKED)) | ||
72 | return PCIBIOS_SET_FAILED; | ||
73 | #endif | ||
69 | 74 | ||
70 | addr = rtas_config_addr(pdn->busno, pdn->devfn, where); | 75 | addr = rtas_config_addr(pdn->busno, pdn->devfn, where); |
71 | buid = pdn->phb->buid; | 76 | buid = pdn->phb->buid; |
@@ -90,9 +95,6 @@ static int rtas_pci_read_config(struct pci_bus *bus, | |||
90 | struct device_node *busdn, *dn; | 95 | struct device_node *busdn, *dn; |
91 | struct pci_dn *pdn; | 96 | struct pci_dn *pdn; |
92 | bool found = false; | 97 | bool found = false; |
93 | #ifdef CONFIG_EEH | ||
94 | struct eeh_dev *edev; | ||
95 | #endif | ||
96 | int ret; | 98 | int ret; |
97 | 99 | ||
98 | /* Search only direct children of the bus */ | 100 | /* Search only direct children of the bus */ |
@@ -109,11 +111,6 @@ static int rtas_pci_read_config(struct pci_bus *bus, | |||
109 | 111 | ||
110 | if (!found) | 112 | if (!found) |
111 | return PCIBIOS_DEVICE_NOT_FOUND; | 113 | return PCIBIOS_DEVICE_NOT_FOUND; |
112 | #ifdef CONFIG_EEH | ||
113 | edev = of_node_to_eeh_dev(dn); | ||
114 | if (edev && edev->pe && edev->pe->state & EEH_PE_RESET) | ||
115 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
116 | #endif | ||
117 | 114 | ||
118 | ret = rtas_read_config(pdn, where, size, val); | 115 | ret = rtas_read_config(pdn, where, size, val); |
119 | if (*val == EEH_IO_ERROR_VALUE(size) && | 116 | if (*val == EEH_IO_ERROR_VALUE(size) && |
@@ -132,6 +129,11 @@ int rtas_write_config(struct pci_dn *pdn, int where, int size, u32 val) | |||
132 | return PCIBIOS_DEVICE_NOT_FOUND; | 129 | return PCIBIOS_DEVICE_NOT_FOUND; |
133 | if (!config_access_valid(pdn, where)) | 130 | if (!config_access_valid(pdn, where)) |
134 | return PCIBIOS_BAD_REGISTER_NUMBER; | 131 | return PCIBIOS_BAD_REGISTER_NUMBER; |
132 | #ifdef CONFIG_EEH | ||
133 | if (pdn->edev && pdn->edev->pe && | ||
134 | (pdn->edev->pe->state & EEH_PE_CFG_BLOCKED)) | ||
135 | return PCIBIOS_SET_FAILED; | ||
136 | #endif | ||
135 | 137 | ||
136 | addr = rtas_config_addr(pdn->busno, pdn->devfn, where); | 138 | addr = rtas_config_addr(pdn->busno, pdn->devfn, where); |
137 | buid = pdn->phb->buid; | 139 | buid = pdn->phb->buid; |
@@ -155,10 +157,6 @@ static int rtas_pci_write_config(struct pci_bus *bus, | |||
155 | struct device_node *busdn, *dn; | 157 | struct device_node *busdn, *dn; |
156 | struct pci_dn *pdn; | 158 | struct pci_dn *pdn; |
157 | bool found = false; | 159 | bool found = false; |
158 | #ifdef CONFIG_EEH | ||
159 | struct eeh_dev *edev; | ||
160 | #endif | ||
161 | int ret; | ||
162 | 160 | ||
163 | /* Search only direct children of the bus */ | 161 | /* Search only direct children of the bus */ |
164 | busdn = pci_bus_to_OF_node(bus); | 162 | busdn = pci_bus_to_OF_node(bus); |
@@ -173,14 +171,8 @@ static int rtas_pci_write_config(struct pci_bus *bus, | |||
173 | 171 | ||
174 | if (!found) | 172 | if (!found) |
175 | return PCIBIOS_DEVICE_NOT_FOUND; | 173 | return PCIBIOS_DEVICE_NOT_FOUND; |
176 | #ifdef CONFIG_EEH | ||
177 | edev = of_node_to_eeh_dev(dn); | ||
178 | if (edev && edev->pe && (edev->pe->state & EEH_PE_RESET)) | ||
179 | return PCIBIOS_DEVICE_NOT_FOUND; | ||
180 | #endif | ||
181 | ret = rtas_write_config(pdn, where, size, val); | ||
182 | 174 | ||
183 | return ret; | 175 | return rtas_write_config(pdn, where, size, val); |
184 | } | 176 | } |
185 | 177 | ||
186 | static struct pci_ops rtas_pci_ops = { | 178 | static struct pci_ops rtas_pci_ops = { |
diff --git a/arch/powerpc/kernel/setup_64.c b/arch/powerpc/kernel/setup_64.c index cd07d79ad21c..4f3cfe1b6a33 100644 --- a/arch/powerpc/kernel/setup_64.c +++ b/arch/powerpc/kernel/setup_64.c | |||
@@ -522,36 +522,36 @@ void __init setup_system(void) | |||
522 | smp_release_cpus(); | 522 | smp_release_cpus(); |
523 | #endif | 523 | #endif |
524 | 524 | ||
525 | printk("Starting Linux PPC64 %s\n", init_utsname()->version); | 525 | pr_info("Starting Linux PPC64 %s\n", init_utsname()->version); |
526 | 526 | ||
527 | printk("-----------------------------------------------------\n"); | 527 | pr_info("-----------------------------------------------------\n"); |
528 | printk("ppc64_pft_size = 0x%llx\n", ppc64_pft_size); | 528 | pr_info("ppc64_pft_size = 0x%llx\n", ppc64_pft_size); |
529 | printk("phys_mem_size = 0x%llx\n", memblock_phys_mem_size()); | 529 | pr_info("phys_mem_size = 0x%llx\n", memblock_phys_mem_size()); |
530 | 530 | ||
531 | if (ppc64_caches.dline_size != 0x80) | 531 | if (ppc64_caches.dline_size != 0x80) |
532 | printk("dcache_line_size = 0x%x\n", ppc64_caches.dline_size); | 532 | pr_info("dcache_line_size = 0x%x\n", ppc64_caches.dline_size); |
533 | if (ppc64_caches.iline_size != 0x80) | 533 | if (ppc64_caches.iline_size != 0x80) |
534 | printk("icache_line_size = 0x%x\n", ppc64_caches.iline_size); | 534 | pr_info("icache_line_size = 0x%x\n", ppc64_caches.iline_size); |
535 | 535 | ||
536 | printk("cpu_features = 0x%016lx\n", cur_cpu_spec->cpu_features); | 536 | pr_info("cpu_features = 0x%016lx\n", cur_cpu_spec->cpu_features); |
537 | printk(" possible = 0x%016lx\n", CPU_FTRS_POSSIBLE); | 537 | pr_info(" possible = 0x%016lx\n", CPU_FTRS_POSSIBLE); |
538 | printk(" always = 0x%016lx\n", CPU_FTRS_ALWAYS); | 538 | pr_info(" always = 0x%016lx\n", CPU_FTRS_ALWAYS); |
539 | printk("cpu_user_features = 0x%08x 0x%08x\n", cur_cpu_spec->cpu_user_features, | 539 | pr_info("cpu_user_features = 0x%08x 0x%08x\n", cur_cpu_spec->cpu_user_features, |
540 | cur_cpu_spec->cpu_user_features2); | 540 | cur_cpu_spec->cpu_user_features2); |
541 | printk("mmu_features = 0x%08x\n", cur_cpu_spec->mmu_features); | 541 | pr_info("mmu_features = 0x%08x\n", cur_cpu_spec->mmu_features); |
542 | printk("firmware_features = 0x%016lx\n", powerpc_firmware_features); | 542 | pr_info("firmware_features = 0x%016lx\n", powerpc_firmware_features); |
543 | 543 | ||
544 | #ifdef CONFIG_PPC_STD_MMU_64 | 544 | #ifdef CONFIG_PPC_STD_MMU_64 |
545 | if (htab_address) | 545 | if (htab_address) |
546 | printk("htab_address = 0x%p\n", htab_address); | 546 | pr_info("htab_address = 0x%p\n", htab_address); |
547 | 547 | ||
548 | printk("htab_hash_mask = 0x%lx\n", htab_hash_mask); | 548 | pr_info("htab_hash_mask = 0x%lx\n", htab_hash_mask); |
549 | #endif | 549 | #endif |
550 | 550 | ||
551 | if (PHYSICAL_START > 0) | 551 | if (PHYSICAL_START > 0) |
552 | printk("physical_start = 0x%llx\n", | 552 | pr_info("physical_start = 0x%llx\n", |
553 | (unsigned long long)PHYSICAL_START); | 553 | (unsigned long long)PHYSICAL_START); |
554 | printk("-----------------------------------------------------\n"); | 554 | pr_info("-----------------------------------------------------\n"); |
555 | 555 | ||
556 | DBG(" <- setup_system()\n"); | 556 | DBG(" <- setup_system()\n"); |
557 | } | 557 | } |
diff --git a/arch/powerpc/kernel/stacktrace.c b/arch/powerpc/kernel/stacktrace.c index 3d30ef1038e5..ea43a347a104 100644 --- a/arch/powerpc/kernel/stacktrace.c +++ b/arch/powerpc/kernel/stacktrace.c | |||
@@ -50,7 +50,7 @@ void save_stack_trace(struct stack_trace *trace) | |||
50 | { | 50 | { |
51 | unsigned long sp; | 51 | unsigned long sp; |
52 | 52 | ||
53 | asm("mr %0,1" : "=r" (sp)); | 53 | sp = current_stack_pointer(); |
54 | 54 | ||
55 | save_context_stack(trace, sp, current, 1); | 55 | save_context_stack(trace, sp, current, 1); |
56 | } | 56 | } |