Merge "remoteproc: pas: Add Data Synchronization barrier before reading tcsr reg"

This commit is contained in:
QCTECMDR Service 2024-08-04 10:16:31 -07:00 committed by Gerrit - the friendly Code Review server
commit cd1621edd7

View File

@ -834,6 +834,22 @@ static irqreturn_t soccp_running_ack(int irq, void *data)
* Return: 0 if the WFI status register reflects the requested state.
*/
static int rproc_config_check(struct qcom_adsp *adsp, u32 state)
{
unsigned int retry_num = 50;
u32 val;
do {
usleep_range(SOCCP_SLEEP_US, SOCCP_SLEEP_US + 100);
/* Making sure the mem mapped io is read correctly*/
dsb(sy);
val = readl(adsp->config_addr);
if ((state == SOCCP_D0) && (val == SOCCP_D1))
return 0;
} while (val != state && --retry_num);
return (val == state) ? 0 : -ETIMEDOUT;
}
static int rproc_config_check_atomic(struct qcom_adsp *adsp, u32 state)
{
u32 val;
@ -959,6 +975,7 @@ int rproc_set_state(struct rproc *rproc, bool state)
ret = rproc_config_check(adsp, SOCCP_D0);
if (ret) {
dsb(sy);
dev_err(adsp->dev, "%s requested D3->D0: soccp failed to update tcsr val=%d\n",
current->comm, readl(adsp->config_addr));
goto soccp_out;
@ -990,6 +1007,7 @@ int rproc_set_state(struct rproc *rproc, bool state)
ret = rproc_config_check(adsp, SOCCP_D3);
if (ret) {
dsb(sy);
dev_err(adsp->dev, "%s requested D0->D3 failed: TCSR value:%d\n",
current->comm, readl(adsp->config_addr));
goto soccp_out;
@ -1030,7 +1048,7 @@ static int rproc_panic_handler(struct notifier_block *this,
dev_err(adsp->dev, "failed to update smem bits for D3 to D0\n");
goto done;
}
ret = rproc_config_check(adsp, SOCCP_D0);
ret = rproc_config_check_atomic(adsp, SOCCP_D0);
if (ret)
dev_err(adsp->dev, "failed to change to D0\n");
done:
@ -1044,10 +1062,13 @@ static void qcom_pas_handover(struct qcom_q6v5 *q6v5)
if (adsp->check_status) {
ret = rproc_config_check(adsp, SOCCP_D3);
dsb(sy);
if (ret)
dev_err(adsp->dev, "state not changed in handover\n");
dev_err(adsp->dev, "state not changed in handover TCSR val = %d\n",
readl(adsp->config_addr));
else
dev_info(adsp->dev, "state changed in handover for soccp!\n");
dev_info(adsp->dev, "state changed in handover for soccp! TCSR val = %d\n",
readl(adsp->config_addr));
}
disable_regulators(adsp);
clk_disable_unprepare(adsp->aggre2_clk);