diff options
Diffstat (limited to 'drivers/misc/fastrpc.c')
| -rw-r--r-- | drivers/misc/fastrpc.c | 23 | 
1 files changed, 14 insertions, 9 deletions
| diff --git a/drivers/misc/fastrpc.c b/drivers/misc/fastrpc.c index beda610e6b30..39aca7753719 100644 --- a/drivers/misc/fastrpc.c +++ b/drivers/misc/fastrpc.c @@ -24,7 +24,7 @@  #define SDSP_DOMAIN_ID (2)  #define CDSP_DOMAIN_ID (3)  #define FASTRPC_DEV_MAX		4 /* adsp, mdsp, slpi, cdsp*/ -#define FASTRPC_MAX_SESSIONS	9 /*8 compute, 1 cpz*/ +#define FASTRPC_MAX_SESSIONS	13 /*12 compute, 1 cpz*/  #define FASTRPC_ALIGN		128  #define FASTRPC_MAX_FDLIST	16  #define FASTRPC_MAX_CRCLIST	64 @@ -814,10 +814,12 @@ static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)  			rpra[i].pv = (u64) ctx->args[i].ptr;  			pages[i].addr = ctx->maps[i]->phys; +			mmap_read_lock(current->mm);  			vma = find_vma(current->mm, ctx->args[i].ptr);  			if (vma)  				pages[i].addr += ctx->args[i].ptr -  						 vma->vm_start; +			mmap_read_unlock(current->mm);  			pg_start = (ctx->args[i].ptr & PAGE_MASK) >> PAGE_SHIFT;  			pg_end = ((ctx->args[i].ptr + len - 1) & PAGE_MASK) >> @@ -890,15 +892,17 @@ static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,  	inbufs = REMOTE_SCALARS_INBUFS(ctx->sc);  	for (i = inbufs; i < ctx->nbufs; ++i) { -		void *src = (void *)(uintptr_t)rpra[i].pv; -		void *dst = (void *)(uintptr_t)ctx->args[i].ptr; -		u64 len = rpra[i].len; +		if (!ctx->maps[i]) { +			void *src = (void *)(uintptr_t)rpra[i].pv; +			void *dst = (void *)(uintptr_t)ctx->args[i].ptr; +			u64 len = rpra[i].len; -		if (!kernel) { -			if (copy_to_user((void __user *)dst, src, len)) -				return -EFAULT; -		} else { -			memcpy(dst, src, len); +			if (!kernel) { +				if (copy_to_user((void __user *)dst, src, len)) +					return -EFAULT; +			} else { +				memcpy(dst, src, len); +			}  		}  	} @@ -1763,3 +1767,4 @@ static void fastrpc_exit(void)  module_exit(fastrpc_exit);  MODULE_LICENSE("GPL v2"); +MODULE_IMPORT_NS(DMA_BUF); |