mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 11:41:38 -04:00
remoteproc: add IOMMU hardware capability flag
The remoteproc framework currently relies on iommu_present() on the bus the device is on, to perform MMU management. However, this logic doesn't scale for multi-arch, especially for processors that do not have an IOMMU. Replace this logic instead by using a h/w capability flag for the presence of IOMMU in the rproc structure. This issue is seen on OMAP platforms when trying to add a remoteproc driver for a small Cortex M3 called the WkupM3 used for suspend / resume management on TI AM335/AM437x SoCs. This processor does not have an MMU. Same is the case with another processor subsystem PRU-ICSS on AM335/AM437x. All these are platform devices, and the current iommu_present check will not scale for the same kernel image to support OMAP4/OMAP5 and AM335/AM437x. The existing platform implementation drivers - OMAP remoteproc, STE Modem remoteproc and DA8xx remoteproc, are updated as well to properly configure the newly added rproc field. Cc: Robert Tivy <[email protected]> Cc: Linus Walleij <[email protected]> Signed-off-by: Suman Anna <[email protected]> [small change in the commit title and in a single comment] Signed-off-by: Ohad Ben-Cohen <[email protected]>
This commit is contained in:
parent
c517d838eb
commit
315491e5d6
5 changed files with 8 additions and 13 deletions
|
|
@ -224,6 +224,7 @@ static int da8xx_rproc_probe(struct platform_device *pdev)
|
|||
|
||||
drproc = rproc->priv;
|
||||
drproc->rproc = rproc;
|
||||
rproc->has_iommu = false;
|
||||
|
||||
platform_set_drvdata(pdev, rproc);
|
||||
|
||||
|
|
|
|||
|
|
@ -202,6 +202,8 @@ static int omap_rproc_probe(struct platform_device *pdev)
|
|||
|
||||
oproc = rproc->priv;
|
||||
oproc->rproc = rproc;
|
||||
/* All existing OMAP IPU and DSP processors have an MMU */
|
||||
rproc->has_iommu = true;
|
||||
|
||||
platform_set_drvdata(pdev, rproc);
|
||||
|
||||
|
|
|
|||
|
|
@ -94,19 +94,8 @@ static int rproc_enable_iommu(struct rproc *rproc)
|
|||
struct device *dev = rproc->dev.parent;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* We currently use iommu_present() to decide if an IOMMU
|
||||
* setup is needed.
|
||||
*
|
||||
* This works for simple cases, but will easily fail with
|
||||
* platforms that do have an IOMMU, but not for this specific
|
||||
* rproc.
|
||||
*
|
||||
* This will be easily solved by introducing hw capabilities
|
||||
* that will be set by the remoteproc driver.
|
||||
*/
|
||||
if (!iommu_present(dev->bus)) {
|
||||
dev_dbg(dev, "iommu not found\n");
|
||||
if (!rproc->has_iommu) {
|
||||
dev_dbg(dev, "iommu not present\n");
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -289,6 +289,7 @@ static int sproc_probe(struct platform_device *pdev)
|
|||
sproc = rproc->priv;
|
||||
sproc->mdev = mdev;
|
||||
sproc->rproc = rproc;
|
||||
rproc->has_iommu = false;
|
||||
mdev->drv_data = sproc;
|
||||
|
||||
/* Provide callback functions to modem device */
|
||||
|
|
|
|||
Loading…
Reference in a new issue