Merge 6.4-rc5 into usb-next
[platform/kernel/linux-starfive.git] / drivers / misc / fastrpc.c
1 // SPDX-License-Identifier: GPL-2.0
2 // Copyright (c) 2011-2018, The Linux Foundation. All rights reserved.
3 // Copyright (c) 2018, Linaro Limited
4
5 #include <linux/completion.h>
6 #include <linux/device.h>
7 #include <linux/dma-buf.h>
8 #include <linux/dma-mapping.h>
9 #include <linux/dma-resv.h>
10 #include <linux/idr.h>
11 #include <linux/list.h>
12 #include <linux/miscdevice.h>
13 #include <linux/module.h>
14 #include <linux/of_address.h>
15 #include <linux/of.h>
16 #include <linux/sort.h>
17 #include <linux/of_platform.h>
18 #include <linux/rpmsg.h>
19 #include <linux/scatterlist.h>
20 #include <linux/slab.h>
21 #include <linux/firmware/qcom/qcom_scm.h>
22 #include <uapi/misc/fastrpc.h>
23 #include <linux/of_reserved_mem.h>
24
25 #define ADSP_DOMAIN_ID (0)
26 #define MDSP_DOMAIN_ID (1)
27 #define SDSP_DOMAIN_ID (2)
28 #define CDSP_DOMAIN_ID (3)
29 #define FASTRPC_DEV_MAX         4 /* adsp, mdsp, slpi, cdsp*/
30 #define FASTRPC_MAX_SESSIONS    14
31 #define FASTRPC_MAX_VMIDS       16
32 #define FASTRPC_ALIGN           128
33 #define FASTRPC_MAX_FDLIST      16
34 #define FASTRPC_MAX_CRCLIST     64
35 #define FASTRPC_PHYS(p) ((p) & 0xffffffff)
36 #define FASTRPC_CTX_MAX (256)
37 #define FASTRPC_INIT_HANDLE     1
38 #define FASTRPC_DSP_UTILITIES_HANDLE    2
39 #define FASTRPC_CTXID_MASK (0xFF0)
40 #define INIT_FILELEN_MAX (2 * 1024 * 1024)
41 #define INIT_FILE_NAMELEN_MAX (128)
42 #define FASTRPC_DEVICE_NAME     "fastrpc"
43
44 /* Add memory to static PD pool, protection thru XPU */
45 #define ADSP_MMAP_HEAP_ADDR  4
46 /* MAP static DMA buffer on DSP User PD */
47 #define ADSP_MMAP_DMA_BUFFER  6
48 /* Add memory to static PD pool protection thru hypervisor */
49 #define ADSP_MMAP_REMOTE_HEAP_ADDR  8
50 /* Add memory to userPD pool, for user heap */
51 #define ADSP_MMAP_ADD_PAGES 0x1000
52 /* Add memory to userPD pool, for LLC heap */
53 #define ADSP_MMAP_ADD_PAGES_LLC 0x3000,
54
55 #define DSP_UNSUPPORTED_API (0x80000414)
56 /* MAX NUMBER of DSP ATTRIBUTES SUPPORTED */
57 #define FASTRPC_MAX_DSP_ATTRIBUTES (256)
58 #define FASTRPC_MAX_DSP_ATTRIBUTES_LEN (sizeof(u32) * FASTRPC_MAX_DSP_ATTRIBUTES)
59
60 /* Retrives number of input buffers from the scalars parameter */
61 #define REMOTE_SCALARS_INBUFS(sc)       (((sc) >> 16) & 0x0ff)
62
63 /* Retrives number of output buffers from the scalars parameter */
64 #define REMOTE_SCALARS_OUTBUFS(sc)      (((sc) >> 8) & 0x0ff)
65
66 /* Retrives number of input handles from the scalars parameter */
67 #define REMOTE_SCALARS_INHANDLES(sc)    (((sc) >> 4) & 0x0f)
68
69 /* Retrives number of output handles from the scalars parameter */
70 #define REMOTE_SCALARS_OUTHANDLES(sc)   ((sc) & 0x0f)
71
72 #define REMOTE_SCALARS_LENGTH(sc)       (REMOTE_SCALARS_INBUFS(sc) +   \
73                                          REMOTE_SCALARS_OUTBUFS(sc) +  \
74                                          REMOTE_SCALARS_INHANDLES(sc)+ \
75                                          REMOTE_SCALARS_OUTHANDLES(sc))
76 #define FASTRPC_BUILD_SCALARS(attr, method, in, out, oin, oout)  \
77                                 (((attr & 0x07) << 29) |                \
78                                 ((method & 0x1f) << 24) |       \
79                                 ((in & 0xff) << 16) |           \
80                                 ((out & 0xff) <<  8) |          \
81                                 ((oin & 0x0f) <<  4) |          \
82                                 (oout & 0x0f))
83
84 #define FASTRPC_SCALARS(method, in, out) \
85                 FASTRPC_BUILD_SCALARS(0, method, in, out, 0, 0)
86
87 #define FASTRPC_CREATE_PROCESS_NARGS    6
88 #define FASTRPC_CREATE_STATIC_PROCESS_NARGS     3
89 /* Remote Method id table */
90 #define FASTRPC_RMID_INIT_ATTACH        0
91 #define FASTRPC_RMID_INIT_RELEASE       1
92 #define FASTRPC_RMID_INIT_MMAP          4
93 #define FASTRPC_RMID_INIT_MUNMAP        5
94 #define FASTRPC_RMID_INIT_CREATE        6
95 #define FASTRPC_RMID_INIT_CREATE_ATTR   7
96 #define FASTRPC_RMID_INIT_CREATE_STATIC 8
97 #define FASTRPC_RMID_INIT_MEM_MAP      10
98 #define FASTRPC_RMID_INIT_MEM_UNMAP    11
99
100 /* Protection Domain(PD) ids */
101 #define ROOT_PD         (0)
102 #define USER_PD         (1)
103 #define SENSORS_PD      (2)
104
105 #define miscdev_to_fdevice(d) container_of(d, struct fastrpc_device, miscdev)
106
107 static const char *domains[FASTRPC_DEV_MAX] = { "adsp", "mdsp",
108                                                 "sdsp", "cdsp"};
109 struct fastrpc_phy_page {
110         u64 addr;               /* physical address */
111         u64 size;               /* size of contiguous region */
112 };
113
114 struct fastrpc_invoke_buf {
115         u32 num;                /* number of contiguous regions */
116         u32 pgidx;              /* index to start of contiguous region */
117 };
118
119 struct fastrpc_remote_dmahandle {
120         s32 fd;         /* dma handle fd */
121         u32 offset;     /* dma handle offset */
122         u32 len;        /* dma handle length */
123 };
124
125 struct fastrpc_remote_buf {
126         u64 pv;         /* buffer pointer */
127         u64 len;        /* length of buffer */
128 };
129
130 union fastrpc_remote_arg {
131         struct fastrpc_remote_buf buf;
132         struct fastrpc_remote_dmahandle dma;
133 };
134
135 struct fastrpc_mmap_rsp_msg {
136         u64 vaddr;
137 };
138
139 struct fastrpc_mmap_req_msg {
140         s32 pgid;
141         u32 flags;
142         u64 vaddr;
143         s32 num;
144 };
145
146 struct fastrpc_mem_map_req_msg {
147         s32 pgid;
148         s32 fd;
149         s32 offset;
150         u32 flags;
151         u64 vaddrin;
152         s32 num;
153         s32 data_len;
154 };
155
156 struct fastrpc_munmap_req_msg {
157         s32 pgid;
158         u64 vaddr;
159         u64 size;
160 };
161
162 struct fastrpc_mem_unmap_req_msg {
163         s32 pgid;
164         s32 fd;
165         u64 vaddrin;
166         u64 len;
167 };
168
169 struct fastrpc_msg {
170         int pid;                /* process group id */
171         int tid;                /* thread id */
172         u64 ctx;                /* invoke caller context */
173         u32 handle;     /* handle to invoke */
174         u32 sc;         /* scalars structure describing the data */
175         u64 addr;               /* physical address */
176         u64 size;               /* size of contiguous region */
177 };
178
179 struct fastrpc_invoke_rsp {
180         u64 ctx;                /* invoke caller context */
181         int retval;             /* invoke return value */
182 };
183
184 struct fastrpc_buf_overlap {
185         u64 start;
186         u64 end;
187         int raix;
188         u64 mstart;
189         u64 mend;
190         u64 offset;
191 };
192
193 struct fastrpc_buf {
194         struct fastrpc_user *fl;
195         struct dma_buf *dmabuf;
196         struct device *dev;
197         void *virt;
198         u64 phys;
199         u64 size;
200         /* Lock for dma buf attachments */
201         struct mutex lock;
202         struct list_head attachments;
203         /* mmap support */
204         struct list_head node; /* list of user requested mmaps */
205         uintptr_t raddr;
206 };
207
208 struct fastrpc_dma_buf_attachment {
209         struct device *dev;
210         struct sg_table sgt;
211         struct list_head node;
212 };
213
214 struct fastrpc_map {
215         struct list_head node;
216         struct fastrpc_user *fl;
217         int fd;
218         struct dma_buf *buf;
219         struct sg_table *table;
220         struct dma_buf_attachment *attach;
221         u64 phys;
222         u64 size;
223         void *va;
224         u64 len;
225         u64 raddr;
226         u32 attr;
227         struct kref refcount;
228 };
229
230 struct fastrpc_invoke_ctx {
231         int nscalars;
232         int nbufs;
233         int retval;
234         int pid;
235         int tgid;
236         u32 sc;
237         u32 *crc;
238         u64 ctxid;
239         u64 msg_sz;
240         struct kref refcount;
241         struct list_head node; /* list of ctxs */
242         struct completion work;
243         struct work_struct put_work;
244         struct fastrpc_msg msg;
245         struct fastrpc_user *fl;
246         union fastrpc_remote_arg *rpra;
247         struct fastrpc_map **maps;
248         struct fastrpc_buf *buf;
249         struct fastrpc_invoke_args *args;
250         struct fastrpc_buf_overlap *olaps;
251         struct fastrpc_channel_ctx *cctx;
252 };
253
254 struct fastrpc_session_ctx {
255         struct device *dev;
256         int sid;
257         bool used;
258         bool valid;
259 };
260
261 struct fastrpc_channel_ctx {
262         int domain_id;
263         int sesscount;
264         int vmcount;
265         u64 perms;
266         struct qcom_scm_vmperm vmperms[FASTRPC_MAX_VMIDS];
267         struct rpmsg_device *rpdev;
268         struct fastrpc_session_ctx session[FASTRPC_MAX_SESSIONS];
269         spinlock_t lock;
270         struct idr ctx_idr;
271         struct list_head users;
272         struct kref refcount;
273         /* Flag if dsp attributes are cached */
274         bool valid_attributes;
275         u32 dsp_attributes[FASTRPC_MAX_DSP_ATTRIBUTES];
276         struct fastrpc_device *secure_fdevice;
277         struct fastrpc_device *fdevice;
278         struct fastrpc_buf *remote_heap;
279         struct list_head invoke_interrupted_mmaps;
280         bool secure;
281         bool unsigned_support;
282         u64 dma_mask;
283 };
284
285 struct fastrpc_device {
286         struct fastrpc_channel_ctx *cctx;
287         struct miscdevice miscdev;
288         bool secure;
289 };
290
291 struct fastrpc_user {
292         struct list_head user;
293         struct list_head maps;
294         struct list_head pending;
295         struct list_head mmaps;
296
297         struct fastrpc_channel_ctx *cctx;
298         struct fastrpc_session_ctx *sctx;
299         struct fastrpc_buf *init_mem;
300
301         int tgid;
302         int pd;
303         bool is_secure_dev;
304         /* Lock for lists */
305         spinlock_t lock;
306         /* lock for allocations */
307         struct mutex mutex;
308 };
309
310 static void fastrpc_free_map(struct kref *ref)
311 {
312         struct fastrpc_map *map;
313
314         map = container_of(ref, struct fastrpc_map, refcount);
315
316         if (map->table) {
317                 if (map->attr & FASTRPC_ATTR_SECUREMAP) {
318                         struct qcom_scm_vmperm perm;
319                         int vmid = map->fl->cctx->vmperms[0].vmid;
320                         u64 src_perms = BIT(QCOM_SCM_VMID_HLOS) | BIT(vmid);
321                         int err = 0;
322
323                         perm.vmid = QCOM_SCM_VMID_HLOS;
324                         perm.perm = QCOM_SCM_PERM_RWX;
325                         err = qcom_scm_assign_mem(map->phys, map->size,
326                                 &src_perms, &perm, 1);
327                         if (err) {
328                                 dev_err(map->fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
329                                                 map->phys, map->size, err);
330                                 return;
331                         }
332                 }
333                 dma_buf_unmap_attachment_unlocked(map->attach, map->table,
334                                                   DMA_BIDIRECTIONAL);
335                 dma_buf_detach(map->buf, map->attach);
336                 dma_buf_put(map->buf);
337         }
338
339         if (map->fl) {
340                 spin_lock(&map->fl->lock);
341                 list_del(&map->node);
342                 spin_unlock(&map->fl->lock);
343                 map->fl = NULL;
344         }
345
346         kfree(map);
347 }
348
349 static void fastrpc_map_put(struct fastrpc_map *map)
350 {
351         if (map)
352                 kref_put(&map->refcount, fastrpc_free_map);
353 }
354
355 static int fastrpc_map_get(struct fastrpc_map *map)
356 {
357         if (!map)
358                 return -ENOENT;
359
360         return kref_get_unless_zero(&map->refcount) ? 0 : -ENOENT;
361 }
362
363
364 static int fastrpc_map_lookup(struct fastrpc_user *fl, int fd,
365                             struct fastrpc_map **ppmap, bool take_ref)
366 {
367         struct fastrpc_session_ctx *sess = fl->sctx;
368         struct fastrpc_map *map = NULL;
369         int ret = -ENOENT;
370
371         spin_lock(&fl->lock);
372         list_for_each_entry(map, &fl->maps, node) {
373                 if (map->fd != fd)
374                         continue;
375
376                 if (take_ref) {
377                         ret = fastrpc_map_get(map);
378                         if (ret) {
379                                 dev_dbg(sess->dev, "%s: Failed to get map fd=%d ret=%d\n",
380                                         __func__, fd, ret);
381                                 break;
382                         }
383                 }
384
385                 *ppmap = map;
386                 ret = 0;
387                 break;
388         }
389         spin_unlock(&fl->lock);
390
391         return ret;
392 }
393
394 static void fastrpc_buf_free(struct fastrpc_buf *buf)
395 {
396         dma_free_coherent(buf->dev, buf->size, buf->virt,
397                           FASTRPC_PHYS(buf->phys));
398         kfree(buf);
399 }
400
401 static int __fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
402                              u64 size, struct fastrpc_buf **obuf)
403 {
404         struct fastrpc_buf *buf;
405
406         buf = kzalloc(sizeof(*buf), GFP_KERNEL);
407         if (!buf)
408                 return -ENOMEM;
409
410         INIT_LIST_HEAD(&buf->attachments);
411         INIT_LIST_HEAD(&buf->node);
412         mutex_init(&buf->lock);
413
414         buf->fl = fl;
415         buf->virt = NULL;
416         buf->phys = 0;
417         buf->size = size;
418         buf->dev = dev;
419         buf->raddr = 0;
420
421         buf->virt = dma_alloc_coherent(dev, buf->size, (dma_addr_t *)&buf->phys,
422                                        GFP_KERNEL);
423         if (!buf->virt) {
424                 mutex_destroy(&buf->lock);
425                 kfree(buf);
426                 return -ENOMEM;
427         }
428
429         *obuf = buf;
430
431         return 0;
432 }
433
434 static int fastrpc_buf_alloc(struct fastrpc_user *fl, struct device *dev,
435                              u64 size, struct fastrpc_buf **obuf)
436 {
437         int ret;
438         struct fastrpc_buf *buf;
439
440         ret = __fastrpc_buf_alloc(fl, dev, size, obuf);
441         if (ret)
442                 return ret;
443
444         buf = *obuf;
445
446         if (fl->sctx && fl->sctx->sid)
447                 buf->phys += ((u64)fl->sctx->sid << 32);
448
449         return 0;
450 }
451
452 static int fastrpc_remote_heap_alloc(struct fastrpc_user *fl, struct device *dev,
453                                      u64 size, struct fastrpc_buf **obuf)
454 {
455         struct device *rdev = &fl->cctx->rpdev->dev;
456
457         return  __fastrpc_buf_alloc(fl, rdev, size, obuf);
458 }
459
460 static void fastrpc_channel_ctx_free(struct kref *ref)
461 {
462         struct fastrpc_channel_ctx *cctx;
463
464         cctx = container_of(ref, struct fastrpc_channel_ctx, refcount);
465
466         kfree(cctx);
467 }
468
469 static void fastrpc_channel_ctx_get(struct fastrpc_channel_ctx *cctx)
470 {
471         kref_get(&cctx->refcount);
472 }
473
474 static void fastrpc_channel_ctx_put(struct fastrpc_channel_ctx *cctx)
475 {
476         kref_put(&cctx->refcount, fastrpc_channel_ctx_free);
477 }
478
479 static void fastrpc_context_free(struct kref *ref)
480 {
481         struct fastrpc_invoke_ctx *ctx;
482         struct fastrpc_channel_ctx *cctx;
483         unsigned long flags;
484         int i;
485
486         ctx = container_of(ref, struct fastrpc_invoke_ctx, refcount);
487         cctx = ctx->cctx;
488
489         for (i = 0; i < ctx->nbufs; i++)
490                 fastrpc_map_put(ctx->maps[i]);
491
492         if (ctx->buf)
493                 fastrpc_buf_free(ctx->buf);
494
495         spin_lock_irqsave(&cctx->lock, flags);
496         idr_remove(&cctx->ctx_idr, ctx->ctxid >> 4);
497         spin_unlock_irqrestore(&cctx->lock, flags);
498
499         kfree(ctx->maps);
500         kfree(ctx->olaps);
501         kfree(ctx);
502
503         fastrpc_channel_ctx_put(cctx);
504 }
505
506 static void fastrpc_context_get(struct fastrpc_invoke_ctx *ctx)
507 {
508         kref_get(&ctx->refcount);
509 }
510
511 static void fastrpc_context_put(struct fastrpc_invoke_ctx *ctx)
512 {
513         kref_put(&ctx->refcount, fastrpc_context_free);
514 }
515
516 static void fastrpc_context_put_wq(struct work_struct *work)
517 {
518         struct fastrpc_invoke_ctx *ctx =
519                         container_of(work, struct fastrpc_invoke_ctx, put_work);
520
521         fastrpc_context_put(ctx);
522 }
523
524 #define CMP(aa, bb) ((aa) == (bb) ? 0 : (aa) < (bb) ? -1 : 1)
525 static int olaps_cmp(const void *a, const void *b)
526 {
527         struct fastrpc_buf_overlap *pa = (struct fastrpc_buf_overlap *)a;
528         struct fastrpc_buf_overlap *pb = (struct fastrpc_buf_overlap *)b;
529         /* sort with lowest starting buffer first */
530         int st = CMP(pa->start, pb->start);
531         /* sort with highest ending buffer first */
532         int ed = CMP(pb->end, pa->end);
533
534         return st == 0 ? ed : st;
535 }
536
537 static void fastrpc_get_buff_overlaps(struct fastrpc_invoke_ctx *ctx)
538 {
539         u64 max_end = 0;
540         int i;
541
542         for (i = 0; i < ctx->nbufs; ++i) {
543                 ctx->olaps[i].start = ctx->args[i].ptr;
544                 ctx->olaps[i].end = ctx->olaps[i].start + ctx->args[i].length;
545                 ctx->olaps[i].raix = i;
546         }
547
548         sort(ctx->olaps, ctx->nbufs, sizeof(*ctx->olaps), olaps_cmp, NULL);
549
550         for (i = 0; i < ctx->nbufs; ++i) {
551                 /* Falling inside previous range */
552                 if (ctx->olaps[i].start < max_end) {
553                         ctx->olaps[i].mstart = max_end;
554                         ctx->olaps[i].mend = ctx->olaps[i].end;
555                         ctx->olaps[i].offset = max_end - ctx->olaps[i].start;
556
557                         if (ctx->olaps[i].end > max_end) {
558                                 max_end = ctx->olaps[i].end;
559                         } else {
560                                 ctx->olaps[i].mend = 0;
561                                 ctx->olaps[i].mstart = 0;
562                         }
563
564                 } else  {
565                         ctx->olaps[i].mend = ctx->olaps[i].end;
566                         ctx->olaps[i].mstart = ctx->olaps[i].start;
567                         ctx->olaps[i].offset = 0;
568                         max_end = ctx->olaps[i].end;
569                 }
570         }
571 }
572
573 static struct fastrpc_invoke_ctx *fastrpc_context_alloc(
574                         struct fastrpc_user *user, u32 kernel, u32 sc,
575                         struct fastrpc_invoke_args *args)
576 {
577         struct fastrpc_channel_ctx *cctx = user->cctx;
578         struct fastrpc_invoke_ctx *ctx = NULL;
579         unsigned long flags;
580         int ret;
581
582         ctx = kzalloc(sizeof(*ctx), GFP_KERNEL);
583         if (!ctx)
584                 return ERR_PTR(-ENOMEM);
585
586         INIT_LIST_HEAD(&ctx->node);
587         ctx->fl = user;
588         ctx->nscalars = REMOTE_SCALARS_LENGTH(sc);
589         ctx->nbufs = REMOTE_SCALARS_INBUFS(sc) +
590                      REMOTE_SCALARS_OUTBUFS(sc);
591
592         if (ctx->nscalars) {
593                 ctx->maps = kcalloc(ctx->nscalars,
594                                     sizeof(*ctx->maps), GFP_KERNEL);
595                 if (!ctx->maps) {
596                         kfree(ctx);
597                         return ERR_PTR(-ENOMEM);
598                 }
599                 ctx->olaps = kcalloc(ctx->nscalars,
600                                     sizeof(*ctx->olaps), GFP_KERNEL);
601                 if (!ctx->olaps) {
602                         kfree(ctx->maps);
603                         kfree(ctx);
604                         return ERR_PTR(-ENOMEM);
605                 }
606                 ctx->args = args;
607                 fastrpc_get_buff_overlaps(ctx);
608         }
609
610         /* Released in fastrpc_context_put() */
611         fastrpc_channel_ctx_get(cctx);
612
613         ctx->sc = sc;
614         ctx->retval = -1;
615         ctx->pid = current->pid;
616         ctx->tgid = user->tgid;
617         ctx->cctx = cctx;
618         init_completion(&ctx->work);
619         INIT_WORK(&ctx->put_work, fastrpc_context_put_wq);
620
621         spin_lock(&user->lock);
622         list_add_tail(&ctx->node, &user->pending);
623         spin_unlock(&user->lock);
624
625         spin_lock_irqsave(&cctx->lock, flags);
626         ret = idr_alloc_cyclic(&cctx->ctx_idr, ctx, 1,
627                                FASTRPC_CTX_MAX, GFP_ATOMIC);
628         if (ret < 0) {
629                 spin_unlock_irqrestore(&cctx->lock, flags);
630                 goto err_idr;
631         }
632         ctx->ctxid = ret << 4;
633         spin_unlock_irqrestore(&cctx->lock, flags);
634
635         kref_init(&ctx->refcount);
636
637         return ctx;
638 err_idr:
639         spin_lock(&user->lock);
640         list_del(&ctx->node);
641         spin_unlock(&user->lock);
642         fastrpc_channel_ctx_put(cctx);
643         kfree(ctx->maps);
644         kfree(ctx->olaps);
645         kfree(ctx);
646
647         return ERR_PTR(ret);
648 }
649
650 static struct sg_table *
651 fastrpc_map_dma_buf(struct dma_buf_attachment *attachment,
652                     enum dma_data_direction dir)
653 {
654         struct fastrpc_dma_buf_attachment *a = attachment->priv;
655         struct sg_table *table;
656         int ret;
657
658         table = &a->sgt;
659
660         ret = dma_map_sgtable(attachment->dev, table, dir, 0);
661         if (ret)
662                 table = ERR_PTR(ret);
663         return table;
664 }
665
666 static void fastrpc_unmap_dma_buf(struct dma_buf_attachment *attach,
667                                   struct sg_table *table,
668                                   enum dma_data_direction dir)
669 {
670         dma_unmap_sgtable(attach->dev, table, dir, 0);
671 }
672
673 static void fastrpc_release(struct dma_buf *dmabuf)
674 {
675         struct fastrpc_buf *buffer = dmabuf->priv;
676
677         fastrpc_buf_free(buffer);
678 }
679
680 static int fastrpc_dma_buf_attach(struct dma_buf *dmabuf,
681                                   struct dma_buf_attachment *attachment)
682 {
683         struct fastrpc_dma_buf_attachment *a;
684         struct fastrpc_buf *buffer = dmabuf->priv;
685         int ret;
686
687         a = kzalloc(sizeof(*a), GFP_KERNEL);
688         if (!a)
689                 return -ENOMEM;
690
691         ret = dma_get_sgtable(buffer->dev, &a->sgt, buffer->virt,
692                               FASTRPC_PHYS(buffer->phys), buffer->size);
693         if (ret < 0) {
694                 dev_err(buffer->dev, "failed to get scatterlist from DMA API\n");
695                 kfree(a);
696                 return -EINVAL;
697         }
698
699         a->dev = attachment->dev;
700         INIT_LIST_HEAD(&a->node);
701         attachment->priv = a;
702
703         mutex_lock(&buffer->lock);
704         list_add(&a->node, &buffer->attachments);
705         mutex_unlock(&buffer->lock);
706
707         return 0;
708 }
709
710 static void fastrpc_dma_buf_detatch(struct dma_buf *dmabuf,
711                                     struct dma_buf_attachment *attachment)
712 {
713         struct fastrpc_dma_buf_attachment *a = attachment->priv;
714         struct fastrpc_buf *buffer = dmabuf->priv;
715
716         mutex_lock(&buffer->lock);
717         list_del(&a->node);
718         mutex_unlock(&buffer->lock);
719         sg_free_table(&a->sgt);
720         kfree(a);
721 }
722
723 static int fastrpc_vmap(struct dma_buf *dmabuf, struct iosys_map *map)
724 {
725         struct fastrpc_buf *buf = dmabuf->priv;
726
727         iosys_map_set_vaddr(map, buf->virt);
728
729         return 0;
730 }
731
732 static int fastrpc_mmap(struct dma_buf *dmabuf,
733                         struct vm_area_struct *vma)
734 {
735         struct fastrpc_buf *buf = dmabuf->priv;
736         size_t size = vma->vm_end - vma->vm_start;
737
738         dma_resv_assert_held(dmabuf->resv);
739
740         return dma_mmap_coherent(buf->dev, vma, buf->virt,
741                                  FASTRPC_PHYS(buf->phys), size);
742 }
743
744 static const struct dma_buf_ops fastrpc_dma_buf_ops = {
745         .attach = fastrpc_dma_buf_attach,
746         .detach = fastrpc_dma_buf_detatch,
747         .map_dma_buf = fastrpc_map_dma_buf,
748         .unmap_dma_buf = fastrpc_unmap_dma_buf,
749         .mmap = fastrpc_mmap,
750         .vmap = fastrpc_vmap,
751         .release = fastrpc_release,
752 };
753
754 static int fastrpc_map_create(struct fastrpc_user *fl, int fd,
755                               u64 len, u32 attr, struct fastrpc_map **ppmap)
756 {
757         struct fastrpc_session_ctx *sess = fl->sctx;
758         struct fastrpc_map *map = NULL;
759         int err = 0;
760
761         if (!fastrpc_map_lookup(fl, fd, ppmap, true))
762                 return 0;
763
764         map = kzalloc(sizeof(*map), GFP_KERNEL);
765         if (!map)
766                 return -ENOMEM;
767
768         INIT_LIST_HEAD(&map->node);
769         kref_init(&map->refcount);
770
771         map->fl = fl;
772         map->fd = fd;
773         map->buf = dma_buf_get(fd);
774         if (IS_ERR(map->buf)) {
775                 err = PTR_ERR(map->buf);
776                 goto get_err;
777         }
778
779         map->attach = dma_buf_attach(map->buf, sess->dev);
780         if (IS_ERR(map->attach)) {
781                 dev_err(sess->dev, "Failed to attach dmabuf\n");
782                 err = PTR_ERR(map->attach);
783                 goto attach_err;
784         }
785
786         map->table = dma_buf_map_attachment_unlocked(map->attach, DMA_BIDIRECTIONAL);
787         if (IS_ERR(map->table)) {
788                 err = PTR_ERR(map->table);
789                 goto map_err;
790         }
791
792         if (attr & FASTRPC_ATTR_SECUREMAP) {
793                 map->phys = sg_phys(map->table->sgl);
794         } else {
795                 map->phys = sg_dma_address(map->table->sgl);
796                 map->phys += ((u64)fl->sctx->sid << 32);
797         }
798         map->size = len;
799         map->va = sg_virt(map->table->sgl);
800         map->len = len;
801
802         if (attr & FASTRPC_ATTR_SECUREMAP) {
803                 /*
804                  * If subsystem VMIDs are defined in DTSI, then do
805                  * hyp_assign from HLOS to those VM(s)
806                  */
807                 u64 src_perms = BIT(QCOM_SCM_VMID_HLOS);
808                 struct qcom_scm_vmperm dst_perms[2] = {0};
809
810                 dst_perms[0].vmid = QCOM_SCM_VMID_HLOS;
811                 dst_perms[0].perm = QCOM_SCM_PERM_RW;
812                 dst_perms[1].vmid = fl->cctx->vmperms[0].vmid;
813                 dst_perms[1].perm = QCOM_SCM_PERM_RWX;
814                 map->attr = attr;
815                 err = qcom_scm_assign_mem(map->phys, (u64)map->size, &src_perms, dst_perms, 2);
816                 if (err) {
817                         dev_err(sess->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d",
818                                         map->phys, map->size, err);
819                         goto map_err;
820                 }
821         }
822         spin_lock(&fl->lock);
823         list_add_tail(&map->node, &fl->maps);
824         spin_unlock(&fl->lock);
825         *ppmap = map;
826
827         return 0;
828
829 map_err:
830         dma_buf_detach(map->buf, map->attach);
831 attach_err:
832         dma_buf_put(map->buf);
833 get_err:
834         fastrpc_map_put(map);
835
836         return err;
837 }
838
839 /*
840  * Fastrpc payload buffer with metadata looks like:
841  *
842  * >>>>>>  START of METADATA <<<<<<<<<
843  * +---------------------------------+
844  * |           Arguments             |
845  * | type:(union fastrpc_remote_arg)|
846  * |             (0 - N)             |
847  * +---------------------------------+
848  * |         Invoke Buffer list      |
849  * | type:(struct fastrpc_invoke_buf)|
850  * |           (0 - N)               |
851  * +---------------------------------+
852  * |         Page info list          |
853  * | type:(struct fastrpc_phy_page)  |
854  * |             (0 - N)             |
855  * +---------------------------------+
856  * |         Optional info           |
857  * |(can be specific to SoC/Firmware)|
858  * +---------------------------------+
859  * >>>>>>>>  END of METADATA <<<<<<<<<
860  * +---------------------------------+
861  * |         Inline ARGS             |
862  * |            (0-N)                |
863  * +---------------------------------+
864  */
865
866 static int fastrpc_get_meta_size(struct fastrpc_invoke_ctx *ctx)
867 {
868         int size = 0;
869
870         size = (sizeof(struct fastrpc_remote_buf) +
871                 sizeof(struct fastrpc_invoke_buf) +
872                 sizeof(struct fastrpc_phy_page)) * ctx->nscalars +
873                 sizeof(u64) * FASTRPC_MAX_FDLIST +
874                 sizeof(u32) * FASTRPC_MAX_CRCLIST;
875
876         return size;
877 }
878
879 static u64 fastrpc_get_payload_size(struct fastrpc_invoke_ctx *ctx, int metalen)
880 {
881         u64 size = 0;
882         int oix;
883
884         size = ALIGN(metalen, FASTRPC_ALIGN);
885         for (oix = 0; oix < ctx->nbufs; oix++) {
886                 int i = ctx->olaps[oix].raix;
887
888                 if (ctx->args[i].fd == 0 || ctx->args[i].fd == -1) {
889
890                         if (ctx->olaps[oix].offset == 0)
891                                 size = ALIGN(size, FASTRPC_ALIGN);
892
893                         size += (ctx->olaps[oix].mend - ctx->olaps[oix].mstart);
894                 }
895         }
896
897         return size;
898 }
899
900 static int fastrpc_create_maps(struct fastrpc_invoke_ctx *ctx)
901 {
902         struct device *dev = ctx->fl->sctx->dev;
903         int i, err;
904
905         for (i = 0; i < ctx->nscalars; ++i) {
906
907                 if (ctx->args[i].fd == 0 || ctx->args[i].fd == -1 ||
908                     ctx->args[i].length == 0)
909                         continue;
910
911                 err = fastrpc_map_create(ctx->fl, ctx->args[i].fd,
912                          ctx->args[i].length, ctx->args[i].attr, &ctx->maps[i]);
913                 if (err) {
914                         dev_err(dev, "Error Creating map %d\n", err);
915                         return -EINVAL;
916                 }
917
918         }
919         return 0;
920 }
921
922 static struct fastrpc_invoke_buf *fastrpc_invoke_buf_start(union fastrpc_remote_arg *pra, int len)
923 {
924         return (struct fastrpc_invoke_buf *)(&pra[len]);
925 }
926
927 static struct fastrpc_phy_page *fastrpc_phy_page_start(struct fastrpc_invoke_buf *buf, int len)
928 {
929         return (struct fastrpc_phy_page *)(&buf[len]);
930 }
931
932 static int fastrpc_get_args(u32 kernel, struct fastrpc_invoke_ctx *ctx)
933 {
934         struct device *dev = ctx->fl->sctx->dev;
935         union fastrpc_remote_arg *rpra;
936         struct fastrpc_invoke_buf *list;
937         struct fastrpc_phy_page *pages;
938         int inbufs, i, oix, err = 0;
939         u64 len, rlen, pkt_size;
940         u64 pg_start, pg_end;
941         uintptr_t args;
942         int metalen;
943
944         inbufs = REMOTE_SCALARS_INBUFS(ctx->sc);
945         metalen = fastrpc_get_meta_size(ctx);
946         pkt_size = fastrpc_get_payload_size(ctx, metalen);
947
948         err = fastrpc_create_maps(ctx);
949         if (err)
950                 return err;
951
952         ctx->msg_sz = pkt_size;
953
954         err = fastrpc_buf_alloc(ctx->fl, dev, pkt_size, &ctx->buf);
955         if (err)
956                 return err;
957
958         rpra = ctx->buf->virt;
959         list = fastrpc_invoke_buf_start(rpra, ctx->nscalars);
960         pages = fastrpc_phy_page_start(list, ctx->nscalars);
961         args = (uintptr_t)ctx->buf->virt + metalen;
962         rlen = pkt_size - metalen;
963         ctx->rpra = rpra;
964
965         for (oix = 0; oix < ctx->nbufs; ++oix) {
966                 int mlen;
967
968                 i = ctx->olaps[oix].raix;
969                 len = ctx->args[i].length;
970
971                 rpra[i].buf.pv = 0;
972                 rpra[i].buf.len = len;
973                 list[i].num = len ? 1 : 0;
974                 list[i].pgidx = i;
975
976                 if (!len)
977                         continue;
978
979                 if (ctx->maps[i]) {
980                         struct vm_area_struct *vma = NULL;
981
982                         rpra[i].buf.pv = (u64) ctx->args[i].ptr;
983                         pages[i].addr = ctx->maps[i]->phys;
984
985                         mmap_read_lock(current->mm);
986                         vma = find_vma(current->mm, ctx->args[i].ptr);
987                         if (vma)
988                                 pages[i].addr += ctx->args[i].ptr -
989                                                  vma->vm_start;
990                         mmap_read_unlock(current->mm);
991
992                         pg_start = (ctx->args[i].ptr & PAGE_MASK) >> PAGE_SHIFT;
993                         pg_end = ((ctx->args[i].ptr + len - 1) & PAGE_MASK) >>
994                                   PAGE_SHIFT;
995                         pages[i].size = (pg_end - pg_start + 1) * PAGE_SIZE;
996
997                 } else {
998
999                         if (ctx->olaps[oix].offset == 0) {
1000                                 rlen -= ALIGN(args, FASTRPC_ALIGN) - args;
1001                                 args = ALIGN(args, FASTRPC_ALIGN);
1002                         }
1003
1004                         mlen = ctx->olaps[oix].mend - ctx->olaps[oix].mstart;
1005
1006                         if (rlen < mlen)
1007                                 goto bail;
1008
1009                         rpra[i].buf.pv = args - ctx->olaps[oix].offset;
1010                         pages[i].addr = ctx->buf->phys -
1011                                         ctx->olaps[oix].offset +
1012                                         (pkt_size - rlen);
1013                         pages[i].addr = pages[i].addr & PAGE_MASK;
1014
1015                         pg_start = (args & PAGE_MASK) >> PAGE_SHIFT;
1016                         pg_end = ((args + len - 1) & PAGE_MASK) >> PAGE_SHIFT;
1017                         pages[i].size = (pg_end - pg_start + 1) * PAGE_SIZE;
1018                         args = args + mlen;
1019                         rlen -= mlen;
1020                 }
1021
1022                 if (i < inbufs && !ctx->maps[i]) {
1023                         void *dst = (void *)(uintptr_t)rpra[i].buf.pv;
1024                         void *src = (void *)(uintptr_t)ctx->args[i].ptr;
1025
1026                         if (!kernel) {
1027                                 if (copy_from_user(dst, (void __user *)src,
1028                                                    len)) {
1029                                         err = -EFAULT;
1030                                         goto bail;
1031                                 }
1032                         } else {
1033                                 memcpy(dst, src, len);
1034                         }
1035                 }
1036         }
1037
1038         for (i = ctx->nbufs; i < ctx->nscalars; ++i) {
1039                 list[i].num = ctx->args[i].length ? 1 : 0;
1040                 list[i].pgidx = i;
1041                 if (ctx->maps[i]) {
1042                         pages[i].addr = ctx->maps[i]->phys;
1043                         pages[i].size = ctx->maps[i]->size;
1044                 }
1045                 rpra[i].dma.fd = ctx->args[i].fd;
1046                 rpra[i].dma.len = ctx->args[i].length;
1047                 rpra[i].dma.offset = (u64) ctx->args[i].ptr;
1048         }
1049
1050 bail:
1051         if (err)
1052                 dev_err(dev, "Error: get invoke args failed:%d\n", err);
1053
1054         return err;
1055 }
1056
1057 static int fastrpc_put_args(struct fastrpc_invoke_ctx *ctx,
1058                             u32 kernel)
1059 {
1060         union fastrpc_remote_arg *rpra = ctx->rpra;
1061         struct fastrpc_user *fl = ctx->fl;
1062         struct fastrpc_map *mmap = NULL;
1063         struct fastrpc_invoke_buf *list;
1064         struct fastrpc_phy_page *pages;
1065         u64 *fdlist;
1066         int i, inbufs, outbufs, handles;
1067
1068         inbufs = REMOTE_SCALARS_INBUFS(ctx->sc);
1069         outbufs = REMOTE_SCALARS_OUTBUFS(ctx->sc);
1070         handles = REMOTE_SCALARS_INHANDLES(ctx->sc) + REMOTE_SCALARS_OUTHANDLES(ctx->sc);
1071         list = fastrpc_invoke_buf_start(rpra, ctx->nscalars);
1072         pages = fastrpc_phy_page_start(list, ctx->nscalars);
1073         fdlist = (uint64_t *)(pages + inbufs + outbufs + handles);
1074
1075         for (i = inbufs; i < ctx->nbufs; ++i) {
1076                 if (!ctx->maps[i]) {
1077                         void *src = (void *)(uintptr_t)rpra[i].buf.pv;
1078                         void *dst = (void *)(uintptr_t)ctx->args[i].ptr;
1079                         u64 len = rpra[i].buf.len;
1080
1081                         if (!kernel) {
1082                                 if (copy_to_user((void __user *)dst, src, len))
1083                                         return -EFAULT;
1084                         } else {
1085                                 memcpy(dst, src, len);
1086                         }
1087                 }
1088         }
1089
1090         for (i = 0; i < FASTRPC_MAX_FDLIST; i++) {
1091                 if (!fdlist[i])
1092                         break;
1093                 if (!fastrpc_map_lookup(fl, (int)fdlist[i], &mmap, false))
1094                         fastrpc_map_put(mmap);
1095         }
1096
1097         return 0;
1098 }
1099
1100 static int fastrpc_invoke_send(struct fastrpc_session_ctx *sctx,
1101                                struct fastrpc_invoke_ctx *ctx,
1102                                u32 kernel, uint32_t handle)
1103 {
1104         struct fastrpc_channel_ctx *cctx;
1105         struct fastrpc_user *fl = ctx->fl;
1106         struct fastrpc_msg *msg = &ctx->msg;
1107         int ret;
1108
1109         cctx = fl->cctx;
1110         msg->pid = fl->tgid;
1111         msg->tid = current->pid;
1112
1113         if (kernel)
1114                 msg->pid = 0;
1115
1116         msg->ctx = ctx->ctxid | fl->pd;
1117         msg->handle = handle;
1118         msg->sc = ctx->sc;
1119         msg->addr = ctx->buf ? ctx->buf->phys : 0;
1120         msg->size = roundup(ctx->msg_sz, PAGE_SIZE);
1121         fastrpc_context_get(ctx);
1122
1123         ret = rpmsg_send(cctx->rpdev->ept, (void *)msg, sizeof(*msg));
1124
1125         if (ret)
1126                 fastrpc_context_put(ctx);
1127
1128         return ret;
1129
1130 }
1131
1132 static int fastrpc_internal_invoke(struct fastrpc_user *fl,  u32 kernel,
1133                                    u32 handle, u32 sc,
1134                                    struct fastrpc_invoke_args *args)
1135 {
1136         struct fastrpc_invoke_ctx *ctx = NULL;
1137         struct fastrpc_buf *buf, *b;
1138
1139         int err = 0;
1140
1141         if (!fl->sctx)
1142                 return -EINVAL;
1143
1144         if (!fl->cctx->rpdev)
1145                 return -EPIPE;
1146
1147         if (handle == FASTRPC_INIT_HANDLE && !kernel) {
1148                 dev_warn_ratelimited(fl->sctx->dev, "user app trying to send a kernel RPC message (%d)\n",  handle);
1149                 return -EPERM;
1150         }
1151
1152         ctx = fastrpc_context_alloc(fl, kernel, sc, args);
1153         if (IS_ERR(ctx))
1154                 return PTR_ERR(ctx);
1155
1156         if (ctx->nscalars) {
1157                 err = fastrpc_get_args(kernel, ctx);
1158                 if (err)
1159                         goto bail;
1160         }
1161
1162         /* make sure that all CPU memory writes are seen by DSP */
1163         dma_wmb();
1164         /* Send invoke buffer to remote dsp */
1165         err = fastrpc_invoke_send(fl->sctx, ctx, kernel, handle);
1166         if (err)
1167                 goto bail;
1168
1169         if (kernel) {
1170                 if (!wait_for_completion_timeout(&ctx->work, 10 * HZ))
1171                         err = -ETIMEDOUT;
1172         } else {
1173                 err = wait_for_completion_interruptible(&ctx->work);
1174         }
1175
1176         if (err)
1177                 goto bail;
1178
1179         /* Check the response from remote dsp */
1180         err = ctx->retval;
1181         if (err)
1182                 goto bail;
1183
1184         if (ctx->nscalars) {
1185                 /* make sure that all memory writes by DSP are seen by CPU */
1186                 dma_rmb();
1187                 /* populate all the output buffers with results */
1188                 err = fastrpc_put_args(ctx, kernel);
1189                 if (err)
1190                         goto bail;
1191         }
1192
1193 bail:
1194         if (err != -ERESTARTSYS && err != -ETIMEDOUT) {
1195                 /* We are done with this compute context */
1196                 spin_lock(&fl->lock);
1197                 list_del(&ctx->node);
1198                 spin_unlock(&fl->lock);
1199                 fastrpc_context_put(ctx);
1200         }
1201
1202         if (err == -ERESTARTSYS) {
1203                 list_for_each_entry_safe(buf, b, &fl->mmaps, node) {
1204                         list_del(&buf->node);
1205                         list_add_tail(&buf->node, &fl->cctx->invoke_interrupted_mmaps);
1206                 }
1207         }
1208
1209         if (err)
1210                 dev_dbg(fl->sctx->dev, "Error: Invoke Failed %d\n", err);
1211
1212         return err;
1213 }
1214
1215 static bool is_session_rejected(struct fastrpc_user *fl, bool unsigned_pd_request)
1216 {
1217         /* Check if the device node is non-secure and channel is secure*/
1218         if (!fl->is_secure_dev && fl->cctx->secure) {
1219                 /*
1220                  * Allow untrusted applications to offload only to Unsigned PD when
1221                  * channel is configured as secure and block untrusted apps on channel
1222                  * that does not support unsigned PD offload
1223                  */
1224                 if (!fl->cctx->unsigned_support || !unsigned_pd_request) {
1225                         dev_err(&fl->cctx->rpdev->dev, "Error: Untrusted application trying to offload to signed PD");
1226                         return true;
1227                 }
1228         }
1229
1230         return false;
1231 }
1232
1233 static int fastrpc_init_create_static_process(struct fastrpc_user *fl,
1234                                               char __user *argp)
1235 {
1236         struct fastrpc_init_create_static init;
1237         struct fastrpc_invoke_args *args;
1238         struct fastrpc_phy_page pages[1];
1239         char *name;
1240         int err;
1241         struct {
1242                 int pgid;
1243                 u32 namelen;
1244                 u32 pageslen;
1245         } inbuf;
1246         u32 sc;
1247
1248         args = kcalloc(FASTRPC_CREATE_STATIC_PROCESS_NARGS, sizeof(*args), GFP_KERNEL);
1249         if (!args)
1250                 return -ENOMEM;
1251
1252         if (copy_from_user(&init, argp, sizeof(init))) {
1253                 err = -EFAULT;
1254                 goto err;
1255         }
1256
1257         if (init.namelen > INIT_FILE_NAMELEN_MAX) {
1258                 err = -EINVAL;
1259                 goto err;
1260         }
1261
1262         name = kzalloc(init.namelen, GFP_KERNEL);
1263         if (!name) {
1264                 err = -ENOMEM;
1265                 goto err;
1266         }
1267
1268         if (copy_from_user(name, (void __user *)(uintptr_t)init.name, init.namelen)) {
1269                 err = -EFAULT;
1270                 goto err_name;
1271         }
1272
1273         if (!fl->cctx->remote_heap) {
1274                 err = fastrpc_remote_heap_alloc(fl, fl->sctx->dev, init.memlen,
1275                                                 &fl->cctx->remote_heap);
1276                 if (err)
1277                         goto err_name;
1278
1279                 /* Map if we have any heap VMIDs associated with this ADSP Static Process. */
1280                 if (fl->cctx->vmcount) {
1281                         err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
1282                                                         (u64)fl->cctx->remote_heap->size,
1283                                                         &fl->cctx->perms,
1284                                                         fl->cctx->vmperms, fl->cctx->vmcount);
1285                         if (err) {
1286                                 dev_err(fl->sctx->dev, "Failed to assign memory with phys 0x%llx size 0x%llx err %d",
1287                                         fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);
1288                                 goto err_map;
1289                         }
1290                 }
1291         }
1292
1293         inbuf.pgid = fl->tgid;
1294         inbuf.namelen = init.namelen;
1295         inbuf.pageslen = 0;
1296         fl->pd = USER_PD;
1297
1298         args[0].ptr = (u64)(uintptr_t)&inbuf;
1299         args[0].length = sizeof(inbuf);
1300         args[0].fd = -1;
1301
1302         args[1].ptr = (u64)(uintptr_t)name;
1303         args[1].length = inbuf.namelen;
1304         args[1].fd = -1;
1305
1306         pages[0].addr = fl->cctx->remote_heap->phys;
1307         pages[0].size = fl->cctx->remote_heap->size;
1308
1309         args[2].ptr = (u64)(uintptr_t) pages;
1310         args[2].length = sizeof(*pages);
1311         args[2].fd = -1;
1312
1313         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_STATIC, 3, 0);
1314
1315         err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE,
1316                                       sc, args);
1317         if (err)
1318                 goto err_invoke;
1319
1320         kfree(args);
1321
1322         return 0;
1323 err_invoke:
1324         if (fl->cctx->vmcount) {
1325                 struct qcom_scm_vmperm perm;
1326
1327                 perm.vmid = QCOM_SCM_VMID_HLOS;
1328                 perm.perm = QCOM_SCM_PERM_RWX;
1329                 err = qcom_scm_assign_mem(fl->cctx->remote_heap->phys,
1330                                                 (u64)fl->cctx->remote_heap->size,
1331                                                 &fl->cctx->perms, &perm, 1);
1332                 if (err)
1333                         dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
1334                                 fl->cctx->remote_heap->phys, fl->cctx->remote_heap->size, err);
1335         }
1336 err_map:
1337         fastrpc_buf_free(fl->cctx->remote_heap);
1338 err_name:
1339         kfree(name);
1340 err:
1341         kfree(args);
1342
1343         return err;
1344 }
1345
1346 static int fastrpc_init_create_process(struct fastrpc_user *fl,
1347                                         char __user *argp)
1348 {
1349         struct fastrpc_init_create init;
1350         struct fastrpc_invoke_args *args;
1351         struct fastrpc_phy_page pages[1];
1352         struct fastrpc_map *map = NULL;
1353         struct fastrpc_buf *imem = NULL;
1354         int memlen;
1355         int err;
1356         struct {
1357                 int pgid;
1358                 u32 namelen;
1359                 u32 filelen;
1360                 u32 pageslen;
1361                 u32 attrs;
1362                 u32 siglen;
1363         } inbuf;
1364         u32 sc;
1365         bool unsigned_module = false;
1366
1367         args = kcalloc(FASTRPC_CREATE_PROCESS_NARGS, sizeof(*args), GFP_KERNEL);
1368         if (!args)
1369                 return -ENOMEM;
1370
1371         if (copy_from_user(&init, argp, sizeof(init))) {
1372                 err = -EFAULT;
1373                 goto err;
1374         }
1375
1376         if (init.attrs & FASTRPC_MODE_UNSIGNED_MODULE)
1377                 unsigned_module = true;
1378
1379         if (is_session_rejected(fl, unsigned_module)) {
1380                 err = -ECONNREFUSED;
1381                 goto err;
1382         }
1383
1384         if (init.filelen > INIT_FILELEN_MAX) {
1385                 err = -EINVAL;
1386                 goto err;
1387         }
1388
1389         inbuf.pgid = fl->tgid;
1390         inbuf.namelen = strlen(current->comm) + 1;
1391         inbuf.filelen = init.filelen;
1392         inbuf.pageslen = 1;
1393         inbuf.attrs = init.attrs;
1394         inbuf.siglen = init.siglen;
1395         fl->pd = USER_PD;
1396
1397         if (init.filelen && init.filefd) {
1398                 err = fastrpc_map_create(fl, init.filefd, init.filelen, 0, &map);
1399                 if (err)
1400                         goto err;
1401         }
1402
1403         memlen = ALIGN(max(INIT_FILELEN_MAX, (int)init.filelen * 4),
1404                        1024 * 1024);
1405         err = fastrpc_buf_alloc(fl, fl->sctx->dev, memlen,
1406                                 &imem);
1407         if (err)
1408                 goto err_alloc;
1409
1410         fl->init_mem = imem;
1411         args[0].ptr = (u64)(uintptr_t)&inbuf;
1412         args[0].length = sizeof(inbuf);
1413         args[0].fd = -1;
1414
1415         args[1].ptr = (u64)(uintptr_t)current->comm;
1416         args[1].length = inbuf.namelen;
1417         args[1].fd = -1;
1418
1419         args[2].ptr = (u64) init.file;
1420         args[2].length = inbuf.filelen;
1421         args[2].fd = init.filefd;
1422
1423         pages[0].addr = imem->phys;
1424         pages[0].size = imem->size;
1425
1426         args[3].ptr = (u64)(uintptr_t) pages;
1427         args[3].length = 1 * sizeof(*pages);
1428         args[3].fd = -1;
1429
1430         args[4].ptr = (u64)(uintptr_t)&inbuf.attrs;
1431         args[4].length = sizeof(inbuf.attrs);
1432         args[4].fd = -1;
1433
1434         args[5].ptr = (u64)(uintptr_t) &inbuf.siglen;
1435         args[5].length = sizeof(inbuf.siglen);
1436         args[5].fd = -1;
1437
1438         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE, 4, 0);
1439         if (init.attrs)
1440                 sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_CREATE_ATTR, 6, 0);
1441
1442         err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE,
1443                                       sc, args);
1444         if (err)
1445                 goto err_invoke;
1446
1447         kfree(args);
1448
1449         return 0;
1450
1451 err_invoke:
1452         fl->init_mem = NULL;
1453         fastrpc_buf_free(imem);
1454 err_alloc:
1455         fastrpc_map_put(map);
1456 err:
1457         kfree(args);
1458
1459         return err;
1460 }
1461
1462 static struct fastrpc_session_ctx *fastrpc_session_alloc(
1463                                         struct fastrpc_channel_ctx *cctx)
1464 {
1465         struct fastrpc_session_ctx *session = NULL;
1466         unsigned long flags;
1467         int i;
1468
1469         spin_lock_irqsave(&cctx->lock, flags);
1470         for (i = 0; i < cctx->sesscount; i++) {
1471                 if (!cctx->session[i].used && cctx->session[i].valid) {
1472                         cctx->session[i].used = true;
1473                         session = &cctx->session[i];
1474                         break;
1475                 }
1476         }
1477         spin_unlock_irqrestore(&cctx->lock, flags);
1478
1479         return session;
1480 }
1481
1482 static void fastrpc_session_free(struct fastrpc_channel_ctx *cctx,
1483                                  struct fastrpc_session_ctx *session)
1484 {
1485         unsigned long flags;
1486
1487         spin_lock_irqsave(&cctx->lock, flags);
1488         session->used = false;
1489         spin_unlock_irqrestore(&cctx->lock, flags);
1490 }
1491
1492 static int fastrpc_release_current_dsp_process(struct fastrpc_user *fl)
1493 {
1494         struct fastrpc_invoke_args args[1];
1495         int tgid = 0;
1496         u32 sc;
1497
1498         tgid = fl->tgid;
1499         args[0].ptr = (u64)(uintptr_t) &tgid;
1500         args[0].length = sizeof(tgid);
1501         args[0].fd = -1;
1502         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_RELEASE, 1, 0);
1503
1504         return fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE,
1505                                        sc, &args[0]);
1506 }
1507
1508 static int fastrpc_device_release(struct inode *inode, struct file *file)
1509 {
1510         struct fastrpc_user *fl = (struct fastrpc_user *)file->private_data;
1511         struct fastrpc_channel_ctx *cctx = fl->cctx;
1512         struct fastrpc_invoke_ctx *ctx, *n;
1513         struct fastrpc_map *map, *m;
1514         struct fastrpc_buf *buf, *b;
1515         unsigned long flags;
1516
1517         fastrpc_release_current_dsp_process(fl);
1518
1519         spin_lock_irqsave(&cctx->lock, flags);
1520         list_del(&fl->user);
1521         spin_unlock_irqrestore(&cctx->lock, flags);
1522
1523         if (fl->init_mem)
1524                 fastrpc_buf_free(fl->init_mem);
1525
1526         list_for_each_entry_safe(ctx, n, &fl->pending, node) {
1527                 list_del(&ctx->node);
1528                 fastrpc_context_put(ctx);
1529         }
1530
1531         list_for_each_entry_safe(map, m, &fl->maps, node)
1532                 fastrpc_map_put(map);
1533
1534         list_for_each_entry_safe(buf, b, &fl->mmaps, node) {
1535                 list_del(&buf->node);
1536                 fastrpc_buf_free(buf);
1537         }
1538
1539         fastrpc_session_free(cctx, fl->sctx);
1540         fastrpc_channel_ctx_put(cctx);
1541
1542         mutex_destroy(&fl->mutex);
1543         kfree(fl);
1544         file->private_data = NULL;
1545
1546         return 0;
1547 }
1548
1549 static int fastrpc_device_open(struct inode *inode, struct file *filp)
1550 {
1551         struct fastrpc_channel_ctx *cctx;
1552         struct fastrpc_device *fdevice;
1553         struct fastrpc_user *fl = NULL;
1554         unsigned long flags;
1555
1556         fdevice = miscdev_to_fdevice(filp->private_data);
1557         cctx = fdevice->cctx;
1558
1559         fl = kzalloc(sizeof(*fl), GFP_KERNEL);
1560         if (!fl)
1561                 return -ENOMEM;
1562
1563         /* Released in fastrpc_device_release() */
1564         fastrpc_channel_ctx_get(cctx);
1565
1566         filp->private_data = fl;
1567         spin_lock_init(&fl->lock);
1568         mutex_init(&fl->mutex);
1569         INIT_LIST_HEAD(&fl->pending);
1570         INIT_LIST_HEAD(&fl->maps);
1571         INIT_LIST_HEAD(&fl->mmaps);
1572         INIT_LIST_HEAD(&fl->user);
1573         fl->tgid = current->tgid;
1574         fl->cctx = cctx;
1575         fl->is_secure_dev = fdevice->secure;
1576
1577         fl->sctx = fastrpc_session_alloc(cctx);
1578         if (!fl->sctx) {
1579                 dev_err(&cctx->rpdev->dev, "No session available\n");
1580                 mutex_destroy(&fl->mutex);
1581                 kfree(fl);
1582
1583                 return -EBUSY;
1584         }
1585
1586         spin_lock_irqsave(&cctx->lock, flags);
1587         list_add_tail(&fl->user, &cctx->users);
1588         spin_unlock_irqrestore(&cctx->lock, flags);
1589
1590         return 0;
1591 }
1592
1593 static int fastrpc_dmabuf_alloc(struct fastrpc_user *fl, char __user *argp)
1594 {
1595         struct fastrpc_alloc_dma_buf bp;
1596         DEFINE_DMA_BUF_EXPORT_INFO(exp_info);
1597         struct fastrpc_buf *buf = NULL;
1598         int err;
1599
1600         if (copy_from_user(&bp, argp, sizeof(bp)))
1601                 return -EFAULT;
1602
1603         err = fastrpc_buf_alloc(fl, fl->sctx->dev, bp.size, &buf);
1604         if (err)
1605                 return err;
1606         exp_info.ops = &fastrpc_dma_buf_ops;
1607         exp_info.size = bp.size;
1608         exp_info.flags = O_RDWR;
1609         exp_info.priv = buf;
1610         buf->dmabuf = dma_buf_export(&exp_info);
1611         if (IS_ERR(buf->dmabuf)) {
1612                 err = PTR_ERR(buf->dmabuf);
1613                 fastrpc_buf_free(buf);
1614                 return err;
1615         }
1616
1617         bp.fd = dma_buf_fd(buf->dmabuf, O_ACCMODE);
1618         if (bp.fd < 0) {
1619                 dma_buf_put(buf->dmabuf);
1620                 return -EINVAL;
1621         }
1622
1623         if (copy_to_user(argp, &bp, sizeof(bp))) {
1624                 /*
1625                  * The usercopy failed, but we can't do much about it, as
1626                  * dma_buf_fd() already called fd_install() and made the
1627                  * file descriptor accessible for the current process. It
1628                  * might already be closed and dmabuf no longer valid when
1629                  * we reach this point. Therefore "leak" the fd and rely on
1630                  * the process exit path to do any required cleanup.
1631                  */
1632                 return -EFAULT;
1633         }
1634
1635         return 0;
1636 }
1637
1638 static int fastrpc_init_attach(struct fastrpc_user *fl, int pd)
1639 {
1640         struct fastrpc_invoke_args args[1];
1641         int tgid = fl->tgid;
1642         u32 sc;
1643
1644         args[0].ptr = (u64)(uintptr_t) &tgid;
1645         args[0].length = sizeof(tgid);
1646         args[0].fd = -1;
1647         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_ATTACH, 1, 0);
1648         fl->pd = pd;
1649
1650         return fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE,
1651                                        sc, &args[0]);
1652 }
1653
1654 static int fastrpc_invoke(struct fastrpc_user *fl, char __user *argp)
1655 {
1656         struct fastrpc_invoke_args *args = NULL;
1657         struct fastrpc_invoke inv;
1658         u32 nscalars;
1659         int err;
1660
1661         if (copy_from_user(&inv, argp, sizeof(inv)))
1662                 return -EFAULT;
1663
1664         /* nscalars is truncated here to max supported value */
1665         nscalars = REMOTE_SCALARS_LENGTH(inv.sc);
1666         if (nscalars) {
1667                 args = kcalloc(nscalars, sizeof(*args), GFP_KERNEL);
1668                 if (!args)
1669                         return -ENOMEM;
1670
1671                 if (copy_from_user(args, (void __user *)(uintptr_t)inv.args,
1672                                    nscalars * sizeof(*args))) {
1673                         kfree(args);
1674                         return -EFAULT;
1675                 }
1676         }
1677
1678         err = fastrpc_internal_invoke(fl, false, inv.handle, inv.sc, args);
1679         kfree(args);
1680
1681         return err;
1682 }
1683
1684 static int fastrpc_get_info_from_dsp(struct fastrpc_user *fl, uint32_t *dsp_attr_buf,
1685                                      uint32_t dsp_attr_buf_len)
1686 {
1687         struct fastrpc_invoke_args args[2] = { 0 };
1688
1689         /* Capability filled in userspace */
1690         dsp_attr_buf[0] = 0;
1691
1692         args[0].ptr = (u64)(uintptr_t)&dsp_attr_buf_len;
1693         args[0].length = sizeof(dsp_attr_buf_len);
1694         args[0].fd = -1;
1695         args[1].ptr = (u64)(uintptr_t)&dsp_attr_buf[1];
1696         args[1].length = dsp_attr_buf_len;
1697         args[1].fd = -1;
1698         fl->pd = USER_PD;
1699
1700         return fastrpc_internal_invoke(fl, true, FASTRPC_DSP_UTILITIES_HANDLE,
1701                                        FASTRPC_SCALARS(0, 1, 1), args);
1702 }
1703
1704 static int fastrpc_get_info_from_kernel(struct fastrpc_ioctl_capability *cap,
1705                                         struct fastrpc_user *fl)
1706 {
1707         struct fastrpc_channel_ctx *cctx = fl->cctx;
1708         uint32_t attribute_id = cap->attribute_id;
1709         uint32_t *dsp_attributes;
1710         unsigned long flags;
1711         uint32_t domain = cap->domain;
1712         int err;
1713
1714         spin_lock_irqsave(&cctx->lock, flags);
1715         /* check if we already have queried dsp for attributes */
1716         if (cctx->valid_attributes) {
1717                 spin_unlock_irqrestore(&cctx->lock, flags);
1718                 goto done;
1719         }
1720         spin_unlock_irqrestore(&cctx->lock, flags);
1721
1722         dsp_attributes = kzalloc(FASTRPC_MAX_DSP_ATTRIBUTES_LEN, GFP_KERNEL);
1723         if (!dsp_attributes)
1724                 return -ENOMEM;
1725
1726         err = fastrpc_get_info_from_dsp(fl, dsp_attributes, FASTRPC_MAX_DSP_ATTRIBUTES_LEN);
1727         if (err == DSP_UNSUPPORTED_API) {
1728                 dev_info(&cctx->rpdev->dev,
1729                          "Warning: DSP capabilities not supported on domain: %d\n", domain);
1730                 kfree(dsp_attributes);
1731                 return -EOPNOTSUPP;
1732         } else if (err) {
1733                 dev_err(&cctx->rpdev->dev, "Error: dsp information is incorrect err: %d\n", err);
1734                 kfree(dsp_attributes);
1735                 return err;
1736         }
1737
1738         spin_lock_irqsave(&cctx->lock, flags);
1739         memcpy(cctx->dsp_attributes, dsp_attributes, FASTRPC_MAX_DSP_ATTRIBUTES_LEN);
1740         cctx->valid_attributes = true;
1741         spin_unlock_irqrestore(&cctx->lock, flags);
1742         kfree(dsp_attributes);
1743 done:
1744         cap->capability = cctx->dsp_attributes[attribute_id];
1745         return 0;
1746 }
1747
1748 static int fastrpc_get_dsp_info(struct fastrpc_user *fl, char __user *argp)
1749 {
1750         struct fastrpc_ioctl_capability cap = {0};
1751         int err = 0;
1752
1753         if (copy_from_user(&cap, argp, sizeof(cap)))
1754                 return  -EFAULT;
1755
1756         cap.capability = 0;
1757         if (cap.domain >= FASTRPC_DEV_MAX) {
1758                 dev_err(&fl->cctx->rpdev->dev, "Error: Invalid domain id:%d, err:%d\n",
1759                         cap.domain, err);
1760                 return -ECHRNG;
1761         }
1762
1763         /* Fastrpc Capablities does not support modem domain */
1764         if (cap.domain == MDSP_DOMAIN_ID) {
1765                 dev_err(&fl->cctx->rpdev->dev, "Error: modem not supported %d\n", err);
1766                 return -ECHRNG;
1767         }
1768
1769         if (cap.attribute_id >= FASTRPC_MAX_DSP_ATTRIBUTES) {
1770                 dev_err(&fl->cctx->rpdev->dev, "Error: invalid attribute: %d, err: %d\n",
1771                         cap.attribute_id, err);
1772                 return -EOVERFLOW;
1773         }
1774
1775         err = fastrpc_get_info_from_kernel(&cap, fl);
1776         if (err)
1777                 return err;
1778
1779         if (copy_to_user(argp, &cap.capability, sizeof(cap.capability)))
1780                 return -EFAULT;
1781
1782         return 0;
1783 }
1784
1785 static int fastrpc_req_munmap_impl(struct fastrpc_user *fl, struct fastrpc_buf *buf)
1786 {
1787         struct fastrpc_invoke_args args[1] = { [0] = { 0 } };
1788         struct fastrpc_munmap_req_msg req_msg;
1789         struct device *dev = fl->sctx->dev;
1790         int err;
1791         u32 sc;
1792
1793         req_msg.pgid = fl->tgid;
1794         req_msg.size = buf->size;
1795         req_msg.vaddr = buf->raddr;
1796
1797         args[0].ptr = (u64) (uintptr_t) &req_msg;
1798         args[0].length = sizeof(req_msg);
1799
1800         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_MUNMAP, 1, 0);
1801         err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, sc,
1802                                       &args[0]);
1803         if (!err) {
1804                 dev_dbg(dev, "unmmap\tpt 0x%09lx OK\n", buf->raddr);
1805                 spin_lock(&fl->lock);
1806                 list_del(&buf->node);
1807                 spin_unlock(&fl->lock);
1808                 fastrpc_buf_free(buf);
1809         } else {
1810                 dev_err(dev, "unmmap\tpt 0x%09lx ERROR\n", buf->raddr);
1811         }
1812
1813         return err;
1814 }
1815
1816 static int fastrpc_req_munmap(struct fastrpc_user *fl, char __user *argp)
1817 {
1818         struct fastrpc_buf *buf = NULL, *iter, *b;
1819         struct fastrpc_req_munmap req;
1820         struct device *dev = fl->sctx->dev;
1821
1822         if (copy_from_user(&req, argp, sizeof(req)))
1823                 return -EFAULT;
1824
1825         spin_lock(&fl->lock);
1826         list_for_each_entry_safe(iter, b, &fl->mmaps, node) {
1827                 if ((iter->raddr == req.vaddrout) && (iter->size == req.size)) {
1828                         buf = iter;
1829                         break;
1830                 }
1831         }
1832         spin_unlock(&fl->lock);
1833
1834         if (!buf) {
1835                 dev_err(dev, "mmap\t\tpt 0x%09llx [len 0x%08llx] not in list\n",
1836                         req.vaddrout, req.size);
1837                 return -EINVAL;
1838         }
1839
1840         return fastrpc_req_munmap_impl(fl, buf);
1841 }
1842
1843 static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp)
1844 {
1845         struct fastrpc_invoke_args args[3] = { [0 ... 2] = { 0 } };
1846         struct fastrpc_buf *buf = NULL;
1847         struct fastrpc_mmap_req_msg req_msg;
1848         struct fastrpc_mmap_rsp_msg rsp_msg;
1849         struct fastrpc_phy_page pages;
1850         struct fastrpc_req_mmap req;
1851         struct device *dev = fl->sctx->dev;
1852         int err;
1853         u32 sc;
1854
1855         if (copy_from_user(&req, argp, sizeof(req)))
1856                 return -EFAULT;
1857
1858         if (req.flags != ADSP_MMAP_ADD_PAGES && req.flags != ADSP_MMAP_REMOTE_HEAP_ADDR) {
1859                 dev_err(dev, "flag not supported 0x%x\n", req.flags);
1860
1861                 return -EINVAL;
1862         }
1863
1864         if (req.vaddrin) {
1865                 dev_err(dev, "adding user allocated pages is not supported\n");
1866                 return -EINVAL;
1867         }
1868
1869         err = fastrpc_buf_alloc(fl, fl->sctx->dev, req.size, &buf);
1870         if (err) {
1871                 dev_err(dev, "failed to allocate buffer\n");
1872                 return err;
1873         }
1874
1875         req_msg.pgid = fl->tgid;
1876         req_msg.flags = req.flags;
1877         req_msg.vaddr = req.vaddrin;
1878         req_msg.num = sizeof(pages);
1879
1880         args[0].ptr = (u64) (uintptr_t) &req_msg;
1881         args[0].length = sizeof(req_msg);
1882
1883         pages.addr = buf->phys;
1884         pages.size = buf->size;
1885
1886         args[1].ptr = (u64) (uintptr_t) &pages;
1887         args[1].length = sizeof(pages);
1888
1889         args[2].ptr = (u64) (uintptr_t) &rsp_msg;
1890         args[2].length = sizeof(rsp_msg);
1891
1892         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_MMAP, 2, 1);
1893         err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, sc,
1894                                       &args[0]);
1895         if (err) {
1896                 dev_err(dev, "mmap error (len 0x%08llx)\n", buf->size);
1897                 goto err_invoke;
1898         }
1899
1900         /* update the buffer to be able to deallocate the memory on the DSP */
1901         buf->raddr = (uintptr_t) rsp_msg.vaddr;
1902
1903         /* let the client know the address to use */
1904         req.vaddrout = rsp_msg.vaddr;
1905
1906         /* Add memory to static PD pool, protection thru hypervisor */
1907         if (req.flags == ADSP_MMAP_REMOTE_HEAP_ADDR && fl->cctx->vmcount) {
1908                 struct qcom_scm_vmperm perm;
1909
1910                 perm.vmid = QCOM_SCM_VMID_HLOS;
1911                 perm.perm = QCOM_SCM_PERM_RWX;
1912                 err = qcom_scm_assign_mem(buf->phys, buf->size,
1913                         &fl->cctx->perms, &perm, 1);
1914                 if (err) {
1915                         dev_err(fl->sctx->dev, "Failed to assign memory phys 0x%llx size 0x%llx err %d",
1916                                         buf->phys, buf->size, err);
1917                         goto err_assign;
1918                 }
1919         }
1920
1921         spin_lock(&fl->lock);
1922         list_add_tail(&buf->node, &fl->mmaps);
1923         spin_unlock(&fl->lock);
1924
1925         if (copy_to_user((void __user *)argp, &req, sizeof(req))) {
1926                 err = -EFAULT;
1927                 goto err_assign;
1928         }
1929
1930         dev_dbg(dev, "mmap\t\tpt 0x%09lx OK [len 0x%08llx]\n",
1931                 buf->raddr, buf->size);
1932
1933         return 0;
1934
1935 err_assign:
1936         fastrpc_req_munmap_impl(fl, buf);
1937 err_invoke:
1938         fastrpc_buf_free(buf);
1939
1940         return err;
1941 }
1942
1943 static int fastrpc_req_mem_unmap_impl(struct fastrpc_user *fl, struct fastrpc_mem_unmap *req)
1944 {
1945         struct fastrpc_invoke_args args[1] = { [0] = { 0 } };
1946         struct fastrpc_map *map = NULL, *iter, *m;
1947         struct fastrpc_mem_unmap_req_msg req_msg = { 0 };
1948         int err = 0;
1949         u32 sc;
1950         struct device *dev = fl->sctx->dev;
1951
1952         spin_lock(&fl->lock);
1953         list_for_each_entry_safe(iter, m, &fl->maps, node) {
1954                 if ((req->fd < 0 || iter->fd == req->fd) && (iter->raddr == req->vaddr)) {
1955                         map = iter;
1956                         break;
1957                 }
1958         }
1959
1960         spin_unlock(&fl->lock);
1961
1962         if (!map) {
1963                 dev_err(dev, "map not in list\n");
1964                 return -EINVAL;
1965         }
1966
1967         req_msg.pgid = fl->tgid;
1968         req_msg.len = map->len;
1969         req_msg.vaddrin = map->raddr;
1970         req_msg.fd = map->fd;
1971
1972         args[0].ptr = (u64) (uintptr_t) &req_msg;
1973         args[0].length = sizeof(req_msg);
1974
1975         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_MEM_UNMAP, 1, 0);
1976         err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, sc,
1977                                       &args[0]);
1978         fastrpc_map_put(map);
1979         if (err)
1980                 dev_err(dev, "unmmap\tpt fd = %d, 0x%09llx error\n",  map->fd, map->raddr);
1981
1982         return err;
1983 }
1984
1985 static int fastrpc_req_mem_unmap(struct fastrpc_user *fl, char __user *argp)
1986 {
1987         struct fastrpc_mem_unmap req;
1988
1989         if (copy_from_user(&req, argp, sizeof(req)))
1990                 return -EFAULT;
1991
1992         return fastrpc_req_mem_unmap_impl(fl, &req);
1993 }
1994
1995 static int fastrpc_req_mem_map(struct fastrpc_user *fl, char __user *argp)
1996 {
1997         struct fastrpc_invoke_args args[4] = { [0 ... 3] = { 0 } };
1998         struct fastrpc_mem_map_req_msg req_msg = { 0 };
1999         struct fastrpc_mmap_rsp_msg rsp_msg = { 0 };
2000         struct fastrpc_mem_unmap req_unmap = { 0 };
2001         struct fastrpc_phy_page pages = { 0 };
2002         struct fastrpc_mem_map req;
2003         struct device *dev = fl->sctx->dev;
2004         struct fastrpc_map *map = NULL;
2005         int err;
2006         u32 sc;
2007
2008         if (copy_from_user(&req, argp, sizeof(req)))
2009                 return -EFAULT;
2010
2011         /* create SMMU mapping */
2012         err = fastrpc_map_create(fl, req.fd, req.length, 0, &map);
2013         if (err) {
2014                 dev_err(dev, "failed to map buffer, fd = %d\n", req.fd);
2015                 return err;
2016         }
2017
2018         req_msg.pgid = fl->tgid;
2019         req_msg.fd = req.fd;
2020         req_msg.offset = req.offset;
2021         req_msg.vaddrin = req.vaddrin;
2022         map->va = (void *) (uintptr_t) req.vaddrin;
2023         req_msg.flags = req.flags;
2024         req_msg.num = sizeof(pages);
2025         req_msg.data_len = 0;
2026
2027         args[0].ptr = (u64) (uintptr_t) &req_msg;
2028         args[0].length = sizeof(req_msg);
2029
2030         pages.addr = map->phys;
2031         pages.size = map->size;
2032
2033         args[1].ptr = (u64) (uintptr_t) &pages;
2034         args[1].length = sizeof(pages);
2035
2036         args[2].ptr = (u64) (uintptr_t) &pages;
2037         args[2].length = 0;
2038
2039         args[3].ptr = (u64) (uintptr_t) &rsp_msg;
2040         args[3].length = sizeof(rsp_msg);
2041
2042         sc = FASTRPC_SCALARS(FASTRPC_RMID_INIT_MEM_MAP, 3, 1);
2043         err = fastrpc_internal_invoke(fl, true, FASTRPC_INIT_HANDLE, sc, &args[0]);
2044         if (err) {
2045                 dev_err(dev, "mem mmap error, fd %d, vaddr %llx, size %lld\n",
2046                         req.fd, req.vaddrin, map->size);
2047                 goto err_invoke;
2048         }
2049
2050         /* update the buffer to be able to deallocate the memory on the DSP */
2051         map->raddr = rsp_msg.vaddr;
2052
2053         /* let the client know the address to use */
2054         req.vaddrout = rsp_msg.vaddr;
2055
2056         if (copy_to_user((void __user *)argp, &req, sizeof(req))) {
2057                 /* unmap the memory and release the buffer */
2058                 req_unmap.vaddr = (uintptr_t) rsp_msg.vaddr;
2059                 req_unmap.length = map->size;
2060                 fastrpc_req_mem_unmap_impl(fl, &req_unmap);
2061                 return -EFAULT;
2062         }
2063
2064         return 0;
2065
2066 err_invoke:
2067         fastrpc_map_put(map);
2068
2069         return err;
2070 }
2071
2072 static long fastrpc_device_ioctl(struct file *file, unsigned int cmd,
2073                                  unsigned long arg)
2074 {
2075         struct fastrpc_user *fl = (struct fastrpc_user *)file->private_data;
2076         char __user *argp = (char __user *)arg;
2077         int err;
2078
2079         switch (cmd) {
2080         case FASTRPC_IOCTL_INVOKE:
2081                 err = fastrpc_invoke(fl, argp);
2082                 break;
2083         case FASTRPC_IOCTL_INIT_ATTACH:
2084                 err = fastrpc_init_attach(fl, ROOT_PD);
2085                 break;
2086         case FASTRPC_IOCTL_INIT_ATTACH_SNS:
2087                 err = fastrpc_init_attach(fl, SENSORS_PD);
2088                 break;
2089         case FASTRPC_IOCTL_INIT_CREATE_STATIC:
2090                 err = fastrpc_init_create_static_process(fl, argp);
2091                 break;
2092         case FASTRPC_IOCTL_INIT_CREATE:
2093                 err = fastrpc_init_create_process(fl, argp);
2094                 break;
2095         case FASTRPC_IOCTL_ALLOC_DMA_BUFF:
2096                 err = fastrpc_dmabuf_alloc(fl, argp);
2097                 break;
2098         case FASTRPC_IOCTL_MMAP:
2099                 err = fastrpc_req_mmap(fl, argp);
2100                 break;
2101         case FASTRPC_IOCTL_MUNMAP:
2102                 err = fastrpc_req_munmap(fl, argp);
2103                 break;
2104         case FASTRPC_IOCTL_MEM_MAP:
2105                 err = fastrpc_req_mem_map(fl, argp);
2106                 break;
2107         case FASTRPC_IOCTL_MEM_UNMAP:
2108                 err = fastrpc_req_mem_unmap(fl, argp);
2109                 break;
2110         case FASTRPC_IOCTL_GET_DSP_INFO:
2111                 err = fastrpc_get_dsp_info(fl, argp);
2112                 break;
2113         default:
2114                 err = -ENOTTY;
2115                 break;
2116         }
2117
2118         return err;
2119 }
2120
2121 static const struct file_operations fastrpc_fops = {
2122         .open = fastrpc_device_open,
2123         .release = fastrpc_device_release,
2124         .unlocked_ioctl = fastrpc_device_ioctl,
2125         .compat_ioctl = fastrpc_device_ioctl,
2126 };
2127
2128 static int fastrpc_cb_probe(struct platform_device *pdev)
2129 {
2130         struct fastrpc_channel_ctx *cctx;
2131         struct fastrpc_session_ctx *sess;
2132         struct device *dev = &pdev->dev;
2133         int i, sessions = 0;
2134         unsigned long flags;
2135         int rc;
2136
2137         cctx = dev_get_drvdata(dev->parent);
2138         if (!cctx)
2139                 return -EINVAL;
2140
2141         of_property_read_u32(dev->of_node, "qcom,nsessions", &sessions);
2142
2143         spin_lock_irqsave(&cctx->lock, flags);
2144         if (cctx->sesscount >= FASTRPC_MAX_SESSIONS) {
2145                 dev_err(&pdev->dev, "too many sessions\n");
2146                 spin_unlock_irqrestore(&cctx->lock, flags);
2147                 return -ENOSPC;
2148         }
2149         sess = &cctx->session[cctx->sesscount++];
2150         sess->used = false;
2151         sess->valid = true;
2152         sess->dev = dev;
2153         dev_set_drvdata(dev, sess);
2154
2155         if (of_property_read_u32(dev->of_node, "reg", &sess->sid))
2156                 dev_info(dev, "FastRPC Session ID not specified in DT\n");
2157
2158         if (sessions > 0) {
2159                 struct fastrpc_session_ctx *dup_sess;
2160
2161                 for (i = 1; i < sessions; i++) {
2162                         if (cctx->sesscount >= FASTRPC_MAX_SESSIONS)
2163                                 break;
2164                         dup_sess = &cctx->session[cctx->sesscount++];
2165                         memcpy(dup_sess, sess, sizeof(*dup_sess));
2166                 }
2167         }
2168         spin_unlock_irqrestore(&cctx->lock, flags);
2169         rc = dma_set_mask(dev, DMA_BIT_MASK(32));
2170         if (rc) {
2171                 dev_err(dev, "32-bit DMA enable failed\n");
2172                 return rc;
2173         }
2174
2175         return 0;
2176 }
2177
2178 static int fastrpc_cb_remove(struct platform_device *pdev)
2179 {
2180         struct fastrpc_channel_ctx *cctx = dev_get_drvdata(pdev->dev.parent);
2181         struct fastrpc_session_ctx *sess = dev_get_drvdata(&pdev->dev);
2182         unsigned long flags;
2183         int i;
2184
2185         spin_lock_irqsave(&cctx->lock, flags);
2186         for (i = 1; i < FASTRPC_MAX_SESSIONS; i++) {
2187                 if (cctx->session[i].sid == sess->sid) {
2188                         cctx->session[i].valid = false;
2189                         cctx->sesscount--;
2190                 }
2191         }
2192         spin_unlock_irqrestore(&cctx->lock, flags);
2193
2194         return 0;
2195 }
2196
2197 static const struct of_device_id fastrpc_match_table[] = {
2198         { .compatible = "qcom,fastrpc-compute-cb", },
2199         {}
2200 };
2201
2202 static struct platform_driver fastrpc_cb_driver = {
2203         .probe = fastrpc_cb_probe,
2204         .remove = fastrpc_cb_remove,
2205         .driver = {
2206                 .name = "qcom,fastrpc-cb",
2207                 .of_match_table = fastrpc_match_table,
2208                 .suppress_bind_attrs = true,
2209         },
2210 };
2211
2212 static int fastrpc_device_register(struct device *dev, struct fastrpc_channel_ctx *cctx,
2213                                    bool is_secured, const char *domain)
2214 {
2215         struct fastrpc_device *fdev;
2216         int err;
2217
2218         fdev = devm_kzalloc(dev, sizeof(*fdev), GFP_KERNEL);
2219         if (!fdev)
2220                 return -ENOMEM;
2221
2222         fdev->secure = is_secured;
2223         fdev->cctx = cctx;
2224         fdev->miscdev.minor = MISC_DYNAMIC_MINOR;
2225         fdev->miscdev.fops = &fastrpc_fops;
2226         fdev->miscdev.name = devm_kasprintf(dev, GFP_KERNEL, "fastrpc-%s%s",
2227                                             domain, is_secured ? "-secure" : "");
2228         err = misc_register(&fdev->miscdev);
2229         if (!err) {
2230                 if (is_secured)
2231                         cctx->secure_fdevice = fdev;
2232                 else
2233                         cctx->fdevice = fdev;
2234         }
2235
2236         return err;
2237 }
2238
2239 static int fastrpc_rpmsg_probe(struct rpmsg_device *rpdev)
2240 {
2241         struct device *rdev = &rpdev->dev;
2242         struct fastrpc_channel_ctx *data;
2243         int i, err, domain_id = -1, vmcount;
2244         const char *domain;
2245         bool secure_dsp;
2246         unsigned int vmids[FASTRPC_MAX_VMIDS];
2247
2248         err = of_property_read_string(rdev->of_node, "label", &domain);
2249         if (err) {
2250                 dev_info(rdev, "FastRPC Domain not specified in DT\n");
2251                 return err;
2252         }
2253
2254         for (i = 0; i <= CDSP_DOMAIN_ID; i++) {
2255                 if (!strcmp(domains[i], domain)) {
2256                         domain_id = i;
2257                         break;
2258                 }
2259         }
2260
2261         if (domain_id < 0) {
2262                 dev_info(rdev, "FastRPC Invalid Domain ID %d\n", domain_id);
2263                 return -EINVAL;
2264         }
2265
2266         if (of_reserved_mem_device_init_by_idx(rdev, rdev->of_node, 0))
2267                 dev_info(rdev, "no reserved DMA memory for FASTRPC\n");
2268
2269         vmcount = of_property_read_variable_u32_array(rdev->of_node,
2270                                 "qcom,vmids", &vmids[0], 0, FASTRPC_MAX_VMIDS);
2271         if (vmcount < 0)
2272                 vmcount = 0;
2273         else if (!qcom_scm_is_available())
2274                 return -EPROBE_DEFER;
2275
2276         data = kzalloc(sizeof(*data), GFP_KERNEL);
2277         if (!data)
2278                 return -ENOMEM;
2279
2280         if (vmcount) {
2281                 data->vmcount = vmcount;
2282                 data->perms = BIT(QCOM_SCM_VMID_HLOS);
2283                 for (i = 0; i < data->vmcount; i++) {
2284                         data->vmperms[i].vmid = vmids[i];
2285                         data->vmperms[i].perm = QCOM_SCM_PERM_RWX;
2286                 }
2287         }
2288
2289         secure_dsp = !(of_property_read_bool(rdev->of_node, "qcom,non-secure-domain"));
2290         data->secure = secure_dsp;
2291
2292         switch (domain_id) {
2293         case ADSP_DOMAIN_ID:
2294         case MDSP_DOMAIN_ID:
2295         case SDSP_DOMAIN_ID:
2296                 /* Unsigned PD offloading is only supported on CDSP*/
2297                 data->unsigned_support = false;
2298                 err = fastrpc_device_register(rdev, data, secure_dsp, domains[domain_id]);
2299                 if (err)
2300                         goto fdev_error;
2301                 break;
2302         case CDSP_DOMAIN_ID:
2303                 data->unsigned_support = true;
2304                 /* Create both device nodes so that we can allow both Signed and Unsigned PD */
2305                 err = fastrpc_device_register(rdev, data, true, domains[domain_id]);
2306                 if (err)
2307                         goto fdev_error;
2308
2309                 err = fastrpc_device_register(rdev, data, false, domains[domain_id]);
2310                 if (err)
2311                         goto fdev_error;
2312                 break;
2313         default:
2314                 err = -EINVAL;
2315                 goto fdev_error;
2316         }
2317
2318         kref_init(&data->refcount);
2319
2320         dev_set_drvdata(&rpdev->dev, data);
2321         rdev->dma_mask = &data->dma_mask;
2322         dma_set_mask_and_coherent(rdev, DMA_BIT_MASK(32));
2323         INIT_LIST_HEAD(&data->users);
2324         INIT_LIST_HEAD(&data->invoke_interrupted_mmaps);
2325         spin_lock_init(&data->lock);
2326         idr_init(&data->ctx_idr);
2327         data->domain_id = domain_id;
2328         data->rpdev = rpdev;
2329
2330         err = of_platform_populate(rdev->of_node, NULL, NULL, rdev);
2331         if (err)
2332                 goto populate_error;
2333
2334         return 0;
2335
2336 populate_error:
2337         if (data->fdevice)
2338                 misc_deregister(&data->fdevice->miscdev);
2339         if (data->secure_fdevice)
2340                 misc_deregister(&data->secure_fdevice->miscdev);
2341
2342 fdev_error:
2343         kfree(data);
2344         return err;
2345 }
2346
2347 static void fastrpc_notify_users(struct fastrpc_user *user)
2348 {
2349         struct fastrpc_invoke_ctx *ctx;
2350
2351         spin_lock(&user->lock);
2352         list_for_each_entry(ctx, &user->pending, node) {
2353                 ctx->retval = -EPIPE;
2354                 complete(&ctx->work);
2355         }
2356         spin_unlock(&user->lock);
2357 }
2358
2359 static void fastrpc_rpmsg_remove(struct rpmsg_device *rpdev)
2360 {
2361         struct fastrpc_channel_ctx *cctx = dev_get_drvdata(&rpdev->dev);
2362         struct fastrpc_buf *buf, *b;
2363         struct fastrpc_user *user;
2364         unsigned long flags;
2365
2366         /* No invocations past this point */
2367         spin_lock_irqsave(&cctx->lock, flags);
2368         cctx->rpdev = NULL;
2369         list_for_each_entry(user, &cctx->users, user)
2370                 fastrpc_notify_users(user);
2371         spin_unlock_irqrestore(&cctx->lock, flags);
2372
2373         if (cctx->fdevice)
2374                 misc_deregister(&cctx->fdevice->miscdev);
2375
2376         if (cctx->secure_fdevice)
2377                 misc_deregister(&cctx->secure_fdevice->miscdev);
2378
2379         list_for_each_entry_safe(buf, b, &cctx->invoke_interrupted_mmaps, node)
2380                 list_del(&buf->node);
2381
2382         if (cctx->remote_heap)
2383                 fastrpc_buf_free(cctx->remote_heap);
2384
2385         of_platform_depopulate(&rpdev->dev);
2386
2387         fastrpc_channel_ctx_put(cctx);
2388 }
2389
2390 static int fastrpc_rpmsg_callback(struct rpmsg_device *rpdev, void *data,
2391                                   int len, void *priv, u32 addr)
2392 {
2393         struct fastrpc_channel_ctx *cctx = dev_get_drvdata(&rpdev->dev);
2394         struct fastrpc_invoke_rsp *rsp = data;
2395         struct fastrpc_invoke_ctx *ctx;
2396         unsigned long flags;
2397         unsigned long ctxid;
2398
2399         if (len < sizeof(*rsp))
2400                 return -EINVAL;
2401
2402         ctxid = ((rsp->ctx & FASTRPC_CTXID_MASK) >> 4);
2403
2404         spin_lock_irqsave(&cctx->lock, flags);
2405         ctx = idr_find(&cctx->ctx_idr, ctxid);
2406         spin_unlock_irqrestore(&cctx->lock, flags);
2407
2408         if (!ctx) {
2409                 dev_err(&rpdev->dev, "No context ID matches response\n");
2410                 return -ENOENT;
2411         }
2412
2413         ctx->retval = rsp->retval;
2414         complete(&ctx->work);
2415
2416         /*
2417          * The DMA buffer associated with the context cannot be freed in
2418          * interrupt context so schedule it through a worker thread to
2419          * avoid a kernel BUG.
2420          */
2421         schedule_work(&ctx->put_work);
2422
2423         return 0;
2424 }
2425
2426 static const struct of_device_id fastrpc_rpmsg_of_match[] = {
2427         { .compatible = "qcom,fastrpc" },
2428         { },
2429 };
2430 MODULE_DEVICE_TABLE(of, fastrpc_rpmsg_of_match);
2431
2432 static struct rpmsg_driver fastrpc_driver = {
2433         .probe = fastrpc_rpmsg_probe,
2434         .remove = fastrpc_rpmsg_remove,
2435         .callback = fastrpc_rpmsg_callback,
2436         .drv = {
2437                 .name = "qcom,fastrpc",
2438                 .of_match_table = fastrpc_rpmsg_of_match,
2439         },
2440 };
2441
2442 static int fastrpc_init(void)
2443 {
2444         int ret;
2445
2446         ret = platform_driver_register(&fastrpc_cb_driver);
2447         if (ret < 0) {
2448                 pr_err("fastrpc: failed to register cb driver\n");
2449                 return ret;
2450         }
2451
2452         ret = register_rpmsg_driver(&fastrpc_driver);
2453         if (ret < 0) {
2454                 pr_err("fastrpc: failed to register rpmsg driver\n");
2455                 platform_driver_unregister(&fastrpc_cb_driver);
2456                 return ret;
2457         }
2458
2459         return 0;
2460 }
2461 module_init(fastrpc_init);
2462
2463 static void fastrpc_exit(void)
2464 {
2465         platform_driver_unregister(&fastrpc_cb_driver);
2466         unregister_rpmsg_driver(&fastrpc_driver);
2467 }
2468 module_exit(fastrpc_exit);
2469
2470 MODULE_LICENSE("GPL v2");
2471 MODULE_IMPORT_NS(DMA_BUF);