On 12/07/2016 02:35 PM, Loic Pallardy wrote: > Low level platform specific driver has the knowledge of the different > communication link constraints like fixed or secured memory region to > use for buffer allocation. > > If virtual address is defined in virtio_rpmsg_cfg structure, a dedicated > memory pool buffer fitting platform requirements is available. > Rpmsg virtio layer should rely on it if its size is compliant with link > characteristics. > > Signed-off-by: Loic Pallardy <loic.pallardy@xxxxxx> > --- > drivers/rpmsg/virtio_rpmsg_bus.c | 54 ++++++++++++++++++++++++++-------------- > 1 file changed, 36 insertions(+), 18 deletions(-) > > diff --git a/drivers/rpmsg/virtio_rpmsg_bus.c b/drivers/rpmsg/virtio_rpmsg_bus.c > index 1a97af8..b12fe2a 100644 > --- a/drivers/rpmsg/virtio_rpmsg_bus.c > +++ b/drivers/rpmsg/virtio_rpmsg_bus.c > @@ -57,6 +57,7 @@ > * @sendq: wait queue of sending contexts waiting for a tx buffers > * @sleepers: number of senders that are waiting for a tx buffer > * @ns_ept: the bus's name service endpoint > + * @ext_buffer: buffer allocated by low level driver > * > * This structure stores the rpmsg state of a given virtio remote processor > * device (there might be several virtio proc devices for each physical > @@ -76,6 +77,7 @@ struct virtproc_info { > wait_queue_head_t sendq; > atomic_t sleepers; > struct rpmsg_endpoint *ns_ept; > + bool ext_buffer; > }; > > /* The feature bitmap for virtio rpmsg */ > @@ -904,6 +906,17 @@ static int virtio_rpmsg_get_config(struct virtio_device *vdev) > ret = -ENOMEM; > goto out; > } > + > + /* Level platform specific buffer driver ? */ > + if (virtio_cfg.va != -1) { > + vrp->ext_buffer = true; > + /* half of the buffers is dedicated for RX */ > + vrp->rbufs = (void *)(uintptr_t)virtio_cfg.va; > + > + /* and half is dedicated for TX */ > + vrp->sbufs = (void *)(uintptr_t) virtio_cfg.va + total_buf_space / 2; > + } > + > return !ret; > } > out: > @@ -960,24 +973,27 @@ static int rpmsg_probe(struct virtio_device *vdev) > if (err < 0) > goto free_vrp; > > - total_buf_space = vrp->num_bufs * vrp->buf_size; > + /* Allocate buffer if none provided by low level platform driver */ > + if (!vrp->ext_buffer) { > + total_buf_space = vrp->num_bufs * vrp->buf_size; > > - bufs_va = dma_alloc_coherent(vdev->dev.parent->parent, > - total_buf_space, &vrp->bufs_dma, > - GFP_KERNEL); > - if (!bufs_va) { > - err = -ENOMEM; > - goto vqs_del; > - } > + bufs_va = dma_alloc_coherent(vdev->dev.parent->parent, > + total_buf_space, &vrp->bufs_dma, > + GFP_KERNEL); Can you run checkpatch with --strict when you resubmit the series, I believe a few have been introduced that weren't there before. regards Suman > + if (!bufs_va) { > + err = -ENOMEM; > + goto vqs_del; > + } > > - dev_dbg(&vdev->dev, "buffers: va %p, dma %pad\n", > - bufs_va, &vrp->bufs_dma); > + dev_dbg(&vdev->dev, "buffers: va %p, dma %pad\n", > + bufs_va, &vrp->bufs_dma); > > - /* half of the buffers is dedicated for RX */ > - vrp->rbufs = bufs_va; > + /* half of the buffers is dedicated for RX */ > + vrp->rbufs = bufs_va; > > - /* and half is dedicated for TX */ > - vrp->sbufs = bufs_va + total_buf_space / 2; > + /* and half is dedicated for TX */ > + vrp->sbufs = bufs_va + total_buf_space / 2; > + } > > /* set up the receive buffers */ > for (i = 0; i < vrp->num_bufs / 2; i++) { > @@ -1028,8 +1044,9 @@ static int rpmsg_probe(struct virtio_device *vdev) > return 0; > > free_coherent: > - dma_free_coherent(vdev->dev.parent->parent, total_buf_space, > - bufs_va, vrp->bufs_dma); > + if (!vrp->ext_buffer) > + dma_free_coherent(vdev->dev.parent->parent, total_buf_space, > + bufs_va, vrp->bufs_dma); > vqs_del: > vdev->config->del_vqs(vrp->vdev); > free_vrp: > @@ -1063,8 +1080,9 @@ static void rpmsg_remove(struct virtio_device *vdev) > > vdev->config->del_vqs(vrp->vdev); > > - dma_free_coherent(vdev->dev.parent->parent, total_buf_space, > - vrp->rbufs, vrp->bufs_dma); > + if (!vrp->ext_buffer) > + dma_free_coherent(vdev->dev.parent->parent, total_buf_space, > + vrp->rbufs, vrp->bufs_dma); > > kfree(vrp); > } > -- To unsubscribe from this list: send the line "unsubscribe linux-remoteproc" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html