From: "Alex Bennée" <alex.bennee@linaro.org>
To: Haixu Cui <quic_haixcui@quicinc.com>
Cc: <qemu-devel@nongnu.org>, <viresh.kumar@linaro.org>,
<quic_ztu@quicinc.com>, <quic_tsoni@quicinc.com>
Subject: Re: [PATCH] Add vhost-user-spi and vhost-user-spi-pci devices
Date: Tue, 27 Aug 2024 18:14:06 +0100 [thread overview]
Message-ID: <8734mp6g81.fsf@draig.linaro.org> (raw)
In-Reply-To: <20240712034246.2553812-1-quic_haixcui@quicinc.com> (Haixu Cui's message of "Fri, 12 Jul 2024 11:42:46 +0800")
Haixu Cui <quic_haixcui@quicinc.com> writes:
Apologies for the delay in getting to this.
> This work is based on the virtio-spi spec, virtio-spi driver introduced by
> the following patch series:
> - https://github.com/oasis-tcs/virtio-spec/tree/virtio-1.4/device-types/spi
> - https://lwn.net/Articles/966715/
>
> To test with rust-vmm vhost-user-spi daemon, start the vhost-daemon firstly:
> vhost-device-spi --socket-path=vspi.sock --socket-count=1 --device "/dev/spidev0.0"
I'm struggling to test this on my main dev box. Are there any dummy SPI
modules for the kernel for testing? Otherwise we could consider
implementing something similar to "mock_gpio" for the rust-vmm
vhost-user-spi backend?
> Then invoke qemu with the following parameters:
> qemu-system-aarch64 -m 1G \
> -chardev socket,path=/home/root/vspi.sock0,id=vspi \
> -device vhost-user-spi-pci,chardev=vspi,id=spi \
> -object memory-backend-file,id=mem,size=1G,mem-path=/dev/shm,share=on \
> -numa node,memdev=mem
> ...
>
> Signed-off-by: Haixu Cui <quic_haixcui@quicinc.com>
> ---
> hw/virtio/Kconfig | 5 +
> hw/virtio/meson.build | 3 +
> hw/virtio/vhost-user-spi-pci.c | 69 ++++++++
> hw/virtio/vhost-user-spi.c | 66 +++++++
> hw/virtio/virtio.c | 4 +-
> include/hw/virtio/vhost-user-spi.h | 25 +++
> include/standard-headers/linux/virtio_ids.h | 1 +
> include/standard-headers/linux/virtio_spi.h | 186 ++++++++++++++++++++
> 8 files changed, 358 insertions(+), 1 deletion(-)
> create mode 100644 hw/virtio/vhost-user-spi-pci.c
> create mode 100644 hw/virtio/vhost-user-spi.c
> create mode 100644 include/hw/virtio/vhost-user-spi.h
> create mode 100644 include/standard-headers/linux/virtio_spi.h
Generally we want separate headers patches for the importing of headers.
Doubly so in this case because I can't see the SPI definitions in the
current Linux master. So:
- 1/2 - Import headers for SPI (!merge until upstream)
- 2/2 - Implement vhost-user stub for virtio-spi
>
> diff --git a/hw/virtio/Kconfig b/hw/virtio/Kconfig
> index aa63ff7fd4..d5857651e5 100644
> --- a/hw/virtio/Kconfig
> +++ b/hw/virtio/Kconfig
> @@ -110,3 +110,8 @@ config VHOST_USER_SCMI
> bool
> default y
> depends on VIRTIO && VHOST_USER
> +
> +config VHOST_USER_SPI
> + bool
> + default y
> + depends on VIRTIO && VHOST_USER
> diff --git a/hw/virtio/meson.build b/hw/virtio/meson.build
> index 621fc65454..42296219e5 100644
> --- a/hw/virtio/meson.build
> +++ b/hw/virtio/meson.build
> @@ -26,6 +26,7 @@ if have_vhost
> system_virtio_ss.add(when: 'CONFIG_VHOST_USER_RNG', if_true: files('vhost-user-rng.c'))
> 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'))
>
> # PCI Stubs
> system_virtio_ss.add(when: 'CONFIG_VIRTIO_PCI', if_true: files('vhost-user-device-pci.c'))
> @@ -39,6 +40,8 @@ if have_vhost
> if_true: files('vhost-user-snd-pci.c'))
> system_virtio_ss.add(when: ['CONFIG_VIRTIO_PCI', 'CONFIG_VHOST_USER_INPUT'],
> 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'))
> endif
> if have_vhost_vdpa
> system_virtio_ss.add(files('vhost-vdpa.c'))
> diff --git a/hw/virtio/vhost-user-spi-pci.c b/hw/virtio/vhost-user-spi-pci.c
> new file mode 100644
> index 0000000000..3565d526af
> --- /dev/null
> +++ b/hw/virtio/vhost-user-spi-pci.c
> @@ -0,0 +1,69 @@
> +/*
> + * Vhost-user spi virtio device PCI glue
> + *
> + * Copyright(c) 2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "hw/qdev-properties.h"
> +#include "hw/virtio/vhost-user-spi.h"
> +#include "hw/virtio/virtio-pci.h"
> +
> +struct VHostUserSPIPCI {
> + VirtIOPCIProxy parent_obj;
> + VHostUserSPI vdev;
> +};
> +
> +typedef struct VHostUserSPIPCI VHostUserSPIPCI;
> +
> +#define TYPE_VHOST_USER_SPI_PCI "vhost-user-spi-pci-base"
> +
> +DECLARE_INSTANCE_CHECKER(VHostUserSPIPCI, VHOST_USER_SPI_PCI,
> + TYPE_VHOST_USER_SPI_PCI)
> +
> +static void vhost_user_spi_pci_realize(VirtIOPCIProxy *vpci_dev, Error **errp)
> +{
> + VHostUserSPIPCI *dev = VHOST_USER_SPI_PCI(vpci_dev);
> + DeviceState *vdev = DEVICE(&dev->vdev);
> +
> + vpci_dev->nvectors = 1;
> + qdev_realize(vdev, BUS(&vpci_dev->bus), errp);
> +}
> +
> +static void vhost_user_spi_pci_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> + VirtioPCIClass *k = VIRTIO_PCI_CLASS(klass);
> + PCIDeviceClass *pcidev_k = PCI_DEVICE_CLASS(klass);
> + k->realize = vhost_user_spi_pci_realize;
> + set_bit(DEVICE_CATEGORY_INPUT, 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_COMMUNICATION_OTHER;
> +}
> +
> +static void vhost_user_spi_pci_instance_init(Object *obj)
> +{
> + VHostUserSPIPCI *dev = VHOST_USER_SPI_PCI(obj);
> +
> + virtio_instance_init_common(obj, &dev->vdev, sizeof(dev->vdev),
> + TYPE_VHOST_USER_SPI);
> +}
> +
> +static const VirtioPCIDeviceTypeInfo vhost_user_spi_pci_info = {
> + .base_name = TYPE_VHOST_USER_SPI_PCI,
> + .non_transitional_name = "vhost-user-spi-pci",
> + .instance_size = sizeof(VHostUserSPIPCI),
> + .instance_init = vhost_user_spi_pci_instance_init,
> + .class_init = vhost_user_spi_pci_class_init,
> +};
> +
> +static void vhost_user_spi_pci_register(void)
> +{
> + virtio_pci_types_register(&vhost_user_spi_pci_info);
> +}
> +
> +type_init(vhost_user_spi_pci_register);
> diff --git a/hw/virtio/vhost-user-spi.c b/hw/virtio/vhost-user-spi.c
> new file mode 100644
> index 0000000000..e138b8b53b
> --- /dev/null
> +++ b/hw/virtio/vhost-user-spi.c
> @@ -0,0 +1,66 @@
> +/*
> + * Vhost-user spi virtio device
> + *
> + * Copyright(c) 2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
> + *
> + * SPDX-License-Identifier: GPL-2.0-or-later
> + */
> +
> +#include "qemu/osdep.h"
> +#include "qapi/error.h"
> +#include "hw/qdev-properties.h"
> +#include "hw/virtio/virtio-bus.h"
> +#include "hw/virtio/vhost-user-spi.h"
> +#include "qemu/error-report.h"
> +#include "standard-headers/linux/virtio_ids.h"
> +#include "standard-headers/linux/virtio_spi.h"
> +
> +static Property vspi_properties[] = {
> + DEFINE_PROP_CHR("chardev", VHostUserBase, chardev),
> + DEFINE_PROP_END_OF_LIST(),
> +};
> +
> +static void vspi_realize(DeviceState *dev, Error **errp)
> +{
> + VHostUserBase *vub = VHOST_USER_BASE(dev);
> + VHostUserBaseClass *vubc = VHOST_USER_BASE_GET_CLASS(dev);
> +
> + /* Fixed for SPI */
> + vub->virtio_id = VIRTIO_ID_SPI;
> + vub->num_vqs = 1;
> + vub->vq_size = 4;
> + vub->config_size = sizeof(struct virtio_spi_config);
> +
> + vubc->parent_realize(dev, errp);
> +}
> +
> +static const VMStateDescription vu_spi_vmstate = {
> + .name = "vhost-user-spi",
> + .unmigratable = 1,
> +};
> +
> +static void vu_spi_class_init(ObjectClass *klass, void *data)
> +{
> + DeviceClass *dc = DEVICE_CLASS(klass);
> + VHostUserBaseClass *vubc = VHOST_USER_BASE_CLASS(klass);
> +
> + dc->vmsd = &vu_spi_vmstate;
> + device_class_set_props(dc, vspi_properties);
> + device_class_set_parent_realize(dc, vspi_realize,
> + &vubc->parent_realize);
> + set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
> +}
> +
> +static const TypeInfo vu_spi_info = {
> + .name = TYPE_VHOST_USER_SPI,
> + .parent = TYPE_VHOST_USER_BASE,
> + .instance_size = sizeof(VHostUserSPI),
> + .class_init = vu_spi_class_init,
> +};
> +
> +static void vu_spi_register_types(void)
> +{
> + type_register_static(&vu_spi_info);
> +}
> +
> +type_init(vu_spi_register_types)
> diff --git a/hw/virtio/virtio.c b/hw/virtio/virtio.c
> index 583a224163..689e2e21e7 100644
> --- a/hw/virtio/virtio.c
> +++ b/hw/virtio/virtio.c
> @@ -46,6 +46,7 @@
> #include "standard-headers/linux/virtio_iommu.h"
> #include "standard-headers/linux/virtio_mem.h"
> #include "standard-headers/linux/virtio_vsock.h"
> +#include "standard-headers/linux/virtio_spi.h"
>
> /*
> * Maximum size of virtio device config space
> @@ -194,7 +195,8 @@ const char *virtio_device_names[] = {
> [VIRTIO_ID_PARAM_SERV] = "virtio-param-serv",
> [VIRTIO_ID_AUDIO_POLICY] = "virtio-audio-pol",
> [VIRTIO_ID_BT] = "virtio-bluetooth",
> - [VIRTIO_ID_GPIO] = "virtio-gpio"
> + [VIRTIO_ID_GPIO] = "virtio-gpio",
> + [VIRTIO_ID_SPI] = "virtio-spi"
> };
For the vhost-user-stub bits when split from the headers:
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
--
Alex Bennée
Virtualisation Tech Lead @ Linaro
next prev parent reply other threads:[~2024-08-27 17:15 UTC|newest]
Thread overview: 7+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-07-12 3:42 [PATCH] Add vhost-user-spi and vhost-user-spi-pci devices Haixu Cui
2024-08-06 3:33 ` Haixu Cui
2024-08-26 9:04 ` Haixu Cui
2024-08-27 17:14 ` Alex Bennée [this message]
2024-09-02 8:57 ` Haixu Cui
2024-09-02 10:15 ` Alex Bennée
2024-09-10 8:39 ` Haixu Cui
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=8734mp6g81.fsf@draig.linaro.org \
--to=alex.bennee@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=quic_haixcui@quicinc.com \
--cc=quic_tsoni@quicinc.com \
--cc=quic_ztu@quicinc.com \
--cc=viresh.kumar@linaro.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.