Browse Source
intel_iommu:
SVM support
vhost:
support for indirect descriptors in shadow virtqueue
vhost-user:
vhost-user-spi support
vhost-user-blk inflight migration support
vhost-user-blk inflight migration support
misc fixes in pci, vhost, virtio, acpi, cxl
cleanups in acpi/ghes
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
-----BEGIN PGP SIGNATURE-----
iQFDBAABCgAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmmEa9APHG1zdEByZWRo
YXQuY29tAAoJECgfDbjSjVRpqj8H/iBqAHZSTmAdBJgoLnmgoTLB01J9aUTrQU2H
BHKyrd+G3m54pwjgUNN5ieZARtlXscigf6fr0Gq2wrc8/kV/O5G5jViw9+1Bo8nW
OkLDW45nDzZGhap4oUedV+PJ3fCuW2fC8Jyb1n8OGlkadbhq0NU6GtqiEx6/7QIh
hk5WUDE/3LH4cTp8qNtr0/nYfM4FZk2sjq7aRyg4cz/uC7rIAFRq7BCZ/dfRqMh/
T+rLnizSSAg9PFMd8slWqoxOGF9NzT9LIoDSkAlso1L9lUekUSNoUblhlWDrRlLn
DEEqqGCVounfBzA95WrTRmvWs6JodppjjAjI0M4isrMKGXXg8dg=
=HdgY
-----END PGP SIGNATURE-----
Merge tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging
virtio,pci,pc: features, fixes
intel_iommu:
SVM support
vhost:
support for indirect descriptors in shadow virtqueue
vhost-user:
vhost-user-spi support
vhost-user-blk inflight migration support
vhost-user-blk inflight migration support
misc fixes in pci, vhost, virtio, acpi, cxl
cleanups in acpi/ghes
Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
# -----BEGIN PGP SIGNATURE-----
#
# iQFDBAABCgAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmmEa9APHG1zdEByZWRo
# YXQuY29tAAoJECgfDbjSjVRpqj8H/iBqAHZSTmAdBJgoLnmgoTLB01J9aUTrQU2H
# BHKyrd+G3m54pwjgUNN5ieZARtlXscigf6fr0Gq2wrc8/kV/O5G5jViw9+1Bo8nW
# OkLDW45nDzZGhap4oUedV+PJ3fCuW2fC8Jyb1n8OGlkadbhq0NU6GtqiEx6/7QIh
# hk5WUDE/3LH4cTp8qNtr0/nYfM4FZk2sjq7aRyg4cz/uC7rIAFRq7BCZ/dfRqMh/
# T+rLnizSSAg9PFMd8slWqoxOGF9NzT9LIoDSkAlso1L9lUekUSNoUblhlWDrRlLn
# DEEqqGCVounfBzA95WrTRmvWs6JodppjjAjI0M4isrMKGXXg8dg=
# =HdgY
# -----END PGP SIGNATURE-----
# gpg: Signature made Thu Feb 5 10:07:12 2026 GMT
# gpg: using RSA key 5D09FD0871C8F85B94CA8A0D281F0DB8D28D5469
# gpg: issuer "mst@redhat.com"
# gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" [full]
# gpg: aka "Michael S. Tsirkin <mst@redhat.com>" [full]
# Primary key fingerprint: 0270 606B 6F3C DF3D 0B17 0970 C350 3912 AFBE 8E67
# Subkey fingerprint: 5D09 FD08 71C8 F85B 94CA 8A0D 281F 0DB8 D28D 5469
* tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu: (38 commits)
hw/cxl: Take into account how many media operations are requested for param check
hw/cxl: Check for overflow on santize media as both base and offset 64bit.
vhost-user-blk: support inter-host inflight migration
vhost: add vmstate for inflight region with inner buffer
vmstate: introduce VMSTATE_VBUFFER_UINT64
vhost-user: introduce protocol feature for skip drain on GET_VRING_BASE
vhost-user.rst: specify vhost-user back-end action on GET_VRING_BASE
virtio-gpu: use consistent error checking for virtio_gpu_create_mapping_iov
virtio-gpu: fix error handling in virgl_cmd_resource_create_blob
virtio-pmem: ignore empty queue notifications
virtio-gpu-virgl: correct parent for blob memory region
MAINTAINERS: Update VIOT maintainer
cryptodev-builtin: Limit the maximum size
hw/virtio/virtio-crypto: verify asym request size
virtio-spi: Add vhost-user-spi device support
standard-headers: Update virtio_spi.h from Linux v6.18-rc3
q35: Fix migration of SMRAM state
pcie_sriov: Fix PCI_SRIOV_* accesses in pcie_sriov_pf_exit()
virtio: Fix crash when sriov-pf is set for non-PCI-Express device
virtio-dmabuf: Ensure UUID persistence for hash table insertion
...
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
pull/319/head
57 changed files with 791 additions and 208 deletions
@ -0,0 +1,69 @@ |
|||
/*
|
|||
* Vhost-user spi virtio device PCI glue |
|||
* |
|||
* Copyright (C) 2025 Qualcomm Innovation Center, Inc. All Rights Reserved. |
|||
* |
|||
* SPDX-License-Identifier: GPL-2.0-or-later |
|||
*/ |
|||
|
|||
#include "qemu/osdep.h" |
|||
#include "hw/core/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, 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_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); |
|||
@ -0,0 +1,65 @@ |
|||
/*
|
|||
* Vhost-user spi virtio device |
|||
* |
|||
* Copyright (C) 2025 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/core/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 const Property vspi_properties[] = { |
|||
DEFINE_PROP_CHR("chardev", VHostUserBase, chardev), |
|||
}; |
|||
|
|||
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, const 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) |
|||
@ -0,0 +1,25 @@ |
|||
/*
|
|||
* Vhost-user spi virtio device |
|||
* |
|||
* Copyright (C) 2025 Qualcomm Innovation Center, Inc. All Rights Reserved. |
|||
* |
|||
* SPDX-License-Identifier: GPL-2.0-or-later |
|||
*/ |
|||
|
|||
#ifndef QEMU_VHOST_USER_SPI_H |
|||
#define QEMU_VHOST_USER_SPI_H |
|||
|
|||
#include "hw/virtio/virtio.h" |
|||
#include "hw/virtio/vhost.h" |
|||
#include "hw/virtio/vhost-user.h" |
|||
#include "hw/virtio/vhost-user-base.h" |
|||
|
|||
#define TYPE_VHOST_USER_SPI "vhost-user-spi-device" |
|||
|
|||
OBJECT_DECLARE_SIMPLE_TYPE(VHostUserSPI, VHOST_USER_SPI) |
|||
|
|||
struct VHostUserSPI { |
|||
VHostUserBase parent_obj; |
|||
}; |
|||
|
|||
#endif /* QEMU_VHOST_USER_SPI_H */ |
|||
@ -0,0 +1,181 @@ |
|||
/* SPDX-License-Identifier: BSD-3-Clause */ |
|||
/*
|
|||
* Copyright (C) 2023 OpenSynergy GmbH |
|||
* Copyright (C) 2025 Qualcomm Innovation Center, Inc. All rights reserved. |
|||
*/ |
|||
#ifndef _LINUX_VIRTIO_VIRTIO_SPI_H |
|||
#define _LINUX_VIRTIO_VIRTIO_SPI_H |
|||
|
|||
#include "standard-headers/linux/types.h" |
|||
#include "standard-headers/linux/virtio_config.h" |
|||
#include "standard-headers/linux/virtio_ids.h" |
|||
#include "standard-headers/linux/virtio_types.h" |
|||
|
|||
/* Sample data on trailing clock edge */ |
|||
#define VIRTIO_SPI_CPHA _BITUL(0) |
|||
/* Clock is high when IDLE */ |
|||
#define VIRTIO_SPI_CPOL _BITUL(1) |
|||
/* Chip Select is active high */ |
|||
#define VIRTIO_SPI_CS_HIGH _BITUL(2) |
|||
/* Transmit LSB first */ |
|||
#define VIRTIO_SPI_MODE_LSB_FIRST _BITUL(3) |
|||
/* Loopback mode */ |
|||
#define VIRTIO_SPI_MODE_LOOP _BITUL(4) |
|||
|
|||
/**
|
|||
* struct virtio_spi_config - All config fields are read-only for the |
|||
* Virtio SPI driver |
|||
* @cs_max_number: maximum number of chipselect the host SPI controller |
|||
* supports. |
|||
* @cs_change_supported: indicates if the host SPI controller supports to toggle |
|||
* chipselect after each transfer in one message: |
|||
* 0: unsupported, chipselect will be kept in active state throughout the |
|||
* message transaction; |
|||
* 1: supported. |
|||
* Note: Message here contains a sequence of SPI transfers. |
|||
* @tx_nbits_supported: indicates the supported number of bit for writing: |
|||
* bit 0: DUAL (2-bit transfer), 1 for supported |
|||
* bit 1: QUAD (4-bit transfer), 1 for supported |
|||
* bit 2: OCTAL (8-bit transfer), 1 for supported |
|||
* other bits are reserved as 0, 1-bit transfer is always supported. |
|||
* @rx_nbits_supported: indicates the supported number of bit for reading: |
|||
* bit 0: DUAL (2-bit transfer), 1 for supported |
|||
* bit 1: QUAD (4-bit transfer), 1 for supported |
|||
* bit 2: OCTAL (8-bit transfer), 1 for supported |
|||
* other bits are reserved as 0, 1-bit transfer is always supported. |
|||
* @bits_per_word_mask: mask indicating which values of bits_per_word are |
|||
* supported. If not set, no limitation for bits_per_word. |
|||
* @mode_func_supported: indicates the following features are supported or not: |
|||
* bit 0-1: CPHA feature |
|||
* 0b00: invalid, should support as least one CPHA setting |
|||
* 0b01: supports CPHA=0 only |
|||
* 0b10: supports CPHA=1 only |
|||
* 0b11: supports CPHA=0 and CPHA=1. |
|||
* bit 2-3: CPOL feature |
|||
* 0b00: invalid, should support as least one CPOL setting |
|||
* 0b01: supports CPOL=0 only |
|||
* 0b10: supports CPOL=1 only |
|||
* 0b11: supports CPOL=0 and CPOL=1. |
|||
* bit 4: chipselect active high feature, 0 for unsupported and 1 for |
|||
* supported, chipselect active low is supported by default. |
|||
* bit 5: LSB first feature, 0 for unsupported and 1 for supported, |
|||
* MSB first is supported by default. |
|||
* bit 6: loopback mode feature, 0 for unsupported and 1 for supported, |
|||
* normal mode is supported by default. |
|||
* @max_freq_hz: the maximum clock rate supported in Hz unit, 0 means no |
|||
* limitation for transfer speed. |
|||
* @max_word_delay_ns: the maximum word delay supported, in nanoseconds. |
|||
* A value of 0 indicates that word delay is unsupported. |
|||
* Each transfer may consist of a sequence of words. |
|||
* @max_cs_setup_ns: the maximum delay supported after chipselect is asserted, |
|||
* in ns unit, 0 means delay is not supported to introduce after chipselect is |
|||
* asserted. |
|||
* @max_cs_hold_ns: the maximum delay supported before chipselect is deasserted, |
|||
* in ns unit, 0 means delay is not supported to introduce before chipselect |
|||
* is deasserted. |
|||
* @max_cs_incative_ns: maximum delay supported after chipselect is deasserted, |
|||
* in ns unit, 0 means delay is not supported to introduce after chipselect is |
|||
* deasserted. |
|||
*/ |
|||
struct virtio_spi_config { |
|||
uint8_t cs_max_number; |
|||
uint8_t cs_change_supported; |
|||
#define VIRTIO_SPI_RX_TX_SUPPORT_DUAL _BITUL(0) |
|||
#define VIRTIO_SPI_RX_TX_SUPPORT_QUAD _BITUL(1) |
|||
#define VIRTIO_SPI_RX_TX_SUPPORT_OCTAL _BITUL(2) |
|||
uint8_t tx_nbits_supported; |
|||
uint8_t rx_nbits_supported; |
|||
uint32_t bits_per_word_mask; |
|||
#define VIRTIO_SPI_MF_SUPPORT_CPHA_0 _BITUL(0) |
|||
#define VIRTIO_SPI_MF_SUPPORT_CPHA_1 _BITUL(1) |
|||
#define VIRTIO_SPI_MF_SUPPORT_CPOL_0 _BITUL(2) |
|||
#define VIRTIO_SPI_MF_SUPPORT_CPOL_1 _BITUL(3) |
|||
#define VIRTIO_SPI_MF_SUPPORT_CS_HIGH _BITUL(4) |
|||
#define VIRTIO_SPI_MF_SUPPORT_LSB_FIRST _BITUL(5) |
|||
#define VIRTIO_SPI_MF_SUPPORT_LOOPBACK _BITUL(6) |
|||
uint32_t mode_func_supported; |
|||
uint32_t max_freq_hz; |
|||
uint32_t max_word_delay_ns; |
|||
uint32_t max_cs_setup_ns; |
|||
uint32_t max_cs_hold_ns; |
|||
uint32_t max_cs_inactive_ns; |
|||
}; |
|||
|
|||
/**
|
|||
* struct spi_transfer_head - virtio SPI transfer descriptor |
|||
* @chip_select_id: chipselect index the SPI transfer used. |
|||
* @bits_per_word: the number of bits in each SPI transfer word. |
|||
* @cs_change: whether to deselect device after finishing this transfer |
|||
* before starting the next transfer, 0 means cs keep asserted and |
|||
* 1 means cs deasserted then asserted again. |
|||
* @tx_nbits: bus width for write transfer. |
|||
* 0,1: bus width is 1, also known as SINGLE |
|||
* 2 : bus width is 2, also known as DUAL |
|||
* 4 : bus width is 4, also known as QUAD |
|||
* 8 : bus width is 8, also known as OCTAL |
|||
* other values are invalid. |
|||
* @rx_nbits: bus width for read transfer. |
|||
* 0,1: bus width is 1, also known as SINGLE |
|||
* 2 : bus width is 2, also known as DUAL |
|||
* 4 : bus width is 4, also known as QUAD |
|||
* 8 : bus width is 8, also known as OCTAL |
|||
* other values are invalid. |
|||
* @reserved: for future use. |
|||
* @mode: SPI transfer mode. |
|||
* bit 0: CPHA, determines the timing (i.e. phase) of the data |
|||
* bits relative to the clock pulses.For CPHA=0, the |
|||
* "out" side changes the data on the trailing edge of the |
|||
* preceding clock cycle, while the "in" side captures the data |
|||
* on (or shortly after) the leading edge of the clock cycle. |
|||
* For CPHA=1, the "out" side changes the data on the leading |
|||
* edge of the current clock cycle, while the "in" side |
|||
* captures the data on (or shortly after) the trailing edge of |
|||
* the clock cycle. |
|||
* bit 1: CPOL, determines the polarity of the clock. CPOL=0 is a |
|||
* clock which idles at 0, and each cycle consists of a pulse |
|||
* of 1. CPOL=1 is a clock which idles at 1, and each cycle |
|||
* consists of a pulse of 0. |
|||
* bit 2: CS_HIGH, if 1, chip select active high, else active low. |
|||
* bit 3: LSB_FIRST, determines per-word bits-on-wire, if 0, MSB |
|||
* first, else LSB first. |
|||
* bit 4: LOOP, loopback mode. |
|||
* @freq: the transfer speed in Hz. |
|||
* @word_delay_ns: delay to be inserted between consecutive words of a |
|||
* transfer, in ns unit. |
|||
* @cs_setup_ns: delay to be introduced after CS is asserted, in ns |
|||
* unit. |
|||
* @cs_delay_hold_ns: delay to be introduced before CS is deasserted |
|||
* for each transfer, in ns unit. |
|||
* @cs_change_delay_inactive_ns: delay to be introduced after CS is |
|||
* deasserted and before next asserted, in ns unit. |
|||
*/ |
|||
struct spi_transfer_head { |
|||
uint8_t chip_select_id; |
|||
uint8_t bits_per_word; |
|||
uint8_t cs_change; |
|||
uint8_t tx_nbits; |
|||
uint8_t rx_nbits; |
|||
uint8_t reserved[3]; |
|||
uint32_t mode; |
|||
uint32_t freq; |
|||
uint32_t word_delay_ns; |
|||
uint32_t cs_setup_ns; |
|||
uint32_t cs_delay_hold_ns; |
|||
uint32_t cs_change_delay_inactive_ns; |
|||
}; |
|||
|
|||
/**
|
|||
* struct spi_transfer_result - virtio SPI transfer result |
|||
* @result: Transfer result code. |
|||
* VIRTIO_SPI_TRANS_OK: Transfer successful. |
|||
* VIRTIO_SPI_PARAM_ERR: Parameter error. |
|||
* VIRTIO_SPI_TRANS_ERR: Transfer error. |
|||
*/ |
|||
struct spi_transfer_result { |
|||
#define VIRTIO_SPI_TRANS_OK 0 |
|||
#define VIRTIO_SPI_PARAM_ERR 1 |
|||
#define VIRTIO_SPI_TRANS_ERR 2 |
|||
uint8_t result; |
|||
}; |
|||
|
|||
#endif /* #ifndef _LINUX_VIRTIO_VIRTIO_SPI_H */ |
|||
Loading…
Reference in new issue