Lines Matching refs:vu_dev

76 #define vu_err(vu_dev, ...)	dev_err(&(vu_dev)->pdev->dev, ##__VA_ARGS__)  argument
127 static int vhost_user_recv(struct virtio_uml_device *vu_dev, in vhost_user_recv() argument
159 static void vhost_user_check_reset(struct virtio_uml_device *vu_dev, in vhost_user_check_reset() argument
162 struct virtio_uml_platform_data *pdata = vu_dev->pdata; in vhost_user_check_reset()
167 if (!vu_dev->registered) in vhost_user_check_reset()
170 vu_dev->registered = 0; in vhost_user_check_reset()
175 static int vhost_user_recv_resp(struct virtio_uml_device *vu_dev, in vhost_user_recv_resp() argument
179 int rc = vhost_user_recv(vu_dev, vu_dev->sock, msg, in vhost_user_recv_resp()
183 vhost_user_check_reset(vu_dev, rc); in vhost_user_recv_resp()
193 static int vhost_user_recv_u64(struct virtio_uml_device *vu_dev, in vhost_user_recv_u64() argument
197 int rc = vhost_user_recv_resp(vu_dev, &msg, in vhost_user_recv_u64()
208 static int vhost_user_recv_req(struct virtio_uml_device *vu_dev, in vhost_user_recv_req() argument
212 int rc = vhost_user_recv(vu_dev, vu_dev->req_fd, msg, in vhost_user_recv_req()
225 static int vhost_user_send(struct virtio_uml_device *vu_dev, in vhost_user_send() argument
242 if (!(vu_dev->protocol_features & in vhost_user_send()
249 raw_spin_lock_irqsave(&vu_dev->sock_lock, flags); in vhost_user_send()
250 rc = full_sendmsg_fds(vu_dev->sock, msg, size, fds, num_fds); in vhost_user_send()
257 rc = vhost_user_recv_u64(vu_dev, &status); in vhost_user_send()
262 vu_err(vu_dev, "slave reports error: %llu\n", status); in vhost_user_send()
269 raw_spin_unlock_irqrestore(&vu_dev->sock_lock, flags); in vhost_user_send()
273 static int vhost_user_send_no_payload(struct virtio_uml_device *vu_dev, in vhost_user_send_no_payload() argument
280 return vhost_user_send(vu_dev, need_response, &msg, NULL, 0); in vhost_user_send_no_payload()
283 static int vhost_user_send_no_payload_fd(struct virtio_uml_device *vu_dev, in vhost_user_send_no_payload_fd() argument
290 return vhost_user_send(vu_dev, false, &msg, &fd, 1); in vhost_user_send_no_payload_fd()
293 static int vhost_user_send_u64(struct virtio_uml_device *vu_dev, in vhost_user_send_u64() argument
302 return vhost_user_send(vu_dev, false, &msg, NULL, 0); in vhost_user_send_u64()
305 static int vhost_user_set_owner(struct virtio_uml_device *vu_dev) in vhost_user_set_owner() argument
307 return vhost_user_send_no_payload(vu_dev, false, VHOST_USER_SET_OWNER); in vhost_user_set_owner()
310 static int vhost_user_get_features(struct virtio_uml_device *vu_dev, in vhost_user_get_features() argument
313 int rc = vhost_user_send_no_payload(vu_dev, true, in vhost_user_get_features()
318 return vhost_user_recv_u64(vu_dev, features); in vhost_user_get_features()
321 static int vhost_user_set_features(struct virtio_uml_device *vu_dev, in vhost_user_set_features() argument
324 return vhost_user_send_u64(vu_dev, VHOST_USER_SET_FEATURES, features); in vhost_user_set_features()
327 static int vhost_user_get_protocol_features(struct virtio_uml_device *vu_dev, in vhost_user_get_protocol_features() argument
330 int rc = vhost_user_send_no_payload(vu_dev, true, in vhost_user_get_protocol_features()
335 return vhost_user_recv_u64(vu_dev, protocol_features); in vhost_user_get_protocol_features()
338 static int vhost_user_set_protocol_features(struct virtio_uml_device *vu_dev, in vhost_user_set_protocol_features() argument
341 return vhost_user_send_u64(vu_dev, VHOST_USER_SET_PROTOCOL_FEATURES, in vhost_user_set_protocol_features()
345 static int vhost_user_get_queue_num(struct virtio_uml_device *vu_dev, in vhost_user_get_queue_num() argument
348 int rc = vhost_user_send_no_payload(vu_dev, true, in vhost_user_get_queue_num()
353 return vhost_user_recv_u64(vu_dev, queue_num); in vhost_user_get_queue_num()
356 static void vhost_user_reply(struct virtio_uml_device *vu_dev, in vhost_user_reply() argument
370 rc = full_sendmsg_fds(vu_dev->req_fd, &reply, size, NULL, 0); in vhost_user_reply()
373 vu_err(vu_dev, in vhost_user_reply()
378 static irqreturn_t vu_req_read_message(struct virtio_uml_device *vu_dev, in vu_req_read_message() argument
391 rc = vhost_user_recv_req(vu_dev, &msg.msg, in vu_req_read_message()
399 vu_dev->config_changed_irq = true; in vu_req_read_message()
403 virtio_device_for_each_vq((&vu_dev->vdev), vq) { in vu_req_read_message()
406 vu_dev->vq_irq_vq_map |= BIT_ULL(vq->index); in vu_req_read_message()
416 vu_err(vu_dev, "unexpected slave request %d\n", in vu_req_read_message()
420 if (ev && !vu_dev->suspended) in vu_req_read_message()
424 vhost_user_reply(vu_dev, &msg.msg, response); in vu_req_read_message()
428 vu_dev->recv_rc = (rc == -EAGAIN) ? 0 : rc; in vu_req_read_message()
434 struct virtio_uml_device *vu_dev = data; in vu_req_interrupt() local
438 ret = vu_req_read_message(vu_dev, NULL); in vu_req_interrupt()
440 if (vu_dev->recv_rc) { in vu_req_interrupt()
441 vhost_user_check_reset(vu_dev, vu_dev->recv_rc); in vu_req_interrupt()
442 } else if (vu_dev->vq_irq_vq_map) { in vu_req_interrupt()
445 virtio_device_for_each_vq((&vu_dev->vdev), vq) { in vu_req_interrupt()
446 if (vu_dev->vq_irq_vq_map & BIT_ULL(vq->index)) in vu_req_interrupt()
449 vu_dev->vq_irq_vq_map = 0; in vu_req_interrupt()
450 } else if (vu_dev->config_changed_irq) { in vu_req_interrupt()
451 virtio_config_changed(&vu_dev->vdev); in vu_req_interrupt()
452 vu_dev->config_changed_irq = false; in vu_req_interrupt()
464 static int vhost_user_init_slave_req(struct virtio_uml_device *vu_dev) in vhost_user_init_slave_req() argument
472 vu_dev->req_fd = req_fds[0]; in vhost_user_init_slave_req()
474 rc = um_request_irq_tt(UM_IRQ_ALLOC, vu_dev->req_fd, IRQ_READ, in vhost_user_init_slave_req()
476 vu_dev->pdev->name, vu_dev, in vhost_user_init_slave_req()
481 vu_dev->irq = rc; in vhost_user_init_slave_req()
483 rc = vhost_user_send_no_payload_fd(vu_dev, VHOST_USER_SET_SLAVE_REQ_FD, in vhost_user_init_slave_req()
491 um_free_irq(vu_dev->irq, vu_dev); in vhost_user_init_slave_req()
500 static int vhost_user_init(struct virtio_uml_device *vu_dev) in vhost_user_init() argument
502 int rc = vhost_user_set_owner(vu_dev); in vhost_user_init()
506 rc = vhost_user_get_features(vu_dev, &vu_dev->features); in vhost_user_init()
510 if (vu_dev->features & BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES)) { in vhost_user_init()
511 rc = vhost_user_get_protocol_features(vu_dev, in vhost_user_init()
512 &vu_dev->protocol_features); in vhost_user_init()
515 vu_dev->protocol_features &= VHOST_USER_SUPPORTED_PROTOCOL_F; in vhost_user_init()
516 rc = vhost_user_set_protocol_features(vu_dev, in vhost_user_init()
517 vu_dev->protocol_features); in vhost_user_init()
522 if (vu_dev->protocol_features & in vhost_user_init()
524 rc = vhost_user_init_slave_req(vu_dev); in vhost_user_init()
529 if (vu_dev->protocol_features & in vhost_user_init()
531 rc = vhost_user_get_queue_num(vu_dev, &vu_dev->max_vqs); in vhost_user_init()
535 vu_dev->max_vqs = U64_MAX; in vhost_user_init()
541 static void vhost_user_get_config(struct virtio_uml_device *vu_dev, in vhost_user_get_config() argument
550 if (!(vu_dev->protocol_features & in vhost_user_get_config()
562 rc = vhost_user_send(vu_dev, true, msg, NULL, 0); in vhost_user_get_config()
564 vu_err(vu_dev, "sending VHOST_USER_GET_CONFIG failed: %d\n", in vhost_user_get_config()
569 rc = vhost_user_recv_resp(vu_dev, msg, msg_size); in vhost_user_get_config()
571 vu_err(vu_dev, in vhost_user_get_config()
580 vu_err(vu_dev, in vhost_user_get_config()
592 static void vhost_user_set_config(struct virtio_uml_device *vu_dev, in vhost_user_set_config() argument
600 if (!(vu_dev->protocol_features & in vhost_user_set_config()
613 rc = vhost_user_send(vu_dev, false, msg, NULL, 0); in vhost_user_set_config()
615 vu_err(vu_dev, "sending VHOST_USER_SET_CONFIG failed: %d\n", in vhost_user_set_config()
643 static int vhost_user_set_mem_table(struct virtio_uml_device *vu_dev) in vhost_user_set_mem_table() argument
696 return vhost_user_send(vu_dev, false, &msg, fds, in vhost_user_set_mem_table()
700 static int vhost_user_set_vring_state(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_state() argument
710 return vhost_user_send(vu_dev, false, &msg, NULL, 0); in vhost_user_set_vring_state()
713 static int vhost_user_set_vring_num(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_num() argument
716 return vhost_user_set_vring_state(vu_dev, VHOST_USER_SET_VRING_NUM, in vhost_user_set_vring_num()
720 static int vhost_user_set_vring_base(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_base() argument
723 return vhost_user_set_vring_state(vu_dev, VHOST_USER_SET_VRING_BASE, in vhost_user_set_vring_base()
727 static int vhost_user_set_vring_addr(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_addr() argument
741 return vhost_user_send(vu_dev, false, &msg, NULL, 0); in vhost_user_set_vring_addr()
744 static int vhost_user_set_vring_fd(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_fd() argument
757 return vhost_user_send(vu_dev, false, &msg, NULL, 0); in vhost_user_set_vring_fd()
759 return vhost_user_send(vu_dev, false, &msg, &fd, 1); in vhost_user_set_vring_fd()
762 static int vhost_user_set_vring_call(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_call() argument
765 return vhost_user_set_vring_fd(vu_dev, VHOST_USER_SET_VRING_CALL, in vhost_user_set_vring_call()
769 static int vhost_user_set_vring_kick(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_kick() argument
772 return vhost_user_set_vring_fd(vu_dev, VHOST_USER_SET_VRING_KICK, in vhost_user_set_vring_kick()
776 static int vhost_user_set_vring_enable(struct virtio_uml_device *vu_dev, in vhost_user_set_vring_enable() argument
779 if (!(vu_dev->features & BIT_ULL(VHOST_USER_F_PROTOCOL_FEATURES))) in vhost_user_set_vring_enable()
782 return vhost_user_set_vring_state(vu_dev, VHOST_USER_SET_VRING_ENABLE, in vhost_user_set_vring_enable()
801 struct virtio_uml_device *vu_dev; in vu_notify() local
803 vu_dev = to_virtio_uml_device(vq->vdev); in vu_notify()
805 return vhost_user_set_vring_state(vu_dev, VHOST_USER_VRING_KICK, in vu_notify()
836 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_get() local
838 vhost_user_get_config(vu_dev, offset, buf, len); in vu_get()
844 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_set() local
846 vhost_user_set_config(vu_dev, offset, buf, len); in vu_set()
851 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_get_status() local
853 return vu_dev->status; in vu_get_status()
858 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_set_status() local
860 vu_dev->status = status; in vu_set_status()
865 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_reset() local
867 vu_dev->status = 0; in vu_reset()
875 struct virtio_uml_device *vu_dev; in vu_del_vq() local
877 vu_dev = to_virtio_uml_device(vq->vdev); in vu_del_vq()
879 um_free_irq(vu_dev->irq, vq); in vu_del_vq()
892 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_del_vqs() local
898 WARN_ON(vhost_user_set_vring_enable(vu_dev, vq->index, false)); in vu_del_vqs()
901 WARN_ON(vhost_user_get_features(vu_dev, &features)); in vu_del_vqs()
907 static int vu_setup_vq_call_fd(struct virtio_uml_device *vu_dev, in vu_setup_vq_call_fd() argument
915 if (vu_dev->protocol_features & in vu_setup_vq_call_fd()
917 vu_dev->protocol_features & in vu_setup_vq_call_fd()
929 irq = um_request_irq(vu_dev->irq, info->call_fd, IRQ_READ, in vu_setup_vq_call_fd()
936 rc = vhost_user_set_vring_call(vu_dev, vq->index, call_fds[1]); in vu_setup_vq_call_fd()
940 vu_dev->irq = irq; in vu_setup_vq_call_fd()
959 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_setup_vq() local
960 struct platform_device *pdev = vu_dev->pdev; in vu_setup_vq()
984 if (vu_dev->protocol_features & in vu_setup_vq()
994 rc = vu_setup_vq_call_fd(vu_dev, vq); in vu_setup_vq()
998 rc = vhost_user_set_vring_num(vu_dev, index, num); in vu_setup_vq()
1002 rc = vhost_user_set_vring_base(vu_dev, index, 0); in vu_setup_vq()
1006 rc = vhost_user_set_vring_addr(vu_dev, index, in vu_setup_vq()
1018 um_free_irq(vu_dev->irq, vq); in vu_setup_vq()
1037 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_find_vqs() local
1042 if (WARN(nvqs > 64 || nvqs > vu_dev->max_vqs, in vu_find_vqs()
1044 nvqs, vu_dev->max_vqs)) in vu_find_vqs()
1047 rc = vhost_user_set_mem_table(vu_dev); in vu_find_vqs()
1071 rc = vhost_user_set_vring_kick(vu_dev, vq->index, in vu_find_vqs()
1077 rc = vhost_user_set_vring_enable(vu_dev, vq->index, true); in vu_find_vqs()
1091 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_get_features() local
1093 return vu_dev->features; in vu_get_features()
1098 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_finalize_features() local
1102 vu_dev->features = vdev->features | supported; in vu_finalize_features()
1104 return vhost_user_set_features(vu_dev, vu_dev->features); in vu_finalize_features()
1109 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in vu_bus_name() local
1111 return vu_dev->pdev->name; in vu_bus_name()
1131 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in virtio_uml_release_dev() local
1136 if (vu_dev->req_fd >= 0) { in virtio_uml_release_dev()
1137 um_free_irq(vu_dev->irq, vu_dev); in virtio_uml_release_dev()
1138 os_close_file(vu_dev->req_fd); in virtio_uml_release_dev()
1141 os_close_file(vu_dev->sock); in virtio_uml_release_dev()
1142 kfree(vu_dev); in virtio_uml_release_dev()
1148 struct virtio_uml_device *vu_dev = to_virtio_uml_device(vdev); in virtio_uml_set_no_vq_suspend() local
1153 vu_dev->no_vq_suspend = no_vq_suspend; in virtio_uml_set_no_vq_suspend()
1161 struct virtio_uml_device *vu_dev; in vu_of_conn_broken() local
1165 vu_dev = platform_get_drvdata(pdata->pdev); in vu_of_conn_broken()
1167 virtio_break_device(&vu_dev->vdev); in vu_of_conn_broken()
1210 struct virtio_uml_device *vu_dev; in virtio_uml_probe() local
1219 vu_dev = kzalloc(sizeof(*vu_dev), GFP_KERNEL); in virtio_uml_probe()
1220 if (!vu_dev) in virtio_uml_probe()
1223 vu_dev->pdata = pdata; in virtio_uml_probe()
1224 vu_dev->vdev.dev.parent = &pdev->dev; in virtio_uml_probe()
1225 vu_dev->vdev.dev.release = virtio_uml_release_dev; in virtio_uml_probe()
1226 vu_dev->vdev.config = &virtio_uml_config_ops; in virtio_uml_probe()
1227 vu_dev->vdev.id.device = pdata->virtio_device_id; in virtio_uml_probe()
1228 vu_dev->vdev.id.vendor = VIRTIO_DEV_ANY_ID; in virtio_uml_probe()
1229 vu_dev->pdev = pdev; in virtio_uml_probe()
1230 vu_dev->req_fd = -1; in virtio_uml_probe()
1231 vu_dev->irq = UM_IRQ_ALLOC; in virtio_uml_probe()
1240 vu_dev->sock = rc; in virtio_uml_probe()
1242 raw_spin_lock_init(&vu_dev->sock_lock); in virtio_uml_probe()
1244 rc = vhost_user_init(vu_dev); in virtio_uml_probe()
1248 platform_set_drvdata(pdev, vu_dev); in virtio_uml_probe()
1250 device_set_wakeup_capable(&vu_dev->vdev.dev, true); in virtio_uml_probe()
1252 rc = register_virtio_device(&vu_dev->vdev); in virtio_uml_probe()
1254 put_device(&vu_dev->vdev.dev); in virtio_uml_probe()
1255 vu_dev->registered = 1; in virtio_uml_probe()
1259 os_close_file(vu_dev->sock); in virtio_uml_probe()
1261 kfree(vu_dev); in virtio_uml_probe()
1267 struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev); in virtio_uml_remove() local
1269 unregister_virtio_device(&vu_dev->vdev); in virtio_uml_remove()
1299 struct virtio_uml_device *vu_dev; in vu_conn_broken() local
1303 vu_dev = platform_get_drvdata(pdata->pdev); in vu_conn_broken()
1305 virtio_break_device(&vu_dev->vdev); in vu_conn_broken()
1422 struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev); in virtio_uml_suspend() local
1424 if (!vu_dev->no_vq_suspend) { in virtio_uml_suspend()
1427 virtio_device_for_each_vq((&vu_dev->vdev), vq) { in virtio_uml_suspend()
1431 vhost_user_set_vring_enable(vu_dev, vq->index, false); in virtio_uml_suspend()
1435 if (!device_may_wakeup(&vu_dev->vdev.dev)) { in virtio_uml_suspend()
1436 vu_dev->suspended = true; in virtio_uml_suspend()
1440 return irq_set_irq_wake(vu_dev->irq, 1); in virtio_uml_suspend()
1445 struct virtio_uml_device *vu_dev = platform_get_drvdata(pdev); in virtio_uml_resume() local
1447 if (!vu_dev->no_vq_suspend) { in virtio_uml_resume()
1450 virtio_device_for_each_vq((&vu_dev->vdev), vq) { in virtio_uml_resume()
1454 vhost_user_set_vring_enable(vu_dev, vq->index, true); in virtio_uml_resume()
1458 vu_dev->suspended = false; in virtio_uml_resume()
1460 if (!device_may_wakeup(&vu_dev->vdev.dev)) in virtio_uml_resume()
1463 return irq_set_irq_wake(vu_dev->irq, 0); in virtio_uml_resume()