ASoC: SOF: amd: Refactor spinlock_irq(&sdev->ipc_lock) sequence in irq_handler
authorVenkata Prasad Potturu <venkataprasad.potturu@amd.com>
Tue, 19 Dec 2023 11:24:09 +0000 (16:54 +0530)
committerMark Brown <broonie@kernel.org>
Tue, 19 Dec 2023 14:02:45 +0000 (14:02 +0000)
Refactor spinlock_irq(&sdev->ipc_lock) sequence in irq_handler
to avoid race conditions for acquiring hw_semaphore.

Signed-off-by: Venkata Prasad Potturu <venkataprasad.potturu@amd.com>
Link: https://msgid.link/r/20231219112416.3334928-1-venkataprasad.potturu@amd.com
Signed-off-by: Mark Brown <broonie@kernel.org>
sound/soc/sof/amd/acp-ipc.c
sound/soc/sof/amd/acp.c

index fcb54f545fea3da973b83798f9c885b591c8e485..2743f07a5e0811912722d174bd4096950e788a62 100644 (file)
@@ -3,7 +3,7 @@
 // This file is provided under a dual BSD/GPLv2 license. When using or
 // redistributing this file, you may do so under either license.
 //
-// Copyright(c) 2021 Advanced Micro Devices, Inc.
+// Copyright(c) 2021, 2023 Advanced Micro Devices, Inc.
 //
 // Authors: Balakishore Pati <Balakishore.pati@amd.com>
 //         Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
@@ -188,13 +188,11 @@ irqreturn_t acp_sof_ipc_irq_thread(int irq, void *context)
 
        dsp_ack = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_SCRATCH_REG_0 + dsp_ack_write);
        if (dsp_ack) {
-               spin_lock_irq(&sdev->ipc_lock);
                /* handle immediate reply from DSP core */
                acp_dsp_ipc_get_reply(sdev);
                snd_sof_ipc_reply(sdev, 0);
                /* set the done bit */
                acp_dsp_ipc_dsp_done(sdev);
-               spin_unlock_irq(&sdev->ipc_lock);
                ipc_irq = true;
        }
 
index 603ea5fc0d0d4d6e8b9e252c87d1d1a9c3f276cf..7860724c4d2d82b9bc4367d2f820235c34690aab 100644 (file)
@@ -343,11 +343,13 @@ static irqreturn_t acp_irq_thread(int irq, void *context)
        const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
        unsigned int count = ACP_HW_SEM_RETRY_COUNT;
 
+       spin_lock_irq(&sdev->ipc_lock);
        while (snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset)) {
                /* Wait until acquired HW Semaphore lock or timeout */
                count--;
                if (!count) {
                        dev_err(sdev->dev, "%s: Failed to acquire HW lock\n", __func__);
+                       spin_unlock_irq(&sdev->ipc_lock);
                        return IRQ_NONE;
                }
        }
@@ -356,6 +358,7 @@ static irqreturn_t acp_irq_thread(int irq, void *context)
        /* Unlock or Release HW Semaphore */
        snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->hw_semaphore_offset, 0x0);
 
+       spin_unlock_irq(&sdev->ipc_lock);
        return IRQ_HANDLED;
 };