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
7 #include "qemu/osdep.h"
8 #include "qemu/error-report.h"
9 #include "qapi/error.h"
10 #include "qemu-common.h"
13 #include "hw/virtio/virtio-input.h"
15 static int vhost_input_config_change(struct vhost_dev
*dev
)
17 error_report("vhost-user-input: unhandled backend config change");
21 static const VhostDevConfigOps config_ops
= {
22 .vhost_dev_config_notifier
= vhost_input_config_change
,
25 static void vhost_input_realize(DeviceState
*dev
, Error
**errp
)
27 VHostUserInput
*vhi
= VHOST_USER_INPUT(dev
);
28 VirtIOInput
*vinput
= VIRTIO_INPUT(dev
);
29 VirtIODevice
*vdev
= VIRTIO_DEVICE(dev
);
31 vhost_dev_set_config_notifier(&vhi
->vhost
->dev
, &config_ops
);
32 vinput
->cfg_size
= sizeof_field(virtio_input_config
, u
);
33 if (vhost_user_backend_dev_init(vhi
->vhost
, vdev
, 2, errp
) == -1) {
38 static void vhost_input_change_active(VirtIOInput
*vinput
)
40 VHostUserInput
*vhi
= VHOST_USER_INPUT(vinput
);
43 vhost_user_backend_start(vhi
->vhost
);
45 vhost_user_backend_stop(vhi
->vhost
);
49 static void vhost_input_get_config(VirtIODevice
*vdev
, uint8_t *config_data
)
51 VirtIOInput
*vinput
= VIRTIO_INPUT(vdev
);
52 VHostUserInput
*vhi
= VHOST_USER_INPUT(vdev
);
55 memset(config_data
, 0, vinput
->cfg_size
);
57 ret
= vhost_dev_get_config(&vhi
->vhost
->dev
, config_data
, vinput
->cfg_size
);
59 error_report("vhost-user-input: get device config space failed");
64 static void vhost_input_set_config(VirtIODevice
*vdev
,
65 const uint8_t *config_data
)
67 VHostUserInput
*vhi
= VHOST_USER_INPUT(vdev
);
70 ret
= vhost_dev_set_config(&vhi
->vhost
->dev
, config_data
,
71 0, sizeof(virtio_input_config
),
72 VHOST_SET_CONFIG_TYPE_MASTER
);
74 error_report("vhost-user-input: set device config space failed");
78 virtio_notify_config(vdev
);
81 static const VMStateDescription vmstate_vhost_input
= {
82 .name
= "vhost-user-input",
86 static void vhost_input_class_init(ObjectClass
*klass
, void *data
)
88 VirtIOInputClass
*vic
= VIRTIO_INPUT_CLASS(klass
);
89 VirtioDeviceClass
*vdc
= VIRTIO_DEVICE_CLASS(klass
);
90 DeviceClass
*dc
= DEVICE_CLASS(klass
);
92 dc
->vmsd
= &vmstate_vhost_input
;
93 vdc
->get_config
= vhost_input_get_config
;
94 vdc
->set_config
= vhost_input_set_config
;
95 vic
->realize
= vhost_input_realize
;
96 vic
->change_active
= vhost_input_change_active
;
99 static void vhost_input_init(Object
*obj
)
101 VHostUserInput
*vhi
= VHOST_USER_INPUT(obj
);
103 vhi
->vhost
= VHOST_USER_BACKEND(object_new(TYPE_VHOST_USER_BACKEND
));
104 object_property_add_alias(obj
, "chardev",
105 OBJECT(vhi
->vhost
), "chardev", &error_abort
);
108 static void vhost_input_finalize(Object
*obj
)
110 VHostUserInput
*vhi
= VHOST_USER_INPUT(obj
);
112 object_unref(OBJECT(vhi
->vhost
));
115 static const TypeInfo vhost_input_info
= {
116 .name
= TYPE_VHOST_USER_INPUT
,
117 .parent
= TYPE_VIRTIO_INPUT
,
118 .instance_size
= sizeof(VHostUserInput
),
119 .instance_init
= vhost_input_init
,
120 .instance_finalize
= vhost_input_finalize
,
121 .class_init
= vhost_input_class_init
,
124 static void vhost_input_register_types(void)
126 type_register_static(&vhost_input_info
);
129 type_init(vhost_input_register_types
)