vhost-user-input.c 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. /*
  2. * This work is licensed under the terms of the GNU GPL, version 2 or
  3. * (at your option) any later version. See the COPYING file in the
  4. * top-level directory.
  5. */
  6. #include "qemu/osdep.h"
  7. #include "qemu/error-report.h"
  8. #include "qapi/error.h"
  9. #include "qemu-common.h"
  10. #include "hw/virtio/virtio-input.h"
  11. static int vhost_input_config_change(struct vhost_dev *dev)
  12. {
  13. error_report("vhost-user-input: unhandled backend config change");
  14. return -1;
  15. }
  16. static const VhostDevConfigOps config_ops = {
  17. .vhost_dev_config_notifier = vhost_input_config_change,
  18. };
  19. static void vhost_input_realize(DeviceState *dev, Error **errp)
  20. {
  21. VHostUserInput *vhi = VHOST_USER_INPUT(dev);
  22. VirtIOInput *vinput = VIRTIO_INPUT(dev);
  23. VirtIODevice *vdev = VIRTIO_DEVICE(dev);
  24. vhost_dev_set_config_notifier(&vhi->vhost->dev, &config_ops);
  25. vinput->cfg_size = sizeof_field(virtio_input_config, u);
  26. if (vhost_user_backend_dev_init(vhi->vhost, vdev, 2, errp) == -1) {
  27. return;
  28. }
  29. }
  30. static void vhost_input_change_active(VirtIOInput *vinput)
  31. {
  32. VHostUserInput *vhi = VHOST_USER_INPUT(vinput);
  33. if (vinput->active) {
  34. vhost_user_backend_start(vhi->vhost);
  35. } else {
  36. vhost_user_backend_stop(vhi->vhost);
  37. }
  38. }
  39. static void vhost_input_get_config(VirtIODevice *vdev, uint8_t *config_data)
  40. {
  41. VirtIOInput *vinput = VIRTIO_INPUT(vdev);
  42. VHostUserInput *vhi = VHOST_USER_INPUT(vdev);
  43. int ret;
  44. memset(config_data, 0, vinput->cfg_size);
  45. ret = vhost_dev_get_config(&vhi->vhost->dev, config_data, vinput->cfg_size);
  46. if (ret) {
  47. error_report("vhost-user-input: get device config space failed");
  48. return;
  49. }
  50. }
  51. static void vhost_input_set_config(VirtIODevice *vdev,
  52. const uint8_t *config_data)
  53. {
  54. VHostUserInput *vhi = VHOST_USER_INPUT(vdev);
  55. int ret;
  56. ret = vhost_dev_set_config(&vhi->vhost->dev, config_data,
  57. 0, sizeof(virtio_input_config),
  58. VHOST_SET_CONFIG_TYPE_MASTER);
  59. if (ret) {
  60. error_report("vhost-user-input: set device config space failed");
  61. return;
  62. }
  63. virtio_notify_config(vdev);
  64. }
  65. static const VMStateDescription vmstate_vhost_input = {
  66. .name = "vhost-user-input",
  67. .unmigratable = 1,
  68. };
  69. static void vhost_input_class_init(ObjectClass *klass, void *data)
  70. {
  71. VirtIOInputClass *vic = VIRTIO_INPUT_CLASS(klass);
  72. VirtioDeviceClass *vdc = VIRTIO_DEVICE_CLASS(klass);
  73. DeviceClass *dc = DEVICE_CLASS(klass);
  74. dc->vmsd = &vmstate_vhost_input;
  75. vdc->get_config = vhost_input_get_config;
  76. vdc->set_config = vhost_input_set_config;
  77. vic->realize = vhost_input_realize;
  78. vic->change_active = vhost_input_change_active;
  79. }
  80. static void vhost_input_init(Object *obj)
  81. {
  82. VHostUserInput *vhi = VHOST_USER_INPUT(obj);
  83. vhi->vhost = VHOST_USER_BACKEND(object_new(TYPE_VHOST_USER_BACKEND));
  84. object_property_add_alias(obj, "chardev",
  85. OBJECT(vhi->vhost), "chardev");
  86. }
  87. static void vhost_input_finalize(Object *obj)
  88. {
  89. VHostUserInput *vhi = VHOST_USER_INPUT(obj);
  90. object_unref(OBJECT(vhi->vhost));
  91. }
  92. static const TypeInfo vhost_input_info = {
  93. .name = TYPE_VHOST_USER_INPUT,
  94. .parent = TYPE_VIRTIO_INPUT,
  95. .instance_size = sizeof(VHostUserInput),
  96. .instance_init = vhost_input_init,
  97. .instance_finalize = vhost_input_finalize,
  98. .class_init = vhost_input_class_init,
  99. };
  100. static void vhost_input_register_types(void)
  101. {
  102. type_register_static(&vhost_input_info);
  103. }
  104. type_init(vhost_input_register_types)