Skip to content

Commit

Permalink
[UPSTREAM] remoteproc: qcom: enable in-kernel PD mapper
Browse files Browse the repository at this point in the history
Request in-kernel protection domain mapper to be started before starting
Qualcomm DSP and release it once DSP is stopped. Once all DSPs are
stopped, the PD mapper will be stopped too.

Signed-off-by: Dmitry Baryshkov <[email protected]>
  • Loading branch information
lumag authored and minlexx committed May 14, 2024
1 parent edc800e commit 7b7a3c9
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 4 deletions.
4 changes: 4 additions & 0 deletions drivers/remoteproc/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -181,6 +181,7 @@ config QCOM_Q6V5_ADSP
depends on QCOM_SYSMON || QCOM_SYSMON=n
depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n
depends on QCOM_PD_MAPPER || QCOM_PD_MAPPER=n
select MFD_SYSCON
select QCOM_PIL_INFO
select QCOM_MDT_LOADER
Expand All @@ -201,6 +202,7 @@ config QCOM_Q6V5_MSS
depends on QCOM_SYSMON || QCOM_SYSMON=n
depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n
depends on QCOM_PD_MAPPER || QCOM_PD_MAPPER=n
select MFD_SYSCON
select QCOM_MDT_LOADER
select QCOM_PIL_INFO
Expand All @@ -221,6 +223,7 @@ config QCOM_Q6V5_PAS
depends on QCOM_SYSMON || QCOM_SYSMON=n
depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n
depends on QCOM_PD_MAPPER || QCOM_PD_MAPPER=n
select MFD_SYSCON
select QCOM_PIL_INFO
select QCOM_MDT_LOADER
Expand All @@ -243,6 +246,7 @@ config QCOM_Q6V5_WCSS
depends on QCOM_SYSMON || QCOM_SYSMON=n
depends on RPMSG_QCOM_GLINK || RPMSG_QCOM_GLINK=n
depends on QCOM_AOSS_QMP || QCOM_AOSS_QMP=n
depends on QCOM_PD_MAPPER || QCOM_PD_MAPPER=n
select MFD_SYSCON
select QCOM_MDT_LOADER
select QCOM_PIL_INFO
Expand Down
11 changes: 10 additions & 1 deletion drivers/remoteproc/qcom_q6v5_adsp.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/remoteproc.h>
#include <linux/reset.h>
#include <linux/soc/qcom/mdt_loader.h>
#include <linux/soc/qcom/pd_mapper.h>
#include <linux/soc/qcom/smem.h>
#include <linux/soc/qcom/smem_state.h>

Expand Down Expand Up @@ -383,10 +384,14 @@ static int adsp_start(struct rproc *rproc)
int ret;
unsigned int val;

ret = qcom_q6v5_prepare(&adsp->q6v5);
ret = qcom_pdm_get();
if (ret)
return ret;

ret = qcom_q6v5_prepare(&adsp->q6v5);
if (ret)
goto put_pdm;

ret = adsp_map_carveout(rproc);
if (ret) {
dev_err(adsp->dev, "ADSP smmu mapping failed\n");
Expand Down Expand Up @@ -455,6 +460,8 @@ static int adsp_start(struct rproc *rproc)
adsp_unmap_carveout(rproc);
disable_irqs:
qcom_q6v5_unprepare(&adsp->q6v5);
put_pdm:
qcom_pdm_release();

return ret;
}
Expand Down Expand Up @@ -487,6 +494,8 @@ static int adsp_stop(struct rproc *rproc)
if (handover)
qcom_adsp_pil_handover(&adsp->q6v5);

qcom_pdm_release();

return ret;
}

Expand Down
10 changes: 9 additions & 1 deletion drivers/remoteproc/qcom_q6v5_mss.c
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
#include <linux/remoteproc.h>
#include <linux/reset.h>
#include <linux/soc/qcom/mdt_loader.h>
#include <linux/soc/qcom/pd_mapper.h>
#include <linux/iopoll.h>
#include <linux/slab.h>

Expand Down Expand Up @@ -1581,10 +1582,14 @@ static int q6v5_start(struct rproc *rproc)
int xfermemop_ret;
int ret;

ret = q6v5_mba_load(qproc);
ret = qcom_pdm_get();
if (ret)
return ret;

ret = q6v5_mba_load(qproc);
if (ret)
goto put_pdm;

dev_info(qproc->dev, "MBA booted with%s debug policy, loading mpss\n",
qproc->dp_size ? "" : "out");

Expand Down Expand Up @@ -1613,6 +1618,8 @@ static int q6v5_start(struct rproc *rproc)
reclaim_mpss:
q6v5_mba_reclaim(qproc);
q6v5_dump_mba_logs(qproc);
put_pdm:
qcom_pdm_release();

return ret;
}
Expand All @@ -1627,6 +1634,7 @@ static int q6v5_stop(struct rproc *rproc)
dev_err(qproc->dev, "timed out on wait\n");

q6v5_mba_reclaim(qproc);
qcom_pdm_release();

return 0;
}
Expand Down
12 changes: 11 additions & 1 deletion drivers/remoteproc/qcom_q6v5_pas.c
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
#include <linux/regulator/consumer.h>
#include <linux/remoteproc.h>
#include <linux/soc/qcom/mdt_loader.h>
#include <linux/soc/qcom/pd_mapper.h>
#include <linux/soc/qcom/smem.h>
#include <linux/soc/qcom/smem_state.h>

Expand Down Expand Up @@ -248,10 +249,14 @@ static int adsp_start(struct rproc *rproc)
struct qcom_adsp *adsp = rproc->priv;
int ret;

ret = qcom_q6v5_prepare(&adsp->q6v5);
ret = qcom_pdm_get();
if (ret)
return ret;

ret = qcom_q6v5_prepare(&adsp->q6v5);
if (ret)
goto put_pdm;

ret = adsp_pds_enable(adsp, adsp->proxy_pds, adsp->proxy_pd_count);
if (ret < 0)
goto disable_irqs;
Expand Down Expand Up @@ -343,6 +348,9 @@ static int adsp_start(struct rproc *rproc)
/* Remove pointer to the loaded firmware, only valid in adsp_load() & adsp_start() */
adsp->firmware = NULL;

put_pdm:
qcom_pdm_release();

return ret;
}

Expand Down Expand Up @@ -386,6 +394,8 @@ static int adsp_stop(struct rproc *rproc)
if (handover)
qcom_pas_handover(&adsp->q6v5);

qcom_pdm_release();

return ret;
}

Expand Down
12 changes: 11 additions & 1 deletion drivers/remoteproc/qcom_q6v5_wcss.c
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
#include <linux/regulator/consumer.h>
#include <linux/reset.h>
#include <linux/soc/qcom/mdt_loader.h>
#include <linux/soc/qcom/pd_mapper.h>
#include "qcom_common.h"
#include "qcom_pil_info.h"
#include "qcom_q6v5.h"
Expand Down Expand Up @@ -240,13 +241,17 @@ static int q6v5_wcss_start(struct rproc *rproc)
struct q6v5_wcss *wcss = rproc->priv;
int ret;

ret = qcom_pdm_get();
if (ret)
return ret;

qcom_q6v5_prepare(&wcss->q6v5);

/* Release Q6 and WCSS reset */
ret = reset_control_deassert(wcss->wcss_reset);
if (ret) {
dev_err(wcss->dev, "wcss_reset failed\n");
return ret;
goto put_pdm;
}

ret = reset_control_deassert(wcss->wcss_q6_reset);
Expand Down Expand Up @@ -288,6 +293,9 @@ static int q6v5_wcss_start(struct rproc *rproc)
wcss_reset:
reset_control_assert(wcss->wcss_reset);

put_pdm:
qcom_pdm_release();

return ret;
}

Expand Down Expand Up @@ -735,6 +743,8 @@ static int q6v5_wcss_stop(struct rproc *rproc)

qcom_q6v5_unprepare(&wcss->q6v5);

qcom_pdm_release();

return 0;
}

Expand Down

0 comments on commit 7b7a3c9

Please sign in to comment.