Commit d6396a73 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'powerpc-4.14-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux

Pull powerpc fixes from Michael Ellerman:
 "It turns out our single-fix pull from last week was too good to be
  true. I missed a few fixes in that pull that had already come in
  because I was on leave, but also we hadn't found the bugs yet. So this
  week it's a bit bigger, though not ridiculous. Hopefully things will
  settle down from here on.

  Four fixes for the new instruction emulation code. A fix for CPU
  offline on bare metal machines when certain idle states are not
  supported, and a fix for a device_node refcounting oops during CPU
  hotplug, caused by recent changes.

  Going to stable are a fix for an oops during core dump on machines
  that have TM (Transactional Memory) disabled. Reordering some EEH
  initialisation to avoid trashing memory, and another device_node
  refcounting fix.

  And a few other minor things.

 Thanks to: Anton Blanchard, Benjamin Herrenschmidt, Cyril Bur, Gautham
 R. Shenoy, Gustavo Romero, Kamalesh Babulal, Matthew Weber, Matt Weber,
 Naveen N. Rao, Nicholas Piggin, Pavithra Prakash, Ravi Bangoria, Ronak
 Desai, Scott Wood, Tyrel Datwyler"

* tag 'powerpc-4.14-3' of git://git.kernel.org/pub/scm/linux/kernel/git/powerpc/linux:
  powerpc/pseries: Fix parent_dn reference leak in add_dt_node()
  powerpc/pseries: Fix "OF: ERROR: Bad of_node_put() on /cpus" during DLPAR
  powerpc/eeh: Create PHB PEs after EEH is initialized
  powerpc/kprobes: Update optprobes to use emulate_update_regs()
  powerpc/powernv: Clear LPCR[PECE1] via stop-api only for deep state offline
  powerpc/sstep: mullw should calculate a 64 bit signed result
  powerpc/sstep: Fix issues with mcrf
  powerpc/sstep: Fix issues with set_cr0()
  powerpc/tm: Flush TM only if CPU has TM feature
  powerpc/sysrq: Fix oops whem ppmu is not registered
  powerpc/configs: Update for CONFIG_SND changes
  powerpc/e6500: Update machine check for L1D cache err
parents 7e6d8f83 b537ca6f
...@@ -138,10 +138,11 @@ CONFIG_FRAMEBUFFER_CONSOLE=y ...@@ -138,10 +138,11 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y CONFIG_LOGO=y
CONFIG_SOUND=m CONFIG_SOUND=m
CONFIG_SND=m CONFIG_SND=m
CONFIG_SND_SEQUENCER=m CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=m CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m CONFIG_SND_PCM_OSS=m
CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_POWERMAC=m CONFIG_SND_POWERMAC=m
CONFIG_SND_AOA=m CONFIG_SND_AOA=m
CONFIG_SND_AOA_FABRIC_LAYOUT=m CONFIG_SND_AOA_FABRIC_LAYOUT=m
......
...@@ -64,11 +64,12 @@ CONFIG_LOGO=y ...@@ -64,11 +64,12 @@ CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_CLUT224 is not set # CONFIG_LOGO_LINUX_CLUT224 is not set
CONFIG_SOUND=y CONFIG_SOUND=y
CONFIG_SND=y CONFIG_SND=y
CONFIG_SND_SEQUENCER=y CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y CONFIG_SND_PCM_OSS=y
CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_SND_VERBOSE_PROCFS is not set # CONFIG_SND_VERBOSE_PROCFS is not set
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_USB_SUPPORT is not set # CONFIG_USB_SUPPORT is not set
CONFIG_RTC_CLASS=y CONFIG_RTC_CLASS=y
CONFIG_RTC_DRV_GENERIC=y CONFIG_RTC_DRV_GENERIC=y
......
...@@ -115,9 +115,10 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y ...@@ -115,9 +115,10 @@ CONFIG_VGACON_SOFT_SCROLLBACK=y
CONFIG_LOGO=y CONFIG_LOGO=y
CONFIG_SOUND=y CONFIG_SOUND=y
CONFIG_SND=y CONFIG_SND=y
CONFIG_SND_SEQUENCER=y CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y CONFIG_SND_PCM_OSS=y
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_USB_AUDIO=y CONFIG_SND_USB_AUDIO=y
CONFIG_SND_USB_USX2Y=y CONFIG_SND_USB_USX2Y=y
......
...@@ -227,11 +227,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y ...@@ -227,11 +227,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y CONFIG_LOGO=y
CONFIG_SOUND=m CONFIG_SOUND=m
CONFIG_SND=m CONFIG_SND=m
CONFIG_SND_SEQUENCER=m CONFIG_SND_OSSEMUL=y
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_MIXER_OSS=m CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m CONFIG_SND_PCM_OSS=m
CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_DUMMY=m CONFIG_SND_DUMMY=m
CONFIG_SND_POWERMAC=m CONFIG_SND_POWERMAC=m
CONFIG_SND_AOA=m CONFIG_SND_AOA=m
......
...@@ -222,11 +222,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y ...@@ -222,11 +222,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y CONFIG_LOGO=y
CONFIG_SOUND=m CONFIG_SOUND=m
CONFIG_SND=m CONFIG_SND=m
CONFIG_SND_SEQUENCER=m CONFIG_SND_OSSEMUL=y
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_MIXER_OSS=m CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m CONFIG_SND_PCM_OSS=m
CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_POWERMAC=m CONFIG_SND_POWERMAC=m
CONFIG_SND_AOA=m CONFIG_SND_AOA=m
CONFIG_SND_AOA_FABRIC_LAYOUT=m CONFIG_SND_AOA_FABRIC_LAYOUT=m
......
...@@ -141,11 +141,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y ...@@ -141,11 +141,12 @@ CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_LOGO=y CONFIG_LOGO=y
CONFIG_SOUND=m CONFIG_SOUND=m
CONFIG_SND=m CONFIG_SND=m
CONFIG_SND_SEQUENCER=m CONFIG_SND_OSSEMUL=y
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_MIXER_OSS=m CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m CONFIG_SND_PCM_OSS=m
CONFIG_SND_SEQUENCER_OSS=y CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_SEQUENCER_OSS=m
CONFIG_HID_DRAGONRISE=y CONFIG_HID_DRAGONRISE=y
CONFIG_HID_GYRATION=y CONFIG_HID_GYRATION=y
CONFIG_HID_TWINHAN=y CONFIG_HID_TWINHAN=y
......
...@@ -789,17 +789,18 @@ CONFIG_LOGO=y ...@@ -789,17 +789,18 @@ CONFIG_LOGO=y
# CONFIG_LOGO_LINUX_VGA16 is not set # CONFIG_LOGO_LINUX_VGA16 is not set
CONFIG_SOUND=m CONFIG_SOUND=m
CONFIG_SND=m CONFIG_SND=m
CONFIG_SND_SEQUENCER=m CONFIG_SND_OSSEMUL=y
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_MIXER_OSS=m CONFIG_SND_MIXER_OSS=m
CONFIG_SND_PCM_OSS=m CONFIG_SND_PCM_OSS=m
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_SND_DYNAMIC_MINORS=y CONFIG_SND_DYNAMIC_MINORS=y
# CONFIG_SND_SUPPORT_OLD_API is not set # CONFIG_SND_SUPPORT_OLD_API is not set
CONFIG_SND_VERBOSE_PRINTK=y CONFIG_SND_VERBOSE_PRINTK=y
CONFIG_SND_DEBUG=y CONFIG_SND_DEBUG=y
CONFIG_SND_DEBUG_VERBOSE=y CONFIG_SND_DEBUG_VERBOSE=y
CONFIG_SND_PCM_XRUN_DEBUG=y CONFIG_SND_PCM_XRUN_DEBUG=y
CONFIG_SND_SEQUENCER=m
CONFIG_SND_SEQ_DUMMY=m
CONFIG_SND_SEQUENCER_OSS=m
CONFIG_SND_DUMMY=m CONFIG_SND_DUMMY=m
CONFIG_SND_VIRMIDI=m CONFIG_SND_VIRMIDI=m
CONFIG_SND_MTPAV=m CONFIG_SND_MTPAV=m
......
...@@ -79,11 +79,12 @@ CONFIG_FB=y ...@@ -79,11 +79,12 @@ CONFIG_FB=y
CONFIG_FRAMEBUFFER_CONSOLE=y CONFIG_FRAMEBUFFER_CONSOLE=y
CONFIG_SOUND=y CONFIG_SOUND=y
CONFIG_SND=y CONFIG_SND=y
CONFIG_SND_SEQUENCER=y CONFIG_SND_OSSEMUL=y
CONFIG_SND_MIXER_OSS=y CONFIG_SND_MIXER_OSS=y
CONFIG_SND_PCM_OSS=y CONFIG_SND_PCM_OSS=y
CONFIG_SND_SEQUENCER_OSS=y
# CONFIG_SND_VERBOSE_PROCFS is not set # CONFIG_SND_VERBOSE_PROCFS is not set
CONFIG_SND_SEQUENCER=y
CONFIG_SND_SEQUENCER_OSS=y
CONFIG_HID_APPLE=m CONFIG_HID_APPLE=m
CONFIG_HID_WACOM=m CONFIG_HID_WACOM=m
CONFIG_MMC=y CONFIG_MMC=y
......
...@@ -1019,6 +1019,10 @@ int eeh_init(void) ...@@ -1019,6 +1019,10 @@ int eeh_init(void)
} else if ((ret = eeh_ops->init())) } else if ((ret = eeh_ops->init()))
return ret; return ret;
/* Initialize PHB PEs */
list_for_each_entry_safe(hose, tmp, &hose_list, list_node)
eeh_dev_phb_init_dynamic(hose);
/* Initialize EEH event */ /* Initialize EEH event */
ret = eeh_event_init(); ret = eeh_event_init();
if (ret) if (ret)
......
...@@ -78,21 +78,3 @@ void eeh_dev_phb_init_dynamic(struct pci_controller *phb) ...@@ -78,21 +78,3 @@ void eeh_dev_phb_init_dynamic(struct pci_controller *phb)
/* EEH PE for PHB */ /* EEH PE for PHB */
eeh_phb_pe_create(phb); eeh_phb_pe_create(phb);
} }
/**
* eeh_dev_phb_init - Create EEH devices for devices included in existing PHBs
*
* Scan all the existing PHBs and create EEH devices for their OF
* nodes and their children OF nodes
*/
static int __init eeh_dev_phb_init(void)
{
struct pci_controller *phb, *tmp;
list_for_each_entry_safe(phb, tmp, &hose_list, list_node)
eeh_dev_phb_init_dynamic(phb);
return 0;
}
core_initcall(eeh_dev_phb_init);
...@@ -104,8 +104,10 @@ static unsigned long can_optimize(struct kprobe *p) ...@@ -104,8 +104,10 @@ static unsigned long can_optimize(struct kprobe *p)
* and that can be emulated. * and that can be emulated.
*/ */
if (!is_conditional_branch(*p->ainsn.insn) && if (!is_conditional_branch(*p->ainsn.insn) &&
analyse_instr(&op, &regs, *p->ainsn.insn)) analyse_instr(&op, &regs, *p->ainsn.insn) == 1) {
emulate_update_regs(&regs, &op);
nip = regs.nip; nip = regs.nip;
}
return nip; return nip;
} }
......
...@@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk) ...@@ -131,7 +131,7 @@ static void flush_tmregs_to_thread(struct task_struct *tsk)
* in the appropriate thread structures from live. * in the appropriate thread structures from live.
*/ */
if (tsk != current) if ((!cpu_has_feature(CPU_FTR_TM)) || (tsk != current))
return; return;
if (MSR_TM_SUSPENDED(mfmsr())) { if (MSR_TM_SUSPENDED(mfmsr())) {
......
...@@ -437,6 +437,7 @@ static inline int check_io_access(struct pt_regs *regs) ...@@ -437,6 +437,7 @@ static inline int check_io_access(struct pt_regs *regs)
int machine_check_e500mc(struct pt_regs *regs) int machine_check_e500mc(struct pt_regs *regs)
{ {
unsigned long mcsr = mfspr(SPRN_MCSR); unsigned long mcsr = mfspr(SPRN_MCSR);
unsigned long pvr = mfspr(SPRN_PVR);
unsigned long reason = mcsr; unsigned long reason = mcsr;
int recoverable = 1; int recoverable = 1;
...@@ -478,8 +479,15 @@ int machine_check_e500mc(struct pt_regs *regs) ...@@ -478,8 +479,15 @@ int machine_check_e500mc(struct pt_regs *regs)
* may still get logged and cause a machine check. We should * may still get logged and cause a machine check. We should
* only treat the non-write shadow case as non-recoverable. * only treat the non-write shadow case as non-recoverable.
*/ */
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS)) /* On e6500 core, L1 DCWS (Data cache write shadow mode) bit
recoverable = 0; * is not implemented but L1 data cache always runs in write
* shadow mode. Hence on data cache parity errors HW will
* automatically invalidate the L1 Data Cache.
*/
if (PVR_VER(pvr) != PVR_VER_E6500) {
if (!(mfspr(SPRN_L1CSR2) & L1CSR2_DCWS))
recoverable = 0;
}
} }
if (reason & MCSR_L2MMU_MHIT) { if (reason & MCSR_L2MMU_MHIT) {
......
...@@ -944,9 +944,9 @@ NOKPROBE_SYMBOL(emulate_dcbz); ...@@ -944,9 +944,9 @@ NOKPROBE_SYMBOL(emulate_dcbz);
: "r" (addr), "i" (-EFAULT), "0" (err)) : "r" (addr), "i" (-EFAULT), "0" (err))
static nokprobe_inline void set_cr0(const struct pt_regs *regs, static nokprobe_inline void set_cr0(const struct pt_regs *regs,
struct instruction_op *op, int rd) struct instruction_op *op)
{ {
long val = regs->gpr[rd]; long val = op->val;
op->type |= SETCC; op->type |= SETCC;
op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000); op->ccval = (regs->ccr & 0x0fffffff) | ((regs->xer >> 3) & 0x10000000);
...@@ -1326,7 +1326,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1326,7 +1326,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
case 13: /* addic. */ case 13: /* addic. */
imm = (short) instr; imm = (short) instr;
add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0); add_with_carry(regs, op, rd, regs->gpr[ra], imm, 0);
set_cr0(regs, op, rd); set_cr0(regs, op);
return 1; return 1;
case 14: /* addi */ case 14: /* addi */
...@@ -1397,13 +1397,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1397,13 +1397,13 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
case 28: /* andi. */ case 28: /* andi. */
op->val = regs->gpr[rd] & (unsigned short) instr; op->val = regs->gpr[rd] & (unsigned short) instr;
set_cr0(regs, op, ra); set_cr0(regs, op);
goto logical_done_nocc; goto logical_done_nocc;
case 29: /* andis. */ case 29: /* andis. */
imm = (unsigned short) instr; imm = (unsigned short) instr;
op->val = regs->gpr[rd] & (imm << 16); op->val = regs->gpr[rd] & (imm << 16);
set_cr0(regs, op, ra); set_cr0(regs, op);
goto logical_done_nocc; goto logical_done_nocc;
#ifdef __powerpc64__ #ifdef __powerpc64__
...@@ -1513,10 +1513,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1513,10 +1513,10 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
op->type = COMPUTE + SETCC; op->type = COMPUTE + SETCC;
imm = 0xf0000000UL; imm = 0xf0000000UL;
val = regs->gpr[rd]; val = regs->gpr[rd];
op->val = regs->ccr; op->ccval = regs->ccr;
for (sh = 0; sh < 8; ++sh) { for (sh = 0; sh < 8; ++sh) {
if (instr & (0x80000 >> sh)) if (instr & (0x80000 >> sh))
op->val = (op->val & ~imm) | op->ccval = (op->ccval & ~imm) |
(val & imm); (val & imm);
imm >>= 4; imm >>= 4;
} }
...@@ -1651,8 +1651,9 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -1651,8 +1651,9 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
goto arith_done; goto arith_done;
case 235: /* mullw */ case 235: /* mullw */
op->val = (unsigned int) regs->gpr[ra] * op->val = (long)(int) regs->gpr[ra] *
(unsigned int) regs->gpr[rb]; (int) regs->gpr[rb];
goto arith_done; goto arith_done;
case 266: /* add */ case 266: /* add */
...@@ -2526,7 +2527,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -2526,7 +2527,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
logical_done: logical_done:
if (instr & 1) if (instr & 1)
set_cr0(regs, op, ra); set_cr0(regs, op);
logical_done_nocc: logical_done_nocc:
op->reg = ra; op->reg = ra;
op->type |= SETREG; op->type |= SETREG;
...@@ -2534,7 +2535,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs, ...@@ -2534,7 +2535,7 @@ int analyse_instr(struct instruction_op *op, const struct pt_regs *regs,
arith_done: arith_done:
if (instr & 1) if (instr & 1)
set_cr0(regs, op, rd); set_cr0(regs, op);
compute_done: compute_done:
op->reg = rd; op->reg = rd;
op->type |= SETREG; op->type |= SETREG;
......
...@@ -793,6 +793,11 @@ void perf_event_print_debug(void) ...@@ -793,6 +793,11 @@ void perf_event_print_debug(void)
u32 pmcs[MAX_HWEVENTS]; u32 pmcs[MAX_HWEVENTS];
int i; int i;
if (!ppmu) {
pr_info("Performance monitor hardware not registered.\n");
return;
}
if (!ppmu->n_counter) if (!ppmu->n_counter)
return; return;
......
...@@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val) ...@@ -393,7 +393,13 @@ static void pnv_program_cpu_hotplug_lpcr(unsigned int cpu, u64 lpcr_val)
u64 pir = get_hard_smp_processor_id(cpu); u64 pir = get_hard_smp_processor_id(cpu);
mtspr(SPRN_LPCR, lpcr_val); mtspr(SPRN_LPCR, lpcr_val);
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
/*
* Program the LPCR via stop-api only if the deepest stop state
* can lose hypervisor context.
*/
if (supported_cpuidle_states & OPAL_PM_LOSE_FULL_CONTEXT)
opal_slw_set_reg(pir, SPRN_LPCR, lpcr_val);
} }
/* /*
......
...@@ -266,7 +266,6 @@ int dlpar_attach_node(struct device_node *dn, struct device_node *parent) ...@@ -266,7 +266,6 @@ int dlpar_attach_node(struct device_node *dn, struct device_node *parent)
return rc; return rc;
} }
of_node_put(dn->parent);
return 0; return 0;
} }
......
...@@ -462,15 +462,19 @@ static ssize_t dlpar_cpu_add(u32 drc_index) ...@@ -462,15 +462,19 @@ static ssize_t dlpar_cpu_add(u32 drc_index)
} }
dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent); dn = dlpar_configure_connector(cpu_to_be32(drc_index), parent);
of_node_put(parent);
if (!dn) { if (!dn) {
pr_warn("Failed call to configure-connector, drc index: %x\n", pr_warn("Failed call to configure-connector, drc index: %x\n",
drc_index); drc_index);
dlpar_release_drc(drc_index); dlpar_release_drc(drc_index);
of_node_put(parent);
return -EINVAL; return -EINVAL;
} }
rc = dlpar_attach_node(dn, parent); rc = dlpar_attach_node(dn, parent);
/* Regardless we are done with parent now */
of_node_put(parent);
if (rc) { if (rc) {
saved_rc = rc; saved_rc = rc;
pr_warn("Failed to attach node %s, rc: %d, drc index: %x\n", pr_warn("Failed to attach node %s, rc: %d, drc index: %x\n",
......
...@@ -226,8 +226,10 @@ static int add_dt_node(__be32 parent_phandle, __be32 drc_index) ...@@ -226,8 +226,10 @@ static int add_dt_node(__be32 parent_phandle, __be32 drc_index)
return -ENOENT; return -ENOENT;
dn = dlpar_configure_connector(drc_index, parent_dn); dn = dlpar_configure_connector(drc_index, parent_dn);
if (!dn) if (!dn) {
of_node_put(parent_dn);
return -ENOENT; return -ENOENT;
}
rc = dlpar_attach_node(dn, parent_dn); rc = dlpar_attach_node(dn, parent_dn);
if (rc) if (rc)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment