aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinux Build Service Account <lnxbuild@localhost>2018-12-14 04:18:50 -0800
committerGerrit - the friendly Code Review server <code-review@localhost>2018-12-14 04:18:50 -0800
commitdb6729c0cb66223e972528bc75872a2f8281d66c (patch)
tree57c7f552a7018fea96c4f5988e62b704d53dc279
parent2b4e95af72ffe2b568c5d32131746e9449bc06ad (diff)
parent5d700a7a84b709317ffefc8060b186916e1a06c0 (diff)
Merge "msm: adsprpc: use same CPU address during DMA allocation and free" into kernel.lnx.4.9.r24-relLA.UM.6.8.1.r2-00600-QCS605.0
-rw-r--r--drivers/char/adsprpc.c33
1 files changed, 21 insertions, 12 deletions
diff --git a/drivers/char/adsprpc.c b/drivers/char/adsprpc.c
index 67677eaaf578..b5af2e22da07 100644
--- a/drivers/char/adsprpc.c
+++ b/drivers/char/adsprpc.c
@@ -645,21 +645,20 @@ static int fastrpc_mmap_find(struct fastrpc_file *fl, int fd,
return -ENOTTY;
}
-static int dma_alloc_memory(dma_addr_t *region_phys, size_t size,
+static int dma_alloc_memory(dma_addr_t *region_phys, void **vaddr, size_t size,
unsigned long dma_attrs)
{
struct fastrpc_apps *me = &gfa;
- void *vaddr = NULL;
if (me->dev == NULL) {
pr_err("device adsprpc-mem is not initialized\n");
return -ENODEV;
}
- vaddr = dma_alloc_attrs(me->dev, size, region_phys, GFP_KERNEL,
+ *vaddr = dma_alloc_attrs(me->dev, size, region_phys, GFP_KERNEL,
dma_attrs);
- if (!vaddr) {
- pr_err("ADSPRPC: Failed to allocate %x remote heap memory\n",
- (unsigned int)size);
+ if (IS_ERR_OR_NULL(*vaddr)) {
+ pr_err("adsprpc: %s: %s: dma_alloc_attrs failed for size 0x%zx, returned %pK\n",
+ current->comm, __func__, size, (*vaddr));
return -ENOMEM;
}
return 0;
@@ -798,6 +797,7 @@ static int fastrpc_mmap_create(struct fastrpc_file *fl, int fd,
struct fastrpc_mmap *map = NULL;
unsigned long attrs;
dma_addr_t region_phys = 0;
+ void *region_vaddr = NULL;
unsigned long flags;
int err = 0, vmid;
@@ -820,12 +820,13 @@ static int fastrpc_mmap_create(struct fastrpc_file *fl, int fd,
map->apps = me;
map->fl = NULL;
- VERIFY(err, !dma_alloc_memory(&region_phys, len, dma_attrs));
+ VERIFY(err, !dma_alloc_memory(&region_phys, &region_vaddr,
+ len, dma_attrs));
if (err)
goto bail;
map->phys = (uintptr_t)region_phys;
map->size = len;
- map->va = (uintptr_t)map->phys;
+ map->va = (uintptr_t)region_vaddr;
} else if (mflags == FASTRPC_DMAHANDLE_NOMAP) {
ion_phys_addr_t iphys;
@@ -2707,14 +2708,15 @@ static int fastrpc_internal_mmap(struct fastrpc_file *fl,
1, &rbuf);
if (err)
goto bail;
- rbuf->virt = NULL;
- err = fastrpc_mmap_on_dsp(fl, ud->flags,
- (uintptr_t)rbuf->virt,
+ err = fastrpc_mmap_on_dsp(fl, ud->flags, 0,
rbuf->phys, rbuf->size, &raddr);
if (err)
goto bail;
rbuf->raddr = raddr;
} else {
+
+ uintptr_t va_to_dsp;
+
mutex_lock(&fl->fl_map_mutex);
if (!fastrpc_mmap_find(fl, ud->fd, (uintptr_t)ud->vaddrin,
ud->size, ud->flags, 1, &map)) {
@@ -2722,13 +2724,20 @@ static int fastrpc_internal_mmap(struct fastrpc_file *fl,
mutex_unlock(&fl->map_mutex);
return 0;
}
+
VERIFY(err, !fastrpc_mmap_create(fl, ud->fd, 0,
(uintptr_t)ud->vaddrin, ud->size,
ud->flags, &map));
mutex_unlock(&fl->fl_map_mutex);
if (err)
goto bail;
- VERIFY(err, 0 == fastrpc_mmap_on_dsp(fl, ud->flags, map->va,
+
+ if (ud->flags == ADSP_MMAP_HEAP_ADDR ||
+ ud->flags == ADSP_MMAP_REMOTE_HEAP_ADDR)
+ va_to_dsp = 0;
+ else
+ va_to_dsp = (uintptr_t)map->va;
+ VERIFY(err, 0 == fastrpc_mmap_on_dsp(fl, ud->flags, va_to_dsp,
map->phys, map->size, &raddr));
if (err)
goto bail;