Skip to content

Commit 897e91e

Browse files
vijendarmukundabroonie
authored andcommitted
ASoC: SOF: amd: Fix for incorrect acp error register offsets
Addition of 'dsp_intr_base' to ACP error register offsets points to wrong register offsets in irq handler. Correct the acp error register offsets. ACP error status register offset and acp error reason register offset got changed from ACP6.0 onwards. Add 'acp_error_stat' and 'acp_sw0_i2s_err_reason' as descriptor fields in sof_amd_acp_desc structure and update the values based on the ACP variant. >From Rembrandt platform onwards, errors related to SW1 Soundwire manager instance/I2S controller connected on P1 power tile is reported with ACP_SW1_I2S_ERROR_REASON register. Add conditional check for the same. Fixes: 96eb818 ("ASoC: SOF: amd: add interrupt handling for SoundWire manager devices") Signed-off-by: Vijendar Mukunda <[email protected]> Link: https://patch.msgid.link/[email protected] Signed-off-by: Mark Brown <[email protected]>
1 parent c56ba3e commit 897e91e

File tree

6 files changed

+19
-6
lines changed

6 files changed

+19
-6
lines changed

sound/soc/sof/amd/acp-dsp-offset.h

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,13 +76,15 @@
7676
#define DSP_SW_INTR_CNTL_OFFSET 0x0
7777
#define DSP_SW_INTR_STAT_OFFSET 0x4
7878
#define DSP_SW_INTR_TRIG_OFFSET 0x8
79-
#define ACP_ERROR_STATUS 0x18C4
79+
#define ACP3X_ERROR_STATUS 0x18C4
80+
#define ACP6X_ERROR_STATUS 0x1A4C
8081
#define ACP3X_AXI2DAGB_SEM_0 0x1880
8182
#define ACP5X_AXI2DAGB_SEM_0 0x1884
8283
#define ACP6X_AXI2DAGB_SEM_0 0x1874
8384

8485
/* ACP common registers to report errors related to I2S & SoundWire interfaces */
85-
#define ACP_SW0_I2S_ERROR_REASON 0x18B4
86+
#define ACP3X_SW_I2S_ERROR_REASON 0x18C8
87+
#define ACP6X_SW0_I2S_ERROR_REASON 0x18B4
8688
#define ACP_SW1_I2S_ERROR_REASON 0x1A50
8789

8890
/* Registers from ACP_SHA block */

sound/soc/sof/amd/acp.c

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ static int config_dma_channel(struct acp_dev_data *adata, unsigned int ch,
9292
unsigned int idx, unsigned int dscr_count)
9393
{
9494
struct snd_sof_dev *sdev = adata->dev;
95+
const struct sof_amd_acp_desc *desc = get_chip_info(sdev->pdata);
9596
unsigned int val, status;
9697
int ret;
9798

@@ -102,7 +103,7 @@ static int config_dma_channel(struct acp_dev_data *adata, unsigned int ch,
102103
val & (1 << ch), ACP_REG_POLL_INTERVAL,
103104
ACP_REG_POLL_TIMEOUT_US);
104105
if (ret < 0) {
105-
status = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_ERROR_STATUS);
106+
status = snd_sof_dsp_read(sdev, ACP_DSP_BAR, desc->acp_error_stat);
106107
val = snd_sof_dsp_read(sdev, ACP_DSP_BAR, ACP_DMA_ERR_STS_0 + ch * sizeof(u32));
107108

108109
dev_err(sdev->dev, "ACP_DMA_ERR_STS :0x%x ACP_ERROR_STATUS :0x%x\n", val, status);
@@ -402,9 +403,11 @@ static irqreturn_t acp_irq_handler(int irq, void *dev_id)
402403

403404
if (val & ACP_ERROR_IRQ_MASK) {
404405
snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->ext_intr_stat, ACP_ERROR_IRQ_MASK);
405-
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + ACP_SW0_I2S_ERROR_REASON, 0);
406-
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + ACP_SW1_I2S_ERROR_REASON, 0);
407-
snd_sof_dsp_write(sdev, ACP_DSP_BAR, base + ACP_ERROR_STATUS, 0);
406+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->acp_sw0_i2s_err_reason, 0);
407+
/* ACP_SW1_I2S_ERROR_REASON is newly added register from rmb platform onwards */
408+
if (desc->rev >= 6)
409+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, ACP_SW1_I2S_ERROR_REASON, 0);
410+
snd_sof_dsp_write(sdev, ACP_DSP_BAR, desc->acp_error_stat, 0);
408411
irq_flag = 1;
409412
}
410413

sound/soc/sof/amd/acp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,8 @@ struct sof_amd_acp_desc {
203203
u32 probe_reg_offset;
204204
u32 reg_start_addr;
205205
u32 reg_end_addr;
206+
u32 acp_error_stat;
207+
u32 acp_sw0_i2s_err_reason;
206208
u32 sdw_max_link_count;
207209
u64 sdw_acpi_dev_addr;
208210
};

sound/soc/sof/amd/pci-acp63.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@ static const struct sof_amd_acp_desc acp63_chip_info = {
3535
.ext_intr_cntl = ACP6X_EXTERNAL_INTR_CNTL,
3636
.ext_intr_stat = ACP6X_EXT_INTR_STAT,
3737
.ext_intr_stat1 = ACP6X_EXT_INTR_STAT1,
38+
.acp_error_stat = ACP6X_ERROR_STATUS,
39+
.acp_sw0_i2s_err_reason = ACP6X_SW0_I2S_ERROR_REASON,
3840
.dsp_intr_base = ACP6X_DSP_SW_INTR_BASE,
3941
.sram_pte_offset = ACP6X_SRAM_PTE_OFFSET,
4042
.hw_semaphore_offset = ACP6X_AXI2DAGB_SEM_0,

sound/soc/sof/amd/pci-rmb.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static const struct sof_amd_acp_desc rembrandt_chip_info = {
3333
.pgfsm_base = ACP6X_PGFSM_BASE,
3434
.ext_intr_stat = ACP6X_EXT_INTR_STAT,
3535
.dsp_intr_base = ACP6X_DSP_SW_INTR_BASE,
36+
.acp_error_stat = ACP6X_ERROR_STATUS,
37+
.acp_sw0_i2s_err_reason = ACP6X_SW0_I2S_ERROR_REASON,
3638
.sram_pte_offset = ACP6X_SRAM_PTE_OFFSET,
3739
.hw_semaphore_offset = ACP6X_AXI2DAGB_SEM_0,
3840
.fusion_dsp_offset = ACP6X_DSP_FUSION_RUNSTALL,

sound/soc/sof/amd/pci-rn.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,8 @@ static const struct sof_amd_acp_desc renoir_chip_info = {
3333
.pgfsm_base = ACP3X_PGFSM_BASE,
3434
.ext_intr_stat = ACP3X_EXT_INTR_STAT,
3535
.dsp_intr_base = ACP3X_DSP_SW_INTR_BASE,
36+
.acp_error_stat = ACP3X_ERROR_STATUS,
37+
.acp_sw0_i2s_err_reason = ACP3X_SW_I2S_ERROR_REASON,
3638
.sram_pte_offset = ACP3X_SRAM_PTE_OFFSET,
3739
.hw_semaphore_offset = ACP3X_AXI2DAGB_SEM_0,
3840
.acp_clkmux_sel = ACP3X_CLKMUX_SEL,

0 commit comments

Comments
 (0)