Hi, I would like to start using a dedicated stack for system reset interrupt and treat it as a Linux nmi, which makes it tricky to call complex interrupt handlers directly from the system reset trap handler.
So I would like to remove the decrementer and external handler calls from Cell and Pasemi platforms' system reset handler. I think we can just remove them if they can be handled when they re-fire as normal interrupts? At the moment I don't have environments set up to test if this works. This will make the powersave wakeup a bit slower. We could add alternate code to IDLETEST here to branch out to powersave wakeup handler like powernv does. I haven't got a patch for that yet but I could help write one if it is important and it can be tested. Thanks, Nick --- arch/powerpc/platforms/cell/pervasive.c | 11 +++++++---- arch/powerpc/platforms/pasemi/idle.c | 11 +++++++---- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/arch/powerpc/platforms/cell/pervasive.c b/arch/powerpc/platforms/cell/pervasive.c index e7d075077cb0..a88944db9fc3 100644 --- a/arch/powerpc/platforms/cell/pervasive.c +++ b/arch/powerpc/platforms/cell/pervasive.c @@ -88,11 +88,14 @@ static void cbe_power_save(void) static int cbe_system_reset_exception(struct pt_regs *regs) { switch (regs->msr & SRR1_WAKEMASK) { - case SRR1_WAKEEE: - do_IRQ(regs); - break; case SRR1_WAKEDEC: - timer_interrupt(regs); + set_dec(1); + case SRR1_WAKEEE: + /* + * Handle these when interrupts get re-enabled and we take + * them as regular exceptions. We are in an NMI context + * and can't handle these here. + */ break; case SRR1_WAKEMT: return cbe_sysreset_hack(); diff --git a/arch/powerpc/platforms/pasemi/idle.c b/arch/powerpc/platforms/pasemi/idle.c index 75b296bc51af..44e0d9226f0a 100644 --- a/arch/powerpc/platforms/pasemi/idle.c +++ b/arch/powerpc/platforms/pasemi/idle.c @@ -53,11 +53,14 @@ static int pasemi_system_reset_exception(struct pt_regs *regs) regs->nip = regs->link; switch (regs->msr & SRR1_WAKEMASK) { - case SRR1_WAKEEE: - do_IRQ(regs); - break; case SRR1_WAKEDEC: - timer_interrupt(regs); + set_dec(1); + case SRR1_WAKEEE: + /* + * Handle these when interrupts get re-enabled and we take + * them as regular exceptions. We are in an NMI context + * and can't handle these here. + */ break; default: /* do system reset */ -- 2.11.0