Quoting Srinivasa Rao Mandadapu (2022-09-08 06:23:41) > diff --git a/drivers/remoteproc/qcom_q6v5_adsp.c b/drivers/remoteproc/qcom_q6v5_adsp.c > index ccb5592..e55d593 100644 > --- a/drivers/remoteproc/qcom_q6v5_adsp.c > +++ b/drivers/remoteproc/qcom_q6v5_adsp.c > @@ -9,6 +9,7 @@ > #include <linux/firmware.h> > #include <linux/interrupt.h> > #include <linux/io.h> > +#include <linux/iommu.h> > #include <linux/iopoll.h> > #include <linux/kernel.h> > #include <linux/mfd/syscon.h> > @@ -48,6 +49,8 @@ > #define LPASS_PWR_ON_REG 0x10 > #define LPASS_HALTREQ_REG 0x0 > > +#define SID_MASK_DEFAULT 0xF > + > #define QDSP6SS_XO_CBCR 0x38 > #define QDSP6SS_CORE_CBCR 0x20 > #define QDSP6SS_SLEEP_CBCR 0x3c > @@ -333,6 +336,42 @@ static int adsp_load(struct rproc *rproc, const struct firmware *fw) > return 0; > } > > +static void adsp_unmap_smmu(struct rproc *rproc) > +{ > + struct qcom_adsp *adsp = (struct qcom_adsp *)rproc->priv; Drop the cast, it's unnecessary. > + > + iommu_unmap(rproc->domain, adsp->mem_phys, adsp->mem_size); > +} > + [..] > @@ -343,9 +382,17 @@ static int adsp_start(struct rproc *rproc) > if (ret) > return ret; > > + if (adsp->has_iommu) { > + ret = adsp_map_smmu(adsp, rproc); > + if (ret) { > + dev_err(adsp->dev, "ADSP smmu mapping failed\n"); > + goto disable_irqs; > + } > + } > + > ret = clk_prepare_enable(adsp->xo); > if (ret) > - goto disable_irqs; > + goto adsp_smmu_unmap; > > ret = qcom_rproc_pds_enable(adsp, adsp->proxy_pds, > adsp->proxy_pd_count); > @@ -401,6 +448,9 @@ static int adsp_start(struct rproc *rproc) > qcom_rproc_pds_disable(adsp, adsp->proxy_pds, adsp->proxy_pd_count); > disable_xo_clk: > clk_disable_unprepare(adsp->xo); > +adsp_smmu_unmap: > + if (adsp->has_iommu) > + adsp_unmap_smmu(rproc); Why not pass adsp directly to adsp_unmap_smmu()? And even better would be to make it a no-op when adsp->has_iommu is false, so that the code reads straight-line otherwise. > disable_irqs: > qcom_q6v5_unprepare(&adsp->q6v5); > > @@ -429,6 +479,9 @@ static int adsp_stop(struct rproc *rproc) > if (ret) > dev_err(adsp->dev, "failed to shutdown: %d\n", ret); > > + if (adsp->has_iommu) > + adsp_unmap_smmu(rproc); > + > handover = qcom_q6v5_unprepare(&adsp->q6v5); > if (handover) > qcom_adsp_pil_handover(&adsp->q6v5); > -- > 2.7.4 >