mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-04 08:13:54 -06:00
virtio,pc,pci: features, cleanups, fixes
more memslots support in libvhost-user support PCIe Gen5/Gen6 link speeds in pcie more traces in vdpa network simulation devices support in vdpa SMBIOS type 9 descriptor implementation Bump max_cpus to 4096 vcpus in q35 aw-bits and granule options in VIRTIO-IOMMU Support report NUMA nodes for device memory using GI in acpi Beginning of shutdown event support in pvpanic fixes, cleanups all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmXw0TMPHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRp8x4H+gLMoGwaGAX7gDGPgn2Ix4j/3kO77ZJ9X9k/ 1KqZu/9eMS1j2Ei+vZqf05w7qRjxxhwDq3ilEXF/+UFqgAehLqpRRB8j5inqvzYt +jv0DbL11PBp/oFjWcytm5CbiVsvq8KlqCF29VNzc162XdtcduUOWagL96y8lJfZ uPrOoyeR7SMH9lp3LLLHWgu+9W4nOS03RroZ6Umj40y5B7yR0Rrppz8lMw5AoQtr 0gMRnFhYXeiW6CXdz+Tzcr7XfvkkYDi/j7ibiNSURLBfOpZa6Y8+kJGKxz5H1K1G 6ZY4PBcOpQzl+NMrktPHogczgJgOK10t+1i/R3bGZYw2Qn/93Eg= =C0UU -----END PGP SIGNATURE----- Merge tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging virtio,pc,pci: features, cleanups, fixes more memslots support in libvhost-user support PCIe Gen5/Gen6 link speeds in pcie more traces in vdpa network simulation devices support in vdpa SMBIOS type 9 descriptor implementation Bump max_cpus to 4096 vcpus in q35 aw-bits and granule options in VIRTIO-IOMMU Support report NUMA nodes for device memory using GI in acpi Beginning of shutdown event support in pvpanic fixes, cleanups all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # -----BEGIN PGP SIGNATURE----- # # iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmXw0TMPHG1zdEByZWRo # YXQuY29tAAoJECgfDbjSjVRp8x4H+gLMoGwaGAX7gDGPgn2Ix4j/3kO77ZJ9X9k/ # 1KqZu/9eMS1j2Ei+vZqf05w7qRjxxhwDq3ilEXF/+UFqgAehLqpRRB8j5inqvzYt # +jv0DbL11PBp/oFjWcytm5CbiVsvq8KlqCF29VNzc162XdtcduUOWagL96y8lJfZ # uPrOoyeR7SMH9lp3LLLHWgu+9W4nOS03RroZ6Umj40y5B7yR0Rrppz8lMw5AoQtr # 0gMRnFhYXeiW6CXdz+Tzcr7XfvkkYDi/j7ibiNSURLBfOpZa6Y8+kJGKxz5H1K1G # 6ZY4PBcOpQzl+NMrktPHogczgJgOK10t+1i/R3bGZYw2Qn/93Eg= # =C0UU # -----END PGP SIGNATURE----- # gpg: Signature made Tue 12 Mar 2024 22:03:31 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: (68 commits) docs/specs/pvpanic: document shutdown event hw/cxl: Fix missing reserved data in CXL Device DVSEC hmat acpi: Fix out of bounds access due to missing use of indirection hmat acpi: Do not add Memory Proximity Domain Attributes Structure targetting non existent memory. qemu-options.hx: Document the virtio-iommu-pci aw-bits option hw/arm/virt: Set virtio-iommu aw-bits default value to 48 hw/i386/q35: Set virtio-iommu aw-bits default value to 39 virtio-iommu: Add an option to define the input range width virtio-iommu: Trace domain range limits as unsigned int qemu-options.hx: Document the virtio-iommu-pci granule option virtio-iommu: Change the default granule to the host page size virtio-iommu: Add a granule property hw/i386/acpi-build: Add support for SRAT Generic Initiator structures hw/acpi: Implement the SRAT GI affinity structure qom: new object to associate device to NUMA node hw/i386/pc: Inline pc_cmos_init() into pc_cmos_init_late() and remove it hw/i386/pc: Set "normal" boot device order in pc_basic_device_init() hw/i386/pc: Avoid one use of the current_machine global hw/i386/pc: Remove "rtc_state" link again Revert "hw/i386/pc: Confine system flash handling to pc_sysfw" ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org> # Conflicts: # hw/core/machine.c
This commit is contained in:
commit
6fc6931231
56 changed files with 1428 additions and 384 deletions
47
include/hw/acpi/acpi_generic_initiator.h
Normal file
47
include/hw/acpi/acpi_generic_initiator.h
Normal file
|
@ -0,0 +1,47 @@
|
|||
// SPDX-License-Identifier: GPL-2.0-only
|
||||
/*
|
||||
* Copyright (c) 2024, NVIDIA CORPORATION & AFFILIATES. All rights reserved
|
||||
*/
|
||||
|
||||
#ifndef ACPI_GENERIC_INITIATOR_H
|
||||
#define ACPI_GENERIC_INITIATOR_H
|
||||
|
||||
#include "qom/object_interfaces.h"
|
||||
|
||||
#define TYPE_ACPI_GENERIC_INITIATOR "acpi-generic-initiator"
|
||||
|
||||
typedef struct AcpiGenericInitiator {
|
||||
/* private */
|
||||
Object parent;
|
||||
|
||||
/* public */
|
||||
char *pci_dev;
|
||||
uint16_t node;
|
||||
} AcpiGenericInitiator;
|
||||
|
||||
/*
|
||||
* ACPI 6.3:
|
||||
* Table 5-81 Flags – Generic Initiator Affinity Structure
|
||||
*/
|
||||
typedef enum {
|
||||
/*
|
||||
* If clear, the OSPM ignores the contents of the Generic
|
||||
* Initiator/Port Affinity Structure. This allows system firmware
|
||||
* to populate the SRAT with a static number of structures, but only
|
||||
* enable them as necessary.
|
||||
*/
|
||||
GEN_AFFINITY_ENABLED = (1 << 0),
|
||||
} GenericAffinityFlags;
|
||||
|
||||
/*
|
||||
* ACPI 6.3:
|
||||
* Table 5-80 Device Handle - PCI
|
||||
*/
|
||||
typedef struct PCIDeviceHandle {
|
||||
uint16_t segment;
|
||||
uint16_t bdf;
|
||||
} PCIDeviceHandle;
|
||||
|
||||
void build_srat_generic_pci_initiator(GArray *table_data);
|
||||
|
||||
#endif
|
|
@ -230,6 +230,7 @@ struct virtio_snd_ctrl_command {
|
|||
VirtQueue *vq;
|
||||
virtio_snd_hdr ctrl;
|
||||
virtio_snd_hdr resp;
|
||||
size_t payload_size;
|
||||
QTAILQ_ENTRY(virtio_snd_ctrl_command) next;
|
||||
};
|
||||
#endif
|
||||
|
|
|
@ -25,6 +25,7 @@ enum reg_type {
|
|||
CXL2_TYPE3_DEVICE,
|
||||
CXL2_LOGICAL_DEVICE,
|
||||
CXL2_ROOT_PORT,
|
||||
CXL2_RC,
|
||||
CXL2_UPSTREAM_PORT,
|
||||
CXL2_DOWNSTREAM_PORT,
|
||||
CXL3_SWITCH_MAILBOX_CCI,
|
||||
|
|
|
@ -92,8 +92,9 @@ typedef struct CXLDVSECDevice {
|
|||
uint32_t range2_base_hi;
|
||||
uint32_t range2_base_lo;
|
||||
uint16_t cap3;
|
||||
uint16_t resv;
|
||||
} QEMU_PACKED CXLDVSECDevice;
|
||||
QEMU_BUILD_BUG_ON(sizeof(CXLDVSECDevice) != 0x3A);
|
||||
QEMU_BUILD_BUG_ON(sizeof(CXLDVSECDevice) != PCIE_CXL_DEVICE_DVSEC_LENGTH);
|
||||
|
||||
/*
|
||||
* CXL r3.1 Section 8.1.5: CXL Extensions DVSEC for Ports
|
||||
|
|
|
@ -211,6 +211,23 @@ struct smbios_type_8 {
|
|||
uint8_t port_type;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 9 - System Slots (v2.1+) */
|
||||
struct smbios_type_9 {
|
||||
struct smbios_structure_header header;
|
||||
uint8_t slot_designation;
|
||||
uint8_t slot_type;
|
||||
uint8_t slot_data_bus_width;
|
||||
uint8_t current_usage;
|
||||
uint8_t slot_length;
|
||||
uint16_t slot_id;
|
||||
uint8_t slot_characteristics1;
|
||||
uint8_t slot_characteristics2;
|
||||
/* SMBIOS spec v2.6+ */
|
||||
uint16_t segment_group_number;
|
||||
uint8_t bus_number;
|
||||
uint8_t device_number;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 11 - OEM strings */
|
||||
struct smbios_type_11 {
|
||||
struct smbios_structure_header header;
|
||||
|
|
|
@ -178,8 +178,6 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
|||
ISADevice *rtc_state,
|
||||
bool create_fdctrl,
|
||||
uint32_t hpet_irqs);
|
||||
void pc_cmos_init(PCMachineState *pcms,
|
||||
ISADevice *s);
|
||||
void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus);
|
||||
|
||||
void pc_i8259_create(ISABus *isa_bus, qemu_irq *i8259_irqs);
|
||||
|
@ -190,6 +188,8 @@ void pc_i8259_create(ISABus *isa_bus, qemu_irq *i8259_irqs);
|
|||
#define TYPE_PORT92 "port92"
|
||||
|
||||
/* pc_sysfw.c */
|
||||
void pc_system_flash_create(PCMachineState *pcms);
|
||||
void pc_system_flash_cleanup_unused(PCMachineState *pcms);
|
||||
void pc_system_firmware_init(PCMachineState *pcms, MemoryRegion *rom_memory);
|
||||
bool pc_system_ovmf_table_find(const char *entry, uint8_t **data,
|
||||
int *data_len);
|
||||
|
|
|
@ -39,6 +39,8 @@ typedef enum PCIExpLinkSpeed {
|
|||
QEMU_PCI_EXP_LNK_5GT,
|
||||
QEMU_PCI_EXP_LNK_8GT,
|
||||
QEMU_PCI_EXP_LNK_16GT,
|
||||
QEMU_PCI_EXP_LNK_32GT,
|
||||
QEMU_PCI_EXP_LNK_64GT,
|
||||
} PCIExpLinkSpeed;
|
||||
|
||||
#define QEMU_PCI_EXP_LNKCAP_MLS(speed) (speed)
|
||||
|
|
|
@ -58,8 +58,8 @@ void pcie_sriov_pf_add_sup_pgsize(PCIDevice *dev, uint16_t opt_sup_pgsize);
|
|||
void pcie_sriov_config_write(PCIDevice *dev, uint32_t address,
|
||||
uint32_t val, int len);
|
||||
|
||||
/* Reset SR/IOV VF Enable bit to unregister all VFs */
|
||||
void pcie_sriov_pf_disable_vfs(PCIDevice *dev);
|
||||
/* Reset SR/IOV */
|
||||
void pcie_sriov_pf_reset(PCIDevice *dev);
|
||||
|
||||
/* Get logical VF number of a VF - only valid for VFs */
|
||||
uint16_t pcie_sriov_vf_number(PCIDevice *dev);
|
||||
|
|
|
@ -30,6 +30,12 @@ typedef struct VhostVDPAHostNotifier {
|
|||
void *addr;
|
||||
} VhostVDPAHostNotifier;
|
||||
|
||||
typedef enum SVQTransitionState {
|
||||
SVQ_TSTATE_DISABLING = -1,
|
||||
SVQ_TSTATE_DONE,
|
||||
SVQ_TSTATE_ENABLING
|
||||
} SVQTransitionState;
|
||||
|
||||
/* Info shared by all vhost_vdpa device models */
|
||||
typedef struct vhost_vdpa_shared {
|
||||
int device_fd;
|
||||
|
@ -47,6 +53,9 @@ typedef struct vhost_vdpa_shared {
|
|||
|
||||
/* Vdpa must send shadow addresses as IOTLB key for data queues, not GPA */
|
||||
bool shadow_data;
|
||||
|
||||
/* SVQ switching is in progress, or already completed? */
|
||||
SVQTransitionState svq_switching;
|
||||
} VhostVDPAShared;
|
||||
|
||||
typedef struct vhost_vdpa {
|
||||
|
|
|
@ -24,6 +24,7 @@
|
|||
#include "hw/virtio/virtio.h"
|
||||
#include "hw/pci/pci.h"
|
||||
#include "qom/object.h"
|
||||
#include "qapi/qapi-types-virtio.h"
|
||||
|
||||
#define TYPE_VIRTIO_IOMMU "virtio-iommu-device"
|
||||
#define TYPE_VIRTIO_IOMMU_PCI "virtio-iommu-pci"
|
||||
|
@ -66,6 +67,8 @@ struct VirtIOIOMMU {
|
|||
bool boot_bypass;
|
||||
Notifier machine_done;
|
||||
bool granule_frozen;
|
||||
GranuleMode granule_mode;
|
||||
uint8_t aw_bits;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
|
@ -43,6 +43,7 @@ enum {
|
|||
VIRTIO_PCI_FLAG_INIT_FLR_BIT,
|
||||
VIRTIO_PCI_FLAG_AER_BIT,
|
||||
VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED_BIT,
|
||||
VIRTIO_PCI_FLAG_VDPA_BIT,
|
||||
};
|
||||
|
||||
/* Need to activate work-arounds for buggy guests at vmstate load. */
|
||||
|
@ -89,6 +90,9 @@ enum {
|
|||
#define VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED \
|
||||
(1 << VIRTIO_PCI_FLAG_ATS_PAGE_ALIGNED_BIT)
|
||||
|
||||
/* VDPA supported flags */
|
||||
#define VIRTIO_PCI_FLAG_VDPA (1 << VIRTIO_PCI_FLAG_VDPA_BIT)
|
||||
|
||||
typedef struct {
|
||||
MSIMessage msg;
|
||||
int virq;
|
||||
|
@ -140,6 +144,7 @@ struct VirtIOPCIProxy {
|
|||
};
|
||||
VirtIOPCIRegion regs[5];
|
||||
};
|
||||
VirtIOPCIRegion lm;
|
||||
MemoryRegion modern_bar;
|
||||
MemoryRegion io_bar;
|
||||
uint32_t legacy_io_bar_idx;
|
||||
|
|
|
@ -35,6 +35,9 @@
|
|||
(0x1ULL << VIRTIO_F_NOTIFY_ON_EMPTY) | \
|
||||
(0x1ULL << VIRTIO_F_ANY_LAYOUT))
|
||||
|
||||
#define LM_DISABLE 0x00
|
||||
#define LM_ENABLE 0x01
|
||||
|
||||
struct VirtQueue;
|
||||
|
||||
static inline hwaddr vring_align(hwaddr addr,
|
||||
|
@ -95,6 +98,11 @@ enum virtio_device_endian {
|
|||
VIRTIO_DEVICE_ENDIAN_BIG,
|
||||
};
|
||||
|
||||
typedef struct BitmapMemoryRegionCaches {
|
||||
struct rcu_head rcu;
|
||||
MemoryRegionCache bitmap;
|
||||
} BitmapMemoryRegionCaches;
|
||||
|
||||
/**
|
||||
* struct VirtIODevice - common VirtIO structure
|
||||
* @name: name of the device
|
||||
|
@ -128,6 +136,14 @@ struct VirtIODevice
|
|||
uint32_t generation;
|
||||
int nvectors;
|
||||
VirtQueue *vq;
|
||||
uint8_t lm_logging_ctrl;
|
||||
uint32_t lm_base_addr_low;
|
||||
uint32_t lm_base_addr_high;
|
||||
uint32_t lm_end_addr_low;
|
||||
uint32_t lm_end_addr_high;
|
||||
|
||||
BitmapMemoryRegionCaches *caches;
|
||||
|
||||
MemoryListener listener;
|
||||
uint16_t device_id;
|
||||
/* @vm_running: current VM running state via virtio_vmstate_change() */
|
||||
|
@ -379,8 +395,11 @@ hwaddr virtio_queue_get_desc_size(VirtIODevice *vdev, int n);
|
|||
hwaddr virtio_queue_get_avail_size(VirtIODevice *vdev, int n);
|
||||
hwaddr virtio_queue_get_used_size(VirtIODevice *vdev, int n);
|
||||
unsigned int virtio_queue_get_last_avail_idx(VirtIODevice *vdev, int n);
|
||||
unsigned int virtio_queue_get_vring_states(VirtIODevice *vdev, int n);
|
||||
void virtio_queue_set_last_avail_idx(VirtIODevice *vdev, int n,
|
||||
unsigned int idx);
|
||||
void virtio_queue_set_vring_states(VirtIODevice *vdev, int n,
|
||||
unsigned int idx);
|
||||
void virtio_queue_restore_last_avail_idx(VirtIODevice *vdev, int n);
|
||||
void virtio_queue_invalidate_signalled_used(VirtIODevice *vdev, int n);
|
||||
void virtio_queue_update_used_idx(VirtIODevice *vdev, int n);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue