mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 00:33:55 -06:00
virtio,pci,pc: features,fixes
pci: Initial support for SPDM Responders cxl: Add support for scan media, feature commands, device patrol scrub control, DDR5 ECS control, firmware updates virtio: in-order support virtio-net: support for SR-IOV emulation (note: known issues on s390, might get reverted if not fixed) smbios: memory device size is now configurable per Machine cpu: architecture agnostic code to support vCPU Hotplug Fixes, cleanups all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> -----BEGIN PGP SIGNATURE----- iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmae9l8PHG1zdEByZWRo YXQuY29tAAoJECgfDbjSjVRp8fYH/impBH9nViO/WK48io4mLSkl0EUL8Y/xrMvH zKFCKaXq8D96VTt1Z4EGKYgwG0voBKZaCEKYU/0ARGnSlSwxINQ8ROCnBWMfn2sx yQt08EXVMznNLtXjc6U5zCoCi6SaV85GH40No3MUFXBQt29ZSlFqO/fuHGZHYBwS wuVKvTjjNF4EsGt3rS4Qsv6BwZWMM+dE6yXpKWk68kR8IGp+6QGxkMbWt9uEX2Md VuemKVnFYw0XGCGy5K+ZkvoA2DGpEw0QxVSOMs8CI55Oc9SkTKz5fUSzXXGo1if+ M1CTjOPJu6pMym6gy6XpFa8/QioDA/jE2vBQvfJ64TwhJDV159s= =k8e9 -----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 pci: Initial support for SPDM Responders cxl: Add support for scan media, feature commands, device patrol scrub control, DDR5 ECS control, firmware updates virtio: in-order support virtio-net: support for SR-IOV emulation (note: known issues on s390, might get reverted if not fixed) smbios: memory device size is now configurable per Machine cpu: architecture agnostic code to support vCPU Hotplug Fixes, cleanups all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # -----BEGIN PGP SIGNATURE----- # # iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAmae9l8PHG1zdEByZWRo # YXQuY29tAAoJECgfDbjSjVRp8fYH/impBH9nViO/WK48io4mLSkl0EUL8Y/xrMvH # zKFCKaXq8D96VTt1Z4EGKYgwG0voBKZaCEKYU/0ARGnSlSwxINQ8ROCnBWMfn2sx # yQt08EXVMznNLtXjc6U5zCoCi6SaV85GH40No3MUFXBQt29ZSlFqO/fuHGZHYBwS # wuVKvTjjNF4EsGt3rS4Qsv6BwZWMM+dE6yXpKWk68kR8IGp+6QGxkMbWt9uEX2Md # VuemKVnFYw0XGCGy5K+ZkvoA2DGpEw0QxVSOMs8CI55Oc9SkTKz5fUSzXXGo1if+ # M1CTjOPJu6pMym6gy6XpFa8/QioDA/jE2vBQvfJ64TwhJDV159s= # =k8e9 # -----END PGP SIGNATURE----- # gpg: Signature made Tue 23 Jul 2024 10:16:31 AM AEST # 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: The key's User ID 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: (61 commits) hw/nvme: Add SPDM over DOE support backends: Initial support for SPDM socket support hw/pci: Add all Data Object Types defined in PCIe r6.0 tests/acpi: Add expected ACPI AML files for RISC-V tests/qtest/bios-tables-test.c: Enable basic testing for RISC-V tests/acpi: Add empty ACPI data files for RISC-V tests/qtest/bios-tables-test.c: Remove the fall back path tests/acpi: update expected DSDT blob for aarch64 and microvm acpi/gpex: Create PCI link devices outside PCI root bridge tests/acpi: Allow DSDT acpi table changes for aarch64 hw/riscv/virt-acpi-build.c: Update the HID of RISC-V UART hw/riscv/virt-acpi-build.c: Add namespace devices for PLIC and APLIC virtio-iommu: Add trace point on virtio_iommu_detach_endpoint_from_domain hw/vfio/common: Add vfio_listener_region_del_iommu trace event virtio-iommu: Remove the end point on detach virtio-iommu: Free [host_]resv_ranges on unset_iommu_devices virtio-iommu: Remove probe_done Revert "virtio-iommu: Clear IOMMUDevice when VFIO device is unplugged" gdbstub: Add helper function to unregister GDB register space physmem: Add helper function to destroy CPU AddressSpace ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
5885bcef3d
81 changed files with 2486 additions and 288 deletions
|
@ -19,6 +19,8 @@
|
|||
#include "hw/boards.h"
|
||||
#include "hw/hotplug.h"
|
||||
|
||||
#define ACPI_CPU_HOTPLUG_REG_LEN 12
|
||||
|
||||
typedef struct AcpiCpuStatus {
|
||||
CPUState *cpu;
|
||||
uint64_t arch_id;
|
||||
|
@ -61,9 +63,10 @@ typedef void (*build_madt_cpu_fn)(int uid, const CPUArchIdList *apic_ids,
|
|||
GArray *entry, bool force_enabled);
|
||||
|
||||
void build_cpus_aml(Aml *table, MachineState *machine, CPUHotplugFeatures opts,
|
||||
build_madt_cpu_fn build_madt_cpu, hwaddr io_base,
|
||||
build_madt_cpu_fn build_madt_cpu, hwaddr base_addr,
|
||||
const char *res_root,
|
||||
const char *event_handler_method);
|
||||
const char *event_handler_method,
|
||||
AmlRegionSpace rs);
|
||||
|
||||
void acpi_cpu_ospm_status(CPUHotplugState *cpu_st, ACPIOSTInfoList ***list);
|
||||
|
||||
|
|
|
@ -62,6 +62,7 @@
|
|||
#include "hw/sysbus.h"
|
||||
#include "hw/acpi/memory_hotplug.h"
|
||||
#include "hw/acpi/ghes.h"
|
||||
#include "hw/acpi/cpu.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define ACPI_POWER_BUTTON_DEVICE "PWRB"
|
||||
|
@ -86,6 +87,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED)
|
|||
#define GED_DEVICE "GED"
|
||||
#define AML_GED_EVT_REG "EREG"
|
||||
#define AML_GED_EVT_SEL "ESEL"
|
||||
#define AML_GED_EVT_CPU_SCAN_METHOD "\\_SB.GED.CSCN"
|
||||
|
||||
/*
|
||||
* Platforms need to specify the GED event bitmap
|
||||
|
@ -95,6 +97,7 @@ OBJECT_DECLARE_SIMPLE_TYPE(AcpiGedState, ACPI_GED)
|
|||
#define ACPI_GED_MEM_HOTPLUG_EVT 0x1
|
||||
#define ACPI_GED_PWR_DOWN_EVT 0x2
|
||||
#define ACPI_GED_NVDIMM_HOTPLUG_EVT 0x4
|
||||
#define ACPI_GED_CPU_HOTPLUG_EVT 0x8
|
||||
|
||||
typedef struct GEDState {
|
||||
MemoryRegion evt;
|
||||
|
@ -106,6 +109,8 @@ struct AcpiGedState {
|
|||
SysBusDevice parent_obj;
|
||||
MemHotplugState memhp_state;
|
||||
MemoryRegion container_memhp;
|
||||
CPUHotplugState cpuhp_state;
|
||||
MemoryRegion container_cpuhp;
|
||||
GEDState ged_state;
|
||||
uint32_t ged_event_bitmap;
|
||||
qemu_irq irq;
|
||||
|
|
|
@ -237,6 +237,9 @@ typedef struct {
|
|||
* purposes only.
|
||||
* Applies only to default memory backend, i.e., explicit memory backend
|
||||
* wasn't used.
|
||||
* @smbios_memory_device_size:
|
||||
* Default size of memory device,
|
||||
* SMBIOS 3.1.0 "7.18 Memory Device (Type 17)"
|
||||
*/
|
||||
struct MachineClass {
|
||||
/*< private >*/
|
||||
|
@ -304,6 +307,7 @@ struct MachineClass {
|
|||
const CPUArchIdList *(*possible_cpu_arch_ids)(MachineState *machine);
|
||||
int64_t (*get_default_cpu_node_id)(const MachineState *ms, int idx);
|
||||
ram_addr_t (*fixup_ram_size)(ram_addr_t size);
|
||||
uint64_t smbios_memory_device_size;
|
||||
};
|
||||
|
||||
/**
|
||||
|
|
|
@ -496,6 +496,7 @@ struct CPUState {
|
|||
QSIMPLEQ_HEAD(, qemu_work_item) work_list;
|
||||
|
||||
struct CPUAddressSpace *cpu_ases;
|
||||
int cpu_ases_count;
|
||||
int num_ases;
|
||||
AddressSpace *as;
|
||||
MemoryRegion *memory;
|
||||
|
|
|
@ -181,6 +181,21 @@ typedef struct CXLCCI {
|
|||
uint64_t runtime;
|
||||
QEMUTimer *timer;
|
||||
} bg;
|
||||
|
||||
/* firmware update */
|
||||
struct {
|
||||
uint8_t active_slot;
|
||||
uint8_t staged_slot;
|
||||
bool slot[4];
|
||||
uint8_t curr_action;
|
||||
uint8_t curr_slot;
|
||||
/* handle partial transfers */
|
||||
bool transferring;
|
||||
size_t prev_offset;
|
||||
size_t prev_len;
|
||||
time_t last_partxfer;
|
||||
} fw;
|
||||
|
||||
size_t payload_max;
|
||||
/* Pointer to device hosting the CCI */
|
||||
DeviceState *d;
|
||||
|
@ -397,9 +412,14 @@ static inline void __toggle_media(CXLDeviceState *cxl_dstate, int val)
|
|||
#define cxl_dev_enable_media(cxlds) \
|
||||
do { __toggle_media((cxlds), 0x1); } while (0)
|
||||
|
||||
static inline bool sanitize_running(CXLCCI *cci)
|
||||
static inline bool cxl_dev_media_disabled(CXLDeviceState *cxl_dstate)
|
||||
{
|
||||
return !!cci->bg.runtime && cci->bg.opcode == 0x4400;
|
||||
uint64_t dev_status_reg = cxl_dstate->mbox_reg_state64[R_CXL_MEM_DEV_STS];
|
||||
return FIELD_EX64(dev_status_reg, CXL_MEM_DEV_STS, MEDIA_STATUS) == 0x3;
|
||||
}
|
||||
static inline bool scan_media_running(CXLCCI *cci)
|
||||
{
|
||||
return !!cci->bg.runtime && cci->bg.opcode == 0x4304;
|
||||
}
|
||||
|
||||
typedef struct CXLError {
|
||||
|
@ -422,6 +442,47 @@ typedef struct CXLPoison {
|
|||
typedef QLIST_HEAD(, CXLPoison) CXLPoisonList;
|
||||
#define CXL_POISON_LIST_LIMIT 256
|
||||
|
||||
/* CXL memory device patrol scrub control attributes */
|
||||
typedef struct CXLMemPatrolScrubReadAttrs {
|
||||
uint8_t scrub_cycle_cap;
|
||||
uint16_t scrub_cycle;
|
||||
uint8_t scrub_flags;
|
||||
} QEMU_PACKED CXLMemPatrolScrubReadAttrs;
|
||||
|
||||
typedef struct CXLMemPatrolScrubWriteAttrs {
|
||||
uint8_t scrub_cycle_hr;
|
||||
uint8_t scrub_flags;
|
||||
} QEMU_PACKED CXLMemPatrolScrubWriteAttrs;
|
||||
|
||||
#define CXL_MEMDEV_PS_GET_FEATURE_VERSION 0x01
|
||||
#define CXL_MEMDEV_PS_SET_FEATURE_VERSION 0x01
|
||||
#define CXL_MEMDEV_PS_SCRUB_CYCLE_CHANGE_CAP_DEFAULT BIT(0)
|
||||
#define CXL_MEMDEV_PS_SCRUB_REALTIME_REPORT_CAP_DEFAULT BIT(1)
|
||||
#define CXL_MEMDEV_PS_CUR_SCRUB_CYCLE_DEFAULT 12
|
||||
#define CXL_MEMDEV_PS_MIN_SCRUB_CYCLE_DEFAULT 1
|
||||
#define CXL_MEMDEV_PS_ENABLE_DEFAULT 0
|
||||
|
||||
/* CXL memory device DDR5 ECS control attributes */
|
||||
typedef struct CXLMemECSReadAttrs {
|
||||
uint8_t ecs_log_cap;
|
||||
uint8_t ecs_cap;
|
||||
uint16_t ecs_config;
|
||||
uint8_t ecs_flags;
|
||||
} QEMU_PACKED CXLMemECSReadAttrs;
|
||||
|
||||
typedef struct CXLMemECSWriteAttrs {
|
||||
uint8_t ecs_log_cap;
|
||||
uint16_t ecs_config;
|
||||
} QEMU_PACKED CXLMemECSWriteAttrs;
|
||||
|
||||
#define CXL_ECS_GET_FEATURE_VERSION 0x01
|
||||
#define CXL_ECS_SET_FEATURE_VERSION 0x01
|
||||
#define CXL_ECS_LOG_ENTRY_TYPE_DEFAULT 0x01
|
||||
#define CXL_ECS_REALTIME_REPORT_CAP_DEFAULT 1
|
||||
#define CXL_ECS_THRESHOLD_COUNT_DEFAULT 3 /* 3: 256, 4: 1024, 5: 4096 */
|
||||
#define CXL_ECS_MODE_DEFAULT 0
|
||||
#define CXL_ECS_NUM_MEDIA_FRUS 3 /* Default */
|
||||
|
||||
#define DCD_MAX_NUM_REGION 8
|
||||
|
||||
typedef struct CXLDCExtentRaw {
|
||||
|
@ -459,6 +520,14 @@ typedef struct CXLDCRegion {
|
|||
unsigned long *blk_bitmap;
|
||||
} CXLDCRegion;
|
||||
|
||||
typedef struct CXLSetFeatureInfo {
|
||||
QemuUUID uuid;
|
||||
uint8_t data_transfer_flag;
|
||||
bool data_saved_across_reset;
|
||||
uint16_t data_offset;
|
||||
size_t data_size;
|
||||
} CXLSetFeatureInfo;
|
||||
|
||||
struct CXLType3Dev {
|
||||
/* Private */
|
||||
PCIDevice parent_obj;
|
||||
|
@ -491,6 +560,19 @@ struct CXLType3Dev {
|
|||
unsigned int poison_list_cnt;
|
||||
bool poison_list_overflowed;
|
||||
uint64_t poison_list_overflow_ts;
|
||||
/* Poison Injection - backup */
|
||||
CXLPoisonList poison_list_bkp;
|
||||
CXLPoisonList scan_media_results;
|
||||
bool scan_media_hasrun;
|
||||
|
||||
CXLSetFeatureInfo set_feat_info;
|
||||
|
||||
/* Patrol scrub control attributes */
|
||||
CXLMemPatrolScrubReadAttrs patrol_scrub_attrs;
|
||||
CXLMemPatrolScrubWriteAttrs patrol_scrub_wr_attrs;
|
||||
/* ECS control attributes */
|
||||
CXLMemECSReadAttrs ecs_attrs[CXL_ECS_NUM_MEDIA_FRUS];
|
||||
CXLMemECSWriteAttrs ecs_wr_attrs[CXL_ECS_NUM_MEDIA_FRUS];
|
||||
|
||||
struct dynamic_capacity {
|
||||
HostMemoryBackend *host_dc;
|
||||
|
@ -554,10 +636,12 @@ CXLRetCode cxl_event_get_records(CXLDeviceState *cxlds, CXLGetEventPayload *pl,
|
|||
size_t *len);
|
||||
CXLRetCode cxl_event_clear_records(CXLDeviceState *cxlds,
|
||||
CXLClearEventPayload *pl);
|
||||
void cxl_discard_all_event_records(CXLDeviceState *cxlds);
|
||||
|
||||
void cxl_event_irq_assert(CXLType3Dev *ct3d);
|
||||
|
||||
void cxl_set_poison_list_overflowed(CXLType3Dev *ct3d);
|
||||
void cxl_clear_poison_list_overflowed(CXLType3Dev *ct3d);
|
||||
|
||||
CXLDCRegion *cxl_find_dc_region(CXLType3Dev *ct3d, uint64_t dpa, uint64_t len);
|
||||
|
||||
|
|
18
include/hw/cxl/cxl_mailbox.h
Normal file
18
include/hw/cxl/cxl_mailbox.h
Normal file
|
@ -0,0 +1,18 @@
|
|||
/*
|
||||
* QEMU CXL Mailbox
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2. See the
|
||||
* COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef CXL_MAILBOX_H
|
||||
#define CXL_MAILBOX_H
|
||||
|
||||
#define CXL_MBOX_IMMEDIATE_CONFIG_CHANGE (1 << 1)
|
||||
#define CXL_MBOX_IMMEDIATE_DATA_CHANGE (1 << 2)
|
||||
#define CXL_MBOX_IMMEDIATE_POLICY_CHANGE (1 << 3)
|
||||
#define CXL_MBOX_IMMEDIATE_LOG_CHANGE (1 << 4)
|
||||
#define CXL_MBOX_SECURITY_STATE_CHANGE (1 << 5)
|
||||
#define CXL_MBOX_BACKGROUND_OPERATION (1 << 6)
|
||||
|
||||
#endif
|
|
@ -3,6 +3,7 @@
|
|||
|
||||
#include "hw/pci/pci.h"
|
||||
#include "hw/pci/pcie.h"
|
||||
#include "hw/pci/pcie_doe.h"
|
||||
|
||||
#define TYPE_PCI_DEVICE "pci-device"
|
||||
typedef struct PCIDeviceClass PCIDeviceClass;
|
||||
|
@ -37,6 +38,8 @@ struct PCIDeviceClass {
|
|||
uint16_t subsystem_id; /* only for header type = 0 */
|
||||
|
||||
const char *romfile; /* rom bar */
|
||||
|
||||
bool sriov_vf_user_creatable;
|
||||
};
|
||||
|
||||
enum PCIReqIDType {
|
||||
|
@ -157,9 +160,17 @@ struct PCIDevice {
|
|||
MSIVectorReleaseNotifier msix_vector_release_notifier;
|
||||
MSIVectorPollNotifier msix_vector_poll_notifier;
|
||||
|
||||
/* SPDM */
|
||||
uint16_t spdm_port;
|
||||
|
||||
/* DOE */
|
||||
DOECap doe_spdm;
|
||||
|
||||
/* ID of standby device in net_failover pair */
|
||||
char *failover_pair_id;
|
||||
uint32_t acpi_index;
|
||||
|
||||
char *sriov_pf;
|
||||
};
|
||||
|
||||
static inline int pci_intx(PCIDevice *pci_dev)
|
||||
|
@ -192,7 +203,7 @@ static inline int pci_is_express_downstream_port(const PCIDevice *d)
|
|||
|
||||
static inline int pci_is_vf(const PCIDevice *d)
|
||||
{
|
||||
return d->exp.sriov_vf.pf != NULL;
|
||||
return d->sriov_pf || d->exp.sriov_vf.pf != NULL;
|
||||
}
|
||||
|
||||
static inline uint32_t pci_config_size(const PCIDevice *d)
|
||||
|
|
|
@ -46,6 +46,8 @@ REG32(PCI_DOE_CAP_STATUS, 0)
|
|||
|
||||
/* PCI-SIG defined Data Object Types - r6.0 Table 6-32 */
|
||||
#define PCI_SIG_DOE_DISCOVERY 0x00
|
||||
#define PCI_SIG_DOE_CMA 0x01
|
||||
#define PCI_SIG_DOE_SECURED_CMA 0x02
|
||||
|
||||
#define PCI_DOE_DW_SIZE_MAX (1 << 18)
|
||||
#define PCI_DOE_PROTOCOL_NUM_MAX 256
|
||||
|
@ -106,6 +108,9 @@ struct DOECap {
|
|||
/* Protocols and its callback response */
|
||||
DOEProtocol *protocols;
|
||||
uint16_t protocol_num;
|
||||
|
||||
/* Used for spdm-socket */
|
||||
int spdm_socket;
|
||||
};
|
||||
|
||||
void pcie_doe_init(PCIDevice *pdev, DOECap *doe_cap, uint16_t offset,
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
typedef struct PCIESriovPF {
|
||||
uint8_t vf_bar_type[PCI_NUM_REGIONS]; /* Store type for each VF bar */
|
||||
PCIDevice **vf; /* Pointer to an array of num_vfs VF devices */
|
||||
bool vf_user_created; /* If VFs are created by user */
|
||||
} PCIESriovPF;
|
||||
|
||||
typedef struct PCIESriovVF {
|
||||
|
@ -40,6 +41,23 @@ void pcie_sriov_pf_init_vf_bar(PCIDevice *dev, int region_num,
|
|||
void pcie_sriov_vf_register_bar(PCIDevice *dev, int region_num,
|
||||
MemoryRegion *memory);
|
||||
|
||||
/**
|
||||
* pcie_sriov_pf_init_from_user_created_vfs() - Initialize PF with user-created
|
||||
* VFs.
|
||||
* @dev: A PCIe device being realized.
|
||||
* @offset: The offset of the SR-IOV capability.
|
||||
* @errp: pointer to Error*, to store an error if it happens.
|
||||
*
|
||||
* Return: The size of added capability. 0 if the user did not create VFs.
|
||||
* -1 if failed.
|
||||
*/
|
||||
int16_t pcie_sriov_pf_init_from_user_created_vfs(PCIDevice *dev,
|
||||
uint16_t offset,
|
||||
Error **errp);
|
||||
|
||||
bool pcie_sriov_register_device(PCIDevice *dev, Error **errp);
|
||||
void pcie_sriov_unregister_device(PCIDevice *dev);
|
||||
|
||||
/*
|
||||
* Default (minimal) page size support values
|
||||
* as required by the SR/IOV standard:
|
||||
|
|
|
@ -43,7 +43,6 @@ typedef struct IOMMUDevice {
|
|||
MemoryRegion bypass_mr; /* The alias of shared memory MR */
|
||||
GList *resv_regions;
|
||||
GList *host_resv_ranges;
|
||||
bool probe_done;
|
||||
} IOMMUDevice;
|
||||
|
||||
typedef struct IOMMUPciBus {
|
||||
|
|
|
@ -152,6 +152,7 @@ struct VirtIOPCIProxy {
|
|||
uint32_t modern_io_bar_idx;
|
||||
uint32_t modern_mem_bar_idx;
|
||||
int config_cap;
|
||||
uint16_t last_pcie_cap_offset;
|
||||
uint32_t flags;
|
||||
bool disable_modern;
|
||||
bool ignore_backend_features;
|
||||
|
|
|
@ -69,6 +69,8 @@ typedef struct VirtQueueElement
|
|||
unsigned int ndescs;
|
||||
unsigned int out_num;
|
||||
unsigned int in_num;
|
||||
/* Element has been processed (VIRTIO_F_IN_ORDER) */
|
||||
bool in_order_filled;
|
||||
hwaddr *in_addr;
|
||||
hwaddr *out_addr;
|
||||
struct iovec *in_sg;
|
||||
|
@ -371,7 +373,9 @@ typedef struct VirtIORNGConf VirtIORNGConf;
|
|||
DEFINE_PROP_BIT64("packed", _state, _field, \
|
||||
VIRTIO_F_RING_PACKED, false), \
|
||||
DEFINE_PROP_BIT64("queue_reset", _state, _field, \
|
||||
VIRTIO_F_RING_RESET, true)
|
||||
VIRTIO_F_RING_RESET, true), \
|
||||
DEFINE_PROP_BIT64("in_order", _state, _field, \
|
||||
VIRTIO_F_IN_ORDER, false)
|
||||
|
||||
hwaddr virtio_queue_get_desc_addr(VirtIODevice *vdev, int n);
|
||||
bool virtio_queue_enabled_legacy(VirtIODevice *vdev, int n);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue