Skip to content

Commit 39cdf02

Browse files
reddysujithgregkh
authored andcommitted
ASoC: SOF: amd: Fix for handling spurious interrupts from DSP
[ Upstream commit 2e7c665 ] As interrupts are Level-triggered,unless and until we deassert the register the interrupts are generated which causes spurious interrupts unhandled. Now we deasserted the interrupt at top half which solved the below "nobody cared" warning. warning reported in dmesg: irq 80: nobody cared (try booting with the "irqpoll" option) CPU: 5 PID: 2735 Comm: irq/80-AudioDSP Not tainted 5.15.86-15817-g4c19f3e06d49 #1 1bd3fd932cf58caacc95b0504d6ea1e3eab22289 Hardware name: Google Skyrim/Skyrim, BIOS Google_Skyrim.15303.0.0 01/03/2023 Call Trace: <IRQ> dump_stack_lvl+0x69/0x97 __report_bad_irq+0x3a/0xae note_interrupt+0x1a9/0x1e3 handle_irq_event_percpu+0x4b/0x6e handle_irq_event+0x36/0x5b handle_fasteoi_irq+0xae/0x171 __common_interrupt+0x48/0xc4 </IRQ> handlers: acp_irq_handler [snd_sof_amd_acp] threaded [<000000007e089f34>] acp_irq_thread [snd_sof_amd_acp] Disabling IRQ #80 Signed-off-by: V sujith kumar Reddy <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mark Brown <[email protected]> Signed-off-by: Sasha Levin <[email protected]>
1 parent 8988889 commit 39cdf02

File tree

1 file changed

+15
-21
lines changed

1 file changed

+15
-21
lines changed

sound/soc/sof/amd/acp.c

Lines changed: 15 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,6 @@ static irqreturn_t acp_irq_thread(int irq, void *context)
316316
{
317317
struct snd_sof_dev *sdev = context;
318318
const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
319-
unsigned int base = desc->dsp_intr_base;
320319
unsigned int val, count = ACP_HW_SEM_RETRY_COUNT;
321320

322321
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->ext_intr_stat);
@@ -326,28 +325,20 @@ static irqreturn_t acp_irq_thread(int irq, void *context)
326325
return IRQ_HANDLED;
327326
}
328327

329-
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET);
330-
if (val & ACP_DSP_TO_HOST_IRQ) {
331-
while (snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset)) {
332-
/* Wait until acquired HW Semaphore lock or timeout */
333-
count--;
334-
if (!count) {
335-
dev_err(sdev->dev, "%s: Failed to acquire HW lock\n", __func__);
336-
return IRQ_NONE;
337-
}
328+
while (snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset)) {
329+
/* Wait until acquired HW Semaphore lock or timeout */
330+
count--;
331+
if (!count) {
332+
dev_err(sdev->dev, "%s: Failed to acquire HW lock\n", __func__);
333+
return IRQ_NONE;
338334
}
339-
340-
sof_ops(sdev)->irq_thread(irq, sdev);
341-
val |= ACP_DSP_TO_HOST_IRQ;
342-
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET, val);
343-
344-
/* Unlock or Release HW Semaphore */
345-
snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset, 0x0);
346-
347-
return IRQ_HANDLED;
348335
}
349336

350-
return IRQ_NONE;
337+
sof_ops(sdev)->irq_thread(irq, sdev);
338+
/* Unlock or Release HW Semaphore */
339+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset, 0x0);
340+
341+
return IRQ_HANDLED;
351342
};
352343

353344
static irqreturn_t acp_irq_handler(int irq, void *dev_id)
@@ -358,8 +349,11 @@ static irqreturn_t acp_irq_handler(int irq, void *dev_id)
358349
unsigned int val;
359350

360351
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET);
361-
if (val)
352+
if (val) {
353+
val |= ACP_DSP_TO_HOST_IRQ;
354+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + DSP_SW_INTR_STAT_OFFSET, val);
362355
return IRQ_WAKE_THREAD;
356+
}
363357

364358
return IRQ_NONE;
365359
}

0 commit comments

Comments
 (0)