You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@nuttx.apache.org by pk...@apache.org on 2022/03/30 07:00:21 UTC
[incubator-nuttx] 07/13: rptun: divide shram to TX & RX
This is an automated email from the ASF dual-hosted git repository.
pkarashchenko pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/incubator-nuttx.git
commit 5599f4e24ab91f11c63ab0cd388d84a1ff8da499
Author: ligd <li...@xiaomi.com>
AuthorDate: Mon Feb 7 20:28:25 2022 +0800
rptun: divide shram to TX & RX
Signed-off-by: ligd <li...@xiaomi.com>
---
drivers/rptun/rptun.c | 68 +++++++++++++++++++++++++++++++++++++--------------
1 file changed, 49 insertions(+), 19 deletions(-)
diff --git a/drivers/rptun/rptun.c b/drivers/rptun/rptun.c
index f016b02..3cf9cb5 100644
--- a/drivers/rptun/rptun.c
+++ b/drivers/rptun/rptun.c
@@ -66,7 +66,8 @@ struct rptun_priv_s
FAR struct rptun_dev_s *dev;
struct remoteproc rproc;
struct rpmsg_virtio_device vdev;
- struct rpmsg_virtio_shm_pool shm_pool;
+ struct rpmsg_virtio_shm_pool tx_shpool;
+ struct rpmsg_virtio_shm_pool rx_shpool;
struct metal_list bind;
struct metal_list node;
sem_t sem;
@@ -636,30 +637,48 @@ static int rptun_dev_start(FAR struct remoteproc *rproc)
align0 = rsc->rpmsg_vring0.align;
align1 = rsc->rpmsg_vring1.align;
- tbsz = ALIGN_UP(sizeof(struct rptun_rsc_s), MAX(align0, align1));
v0sz = ALIGN_UP(vring_size(rsc->rpmsg_vring0.num, align0), align0);
v1sz = ALIGN_UP(vring_size(rsc->rpmsg_vring1.num, align1), align1);
- va0 = (FAR char *)rsc + tbsz;
- va1 = (FAR char *)rsc + tbsz + v0sz;
+ if (rsc->rpmsg_vring0.da == 0 || rsc->rpmsg_vring1.da == 0)
+ {
+ tbsz = ALIGN_UP(sizeof(struct rptun_rsc_s), MAX(align0, align1));
- io = metal_io_get_region();
- pa0 = metal_io_virt_to_phys(io, va0);
- pa1 = metal_io_virt_to_phys(io, va1);
+ va0 = (FAR char *)rsc + tbsz;
+ va1 = (FAR char *)rsc + tbsz + v0sz;
- da0 = da1 = METAL_BAD_PHYS;
+ io = metal_io_get_region();
+ pa0 = metal_io_virt_to_phys(io, va0);
+ pa1 = metal_io_virt_to_phys(io, va1);
- remoteproc_mmap(rproc, &pa0, &da0, v0sz, 0, NULL);
- remoteproc_mmap(rproc, &pa1, &da1, v1sz, 0, NULL);
+ da0 = da1 = METAL_BAD_PHYS;
- rsc->rpmsg_vring0.da = da0;
- rsc->rpmsg_vring1.da = da1;
+ remoteproc_mmap(rproc, &pa0, &da0, v0sz, 0, NULL);
+ remoteproc_mmap(rproc, &pa1, &da1, v1sz, 0, NULL);
- shbuf = (FAR char *)rsc + tbsz + v0sz + v1sz;
- shbufsz = rsc->config.txbuf_size * rsc->rpmsg_vring0.num +
- rsc->config.rxbuf_size * rsc->rpmsg_vring1.num;
+ rsc->rpmsg_vring0.da = da0;
+ rsc->rpmsg_vring1.da = da1;
- rpmsg_virtio_init_shm_pool(&priv->shm_pool, shbuf, shbufsz);
+ shbuf = (FAR char *)rsc + tbsz + v0sz + v1sz;
+ shbufsz = rsc->config.txbuf_size * rsc->rpmsg_vring0.num +
+ rsc->config.rxbuf_size * rsc->rpmsg_vring1.num;
+
+ rpmsg_virtio_init_shm_pool(&priv->tx_shpool, shbuf, shbufsz);
+ }
+ else
+ {
+ da0 = rsc->rpmsg_vring0.da;
+ shbuf = (FAR char *)remoteproc_mmap(rproc, NULL, &da0,
+ v0sz, 0, NULL) + v0sz;
+ shbufsz = rsc->config.rxbuf_size * rsc->rpmsg_vring0.num;
+ rpmsg_virtio_init_shm_pool(&priv->rx_shpool, shbuf, shbufsz);
+
+ da1 = rsc->rpmsg_vring1.da;
+ shbuf = (FAR char *)remoteproc_mmap(rproc, NULL, &da1,
+ v1sz, 0, NULL) + v1sz;
+ shbufsz = rsc->config.txbuf_size * rsc->rpmsg_vring1.num;
+ rpmsg_virtio_init_shm_pool(&priv->tx_shpool, shbuf, shbufsz);
+ }
role = RPMSG_MASTER;
}
@@ -672,8 +691,18 @@ static int rptun_dev_start(FAR struct remoteproc *rproc)
return -ENOMEM;
}
- ret = rpmsg_init_vdev(&priv->vdev, vdev, rptun_ns_bind,
- metal_io_get_region(), &priv->shm_pool);
+ if (priv->rx_shpool.base)
+ {
+ ret = rpmsg_init_vdev_ext(&priv->vdev, vdev, rptun_ns_bind,
+ metal_io_get_region(),
+ &priv->tx_shpool, &priv->rx_shpool);
+ }
+ else
+ {
+ ret = rpmsg_init_vdev(&priv->vdev, vdev, rptun_ns_bind,
+ metal_io_get_region(), &priv->tx_shpool);
+ }
+
if (ret)
{
remoteproc_remove_virtio(rproc, vdev);
@@ -967,7 +996,7 @@ int rpmsg_post(FAR struct rpmsg_endpoint *ept, FAR sem_t *sem)
{
rptun_post(priv);
}
-
+
return ret;
}
@@ -1140,6 +1169,7 @@ int rptun_initialize(FAR struct rptun_dev_s *dev)
goto err_driver;
}
#endif
+
nxsem_set_protocol(&priv->sem, SEM_PRIO_NONE);
return OK;