Skip to content

Commit

Permalink
remoteproc: fix rproc_alloc_carveout() for rproc with iommu domain
Browse files Browse the repository at this point in the history
Correct remoteproc core behavior when memory carveout device
address is fixed in resource table and rproc device doesn't have
associated IOMMU.
Current returned error is breaking legacy on TI platforms.
This patch restores previous behavior. It adds a warn message when
allocation doesn't fit carveout request, but doesn't stop rproc_start()
sequence anymore.

Fixes: 3bc8140 ("remoteproc: configure IOMMU only if device address requested")

Signed-off-by: Loic Pallardy <loic.pallardy@st.com>
Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
  • Loading branch information
ydrallap authored and andersson committed Feb 21, 2019
1 parent b36de8c commit 60f849a
Showing 1 changed file with 16 additions and 10 deletions.
26 changes: 16 additions & 10 deletions drivers/remoteproc/remoteproc_core.c
Original file line number Diff line number Diff line change
Expand Up @@ -765,6 +765,18 @@ static int rproc_alloc_carveout(struct rproc *rproc,
dev_dbg(dev, "carveout va %pK, dma %pad, len 0x%x\n",
va, &dma, mem->len);

if (mem->da != FW_RSC_ADDR_ANY && !rproc->domain) {
/*
* Check requested da is equal to dma address
* and print a warn message in case of missalignment.
* Don't stop rproc_start sequence as coprocessor may
* build pa to da translation on its side.
*/
if (mem->da != (u32)dma)
dev_warn(dev->parent,
"Allocated carveout doesn't fit device address request\n");
}

/*
* Ok, this is non-standard.
*
Expand All @@ -782,15 +794,7 @@ static int rproc_alloc_carveout(struct rproc *rproc,
* to use the iommu-based DMA API: we expect 'dma' to contain the
* physical address in this case.
*/

if (mem->da != FW_RSC_ADDR_ANY) {
if (!rproc->domain) {
dev_err(dev->parent,
"Bad carveout rsc configuration\n");
ret = -ENOMEM;
goto dma_free;
}

if (mem->da != FW_RSC_ADDR_ANY && rproc->domain) {
mapping = kzalloc(sizeof(*mapping), GFP_KERNEL);
if (!mapping) {
ret = -ENOMEM;
Expand All @@ -817,7 +821,9 @@ static int rproc_alloc_carveout(struct rproc *rproc,

dev_dbg(dev, "carveout mapped 0x%x to %pad\n",
mem->da, &dma);
} else {
}

if (mem->da == FW_RSC_ADDR_ANY) {
/* Update device address as undefined by requester */
if ((u64)dma & HIGH_BITS_MASK)
dev_warn(dev, "DMA address cast in 32bit to fit resource table format\n");
Expand Down

0 comments on commit 60f849a

Please sign in to comment.