mirror of
https://github.com/torvalds/linux.git
synced 2026-09-23 22:14:03 +02:00
remoteproc: qcom_q6v5_adsp: Fix iommu_unmap() usage
During adsp_map_carveout, the IOVA is computed by combining the
physical address and the SID:
iova = adsp->mem_phys | (sid << 32);
However, adsp_unmap_carveout() uses the physical address and not
the IOVA in iommu_unmap(), causing the unmap to fail or leak
mappings because the address doesn't match the original IOVA.
Cache the constructed IOVA within the qcom_adsp device struct
during mapping and use it during unmapping.
Fixes: f22eedff28 ("remoteproc: qcom: Add support for memory sandbox")
Signed-off-by: Mostafa Saleh <smostafa@google.com>
Link: https://lore.kernel.org/r/20260827203055.640116-1-smostafa@google.com
Signed-off-by: Bjorn Andersson <andersson@kernel.org>
This commit is contained in:
parent
b853857293
commit
0d8e2195bc
|
|
@ -104,6 +104,7 @@ struct qcom_adsp {
|
|||
struct completion stop_done;
|
||||
|
||||
phys_addr_t mem_phys;
|
||||
unsigned long iova;
|
||||
phys_addr_t mem_reloc;
|
||||
void __iomem *mem_region;
|
||||
size_t mem_size;
|
||||
|
|
@ -333,7 +334,7 @@ static void adsp_unmap_carveout(struct rproc *rproc)
|
|||
struct qcom_adsp *adsp = rproc->priv;
|
||||
|
||||
if (adsp->has_iommu)
|
||||
iommu_unmap(rproc->domain, adsp->mem_phys, adsp->mem_size);
|
||||
iommu_unmap(rproc->domain, adsp->iova, adsp->mem_size);
|
||||
}
|
||||
|
||||
static int adsp_map_carveout(struct rproc *rproc)
|
||||
|
|
@ -341,7 +342,6 @@ static int adsp_map_carveout(struct rproc *rproc)
|
|||
struct qcom_adsp *adsp = rproc->priv;
|
||||
struct of_phandle_args args;
|
||||
long long sid;
|
||||
unsigned long iova;
|
||||
int ret;
|
||||
|
||||
if (!adsp->has_iommu)
|
||||
|
|
@ -358,9 +358,9 @@ static int adsp_map_carveout(struct rproc *rproc)
|
|||
of_node_put(args.np);
|
||||
|
||||
/* Add SID configuration for ADSP Firmware to SMMU */
|
||||
iova = adsp->mem_phys | (sid << 32);
|
||||
adsp->iova = adsp->mem_phys | (sid << 32);
|
||||
|
||||
ret = iommu_map(rproc->domain, iova, adsp->mem_phys,
|
||||
ret = iommu_map(rproc->domain, adsp->iova, adsp->mem_phys,
|
||||
adsp->mem_size, IOMMU_READ | IOMMU_WRITE,
|
||||
GFP_KERNEL);
|
||||
if (ret) {
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user