Lines Matching refs:vrp
214 static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp, in __rpmsg_create_ept() argument
220 struct device *dev = rpdev ? &rpdev->dev : &vrp->vdev->dev; in __rpmsg_create_ept()
244 mutex_lock(&vrp->endpoints_lock); in __rpmsg_create_ept()
247 id = idr_alloc(&vrp->endpoints, ept, id_min, id_max, GFP_KERNEL); in __rpmsg_create_ept()
254 mutex_unlock(&vrp->endpoints_lock); in __rpmsg_create_ept()
259 mutex_unlock(&vrp->endpoints_lock); in __rpmsg_create_ept()
307 return __rpmsg_create_ept(rpdev->vrp, rpdev, cb, priv, addr); in rpmsg_create_ept()
322 __rpmsg_destroy_ept(struct virtproc_info *vrp, struct rpmsg_endpoint *ept) in __rpmsg_destroy_ept() argument
325 mutex_lock(&vrp->endpoints_lock); in __rpmsg_destroy_ept()
326 idr_remove(&vrp->endpoints, ept->addr); in __rpmsg_destroy_ept()
327 mutex_unlock(&vrp->endpoints_lock); in __rpmsg_destroy_ept()
346 __rpmsg_destroy_ept(ept->rpdev->vrp, ept); in rpmsg_destroy_ept()
362 struct virtproc_info *vrp = rpdev->vrp; in rpmsg_dev_probe() local
385 virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { in rpmsg_dev_probe()
405 struct virtproc_info *vrp = rpdev->vrp; in rpmsg_dev_remove() local
410 virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { in rpmsg_dev_remove()
498 static struct rpmsg_channel *rpmsg_create_channel(struct virtproc_info *vrp, in rpmsg_create_channel() argument
502 struct device *tmp, *dev = &vrp->vdev->dev; in rpmsg_create_channel()
521 rpdev->vrp = vrp; in rpmsg_create_channel()
536 rpdev->dev.parent = &vrp->vdev->dev; in rpmsg_create_channel()
554 static int rpmsg_destroy_channel(struct virtproc_info *vrp, in rpmsg_destroy_channel() argument
557 struct virtio_device *vdev = vrp->vdev; in rpmsg_destroy_channel()
572 static void *get_a_tx_buf(struct virtproc_info *vrp) in get_a_tx_buf() argument
578 mutex_lock(&vrp->tx_lock); in get_a_tx_buf()
584 if (vrp->last_sbuf < vrp->num_bufs / 2) in get_a_tx_buf()
585 ret = vrp->sbufs + RPMSG_BUF_SIZE * vrp->last_sbuf++; in get_a_tx_buf()
588 ret = virtqueue_get_buf(vrp->svq, &len); in get_a_tx_buf()
590 mutex_unlock(&vrp->tx_lock); in get_a_tx_buf()
611 static void rpmsg_upref_sleepers(struct virtproc_info *vrp) in rpmsg_upref_sleepers() argument
614 mutex_lock(&vrp->tx_lock); in rpmsg_upref_sleepers()
617 if (atomic_inc_return(&vrp->sleepers) == 1) in rpmsg_upref_sleepers()
619 virtqueue_enable_cb(vrp->svq); in rpmsg_upref_sleepers()
621 mutex_unlock(&vrp->tx_lock); in rpmsg_upref_sleepers()
638 static void rpmsg_downref_sleepers(struct virtproc_info *vrp) in rpmsg_downref_sleepers() argument
641 mutex_lock(&vrp->tx_lock); in rpmsg_downref_sleepers()
644 if (atomic_dec_and_test(&vrp->sleepers)) in rpmsg_downref_sleepers()
646 virtqueue_disable_cb(vrp->svq); in rpmsg_downref_sleepers()
648 mutex_unlock(&vrp->tx_lock); in rpmsg_downref_sleepers()
688 struct virtproc_info *vrp = rpdev->vrp; in rpmsg_send_offchannel_raw() local
715 msg = get_a_tx_buf(vrp); in rpmsg_send_offchannel_raw()
722 rpmsg_upref_sleepers(vrp); in rpmsg_send_offchannel_raw()
730 err = wait_event_interruptible_timeout(vrp->sendq, in rpmsg_send_offchannel_raw()
731 (msg = get_a_tx_buf(vrp)), in rpmsg_send_offchannel_raw()
735 rpmsg_downref_sleepers(vrp); in rpmsg_send_offchannel_raw()
759 mutex_lock(&vrp->tx_lock); in rpmsg_send_offchannel_raw()
762 err = virtqueue_add_outbuf(vrp->svq, &sg, 1, msg, GFP_KERNEL); in rpmsg_send_offchannel_raw()
774 virtqueue_kick(vrp->svq); in rpmsg_send_offchannel_raw()
776 mutex_unlock(&vrp->tx_lock); in rpmsg_send_offchannel_raw()
781 static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, in rpmsg_recv_single() argument
805 mutex_lock(&vrp->endpoints_lock); in rpmsg_recv_single()
807 ept = idr_find(&vrp->endpoints, msg->dst); in rpmsg_recv_single()
813 mutex_unlock(&vrp->endpoints_lock); in rpmsg_recv_single()
834 err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, msg, GFP_KERNEL); in rpmsg_recv_single()
846 struct virtproc_info *vrp = rvq->vdev->priv; in rpmsg_recv_done() local
859 err = rpmsg_recv_single(vrp, dev, msg, len); in rpmsg_recv_done()
872 virtqueue_kick(vrp->rvq); in rpmsg_recv_done()
884 struct virtproc_info *vrp = svq->vdev->priv; in rpmsg_xmit_done() local
889 wake_up_interruptible(&vrp->sendq); in rpmsg_xmit_done()
899 struct virtproc_info *vrp = priv; in rpmsg_ns_cb() local
900 struct device *dev = &vrp->vdev->dev; in rpmsg_ns_cb()
935 ret = rpmsg_destroy_channel(vrp, &chinfo); in rpmsg_ns_cb()
939 newch = rpmsg_create_channel(vrp, &chinfo); in rpmsg_ns_cb()
950 struct virtproc_info *vrp; in rpmsg_probe() local
956 vrp = kzalloc(sizeof(*vrp), GFP_KERNEL); in rpmsg_probe()
957 if (!vrp) in rpmsg_probe()
960 vrp->vdev = vdev; in rpmsg_probe()
962 idr_init(&vrp->endpoints); in rpmsg_probe()
963 mutex_init(&vrp->endpoints_lock); in rpmsg_probe()
964 mutex_init(&vrp->tx_lock); in rpmsg_probe()
965 init_waitqueue_head(&vrp->sendq); in rpmsg_probe()
972 vrp->rvq = vqs[0]; in rpmsg_probe()
973 vrp->svq = vqs[1]; in rpmsg_probe()
976 WARN_ON(virtqueue_get_vring_size(vrp->rvq) != in rpmsg_probe()
977 virtqueue_get_vring_size(vrp->svq)); in rpmsg_probe()
980 if (virtqueue_get_vring_size(vrp->rvq) < MAX_RPMSG_NUM_BUFS / 2) in rpmsg_probe()
981 vrp->num_bufs = virtqueue_get_vring_size(vrp->rvq) * 2; in rpmsg_probe()
983 vrp->num_bufs = MAX_RPMSG_NUM_BUFS; in rpmsg_probe()
985 total_buf_space = vrp->num_bufs * RPMSG_BUF_SIZE; in rpmsg_probe()
989 total_buf_space, &vrp->bufs_dma, in rpmsg_probe()
997 (unsigned long long)vrp->bufs_dma); in rpmsg_probe()
1000 vrp->rbufs = bufs_va; in rpmsg_probe()
1003 vrp->sbufs = bufs_va + total_buf_space / 2; in rpmsg_probe()
1006 for (i = 0; i < vrp->num_bufs / 2; i++) { in rpmsg_probe()
1008 void *cpu_addr = vrp->rbufs + i * RPMSG_BUF_SIZE; in rpmsg_probe()
1012 err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, cpu_addr, in rpmsg_probe()
1018 virtqueue_disable_cb(vrp->svq); in rpmsg_probe()
1020 vdev->priv = vrp; in rpmsg_probe()
1025 vrp->ns_ept = __rpmsg_create_ept(vrp, NULL, rpmsg_ns_cb, in rpmsg_probe()
1026 vrp, RPMSG_NS_ADDR); in rpmsg_probe()
1027 if (!vrp->ns_ept) { in rpmsg_probe()
1038 notify = virtqueue_kick_prepare(vrp->rvq); in rpmsg_probe()
1049 virtqueue_notify(vrp->rvq); in rpmsg_probe()
1057 bufs_va, vrp->bufs_dma); in rpmsg_probe()
1059 vdev->config->del_vqs(vrp->vdev); in rpmsg_probe()
1061 kfree(vrp); in rpmsg_probe()
1074 struct virtproc_info *vrp = vdev->priv; in rpmsg_remove() local
1075 size_t total_buf_space = vrp->num_bufs * RPMSG_BUF_SIZE; in rpmsg_remove()
1084 if (vrp->ns_ept) in rpmsg_remove()
1085 __rpmsg_destroy_ept(vrp, vrp->ns_ept); in rpmsg_remove()
1087 idr_destroy(&vrp->endpoints); in rpmsg_remove()
1089 vdev->config->del_vqs(vrp->vdev); in rpmsg_remove()
1092 vrp->rbufs, vrp->bufs_dma); in rpmsg_remove()
1094 kfree(vrp); in rpmsg_remove()