xref: /qemu/hw/virtio/vhost-user-gpio.c (revision 1577a9180f374cd8bca32f8a5e8c8ac8977d7199)
127ba7b02SViresh Kumar /*
227ba7b02SViresh Kumar  * Vhost-user GPIO virtio device
327ba7b02SViresh Kumar  *
427ba7b02SViresh Kumar  * Copyright (c) 2022 Viresh Kumar <viresh.kumar@linaro.org>
527ba7b02SViresh Kumar  *
627ba7b02SViresh Kumar  * SPDX-License-Identifier: GPL-2.0-or-later
727ba7b02SViresh Kumar  */
827ba7b02SViresh Kumar 
927ba7b02SViresh Kumar #include "qemu/osdep.h"
1027ba7b02SViresh Kumar #include "qapi/error.h"
1127ba7b02SViresh Kumar #include "hw/qdev-properties.h"
1227ba7b02SViresh Kumar #include "hw/virtio/virtio-bus.h"
1327ba7b02SViresh Kumar #include "hw/virtio/vhost-user-gpio.h"
1427ba7b02SViresh Kumar #include "standard-headers/linux/virtio_ids.h"
155ba58758SAlex Bennée #include "standard-headers/linux/virtio_gpio.h"
1627ba7b02SViresh Kumar 
17*1577a918SRichard Henderson static const Property vgpio_properties[] = {
185ba58758SAlex Bennée     DEFINE_PROP_CHR("chardev", VHostUserBase, chardev),
195ba58758SAlex Bennée     DEFINE_PROP_END_OF_LIST(),
2027ba7b02SViresh Kumar };
2127ba7b02SViresh Kumar 
225ba58758SAlex Bennée static void vgpio_realize(DeviceState *dev, Error **errp)
2327ba7b02SViresh Kumar {
245ba58758SAlex Bennée     VHostUserBase *vub = VHOST_USER_BASE(dev);
255ba58758SAlex Bennée     VHostUserBaseClass *vubc = VHOST_USER_BASE_GET_CLASS(dev);
2627ba7b02SViresh Kumar 
275ba58758SAlex Bennée     /* Fixed for GPIO */
285ba58758SAlex Bennée     vub->virtio_id = VIRTIO_ID_GPIO;
295ba58758SAlex Bennée     vub->num_vqs = 2;
305ba58758SAlex Bennée     vub->config_size = sizeof(struct virtio_gpio_config);
3127ba7b02SViresh Kumar 
325ba58758SAlex Bennée     vubc->parent_realize(dev, errp);
3327ba7b02SViresh Kumar }
3427ba7b02SViresh Kumar 
3527ba7b02SViresh Kumar static const VMStateDescription vu_gpio_vmstate = {
3627ba7b02SViresh Kumar     .name = "vhost-user-gpio",
3727ba7b02SViresh Kumar     .unmigratable = 1,
3827ba7b02SViresh Kumar };
3927ba7b02SViresh Kumar 
4027ba7b02SViresh Kumar static void vu_gpio_class_init(ObjectClass *klass, void *data)
4127ba7b02SViresh Kumar {
4227ba7b02SViresh Kumar     DeviceClass *dc = DEVICE_CLASS(klass);
435ba58758SAlex Bennée     VHostUserBaseClass *vubc = VHOST_USER_BASE_CLASS(klass);
4427ba7b02SViresh Kumar 
4527ba7b02SViresh Kumar     dc->vmsd = &vu_gpio_vmstate;
465ba58758SAlex Bennée     device_class_set_props(dc, vgpio_properties);
475ba58758SAlex Bennée     device_class_set_parent_realize(dc, vgpio_realize,
485ba58758SAlex Bennée                                     &vubc->parent_realize);
4927ba7b02SViresh Kumar     set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
5027ba7b02SViresh Kumar }
5127ba7b02SViresh Kumar 
5227ba7b02SViresh Kumar static const TypeInfo vu_gpio_info = {
5327ba7b02SViresh Kumar     .name = TYPE_VHOST_USER_GPIO,
545ba58758SAlex Bennée     .parent = TYPE_VHOST_USER_BASE,
5527ba7b02SViresh Kumar     .instance_size = sizeof(VHostUserGPIO),
5627ba7b02SViresh Kumar     .class_init = vu_gpio_class_init,
5727ba7b02SViresh Kumar };
5827ba7b02SViresh Kumar 
5927ba7b02SViresh Kumar static void vu_gpio_register_types(void)
6027ba7b02SViresh Kumar {
6127ba7b02SViresh Kumar     type_register_static(&vu_gpio_info);
6227ba7b02SViresh Kumar }
6327ba7b02SViresh Kumar 
6427ba7b02SViresh Kumar type_init(vu_gpio_register_types)
65