mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
pc,virtio: features, tests, fixes, cleanups
virtio introspection new serial number opton for cxl vhost user blk dynamic config size virtio-gpio vhost user backend Tests fixes cleanups all over the place Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmNEVeoPHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRph8YH+gMWpb5IglE0Q+H2JiQPBwB/Ghy1ohRKnOvZ lChB7+oy18o2xXRFTOXwG9Ijqsbdn0QMbU/r3NWxBuMzxDow012xiMDniJlJmcXw /4POOCSTKrIfzVBhsEErVSA9NwSE5cQKr1oiRBGIa9UdZfZ//v7s6SoP4vtyj8RZ UJVYVnMDtq/0PaN92IMs06lhqo/LkegE7gTGHMBf8Nvw4SgQoZgfPyp1eR+dKOhz lXNqqvTds9yt8yS65UWbuSrZ9d7GpCQf8nuyLaLaENHd6FQUVfmTTT37l2EKziwp PK0EwWMHeGkj7LHrylztradhE9xBlIW23ROP8wPdGZHmgLNHbC0= =20Zb -----END PGP SIGNATURE----- Merge tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging pc,virtio: features, tests, fixes, cleanups virtio introspection new serial number opton for cxl vhost user blk dynamic config size virtio-gpio vhost user backend Tests fixes cleanups all over the place Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # -----BEGIN PGP SIGNATURE----- # # iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmNEVeoPHG1zdEByZWRo # YXQuY29tAAoJECgfDbjSjVRph8YH+gMWpb5IglE0Q+H2JiQPBwB/Ghy1ohRKnOvZ # lChB7+oy18o2xXRFTOXwG9Ijqsbdn0QMbU/r3NWxBuMzxDow012xiMDniJlJmcXw # /4POOCSTKrIfzVBhsEErVSA9NwSE5cQKr1oiRBGIa9UdZfZ//v7s6SoP4vtyj8RZ # UJVYVnMDtq/0PaN92IMs06lhqo/LkegE7gTGHMBf8Nvw4SgQoZgfPyp1eR+dKOhz # lXNqqvTds9yt8yS65UWbuSrZ9d7GpCQf8nuyLaLaENHd6FQUVfmTTT37l2EKziwp # PK0EwWMHeGkj7LHrylztradhE9xBlIW23ROP8wPdGZHmgLNHbC0= # =20Zb # -----END PGP SIGNATURE----- # gpg: Signature made Mon 10 Oct 2022 13:27:06 EDT # 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: (55 commits) x86: pci: acpi: consolidate PCI slots creation tests: acpi: update expected blobs x86: pci: acpi: reorder Device's _DSM method tests: acpi: whitelist pc/q35 DSDT before moving _ADR field tests: acpi: update expected blobs x86: pci: acpi: reorder Device's _ADR and _SUN fields tests: acpi: whitelist pc/q35 DSDT before moving _ADR field tests: acpi: update expected blobs x86: acpi: cleanup PCI device _DSM duplication tests: acpi: whitelist pc/q35 DSDT before switching _DSM to use ASUN tests: acpi: update expected blobs x86: acpi: _DSM: use Package to pass parameters acpi: x86: refactor PDSM method to reduce nesting tests: acpi: whitelist pc/q35 DSDT due to HPET AML move tests: acpi: update expected blobs after HPET move acpi: x86: deduplicate HPET AML building tests: acpi: whitelist pc/q35 DSDT due to HPET AML move hw/smbios: support for type 8 (port connector) pci: Sanity check mask argument to pci_set_*_by_mask() pci: Remove unused pci_get_*_by_mask() functions ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
cdcb7dcb40
87 changed files with 3796 additions and 289 deletions
|
@ -237,6 +237,7 @@ struct CXLType3Dev {
|
|||
/* Properties */
|
||||
HostMemoryBackend *hostmem;
|
||||
HostMemoryBackend *lsa;
|
||||
uint64_t sn;
|
||||
|
||||
/* State */
|
||||
AddressSpace hostmem_as;
|
||||
|
|
|
@ -189,6 +189,16 @@ struct smbios_type_4 {
|
|||
uint16_t processor_family2;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 8 - Port Connector Information */
|
||||
struct smbios_type_8 {
|
||||
struct smbios_structure_header header;
|
||||
uint8_t internal_reference_str;
|
||||
uint8_t internal_connector_type;
|
||||
uint8_t external_reference_str;
|
||||
uint8_t external_connector_type;
|
||||
uint8_t port_type;
|
||||
} QEMU_PACKED;
|
||||
|
||||
/* SMBIOS type 11 - OEM strings */
|
||||
struct smbios_type_11 {
|
||||
struct smbios_structure_header header;
|
||||
|
|
|
@ -688,60 +688,44 @@ static inline void
|
|||
pci_set_byte_by_mask(uint8_t *config, uint8_t mask, uint8_t reg)
|
||||
{
|
||||
uint8_t val = pci_get_byte(config);
|
||||
uint8_t rval = reg << ctz32(mask);
|
||||
pci_set_byte(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
uint8_t rval;
|
||||
|
||||
static inline uint8_t
|
||||
pci_get_byte_by_mask(uint8_t *config, uint8_t mask)
|
||||
{
|
||||
uint8_t val = pci_get_byte(config);
|
||||
return (val & mask) >> ctz32(mask);
|
||||
assert(mask);
|
||||
rval = reg << ctz32(mask);
|
||||
pci_set_byte(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
|
||||
static inline void
|
||||
pci_set_word_by_mask(uint8_t *config, uint16_t mask, uint16_t reg)
|
||||
{
|
||||
uint16_t val = pci_get_word(config);
|
||||
uint16_t rval = reg << ctz32(mask);
|
||||
pci_set_word(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
uint16_t rval;
|
||||
|
||||
static inline uint16_t
|
||||
pci_get_word_by_mask(uint8_t *config, uint16_t mask)
|
||||
{
|
||||
uint16_t val = pci_get_word(config);
|
||||
return (val & mask) >> ctz32(mask);
|
||||
assert(mask);
|
||||
rval = reg << ctz32(mask);
|
||||
pci_set_word(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
|
||||
static inline void
|
||||
pci_set_long_by_mask(uint8_t *config, uint32_t mask, uint32_t reg)
|
||||
{
|
||||
uint32_t val = pci_get_long(config);
|
||||
uint32_t rval = reg << ctz32(mask);
|
||||
pci_set_long(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
uint32_t rval;
|
||||
|
||||
static inline uint32_t
|
||||
pci_get_long_by_mask(uint8_t *config, uint32_t mask)
|
||||
{
|
||||
uint32_t val = pci_get_long(config);
|
||||
return (val & mask) >> ctz32(mask);
|
||||
assert(mask);
|
||||
rval = reg << ctz32(mask);
|
||||
pci_set_long(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
|
||||
static inline void
|
||||
pci_set_quad_by_mask(uint8_t *config, uint64_t mask, uint64_t reg)
|
||||
{
|
||||
uint64_t val = pci_get_quad(config);
|
||||
uint64_t rval = reg << ctz32(mask);
|
||||
pci_set_quad(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
uint64_t rval;
|
||||
|
||||
static inline uint64_t
|
||||
pci_get_quad_by_mask(uint8_t *config, uint64_t mask)
|
||||
{
|
||||
uint64_t val = pci_get_quad(config);
|
||||
return (val & mask) >> ctz32(mask);
|
||||
assert(mask);
|
||||
rval = reg << ctz32(mask);
|
||||
pci_set_quad(config, (~mask & val) | (mask & rval));
|
||||
}
|
||||
|
||||
PCIDevice *pci_new_multifunction(int devfn, bool multifunction,
|
||||
|
|
|
@ -34,7 +34,6 @@ struct VHostUserBlk {
|
|||
struct virtio_blk_config blkcfg;
|
||||
uint16_t num_queues;
|
||||
uint32_t queue_size;
|
||||
uint32_t config_wce;
|
||||
struct vhost_dev dev;
|
||||
struct vhost_inflight *inflight;
|
||||
VhostUserState vhost_user;
|
||||
|
|
35
include/hw/virtio/vhost-user-gpio.h
Normal file
35
include/hw/virtio/vhost-user-gpio.h
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* Vhost-user GPIO virtio device
|
||||
*
|
||||
* Copyright (c) 2021 Viresh Kumar <viresh.kumar@linaro.org>
|
||||
*
|
||||
* SPDX-License-Identifier: GPL-2.0-or-later
|
||||
*/
|
||||
|
||||
#ifndef _QEMU_VHOST_USER_GPIO_H
|
||||
#define _QEMU_VHOST_USER_GPIO_H
|
||||
|
||||
#include "hw/virtio/virtio.h"
|
||||
#include "hw/virtio/vhost.h"
|
||||
#include "hw/virtio/vhost-user.h"
|
||||
#include "standard-headers/linux/virtio_gpio.h"
|
||||
#include "chardev/char-fe.h"
|
||||
|
||||
#define TYPE_VHOST_USER_GPIO "vhost-user-gpio-device"
|
||||
OBJECT_DECLARE_SIMPLE_TYPE(VHostUserGPIO, VHOST_USER_GPIO);
|
||||
|
||||
struct VHostUserGPIO {
|
||||
/*< private >*/
|
||||
VirtIODevice parent_obj;
|
||||
CharBackend chardev;
|
||||
struct virtio_gpio_config config;
|
||||
struct vhost_virtqueue *vhost_vq;
|
||||
struct vhost_dev vhost_dev;
|
||||
VhostUserState vhost_user;
|
||||
VirtQueue *command_vq;
|
||||
VirtQueue *interrupt_vq;
|
||||
bool connected;
|
||||
/*< public >*/
|
||||
};
|
||||
|
||||
#endif /* _QEMU_VHOST_USER_GPIO_H */
|
|
@ -5,6 +5,9 @@
|
|||
#include "hw/virtio/virtio.h"
|
||||
#include "exec/memory.h"
|
||||
|
||||
#define VHOST_F_DEVICE_IOTLB 63
|
||||
#define VHOST_USER_F_PROTOCOL_FEATURES 30
|
||||
|
||||
/* Generic structures common for any vhost based device. */
|
||||
|
||||
struct vhost_inflight {
|
||||
|
@ -86,11 +89,15 @@ struct vhost_dev {
|
|||
/* if non-zero, minimum required value for max_queues */
|
||||
int num_queues;
|
||||
uint64_t features;
|
||||
/** @acked_features: final set of negotiated features */
|
||||
uint64_t acked_features;
|
||||
/** @backend_features: backend specific feature bits */
|
||||
uint64_t backend_features;
|
||||
/** @protocol_features: final negotiated protocol features */
|
||||
uint64_t protocol_features;
|
||||
uint64_t max_queues;
|
||||
uint64_t backend_cap;
|
||||
/* @started: is the vhost device started? */
|
||||
bool started;
|
||||
bool log_enabled;
|
||||
uint64_t log_size;
|
||||
|
@ -162,6 +169,17 @@ int vhost_dev_enable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
|
|||
*/
|
||||
void vhost_dev_disable_notifiers(struct vhost_dev *hdev, VirtIODevice *vdev);
|
||||
|
||||
/**
|
||||
* vhost_dev_is_started() - report status of vhost device
|
||||
* @hdev: common vhost_dev structure
|
||||
*
|
||||
* Return the started status of the vhost device
|
||||
*/
|
||||
static inline bool vhost_dev_is_started(struct vhost_dev *hdev)
|
||||
{
|
||||
return hdev->started;
|
||||
}
|
||||
|
||||
/**
|
||||
* vhost_dev_start() - start the vhost device
|
||||
* @hdev: common vhost_dev structure
|
||||
|
|
20
include/hw/virtio/virtio-blk-common.h
Normal file
20
include/hw/virtio/virtio-blk-common.h
Normal file
|
@ -0,0 +1,20 @@
|
|||
/*
|
||||
* Virtio Block Device common helpers
|
||||
*
|
||||
* Copyright IBM, Corp. 2007
|
||||
*
|
||||
* Authors:
|
||||
* Anthony Liguori <aliguori@us.ibm.com>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2. See
|
||||
* the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef VIRTIO_BLK_COMMON_H
|
||||
#define VIRTIO_BLK_COMMON_H
|
||||
|
||||
#include "hw/virtio/virtio.h"
|
||||
|
||||
extern const VirtIOConfigSizeParams virtio_blk_cfg_size_params;
|
||||
|
||||
#endif
|
|
@ -24,7 +24,12 @@
|
|||
#include "qom/object.h"
|
||||
#include "hw/virtio/vhost.h"
|
||||
|
||||
/* A guest should never accept this. It implies negotiation is broken. */
|
||||
/*
|
||||
* A guest should never accept this. It implies negotiation is broken
|
||||
* between the driver frontend and the device. This bit is re-used for
|
||||
* vhost-user to advertise VHOST_USER_F_PROTOCOL_FEATURES between QEMU
|
||||
* and a vhost-user backend.
|
||||
*/
|
||||
#define VIRTIO_F_BAD_FEATURE 30
|
||||
|
||||
#define VIRTIO_LEGACY_FEATURES ((0x1ULL << VIRTIO_F_BAD_FEATURE) | \
|
||||
|
@ -44,8 +49,14 @@ typedef struct VirtIOFeature {
|
|||
size_t end;
|
||||
} VirtIOFeature;
|
||||
|
||||
size_t virtio_feature_get_config_size(const VirtIOFeature *features,
|
||||
uint64_t host_features);
|
||||
typedef struct VirtIOConfigSizeParams {
|
||||
size_t min_size;
|
||||
size_t max_size;
|
||||
const VirtIOFeature *feature_sizes;
|
||||
} VirtIOConfigSizeParams;
|
||||
|
||||
size_t virtio_get_config_size(const VirtIOConfigSizeParams *params,
|
||||
uint64_t host_features);
|
||||
|
||||
typedef struct VirtQueue VirtQueue;
|
||||
|
||||
|
@ -71,6 +82,11 @@ typedef struct VirtQueueElement
|
|||
#define TYPE_VIRTIO_DEVICE "virtio-device"
|
||||
OBJECT_DECLARE_TYPE(VirtIODevice, VirtioDeviceClass, VIRTIO_DEVICE)
|
||||
|
||||
typedef struct {
|
||||
int virtio_bit;
|
||||
const char *feature_desc;
|
||||
} qmp_virtio_feature_map_t;
|
||||
|
||||
enum virtio_device_endian {
|
||||
VIRTIO_DEVICE_ENDIAN_UNKNOWN,
|
||||
VIRTIO_DEVICE_ENDIAN_LITTLE,
|
||||
|
@ -95,6 +111,7 @@ struct VirtIODevice
|
|||
VirtQueue *vq;
|
||||
MemoryListener listener;
|
||||
uint16_t device_id;
|
||||
/* @vm_running: current VM running state via virtio_vmstate_change() */
|
||||
bool vm_running;
|
||||
bool broken; /* device in invalid state, needs reset */
|
||||
bool use_disabled_flag; /* allow use of 'disable' flag when needed */
|
||||
|
@ -110,6 +127,7 @@ struct VirtIODevice
|
|||
bool use_guest_notifier_mask;
|
||||
AddressSpace *dma_as;
|
||||
QLIST_HEAD(, VirtQueue) *vector_queues;
|
||||
QTAILQ_ENTRY(VirtIODevice) next;
|
||||
};
|
||||
|
||||
struct VirtioDeviceClass {
|
||||
|
@ -371,6 +389,10 @@ static inline bool virtio_device_started(VirtIODevice *vdev, uint8_t status)
|
|||
return vdev->started;
|
||||
}
|
||||
|
||||
if (!vdev->vm_running) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return status & VIRTIO_CONFIG_S_DRIVER_OK;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue