pc,pci,virtio: cleanups, fixes, features
vhost-user-gpu: edid vhost-user-scmi device vhost-vdpa: _F_CTRL_RX and _F_CTRL_RX_EXTRA support for svq cleanups, fixes all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmSsjYMPHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRp2vYH/20u6TAMssE/UAJoUU0ypbJkbHjDqiqDeuZN qDYazLUWIJTUbDnSfXAiRcdJuukEpEFcoHa9O6vgFE/SNod51IrvsJR9CbZxNmk6 D+Px9dkMckDE/yb8f6hhcHsi7/1v04I0oSXmJTVYxWSKQhD4Km6x8Larqsh0u4yd n6laZ+VK5H8sk6QvI5vMz+lYavACQVryiWV/GAigP21B0eQK79I5/N6y0q8/axD5 cpeTzUF+m33SfLfyd7PPmibCQFYrHDwosynSnr3qnKusPRJt2FzWkzOiZgbtgE2L UQ/S4sYTBy8dZJMc0wTywbs1bSwzNrkQ+uS0v74z9wCUYTgvQTA= =RsOh -----END PGP SIGNATURE----- Merge tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging pc,pci,virtio: cleanups, fixes, features vhost-user-gpu: edid vhost-user-scmi device vhost-vdpa: _F_CTRL_RX and _F_CTRL_RX_EXTRA support for svq cleanups, fixes all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # -----BEGIN PGP SIGNATURE----- # # iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmSsjYMPHG1zdEByZWRo # YXQuY29tAAoJECgfDbjSjVRp2vYH/20u6TAMssE/UAJoUU0ypbJkbHjDqiqDeuZN # qDYazLUWIJTUbDnSfXAiRcdJuukEpEFcoHa9O6vgFE/SNod51IrvsJR9CbZxNmk6 # D+Px9dkMckDE/yb8f6hhcHsi7/1v04I0oSXmJTVYxWSKQhD4Km6x8Larqsh0u4yd # n6laZ+VK5H8sk6QvI5vMz+lYavACQVryiWV/GAigP21B0eQK79I5/N6y0q8/axD5 # cpeTzUF+m33SfLfyd7PPmibCQFYrHDwosynSnr3qnKusPRJt2FzWkzOiZgbtgE2L # UQ/S4sYTBy8dZJMc0wTywbs1bSwzNrkQ+uS0v74z9wCUYTgvQTA= # =RsOh # -----END PGP SIGNATURE----- # gpg: Signature made Tue 11 Jul 2023 12:00:19 AM BST # gpg: using RSA key 5D09FD0871C8F85B94CA8A0D281F0DB8D28D5469 # gpg: issuer "mst@redhat.com" # gpg: Good signature from "Michael S. Tsirkin <mst@kernel.org>" [undefined] # gpg: aka "Michael S. Tsirkin <mst@redhat.com>" [undefined] # gpg: WARNING: This key is not certified with a trusted signature! # gpg: There is no indication that the signature belongs to the owner. # 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: (66 commits) vdpa: Allow VIRTIO_NET_F_CTRL_RX_EXTRA in SVQ vdpa: Restore packet receive filtering state relative with _F_CTRL_RX_EXTRA feature vdpa: Allow VIRTIO_NET_F_CTRL_RX in SVQ vdpa: Avoid forwarding large CVQ command failures vdpa: Accessing CVQ header through its structure vhost: Fix false positive out-of-bounds vdpa: Restore packet receive filtering state relative with _F_CTRL_RX feature vdpa: Restore MAC address filtering state vdpa: Use iovec for vhost_vdpa_net_load_cmd() pcie: Specify 0 for ARI next function numbers pcie: Use common ARI next function number include/hw/virtio: document some more usage of notifiers include/hw/virtio: add kerneldoc for virtio_init include/hw/virtio: document virtio_notify_config hw/virtio: fix typo in VIRTIO_CONFIG_IRQ_IDX comments include/hw: document the device_class_set_parent_* fns include: attempt to document device_class_set_props vdpa: Fix possible use-after-free for VirtQueueElement pcie: Add hotplug detect state register to cmask virtio-iommu: Rework the traces in virtio_iommu_set_page_size_mask() ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
2bb9d628a7
66 changed files with 1662 additions and 268 deletions
|
|
@ -35,6 +35,8 @@ void machine_set_cpu_numa_node(MachineState *machine,
|
|||
Error **errp);
|
||||
void machine_parse_smp_config(MachineState *ms,
|
||||
const SMPConfiguration *config, Error **errp);
|
||||
unsigned int machine_topo_get_cores_per_socket(const MachineState *ms);
|
||||
unsigned int machine_topo_get_threads_per_socket(const MachineState *ms);
|
||||
|
||||
/**
|
||||
* machine_class_allow_dynamic_sysbus_dev: Add type to list of valid devices
|
||||
|
|
|
|||
|
|
@ -146,6 +146,10 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
|
|||
|
||||
void pc_guest_info_init(PCMachineState *pcms);
|
||||
|
||||
#define PCI_HOST_PROP_RAM_MEM "ram-mem"
|
||||
#define PCI_HOST_PROP_PCI_MEM "pci-mem"
|
||||
#define PCI_HOST_PROP_SYSTEM_MEM "system-mem"
|
||||
#define PCI_HOST_PROP_IO_MEM "io-mem"
|
||||
#define PCI_HOST_PROP_PCI_HOLE_START "pci-hole-start"
|
||||
#define PCI_HOST_PROP_PCI_HOLE_END "pci-hole-end"
|
||||
#define PCI_HOST_PROP_PCI_HOLE64_START "pci-hole64-start"
|
||||
|
|
|
|||
|
|
@ -15,6 +15,8 @@
|
|||
#include "hw/pci-host/pam.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define I440FX_HOST_PROP_PCI_TYPE "pci-type"
|
||||
|
||||
#define TYPE_I440FX_PCI_HOST_BRIDGE "i440FX-pcihost"
|
||||
#define TYPE_I440FX_PCI_DEVICE "i440FX"
|
||||
|
||||
|
|
@ -25,9 +27,6 @@ struct PCII440FXState {
|
|||
PCIDevice parent_obj;
|
||||
/*< public >*/
|
||||
|
||||
MemoryRegion *system_memory;
|
||||
MemoryRegion *pci_address_space;
|
||||
MemoryRegion *ram_memory;
|
||||
PAMMemoryRegion pam_regions[PAM_REGIONS_COUNT];
|
||||
MemoryRegion smram_region;
|
||||
MemoryRegion smram, low_smram;
|
||||
|
|
@ -35,15 +34,4 @@ struct PCII440FXState {
|
|||
|
||||
#define TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE "igd-passthrough-i440FX"
|
||||
|
||||
PCIBus *i440fx_init(const char *pci_type,
|
||||
DeviceState *dev,
|
||||
MemoryRegion *address_space_mem,
|
||||
MemoryRegion *address_space_io,
|
||||
ram_addr_t ram_size,
|
||||
ram_addr_t below_4g_mem_size,
|
||||
ram_addr_t above_4g_mem_size,
|
||||
MemoryRegion *pci_memory,
|
||||
MemoryRegion *ram_memory);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -74,11 +74,6 @@ struct Q35PCIHost {
|
|||
* gmch part
|
||||
*/
|
||||
|
||||
#define MCH_HOST_PROP_RAM_MEM "ram-mem"
|
||||
#define MCH_HOST_PROP_PCI_MEM "pci-mem"
|
||||
#define MCH_HOST_PROP_SYSTEM_MEM "system-mem"
|
||||
#define MCH_HOST_PROP_IO_MEM "io-mem"
|
||||
|
||||
/* PCI configuration */
|
||||
#define MCH_HOST_BRIDGE "MCH"
|
||||
|
||||
|
|
|
|||
|
|
@ -209,6 +209,8 @@ enum {
|
|||
QEMU_PCIE_CAP_CXL = (1 << QEMU_PCIE_CXL_BITNR),
|
||||
#define QEMU_PCIE_ERR_UNC_MASK_BITNR 11
|
||||
QEMU_PCIE_ERR_UNC_MASK = (1 << QEMU_PCIE_ERR_UNC_MASK_BITNR),
|
||||
#define QEMU_PCIE_ARI_NEXTFN_1_BITNR 12
|
||||
QEMU_PCIE_ARI_NEXTFN_1 = (1 << QEMU_PCIE_ARI_NEXTFN_1_BITNR),
|
||||
};
|
||||
|
||||
typedef struct PCIINTxRoute {
|
||||
|
|
@ -577,13 +579,11 @@ pci_set_quad_by_mask(uint8_t *config, uint64_t mask, uint64_t reg)
|
|||
pci_set_quad(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
|
||||
PCIDevice *pci_new_multifunction(int devfn, bool multifunction,
|
||||
const char *name);
|
||||
PCIDevice *pci_new_multifunction(int devfn, const char *name);
|
||||
PCIDevice *pci_new(int devfn, const char *name);
|
||||
bool pci_realize_and_unref(PCIDevice *dev, PCIBus *bus, Error **errp);
|
||||
|
||||
PCIDevice *pci_create_simple_multifunction(PCIBus *bus, int devfn,
|
||||
bool multifunction,
|
||||
const char *name);
|
||||
PCIDevice *pci_create_simple(PCIBus *bus, int devfn, const char *name);
|
||||
|
||||
|
|
|
|||
|
|
@ -31,6 +31,8 @@
|
|||
#include "hw/sysbus.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define PCI_HOST_BYPASS_IOMMU "bypass-iommu"
|
||||
|
||||
#define TYPE_PCI_HOST_BRIDGE "pci-host-bridge"
|
||||
OBJECT_DECLARE_TYPE(PCIHostState, PCIHostBridgeClass, PCI_HOST_BRIDGE)
|
||||
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ void pcie_sync_bridge_lnk(PCIDevice *dev);
|
|||
void pcie_acs_init(PCIDevice *dev, uint16_t offset);
|
||||
void pcie_acs_reset(PCIDevice *dev);
|
||||
|
||||
void pcie_ari_init(PCIDevice *dev, uint16_t offset, uint16_t nextfn);
|
||||
void pcie_ari_init(PCIDevice *dev, uint16_t offset);
|
||||
void pcie_dev_ser_num_init(PCIDevice *dev, uint16_t offset, uint64_t ser_num);
|
||||
void pcie_ats_init(PCIDevice *dev, uint16_t offset, bool aligned);
|
||||
|
||||
|
|
|
|||
|
|
@ -926,6 +926,15 @@ BusState *sysbus_get_default(void);
|
|||
char *qdev_get_fw_dev_path(DeviceState *dev);
|
||||
char *qdev_get_own_fw_dev_path_from_handler(BusState *bus, DeviceState *dev);
|
||||
|
||||
/**
|
||||
* device_class_set_props(): add a set of properties to an device
|
||||
* @dc: the parent DeviceClass all devices inherit
|
||||
* @props: an array of properties, terminate by DEFINE_PROP_END_OF_LIST()
|
||||
*
|
||||
* This will add a set of properties to the object. It will fault if
|
||||
* you attempt to add an existing property defined by a parent class.
|
||||
* To modify an inherited property you need to use????
|
||||
*/
|
||||
void device_class_set_props(DeviceClass *dc, Property *props);
|
||||
|
||||
/**
|
||||
|
|
@ -943,9 +952,36 @@ void device_class_set_props(DeviceClass *dc, Property *props);
|
|||
void device_class_set_parent_reset(DeviceClass *dc,
|
||||
DeviceReset dev_reset,
|
||||
DeviceReset *parent_reset);
|
||||
|
||||
/**
|
||||
* device_class_set_parent_realize() - set up for chaining realize fns
|
||||
* @dc: The device class
|
||||
* @dev_realize: the device realize function
|
||||
* @parent_realize: somewhere to save the parents realize function
|
||||
*
|
||||
* This is intended to be used when the new realize function will
|
||||
* eventually call its parent realization function during creation.
|
||||
* This requires storing the function call somewhere (usually in the
|
||||
* instance structure) so you can eventually call
|
||||
* dc->parent_realize(dev, errp)
|
||||
*/
|
||||
void device_class_set_parent_realize(DeviceClass *dc,
|
||||
DeviceRealize dev_realize,
|
||||
DeviceRealize *parent_realize);
|
||||
|
||||
|
||||
/**
|
||||
* device_class_set_parent_unrealize() - set up for chaining unrealize fns
|
||||
* @dc: The device class
|
||||
* @dev_unrealize: the device realize function
|
||||
* @parent_unrealize: somewhere to save the parents unrealize function
|
||||
*
|
||||
* This is intended to be used when the new unrealize function will
|
||||
* eventually call its parent unrealization function during the
|
||||
* unrealize phase. This requires storing the function call somewhere
|
||||
* (usually in the instance structure) so you can eventually call
|
||||
* dc->parent_unrealize(dev);
|
||||
*/
|
||||
void device_class_set_parent_unrealize(DeviceClass *dc,
|
||||
DeviceUnrealize dev_unrealize,
|
||||
DeviceUnrealize *parent_unrealize);
|
||||
|
|
|
|||
30
include/hw/virtio/vhost-user-scmi.h
Normal file
30
include/hw/virtio/vhost-user-scmi.h
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
/*
|
||||
* Vhost-user SCMI virtio device
|
||||
*
|
||||
* Copyright (c) 2023 Red Hat, Inc.
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef _QEMU_VHOST_USER_SCMI_H
|
||||
#define _QEMU_VHOST_USER_SCMI_H
|
||||
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "hw/virtio/vhost.h"
|
||||
#include "hw/virtio/vhost-user.h"
|
||||
|
||||
#define TYPE_VHOST_USER_SCMI "vhost-user-scmi"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(VHostUserSCMI, VHOST_USER_SCMI);
|
||||
|
||||
struct VHostUserSCMI {
|
||||
VirtIODevice parent;
|
||||
CharBackend chardev;
|
||||
struct vhost_virtqueue *vhost_vqs;
|
||||
struct vhost_dev vhost_dev;
|
||||
VhostUserState vhost_user;
|
||||
VirtQueue *cmd_vq;
|
||||
VirtQueue *event_vq;
|
||||
bool connected;
|
||||
};
|
||||
|
||||
#endif /* _QEMU_VHOST_USER_SCMI_H */
|
||||
|
|
@ -320,6 +320,7 @@ bool vhost_has_free_slot(void);
|
|||
int vhost_net_set_backend(struct vhost_dev *hdev,
|
||||
struct vhost_vring_file *file);
|
||||
|
||||
void vhost_toggle_device_iotlb(VirtIODevice *vdev);
|
||||
int vhost_device_iotlb_miss(struct vhost_dev *dev, uint64_t iova, int write);
|
||||
|
||||
int vhost_virtqueue_start(struct vhost_dev *dev, struct VirtIODevice *vdev,
|
||||
|
|
|
|||
|
|
@ -242,6 +242,8 @@ void virtio_gpu_base_reset(VirtIOGPUBase *g);
|
|||
void virtio_gpu_base_fill_display_info(VirtIOGPUBase *g,
|
||||
struct virtio_gpu_resp_display_info *dpy_info);
|
||||
|
||||
void virtio_gpu_base_generate_edid(VirtIOGPUBase *g, int scanout,
|
||||
struct virtio_gpu_resp_edid *edid);
|
||||
/* virtio-gpu.c */
|
||||
void virtio_gpu_ctrl_response(VirtIOGPU *g,
|
||||
struct virtio_gpu_ctrl_command *cmd,
|
||||
|
|
|
|||
|
|
@ -61,6 +61,8 @@ struct VirtIOIOMMU {
|
|||
QemuRecMutex mutex;
|
||||
GTree *endpoints;
|
||||
bool boot_bypass;
|
||||
Notifier machine_done;
|
||||
bool granule_frozen;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -150,10 +150,18 @@ struct VirtIODevice
|
|||
VMChangeStateEntry *vmstate;
|
||||
char *bus_name;
|
||||
uint8_t device_endian;
|
||||
/**
|
||||
* @user_guest_notifier_mask: gate usage of ->guest_notifier_mask() callback.
|
||||
* This is used to suppress the masking of guest updates for
|
||||
* vhost-user devices which are asynchronous by design.
|
||||
*/
|
||||
bool use_guest_notifier_mask;
|
||||
AddressSpace *dma_as;
|
||||
QLIST_HEAD(, VirtQueue) *vector_queues;
|
||||
QTAILQ_ENTRY(VirtIODevice) next;
|
||||
/**
|
||||
* @config_notifier: the event notifier that handles config events
|
||||
*/
|
||||
EventNotifier config_notifier;
|
||||
bool device_iotlb_enabled;
|
||||
};
|
||||
|
|
@ -219,6 +227,12 @@ struct VirtioDeviceClass {
|
|||
void virtio_instance_init_common(Object *proxy_obj, void *data,
|
||||
size_t vdev_size, const char *vdev_name);
|
||||
|
||||
/**
|
||||
* virtio_init() - initialise the common VirtIODevice structure
|
||||
* @vdev: pointer to VirtIODevice
|
||||
* @device_id: the VirtIO device ID (see virtio_ids.h)
|
||||
* @config_size: size of the config space
|
||||
*/
|
||||
void virtio_init(VirtIODevice *vdev, uint16_t device_id, size_t config_size);
|
||||
|
||||
void virtio_cleanup(VirtIODevice *vdev);
|
||||
|
|
@ -276,6 +290,13 @@ extern const VMStateInfo virtio_vmstate_info;
|
|||
|
||||
int virtio_load(VirtIODevice *vdev, QEMUFile *f, int version_id);
|
||||
|
||||
/**
|
||||
* virtio_notify_config() - signal a change to device config
|
||||
* @vdev: the virtio device
|
||||
*
|
||||
* Assuming the virtio device is up (VIRTIO_CONFIG_S_DRIVER_OK) this
|
||||
* will trigger a guest interrupt and update the config version.
|
||||
*/
|
||||
void virtio_notify_config(VirtIODevice *vdev);
|
||||
|
||||
bool virtio_queue_get_notification(VirtQueue *vq);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue