RE: [PATCH v3 11/13] remoteproc: create vdev subdevice with specific dma memory pool
From: Loic PALLARDY
Date: Mon May 14 2018 - 11:57:20 EST
> -----Original Message-----
> From: Bjorn Andersson [mailto:bjorn.andersson@xxxxxxxxxx]
> Sent: Thursday, May 10, 2018 3:06 AM
> To: Loic PALLARDY <loic.pallardy@xxxxxx>
> Cc: ohad@xxxxxxxxxx; linux-remoteproc@xxxxxxxxxxxxxxx; linux-
> kernel@xxxxxxxxxxxxxxx; Arnaud POULIQUEN <arnaud.pouliquen@xxxxxx>;
> benjamin.gaignard@xxxxxxxxxx
> Subject: Re: [PATCH v3 11/13] remoteproc: create vdev subdevice with
> specific dma memory pool
>
> On Thu 01 Mar 08:23 PST 2018, Loic Pallardy wrote:
> > @@ -479,6 +481,41 @@ static int rproc_handle_vdev(struct rproc *rproc,
> struct fw_rsc_vdev *rsc,
> > goto unwind_vring_allocations;
> > }
> >
> > + /* Initialise vdev subdevice */
> > + snprintf(name, sizeof(name), "vdev%dbuffer", rvdev->index);
> > + rvdev->dev.parent = rproc->dev.parent;
> > + dev_set_name(&rvdev->dev, "%s#%s", dev_name(rvdev-
> >dev.parent), name);
> > + dev_set_drvdata(&rvdev->dev, rvdev);
> > + dma_set_coherent_mask(&rvdev->dev, DMA_BIT_MASK(32));
> > +
> > + ret = device_register(&rvdev->dev);
> > + if (ret)
> > + goto unwind_vring_allocations;
> > +
> > + /* Try to find dedicated vdev buffer carveout */
> > + carveout = rproc_find_carveout_by_name(rproc, name);
> > +
> > + if (carveout) {
> > + phys_addr_t pa;
> > +
> > + if (carveout->va) {
> > + dev_warn(dev, "vdev %d buffer carveout already
> mapped\n",
> > + rvdev->index);
> > + pa = rproc_va_to_pa(carveout->va);
> > + } else {
> > + /* Use dma address as carveout no memmapped yet
> */
> > + pa = (phys_addr_t)carveout->dma;
> > + }
> > +
> > + /* Associate vdev buffer memory pool to vdev subdevice */
> > + ret = dmam_declare_coherent_memory(&rvdev->dev, pa,
> > + carveout->da,
> > + carveout->len,
> > +
> DMA_MEMORY_EXCLUSIVE);
> > + if (ret < 0)
> > + goto unregister_device;
> > + }
> > +
>
> So with this there will be one more device between rproc->dev and the
> virtio dev, for the sake of memory management. So e.g. a rpmsg device
> will still need to allocate memory from dev->parent->parent; which now
> possibly has a specific dma_mem.
Yes it is a new sub device between virtio dev and rproc dev, but this device owns memory region dedicated to this vdev
So, rpmsg device will allocate from dev->parent, not from dev->parent->parent.
>
> Is it not possible to assign the memory to the vdev->dev and allow the
> virtio devices can allocate memory from their parent device?
No sure to catch your point.
Who should be the parent device? Rproc dev itself? Doesn't fit well if you want to handle 2 different vdev with specific memory region for each of them.
Regards,
Loic
>
> Regards,
> Bjorn