Lines Matching refs:vrp
136 struct virtproc_info *vrp; member
238 static struct rpmsg_endpoint *__rpmsg_create_ept(struct virtproc_info *vrp, in __rpmsg_create_ept() argument
245 struct device *dev = rpdev ? &rpdev->dev : &vrp->vdev->dev; in __rpmsg_create_ept()
268 mutex_lock(&vrp->endpoints_lock); in __rpmsg_create_ept()
271 id = idr_alloc(&vrp->endpoints, ept, id_min, id_max, GFP_KERNEL); in __rpmsg_create_ept()
278 mutex_unlock(&vrp->endpoints_lock); in __rpmsg_create_ept()
283 mutex_unlock(&vrp->endpoints_lock); in __rpmsg_create_ept()
295 return __rpmsg_create_ept(vch->vrp, rpdev, cb, priv, chinfo.src); in virtio_rpmsg_create_ept()
309 __rpmsg_destroy_ept(struct virtproc_info *vrp, struct rpmsg_endpoint *ept) in __rpmsg_destroy_ept() argument
312 mutex_lock(&vrp->endpoints_lock); in __rpmsg_destroy_ept()
313 idr_remove(&vrp->endpoints, ept->addr); in __rpmsg_destroy_ept()
314 mutex_unlock(&vrp->endpoints_lock); in __rpmsg_destroy_ept()
328 __rpmsg_destroy_ept(vch->vrp, ept); in virtio_rpmsg_destroy_ept()
334 struct virtproc_info *vrp = vch->vrp; in virtio_rpmsg_announce_create() local
340 virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { in virtio_rpmsg_announce_create()
344 nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr); in virtio_rpmsg_announce_create()
345 nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_CREATE); in virtio_rpmsg_announce_create()
358 struct virtproc_info *vrp = vch->vrp; in virtio_rpmsg_announce_destroy() local
364 virtio_has_feature(vrp->vdev, VIRTIO_RPMSG_F_NS)) { in virtio_rpmsg_announce_destroy()
368 nsm.addr = cpu_to_virtio32(vrp->vdev, rpdev->ept->addr); in virtio_rpmsg_announce_destroy()
369 nsm.flags = cpu_to_virtio32(vrp->vdev, RPMSG_NS_DESTROY); in virtio_rpmsg_announce_destroy()
398 static struct rpmsg_device *rpmsg_create_channel(struct virtproc_info *vrp, in rpmsg_create_channel() argument
403 struct device *tmp, *dev = &vrp->vdev->dev; in rpmsg_create_channel()
421 vch->vrp = vrp; in rpmsg_create_channel()
437 rpdev->dev.parent = &vrp->vdev->dev; in rpmsg_create_channel()
447 static void *get_a_tx_buf(struct virtproc_info *vrp) in get_a_tx_buf() argument
453 mutex_lock(&vrp->tx_lock); in get_a_tx_buf()
459 if (vrp->last_sbuf < vrp->num_bufs / 2) in get_a_tx_buf()
460 ret = vrp->sbufs + vrp->buf_size * vrp->last_sbuf++; in get_a_tx_buf()
463 ret = virtqueue_get_buf(vrp->svq, &len); in get_a_tx_buf()
465 mutex_unlock(&vrp->tx_lock); in get_a_tx_buf()
486 static void rpmsg_upref_sleepers(struct virtproc_info *vrp) in rpmsg_upref_sleepers() argument
489 mutex_lock(&vrp->tx_lock); in rpmsg_upref_sleepers()
492 if (atomic_inc_return(&vrp->sleepers) == 1) in rpmsg_upref_sleepers()
494 virtqueue_enable_cb(vrp->svq); in rpmsg_upref_sleepers()
496 mutex_unlock(&vrp->tx_lock); in rpmsg_upref_sleepers()
513 static void rpmsg_downref_sleepers(struct virtproc_info *vrp) in rpmsg_downref_sleepers() argument
516 mutex_lock(&vrp->tx_lock); in rpmsg_downref_sleepers()
519 if (atomic_dec_and_test(&vrp->sleepers)) in rpmsg_downref_sleepers()
521 virtqueue_disable_cb(vrp->svq); in rpmsg_downref_sleepers()
523 mutex_unlock(&vrp->tx_lock); in rpmsg_downref_sleepers()
565 struct virtproc_info *vrp = vch->vrp; in rpmsg_send_offchannel_raw() local
586 if (len > vrp->buf_size - sizeof(struct rpmsg_hdr)) { in rpmsg_send_offchannel_raw()
592 msg = get_a_tx_buf(vrp); in rpmsg_send_offchannel_raw()
599 rpmsg_upref_sleepers(vrp); in rpmsg_send_offchannel_raw()
607 err = wait_event_interruptible_timeout(vrp->sendq, in rpmsg_send_offchannel_raw()
608 (msg = get_a_tx_buf(vrp)), in rpmsg_send_offchannel_raw()
612 rpmsg_downref_sleepers(vrp); in rpmsg_send_offchannel_raw()
621 msg->len = cpu_to_virtio16(vrp->vdev, len); in rpmsg_send_offchannel_raw()
623 msg->src = cpu_to_virtio32(vrp->vdev, src); in rpmsg_send_offchannel_raw()
624 msg->dst = cpu_to_virtio32(vrp->vdev, dst); in rpmsg_send_offchannel_raw()
637 mutex_lock(&vrp->tx_lock); in rpmsg_send_offchannel_raw()
640 err = virtqueue_add_outbuf(vrp->svq, &sg, 1, msg, GFP_KERNEL); in rpmsg_send_offchannel_raw()
652 virtqueue_kick(vrp->svq); in rpmsg_send_offchannel_raw()
654 mutex_unlock(&vrp->tx_lock); in rpmsg_send_offchannel_raw()
708 static int rpmsg_recv_single(struct virtproc_info *vrp, struct device *dev, in rpmsg_recv_single() argument
713 unsigned int msg_len = virtio16_to_cpu(vrp->vdev, msg->len); in rpmsg_recv_single()
717 virtio32_to_cpu(vrp->vdev, msg->src), in rpmsg_recv_single()
718 virtio32_to_cpu(vrp->vdev, msg->dst), msg_len, in rpmsg_recv_single()
719 virtio16_to_cpu(vrp->vdev, msg->flags), in rpmsg_recv_single()
720 virtio32_to_cpu(vrp->vdev, msg->reserved)); in rpmsg_recv_single()
730 if (len > vrp->buf_size || in rpmsg_recv_single()
737 mutex_lock(&vrp->endpoints_lock); in rpmsg_recv_single()
739 ept = idr_find(&vrp->endpoints, virtio32_to_cpu(vrp->vdev, msg->dst)); in rpmsg_recv_single()
745 mutex_unlock(&vrp->endpoints_lock); in rpmsg_recv_single()
753 virtio32_to_cpu(vrp->vdev, msg->src)); in rpmsg_recv_single()
763 rpmsg_sg_init(&sg, msg, vrp->buf_size); in rpmsg_recv_single()
766 err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, msg, GFP_KERNEL); in rpmsg_recv_single()
778 struct virtproc_info *vrp = rvq->vdev->priv; in rpmsg_recv_done() local
791 err = rpmsg_recv_single(vrp, dev, msg, len); in rpmsg_recv_done()
804 virtqueue_kick(vrp->rvq); in rpmsg_recv_done()
816 struct virtproc_info *vrp = svq->vdev->priv; in rpmsg_xmit_done() local
821 wake_up_interruptible(&vrp->sendq); in rpmsg_xmit_done()
831 struct virtproc_info *vrp = priv; in rpmsg_ns_cb() local
832 struct device *dev = &vrp->vdev->dev; in rpmsg_ns_cb()
861 chinfo.dst = virtio32_to_cpu(vrp->vdev, msg->addr); in rpmsg_ns_cb()
864 virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY ? in rpmsg_ns_cb()
867 if (virtio32_to_cpu(vrp->vdev, msg->flags) & RPMSG_NS_DESTROY) { in rpmsg_ns_cb()
868 ret = rpmsg_unregister_device(&vrp->vdev->dev, &chinfo); in rpmsg_ns_cb()
872 newch = rpmsg_create_channel(vrp, &chinfo); in rpmsg_ns_cb()
885 struct virtproc_info *vrp; in rpmsg_probe() local
891 vrp = kzalloc(sizeof(*vrp), GFP_KERNEL); in rpmsg_probe()
892 if (!vrp) in rpmsg_probe()
895 vrp->vdev = vdev; in rpmsg_probe()
897 idr_init(&vrp->endpoints); in rpmsg_probe()
898 mutex_init(&vrp->endpoints_lock); in rpmsg_probe()
899 mutex_init(&vrp->tx_lock); in rpmsg_probe()
900 init_waitqueue_head(&vrp->sendq); in rpmsg_probe()
907 vrp->rvq = vqs[0]; in rpmsg_probe()
908 vrp->svq = vqs[1]; in rpmsg_probe()
911 WARN_ON(virtqueue_get_vring_size(vrp->rvq) != in rpmsg_probe()
912 virtqueue_get_vring_size(vrp->svq)); in rpmsg_probe()
915 if (virtqueue_get_vring_size(vrp->rvq) < MAX_RPMSG_NUM_BUFS / 2) in rpmsg_probe()
916 vrp->num_bufs = virtqueue_get_vring_size(vrp->rvq) * 2; in rpmsg_probe()
918 vrp->num_bufs = MAX_RPMSG_NUM_BUFS; in rpmsg_probe()
920 vrp->buf_size = MAX_RPMSG_BUF_SIZE; in rpmsg_probe()
922 total_buf_space = vrp->num_bufs * vrp->buf_size; in rpmsg_probe()
926 total_buf_space, &vrp->bufs_dma, in rpmsg_probe()
934 bufs_va, &vrp->bufs_dma); in rpmsg_probe()
937 vrp->rbufs = bufs_va; in rpmsg_probe()
940 vrp->sbufs = bufs_va + total_buf_space / 2; in rpmsg_probe()
943 for (i = 0; i < vrp->num_bufs / 2; i++) { in rpmsg_probe()
945 void *cpu_addr = vrp->rbufs + i * vrp->buf_size; in rpmsg_probe()
947 rpmsg_sg_init(&sg, cpu_addr, vrp->buf_size); in rpmsg_probe()
949 err = virtqueue_add_inbuf(vrp->rvq, &sg, 1, cpu_addr, in rpmsg_probe()
955 virtqueue_disable_cb(vrp->svq); in rpmsg_probe()
957 vdev->priv = vrp; in rpmsg_probe()
962 vrp->ns_ept = __rpmsg_create_ept(vrp, NULL, rpmsg_ns_cb, in rpmsg_probe()
963 vrp, RPMSG_NS_ADDR); in rpmsg_probe()
964 if (!vrp->ns_ept) { in rpmsg_probe()
975 notify = virtqueue_kick_prepare(vrp->rvq); in rpmsg_probe()
986 virtqueue_notify(vrp->rvq); in rpmsg_probe()
994 bufs_va, vrp->bufs_dma); in rpmsg_probe()
996 vdev->config->del_vqs(vrp->vdev); in rpmsg_probe()
998 kfree(vrp); in rpmsg_probe()
1011 struct virtproc_info *vrp = vdev->priv; in rpmsg_remove() local
1012 size_t total_buf_space = vrp->num_bufs * vrp->buf_size; in rpmsg_remove()
1021 if (vrp->ns_ept) in rpmsg_remove()
1022 __rpmsg_destroy_ept(vrp, vrp->ns_ept); in rpmsg_remove()
1024 idr_destroy(&vrp->endpoints); in rpmsg_remove()
1026 vdev->config->del_vqs(vrp->vdev); in rpmsg_remove()
1029 vrp->rbufs, vrp->bufs_dma); in rpmsg_remove()
1031 kfree(vrp); in rpmsg_remove()