Re: [PATCH 3/3] iommu: armsmmu: set iommu ops for rpmsg bus

From: Robin Murphy
Date: Fri Mar 02 2018 - 11:59:21 EST


On 02/03/18 14:55, srinivas.kandagatla@xxxxxxxxxx wrote:
From: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>

On Qualcomm SoCs, ADSP exposes many functions like audio and
others. These services need iommu access to allocate any
memory for the DSP. As these drivers are childeren of
rpmsg bus, able to allocate memory from iommus is basic
requirement. So set arm smmu iommu ops for this bus type.

Documentation/rpmsg.txt: "Every rpmsg device is a communication channel with a remote processor (thus rpmsg devices are called channels)."

I'd instinctively assume that a remote processor already has its own memory, and that a communication channel doesn't somehow go directly through an IOMMU, so that "basic requirement" seems like a pretty big assumption.

Signed-off-by: Srinivas Kandagatla <srinivas.kandagatla@xxxxxxxxxx>
---
drivers/iommu/arm-smmu.c | 5 +++++
1 file changed, 5 insertions(+)

diff --git a/drivers/iommu/arm-smmu.c b/drivers/iommu/arm-smmu.c
index e6920d32ac9e..9b63489af15c 100644
--- a/drivers/iommu/arm-smmu.c
+++ b/drivers/iommu/arm-smmu.c
@@ -53,6 +53,7 @@
#include <linux/spinlock.h>
#include <linux/amba/bus.h>
+#include <linux/rpmsg.h>
#include "io-pgtable.h"
#include "arm-smmu-regs.h"
@@ -2168,6 +2169,10 @@ static void arm_smmu_bus_init(void)
bus_set_iommu(&pci_bus_type, &arm_smmu_ops);
}
#endif
+#ifdef CONFIG_RPMSG

Ah, so this will at least build OK with RPMSG=m, but I doubt it does what you want it to in that case.

Robin.

+ if (!iommu_present(&rpmsg_bus))
+ bus_set_iommu(&rpmsg_bus, &arm_smmu_ops);
+#endif
}
static int arm_smmu_device_probe(struct platform_device *pdev)