From: Manos Pitsidianakis Date: Fri, 24 Oct 2025 18:35:30 +0000 (+0300) Subject: virtio: Add vhost-user-rtc and vhost-user-rtc-pci X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e331d3089ee64411013eea74fdf71ccf30bcb626;p=thirdparty%2Fqemu.git virtio: Add vhost-user-rtc and vhost-user-rtc-pci Authored solely by me for Panasonic Automotive Systems Co., Ltd., but based on existing vhost-user devices I wrote in 2025, so the copyright is mixed. Reviewed-by: Alex Bennée Tested-by: Alex Bennée Link: https://lore.kernel.org/qemu-devel/20260416-vhost-user-rtc-v2-1-100a53bfc6ce@linaro.org Signed-off-by: Manos Pitsidianakis --- diff --git a/MAINTAINERS b/MAINTAINERS index 80d28e618d..eda1e84268 100644 --- a/MAINTAINERS +++ b/MAINTAINERS @@ -2586,6 +2586,12 @@ S: Maintained F: include/hw/virtio/vhost-user-spi.h F: hw/virtio/vhost-user-spi* +vhost-user-rtc +M: Manos Pitsidianakis +S: Supported +F: include/hw/virtio/vhost-user-rtc.h +F: hw/virtio/vhost-user-rtc* + virtio-crypto M: Gonglei S: Supported diff --git a/docs/system/devices/virtio/vhost-user.rst b/docs/system/devices/virtio/vhost-user.rst index 2806d81ca2..acfbd609d0 100644 --- a/docs/system/devices/virtio/vhost-user.rst +++ b/docs/system/devices/virtio/vhost-user.rst @@ -61,6 +61,9 @@ platform details for what sort of virtio bus to use. * - vhost-user-spi - Proxy spi devices to host - `vhost-device-spi `_ + * - vhost-user-rtc + - Real time clock + - `vhost-device-rtc `_ The referenced *daemons* are not exhaustive, any conforming backend implementing the device and using the vhost-user protocol should work. diff --git a/hw/virtio/Kconfig b/hw/virtio/Kconfig index 8895682c61..2ebdac16b3 100644 --- a/hw/virtio/Kconfig +++ b/hw/virtio/Kconfig @@ -136,3 +136,8 @@ config VHOST_USER_TEST bool default y depends on VIRTIO && VHOST_USER + +config VHOST_USER_RTC + bool + default y + depends on VIRTIO && VHOST_USER diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build index 415e359e9f..e0566a60de 100644 --- a/hw/virtio/meson.build +++ b/hw/virtio/meson.build @@ -27,6 +27,7 @@ if have_vhost system_virtio_ss.add(when: 'CONFIG_VHOST_USER_SND', if_true: files('vhost-user-snd.c')) system_virtio_ss.add(when: 'CONFIG_VHOST_USER_INPUT', if_true: files('vhost-user-input.c')) system_virtio_ss.add(when: 'CONFIG_VHOST_USER_SPI', if_true: files('vhost-user-spi.c')) + system_virtio_ss.add(when: 'CONFIG_VHOST_USER_RTC', if_true: files('vhost-user-rtc.c')) # PCI Stubs system_virtio_ss.add(when: ['CONFIG_VIRTIO_PCI', 'CONFIG_VHOST_USER_TEST'], @@ -43,6 +44,8 @@ if have_vhost if_true: files('vhost-user-input-pci.c')) system_virtio_ss.add(when: ['CONFIG_VIRTIO_PCI', 'CONFIG_VHOST_USER_SPI'], if_true: files('vhost-user-spi-pci.c')) + system_virtio_ss.add(when: ['CONFIG_VIRTIO_PCI', 'CONFIG_VHOST_USER_RTC'], + if_true: files('vhost-user-rtc-pci.c')) endif if have_vhost_vdpa system_virtio_ss.add(files('vhost-vdpa.c')) diff --git a/hw/virtio/vhost-user-rtc-pci.c b/hw/virtio/vhost-user-rtc-pci.c new file mode 100644 index 0000000000..449368d270 --- /dev/null +++ b/hw/virtio/vhost-user-rtc-pci.c @@ -0,0 +1,70 @@ +/* + * Vhost-user RTC virtio device PCI glue + * + * Copyright (c) 2025 Manos Pitsidianakis + * Copyright 2026 Panasonic Automotive Systems Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "hw/virtio/vhost-user-rtc.h" +#include "hw/virtio/virtio-pci.h" + +struct VHostUserRTCPCI { + VirtIOPCIProxy parent_obj; + VHostUserRTC vdev; +}; + +typedef struct VHostUserRTCPCI VHostUserRTCPCI; + +#define TYPE_VHOST_USER_RTC_PCI "vhost-user-rtc-pci-base" + +DECLARE_INSTANCE_CHECKER(VHostUserRTCPCI, VHOST_USER_RTC_PCI, + TYPE_VHOST_USER_RTC_PCI) + +static void vhost_user_rtc_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp) +{ + VHostUserRTCPCI *dev = VHOST_USER_RTC_PCI(vpci_dev); + DeviceState *vdev = DEVICE(&dev->vdev); + + vpci_dev->nvectors = 1; + + qdev_realize(vdev, BUS(&vpci_dev->bus), errp); +} + +static void vhost_user_rtc_pci_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass); + PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass); + k->realize = vhost_user_rtc_pci_realize; + set_bit(DEVICE_CATEGORY_MISC, dc->categories); + pcidev_k->vendor_id = PCI_VENDOR_ID_REDHAT_QUMRANET; + pcidev_k->device_id = 0; /* Set by virtio-pci based on virtio id */ + pcidev_k->revision = 0x00; + pcidev_k->class_id = PCI_CLASS_SYSTEM_RTC; +} + +static void vhost_user_rtc_pci_instance_init(Object *obj) +{ + VHostUserRTCPCI *dev = VHOST_USER_RTC_PCI(obj); + + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev), + TYPE_VHOST_USER_RTC); +} + +static const VirtioPCIDeviceTypeInfo vhost_user_rtc_pci_info = { + .base_name = TYPE_VHOST_USER_RTC_PCI, + .non_transitional_name = "vhost-user-rtc-pci", + .instance_size = sizeof(VHostUserRTCPCI), + .instance_init = vhost_user_rtc_pci_instance_init, + .class_init = vhost_user_rtc_pci_class_init, +}; + +static void vhost_user_rtc_pci_register(void) +{ + virtio_pci_types_register(&vhost_user_rtc_pci_info); +} + +type_init(vhost_user_rtc_pci_register); diff --git a/hw/virtio/vhost-user-rtc.c b/hw/virtio/vhost-user-rtc.c new file mode 100644 index 0000000000..88b0c70b90 --- /dev/null +++ b/hw/virtio/vhost-user-rtc.c @@ -0,0 +1,64 @@ +/* + * Vhost-user RTC virtio device + * + * Copyright (c) 2025 Manos Pitsidianakis + * Copyright 2026 Panasonic Automotive Systems Co., Ltd. + * + * Simple wrapper of the generic vhost-user-device. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#include "qemu/osdep.h" +#include "qapi/error.h" +#include "hw/virtio/vhost-user-rtc.h" +#include "standard-headers/linux/virtio_ids.h" + +static const VMStateDescription vu_rtc_vmstate = { + .name = "vhost-user-rtc", + .unmigratable = 1, +}; + +static const Property vrtc_properties[] = { + DEFINE_PROP_CHR("chardev", VHostUserBase, chardev), +}; + +static void vu_rtc_base_realize(DeviceState *dev, Error **errp) +{ + VHostUserBase *vub = VHOST_USER_BASE(dev); + VHostUserBaseClass *vubs = VHOST_USER_BASE_GET_CLASS(dev); + + vub->virtio_id = VIRTIO_ID_CLOCK; + vub->num_vqs = 2; + vub->config_size = 0; + vub->vq_size = 1024; + + vubs->parent_realize(dev, errp); +} + +static void vu_rtc_class_init(ObjectClass *klass, const void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + VHostUserBaseClass *vubc = VHOST_USER_BASE_CLASS(klass); + + dc->vmsd = &vu_rtc_vmstate; + device_class_set_props(dc, vrtc_properties); + device_class_set_parent_realize(dc, vu_rtc_base_realize, + &vubc->parent_realize); + + set_bit(DEVICE_CATEGORY_MISC, dc->categories); +} + +static const TypeInfo vu_rtc_info = { + .name = TYPE_VHOST_USER_RTC, + .parent = TYPE_VHOST_USER_BASE, + .instance_size = sizeof(VHostUserRTC), + .class_init = vu_rtc_class_init, +}; + +static void vu_rtc_register_types(void) +{ + type_register_static(&vu_rtc_info); +} + +type_init(vu_rtc_register_types) diff --git a/include/hw/virtio/vhost-user-rtc.h b/include/hw/virtio/vhost-user-rtc.h new file mode 100644 index 0000000000..6b7b53c28f --- /dev/null +++ b/include/hw/virtio/vhost-user-rtc.h @@ -0,0 +1,22 @@ +/* + * Vhost-user RTC virtio device + * + * Copyright (c) 2025 Manos Pitsidianakis + * Copyright 2026 Panasonic Automotive Systems Co., Ltd. + * + * SPDX-License-Identifier: GPL-2.0-or-later + */ + +#ifndef QEMU_VHOST_USER_RTC_H +#define QEMU_VHOST_USER_RTC_H + +#include "hw/virtio/vhost-user-base.h" + +#define TYPE_VHOST_USER_RTC "vhost-user-rtc" +OBJECT_DECLARE_SIMPLE_TYPE(VHostUserRTC, VHOST_USER_RTC) + +struct VHostUserRTC { + VHostUserBase parent_obj; +}; + +#endif /* QEMU_VHOST_USER_RTC_H */