Skip to content

Commit aa6861a

Browse files
ajitkupandeyplbossart
authored andcommitted
ASoC: SOF: amd: Add psp_mbox_ready() and psp_send_cmd() callback
We need to ensure if PSP is mbox ready before and after sending cmd to PSP over SMN interface. Add method to check MBOX_READY bit of PSP with some delay over ACP_PSP_TIMEOUT_COUNTER. Replace psp_fw_validate with new method psp_send_cmd() to send command via psp mailbox. Signed-off-by: Ajit Kumar Pandey <AjitKumar.Pandey@amd.com>
1 parent 0451ac2 commit aa6861a

1 file changed

Lines changed: 41 additions & 6 deletions

File tree

sound/soc/sof/amd/acp.c

Lines changed: 41 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -138,23 +138,58 @@ int configure_and_run_dma(struct acp_dev_data *adata, unsigned int src_addr,
138138
return ret;
139139
}
140140

141-
static int psp_fw_validate(struct acp_dev_data *adata)
141+
/*
142+
* psp_mbox_ready- function to poll ready bit of psp mbox
143+
* @adata: acp device data
144+
* @ack: bool variable to check ready bit status or psp ack
145+
*/
146+
147+
static int psp_mbox_ready(struct acp_dev_data *adata, bool ack)
142148
{
143149
struct snd_sof_dev *sdev = adata->dev;
144150
int timeout;
145151
u32 data;
146152

147-
smn_write(adata->smn_dev, MP0_C2PMSG_26_REG, MBOX_ACP_SHA_DMA_COMMAND);
148-
149153
for (timeout = ACP_PSP_TIMEOUT_COUNTER; timeout > 0; timeout--) {
150154
msleep(20);
151155
smn_read(adata->smn_dev, MP0_C2PMSG_26_REG, &data);
152156
if (data & MBOX_READY_MASK)
153157
return 0;
154158
}
155159

156-
dev_err(sdev->dev, "FW validation timedout: status %x\n", data & MBOX_STATUS_MASK);
157-
return -ETIMEDOUT;
160+
dev_err(sdev->dev, "PSP error status %x\n", data & MBOX_STATUS_MASK);
161+
162+
if (ack)
163+
return -ETIMEDOUT;
164+
165+
return -EBUSY;
166+
}
167+
168+
/*
169+
* psp_send_cmd - function to send psp command over mbox
170+
* @adata: acp device data
171+
* @cmd: non zero integer value for command type
172+
*/
173+
174+
static int psp_send_cmd(struct acp_dev_data *adata, int cmd)
175+
{
176+
struct snd_sof_dev *sdev = adata->dev;
177+
int ret;
178+
179+
if (!cmd)
180+
return -EINVAL;
181+
182+
/* Check if PSP is ready for new command */
183+
ret = psp_mbox_ready(adata, 0);
184+
if (ret)
185+
return ret;
186+
187+
smn_write(adata->smn_dev, MP0_C2PMSG_26_REG, cmd);
188+
189+
/* Check MBOX ready as PSP ack */
190+
ret = psp_mbox_ready(adata, 1);
191+
192+
return ret;
158193
}
159194

160195
int configure_and_run_sha_dma(struct acp_dev_data *adata, void *image_addr,
@@ -196,7 +231,7 @@ int configure_and_run_sha_dma(struct acp_dev_data *adata, void *image_addr,
196231
return ret;
197232
}
198233

199-
ret = psp_fw_validate(adata);
234+
ret = psp_send_cmd(adata, MBOX_ACP_SHA_DMA_COMMAND);
200235
if (ret)
201236
return ret;
202237

0 commit comments

Comments
 (0)