On Tue, Dec 30, 2025 at 04:32:25PM +0530, Ekansh Gupta wrote: > Currently, FastRPC only supports mapping buffers allocated by the > kernel. This limits flexibility for applications that allocate memory > in userspace using rpcmem or DMABUF and need to share it with the DSP.
Hmm, for DMABUF we need _import_ support rather than support for mapping of userspace-allocated buffers. > Add support for mapping and unmapping userspace-allocated buffers to > the DSP through SMMU. This includes handling map requests for rpcmem > and DMABUF-backed memory and providing corresponding unmap > functionality. For me this definitely looks like a step back. For drm/accel we are going to have GEM-managed buffers only. Why do we need to handle userspace-allocated buffers here? > > Signed-off-by: Ekansh Gupta <[email protected]> > --- > drivers/misc/fastrpc.c | 97 +++++++++++++++++++++++++++++++++++++----- > 1 file changed, 86 insertions(+), 11 deletions(-) > > @@ -1989,25 +2020,69 @@ static int fastrpc_req_buf_alloc(struct fastrpc_user > *fl, > return err; > } > > -static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp) > +static int fastrpc_req_map_create(struct fastrpc_user *fl, > + struct fastrpc_req_mmap req, > + char __user *argp) > { > - struct fastrpc_req_mmap req; > + struct fastrpc_map *map = NULL; > + struct device *dev = fl->sctx->dev; > + u64 raddr = 0; > int err; > > - if (copy_from_user(&req, argp, sizeof(req))) > - return -EFAULT; > + err = fastrpc_map_create(fl, req.fd, req.size, 0, &map); > + if (err) { > + dev_err(dev, "failed to map buffer, fd = %d\n", req.fd); > + return err; > + } > + > + err = fastrpc_req_map_dsp(fl, map->phys, map->size, req.flags, > + req.vaddrin, &raddr); > + if (err) > + goto err_invoke; > > - if (req.flags != ADSP_MMAP_ADD_PAGES && req.flags != > ADSP_MMAP_REMOTE_HEAP_ADDR) { > - dev_err(fl->sctx->dev, "flag not supported 0x%x\n", req.flags); > + /* update the buffer to be able to deallocate the memory on the DSP */ > + map->raddr = (u64)raddr; Which type are you converting? And why? > > - return -EINVAL; > + /* let the client know the address to use */ > + req.vaddrout = raddr; > + dev_dbg(dev, "mmap OK: raddr=%p [len=0x%08llx]\n", > + (void *)(unsigned long)map->raddr, map->size); > + > + if (copy_to_user(argp, &req, sizeof(req))) { > + err = -EFAULT; > + goto err_copy; > } > > - err = fastrpc_req_buf_alloc(fl, req, argp); > + return 0; > +err_copy: > + fastrpc_req_munmap_dsp(fl, map->raddr, map->size); > +err_invoke: > + fastrpc_map_put(map); > > return err; > } > > +static int fastrpc_req_mmap(struct fastrpc_user *fl, char __user *argp) > +{ > + struct fastrpc_req_mmap req; > + int err; > + > + if (copy_from_user(&req, argp, sizeof(req))) > + return -EFAULT; > + > + if ((req.flags == ADSP_MMAP_ADD_PAGES || > + req.flags == ADSP_MMAP_REMOTE_HEAP_ADDR)) { Side note: why are these flags not defined in the uABI header? > + err = fastrpc_req_buf_alloc(fl, req, argp); > + if (err) > + return err; -- With best wishes Dmitry
