mirror of
https://github.com/apache/nuttx.git
synced 2026-10-03 20:27:53 +00:00
rptun: use local rx virtqueue idx to resolve remote low power
Store the rx virtqueue idx to the local headrx index, and only process the data when the rx virtqueue has data to avoid access the ram in low power mode. Signed-off-by: ligd <liguiding1@xiaomi.com>
This commit is contained in:
parent
520bb6544e
commit
0ce6bd546d
1 changed files with 41 additions and 5 deletions
|
|
@ -70,6 +70,7 @@ struct rptun_priv_s
|
|||
pid_t tid;
|
||||
#ifdef CONFIG_RPTUN_PM
|
||||
bool stay;
|
||||
uint16_t headrx;
|
||||
#endif
|
||||
};
|
||||
|
||||
|
|
@ -222,8 +223,40 @@ static inline void rptun_pm_action(FAR struct rptun_priv_s *priv,
|
|||
leave_critical_section(flags);
|
||||
}
|
||||
|
||||
static inline void rptun_update_rx(FAR struct rptun_priv_s *priv)
|
||||
{
|
||||
FAR struct rpmsg_virtio_device *rvdev = &priv->rvdev;
|
||||
FAR struct virtqueue *rvq = rvdev->rvq;
|
||||
|
||||
if (rpmsg_virtio_get_role(rvdev) == RPMSG_HOST)
|
||||
{
|
||||
priv->headrx = rvq->vq_ring.used->idx;
|
||||
}
|
||||
else
|
||||
{
|
||||
priv->headrx = rvq->vq_ring.avail->idx;
|
||||
}
|
||||
}
|
||||
|
||||
static inline bool rptun_available_rx(FAR struct rptun_priv_s *priv)
|
||||
{
|
||||
FAR struct rpmsg_virtio_device *rvdev = &priv->rvdev;
|
||||
FAR struct virtqueue *rvq = rvdev->rvq;
|
||||
|
||||
if (rpmsg_virtio_get_role(rvdev) == RPMSG_HOST)
|
||||
{
|
||||
return priv->headrx != rvq->vq_used_cons_idx;
|
||||
}
|
||||
else
|
||||
{
|
||||
return priv->headrx != rvq->vq_available_idx;
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
# define rptun_pm_action(priv, stay)
|
||||
# define rptun_update_rx(priv)
|
||||
# define rptun_available_rx(priv) true
|
||||
#endif
|
||||
|
||||
static void rptun_start_worker(FAR void *arg)
|
||||
|
|
@ -240,7 +273,10 @@ static void rptun_worker(FAR void *arg)
|
|||
{
|
||||
FAR struct rptun_priv_s *priv = arg;
|
||||
|
||||
remoteproc_get_notification(&priv->rproc, RPTUN_NOTIFY_ALL);
|
||||
if (rptun_available_rx(priv))
|
||||
{
|
||||
remoteproc_get_notification(&priv->rproc, RPTUN_NOTIFY_ALL);
|
||||
}
|
||||
}
|
||||
|
||||
static int rptun_thread(int argc, FAR char *argv[])
|
||||
|
|
@ -291,10 +327,8 @@ static int rptun_callback(FAR void *arg, uint32_t vqid)
|
|||
if (vqid == RPTUN_NOTIFY_ALL ||
|
||||
vqid == vdev->vrings_info[rvq->vq_queue_index].notifyid)
|
||||
{
|
||||
if (rptun_buffer_nused(&priv->rvdev, true))
|
||||
{
|
||||
rptun_wakeup_rx(priv);
|
||||
}
|
||||
rptun_update_rx(priv);
|
||||
rptun_wakeup_rx(priv);
|
||||
}
|
||||
|
||||
if (vqid == RPTUN_NOTIFY_ALL ||
|
||||
|
|
@ -811,6 +845,8 @@ static int rptun_dev_start(FAR struct remoteproc *rproc)
|
|||
/* Register callback to mbox for receiving remote message */
|
||||
|
||||
RPTUN_REGISTER_CALLBACK(priv->dev, rptun_callback, priv);
|
||||
|
||||
rptun_update_rx(priv);
|
||||
rptun_wakeup_rx(priv);
|
||||
|
||||
/* Broadcast device_created to all registers */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue