Message ID | 20211209092146.620024-1-sudeep.holla@arm.com (mailing list archive) |
---|---|
State | Handled Elsewhere, archived |
Headers | show |
Series | mailbox: pcc: Handle all PCC subtypes correctly in pcc_mbox_irq | expand |
Hi Jassi, On Thu, Dec 09, 2021 at 09:21:46AM +0000, Sudeep Holla wrote: > Commit c45ded7e1135 ("mailbox: pcc: Add support for PCCT extended PCC > subspaces(type 3/4)") enabled the type3/4 of PCCT, but the change in > pcc_mbox_irq breaks the other PCC subtypes. > > The kernel reports a warning on an Ampere eMag server > > -->8 > CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.16.0-rc4 #127 > Hardware name: MiTAC RAPTOR EV-883832-X3-0001/RAPTOR, BIOS 0.14 02/22/2019 > Call trace: > dump_backtrace+0x0/0x200 > show_stack+0x20/0x30 > dump_stack_lvl+0x68/0x84 > dump_stack+0x18/0x34 > __report_bad_irq+0x54/0x17c > note_interrupt+0x330/0x428 > handle_irq_event_percpu+0x90/0x98 > handle_irq_event+0x4c/0x148 > handle_fasteoi_irq+0xc4/0x188 > generic_handle_domain_irq+0x44/0x68 > gic_handle_irq+0x84/0x2ec > call_on_irq_stack+0x28/0x34 > do_interrupt_handler+0x88/0x90 > el1_interrupt+0x48/0xb0 > el1h_64_irq_handler+0x18/0x28 > el1h_64_irq+0x7c/0x80 > --- > > The main reason for that is the command complete register is read as 0 > if the GAS register doesn't exist for the same which is the case for > PCC subtypes 0-2. Fix it by checking for non-zero value before masking > with the status flag and checking for command completion. > > Fixes: c45ded7e1135 ("mailbox: pcc: Add support for PCCT extended PCC subspaces(type 3/4)") Can you take this patch and [1] for v5.17 ? This one is a bug fix and good to get it merged ASAP.
diff --git a/drivers/mailbox/pcc.c b/drivers/mailbox/pcc.c index e0a1ab3861f0..ed18936b8ce6 100644 --- a/drivers/mailbox/pcc.c +++ b/drivers/mailbox/pcc.c @@ -241,9 +241,11 @@ static irqreturn_t pcc_mbox_irq(int irq, void *p) if (ret) return IRQ_NONE; - val &= pchan->cmd_complete.status_mask; - if (!val) - return IRQ_NONE; + if (val) { /* Ensure GAS exists and value is non-zero */ + val &= pchan->cmd_complete.status_mask; + if (!val) + return IRQ_NONE; + } ret = pcc_chan_reg_read(&pchan->error, &val); if (ret)