mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'for_upstream' of https://git.kernel.org/pub/scm/virt/kvm/mst/qemu into staging
virtio,pc,pci: features, fixes, cleanups Features: SR-IOV emulation for pci virtio-mem-pci support for s390 interleave support for cxl big endian support for vdpa svq new QAPI events for vhost-user Also vIOMMU reset order fixups are in. Fixes, cleanups all over the place. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> # -----BEGIN PGP SIGNATURE----- # # iQFDBAABCAAtFiEEXQn9CHHI+FuUyooNKB8NuNKNVGkFAme4b8sPHG1zdEByZWRo # YXQuY29tAAoJECgfDbjSjVRpHKcIAKPJsVqPdda2dJ7b7FdyRT0Q+uwezXqaGHd4 # 7Lzih1wsxYNkwIAyPtEb76/21qiS7BluqlUCfCB66R9xWjP5/KfvAFj4/r4AEduE # fxAgYzotNpv55zcRbcflMyvQ42WGiZZHC+o5Lp7vDXUP3pIyHrl0Ydh5WmcD+hwS # BjXvda58TirQpPJ7rUL+sSfLih17zQkkDcfv5/AgorDy1wK09RBKwMx/gq7wG8yJ # twy8eBY2CmfmFD7eTM+EKqBD2T0kwLEeLfS/F/tl5Fyg6lAiYgYtCbGLpAmWErsg # XZvfZmwqL7CNzWexGvPFnnLyqwC33WUP0k0kT88Y5wh3/h98blw= # =tej8 # -----END PGP SIGNATURE----- # gpg: Signature made Fri 21 Feb 2025 20:21:31 HKT # 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: (41 commits) docs/devel/reset: Document reset expectations for DMA and IOMMU hw/vfio/common: Add a trace point in vfio_reset_handler hw/arm/smmuv3: Move reset to exit phase hw/i386/intel-iommu: Migrate to 3-phase reset hw/virtio/virtio-iommu: Migrate to 3-phase reset vhost-user-snd: correct the calculation of config_size net: vhost-user: add QAPI events to report connection state hw/virtio/virtio-nsm: Respond with correct length vdpa: Fix endian bugs in shadow virtqueue MAINTAINERS: add more files to `vhost` cryptodev/vhost: allocate CryptoDevBackendVhost using g_mem0() vhost-iova-tree: Update documentation vhost-iova-tree, svq: Implement GPA->IOVA & partial IOVA->HVA trees vhost-iova-tree: Implement an IOVA-only tree amd_iommu: Use correct bitmask to set capability BAR amd_iommu: Use correct DTE field for interrupt passthrough hw/virtio: reset virtio balloon stats on machine reset mem/cxl_type3: support 3, 6, 12 and 16 interleave ways hw/mem/cxl_type3: Ensure errp is set on realization failure hw/mem/cxl_type3: Fix special_ops memory leak on msix_init_exclusive_bar() failure ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
+8
-3
@@ -2221,12 +2221,16 @@ M: Michael S. Tsirkin <mst@redhat.com>
|
||||
R: Stefano Garzarella <sgarzare@redhat.com>
|
||||
S: Supported
|
||||
F: hw/*/*vhost*
|
||||
F: docs/interop/vhost-user.json
|
||||
F: docs/interop/vhost-user.rst
|
||||
F: docs/interop/vhost-user*
|
||||
F: docs/system/devices/vhost-user*
|
||||
F: contrib/vhost-user-*/
|
||||
F: backends/vhost-user.c
|
||||
F: backends/*vhost*
|
||||
F: include/system/vhost-user-backend.h
|
||||
F: include/hw/virtio/vhost*
|
||||
F: include/*/vhost*
|
||||
F: subprojects/libvhost-user/
|
||||
F: block/export/vhost-user*
|
||||
F: util/vhost-user-server.c
|
||||
|
||||
vhost-shadow-virtqueue
|
||||
R: Eugenio Pérez <eperezma@redhat.com>
|
||||
@@ -2255,6 +2259,7 @@ F: include/hw/virtio/virtio-balloon.h
|
||||
F: system/balloon.c
|
||||
F: include/system/balloon.h
|
||||
F: tests/qtest/virtio-balloon-test.c
|
||||
F: tests/functional/test_virtio_balloon.py
|
||||
|
||||
virtio-9p
|
||||
M: Christian Schoenebeck <qemu_oss@crudebyte.com>
|
||||
|
||||
@@ -53,7 +53,7 @@ cryptodev_vhost_init(
|
||||
CryptoDevBackendVhost *crypto;
|
||||
Error *local_err = NULL;
|
||||
|
||||
crypto = g_new(CryptoDevBackendVhost, 1);
|
||||
crypto = g_new0(CryptoDevBackendVhost, 1);
|
||||
crypto->dev.max_queues = 1;
|
||||
crypto->dev.nvqs = 1;
|
||||
crypto->dev.vqs = crypto->vqs;
|
||||
|
||||
@@ -277,13 +277,6 @@ deprecated; use the new name ``dtb-randomness`` instead. The new name
|
||||
better reflects the way this property affects all random data within
|
||||
the device tree blob, not just the ``kaslr-seed`` node.
|
||||
|
||||
``pc-i440fx-2.4`` up to ``pc-i440fx-2.12`` (since 9.1)
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
These old machine types are quite neglected nowadays and thus might have
|
||||
various pitfalls with regards to live migration. Use a newer machine type
|
||||
instead.
|
||||
|
||||
PPC 405 ``ref405ep`` machine (since 9.1)
|
||||
''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
|
||||
@@ -972,6 +972,11 @@ from Linux in 2021, and is not supported anymore by QEMU either.
|
||||
System emulator machines
|
||||
------------------------
|
||||
|
||||
Note: Versioned machine types that have been introduced in a QEMU version
|
||||
that has initially been released more than 6 years before are considered
|
||||
obsolete and will be removed without further notice in this document.
|
||||
Please use newer machine types instead.
|
||||
|
||||
``s390-virtio`` (removed in 2.6)
|
||||
''''''''''''''''''''''''''''''''
|
||||
|
||||
@@ -1006,12 +1011,6 @@ mips ``fulong2e`` machine alias (removed in 6.0)
|
||||
|
||||
This machine has been renamed ``fuloong2e``.
|
||||
|
||||
``pc-0.10`` up to ``pc-i440fx-2.3`` (removed in 4.0 up to 9.0)
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
These machine types were very old and likely could not be used for live
|
||||
migration from old QEMU versions anymore. Use a newer machine type instead.
|
||||
|
||||
Raspberry Pi ``raspi2`` and ``raspi3`` machines (removed in 6.2)
|
||||
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
|
||||
@@ -143,6 +143,11 @@ The *exit* phase is executed only when the last reset operation ends. Therefore
|
||||
the object does not need to care how many of reset controllers it has and how
|
||||
many of them have started a reset.
|
||||
|
||||
DMA capable devices are expected to cancel all outstanding DMA operations
|
||||
during either 'enter' or 'hold' phases. IOMMUs are expected to reset during
|
||||
the 'exit' phase and this sequencing makes sure no outstanding DMA request
|
||||
will fault.
|
||||
|
||||
|
||||
Handling reset in a resettable object
|
||||
-------------------------------------
|
||||
|
||||
+5
-3
@@ -52,9 +52,11 @@ setting up a BAR for a VF.
|
||||
...
|
||||
|
||||
/* Add and initialize the SR/IOV capability */
|
||||
pcie_sriov_pf_init(d, 0x200, "your_virtual_dev",
|
||||
vf_devid, initial_vfs, total_vfs,
|
||||
fun_offset, stride);
|
||||
if (!pcie_sriov_pf_init(d, 0x200, "your_virtual_dev",
|
||||
vf_devid, initial_vfs, total_vfs,
|
||||
fun_offset, stride, errp)) {
|
||||
return;
|
||||
}
|
||||
|
||||
/* Set up individual VF BARs (parameters as for normal BARs) */
|
||||
pcie_sriov_pf_init_vf_bar( ... )
|
||||
|
||||
@@ -924,7 +924,12 @@ static void smmu_base_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
static void smmu_base_reset_hold(Object *obj, ResetType type)
|
||||
/*
|
||||
* Make sure the IOMMU is reset in 'exit' phase after
|
||||
* all outstanding DMA requests have been quiesced during
|
||||
* the 'enter' or 'hold' reset phases
|
||||
*/
|
||||
static void smmu_base_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
SMMUState *s = ARM_SMMU(obj);
|
||||
|
||||
@@ -949,7 +954,7 @@ static void smmu_base_class_init(ObjectClass *klass, void *data)
|
||||
device_class_set_props(dc, smmu_dev_properties);
|
||||
device_class_set_parent_realize(dc, smmu_base_realize,
|
||||
&sbc->parent_realize);
|
||||
rc->phases.hold = smmu_base_reset_hold;
|
||||
rc->phases.exit = smmu_base_reset_exit;
|
||||
}
|
||||
|
||||
static const TypeInfo smmu_base_info = {
|
||||
|
||||
+10
-4
@@ -1870,13 +1870,19 @@ static void smmu_init_irq(SMMUv3State *s, SysBusDevice *dev)
|
||||
}
|
||||
}
|
||||
|
||||
static void smmu_reset_hold(Object *obj, ResetType type)
|
||||
/*
|
||||
* Make sure the IOMMU is reset in 'exit' phase after
|
||||
* all outstanding DMA requests have been quiesced during
|
||||
* the 'enter' or 'hold' reset phases
|
||||
*/
|
||||
static void smmu_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
SMMUv3State *s = ARM_SMMUV3(obj);
|
||||
SMMUv3Class *c = ARM_SMMUV3_GET_CLASS(s);
|
||||
|
||||
if (c->parent_phases.hold) {
|
||||
c->parent_phases.hold(obj, type);
|
||||
trace_smmu_reset_exit();
|
||||
if (c->parent_phases.exit) {
|
||||
c->parent_phases.exit(obj, type);
|
||||
}
|
||||
|
||||
smmuv3_init_regs(s);
|
||||
@@ -1999,7 +2005,7 @@ static void smmuv3_class_init(ObjectClass *klass, void *data)
|
||||
SMMUv3Class *c = ARM_SMMUV3_CLASS(klass);
|
||||
|
||||
dc->vmsd = &vmstate_smmuv3;
|
||||
resettable_class_set_parent_phases(rc, NULL, smmu_reset_hold, NULL,
|
||||
resettable_class_set_parent_phases(rc, NULL, NULL, smmu_reset_exit,
|
||||
&c->parent_phases);
|
||||
device_class_set_parent_realize(dc, smmu_realize,
|
||||
&c->parent_realize);
|
||||
|
||||
@@ -56,6 +56,7 @@ smmuv3_config_cache_inv(uint32_t sid) "Config cache INV for sid=0x%x"
|
||||
smmuv3_notify_flag_add(const char *iommu) "ADD SMMUNotifier node for iommu mr=%s"
|
||||
smmuv3_notify_flag_del(const char *iommu) "DEL SMMUNotifier node for iommu mr=%s"
|
||||
smmuv3_inv_notifiers_iova(const char *name, int asid, int vmid, uint64_t iova, uint8_t tg, uint64_t num_pages, int stage) "iommu mr=%s asid=%d vmid=%d iova=0x%"PRIx64" tg=%d num_pages=0x%"PRIx64" stage=%d"
|
||||
smmu_reset_exit(void) ""
|
||||
|
||||
# strongarm.c
|
||||
strongarm_uart_update_parameters(const char *label, int speed, char parity, int data_bits, int stop_bits) "%s speed=%d parity=%c data=%d stop=%d"
|
||||
|
||||
@@ -243,8 +243,13 @@ static void hdm_init_common(uint32_t *reg_state, uint32_t *write_msk,
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, INTERLEAVE_4K, 1);
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY,
|
||||
POISON_ON_ERR_CAP, 0);
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 3_6_12_WAY, 0);
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 16_WAY, 0);
|
||||
if (type == CXL2_TYPE3_DEVICE) {
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 3_6_12_WAY, 1);
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 16_WAY, 1);
|
||||
} else {
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 3_6_12_WAY, 0);
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, 16_WAY, 0);
|
||||
}
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY, UIO, 0);
|
||||
ARRAY_FIELD_DP32(reg_state, CXL_HDM_DECODER_CAPABILITY,
|
||||
UIO_DECODER_COUNT, 0);
|
||||
|
||||
@@ -352,10 +352,8 @@ static void device_reg_init_common(CXLDeviceState *cxl_dstate)
|
||||
}
|
||||
}
|
||||
|
||||
static void mailbox_reg_init_common(CXLDeviceState *cxl_dstate)
|
||||
static void mailbox_reg_init_common(CXLDeviceState *cxl_dstate, int msi_n)
|
||||
{
|
||||
const uint8_t msi_n = 9;
|
||||
|
||||
/* 2048 payload size */
|
||||
ARRAY_FIELD_DP32(cxl_dstate->mbox_reg_state32, CXL_DEV_MAILBOX_CAP,
|
||||
PAYLOAD_SIZE, CXL_MAILBOX_PAYLOAD_SHIFT);
|
||||
@@ -382,7 +380,7 @@ static void memdev_reg_init_common(CXLDeviceState *cxl_dstate)
|
||||
cxl_dstate->memdev_status = memdev_status_reg;
|
||||
}
|
||||
|
||||
void cxl_device_register_init_t3(CXLType3Dev *ct3d)
|
||||
void cxl_device_register_init_t3(CXLType3Dev *ct3d, int msi_n)
|
||||
{
|
||||
CXLDeviceState *cxl_dstate = &ct3d->cxl_dstate;
|
||||
uint64_t *cap_h = cxl_dstate->caps_reg_state64;
|
||||
@@ -398,7 +396,7 @@ void cxl_device_register_init_t3(CXLType3Dev *ct3d)
|
||||
device_reg_init_common(cxl_dstate);
|
||||
|
||||
cxl_device_cap_init(cxl_dstate, MAILBOX, 2, CXL_DEV_MAILBOX_VERSION);
|
||||
mailbox_reg_init_common(cxl_dstate);
|
||||
mailbox_reg_init_common(cxl_dstate, msi_n);
|
||||
|
||||
cxl_device_cap_init(cxl_dstate, MEMORY_DEVICE, 0x4000,
|
||||
CXL_MEM_DEV_STATUS_VERSION);
|
||||
@@ -408,7 +406,7 @@ void cxl_device_register_init_t3(CXLType3Dev *ct3d)
|
||||
CXL_MAILBOX_MAX_PAYLOAD_SIZE);
|
||||
}
|
||||
|
||||
void cxl_device_register_init_swcci(CSWMBCCIDev *sw)
|
||||
void cxl_device_register_init_swcci(CSWMBCCIDev *sw, int msi_n)
|
||||
{
|
||||
CXLDeviceState *cxl_dstate = &sw->cxl_dstate;
|
||||
uint64_t *cap_h = cxl_dstate->caps_reg_state64;
|
||||
@@ -423,7 +421,7 @@ void cxl_device_register_init_swcci(CSWMBCCIDev *sw)
|
||||
device_reg_init_common(cxl_dstate);
|
||||
|
||||
cxl_device_cap_init(cxl_dstate, MAILBOX, 2, 1);
|
||||
mailbox_reg_init_common(cxl_dstate);
|
||||
mailbox_reg_init_common(cxl_dstate, msi_n);
|
||||
|
||||
cxl_device_cap_init(cxl_dstate, MEMORY_DEVICE, 0x4000, 1);
|
||||
memdev_reg_init_common(cxl_dstate);
|
||||
|
||||
@@ -17,10 +17,12 @@
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/cxl/cxl.h"
|
||||
|
||||
#define CXL_SWCCI_MSIX_MBOX 3
|
||||
|
||||
static void cswmbcci_reset(DeviceState *dev)
|
||||
{
|
||||
CSWMBCCIDev *cswmb = CXL_SWITCH_MAILBOX_CCI(dev);
|
||||
cxl_device_register_init_swcci(cswmb);
|
||||
cxl_device_register_init_swcci(cswmb, CXL_SWCCI_MSIX_MBOX);
|
||||
}
|
||||
|
||||
static void cswbcci_realize(PCIDevice *pci_dev, Error **errp)
|
||||
|
||||
+5
-5
@@ -1309,15 +1309,15 @@ static int amdvi_int_remap_msi(AMDVIState *iommu,
|
||||
ret = -AMDVI_IR_ERR;
|
||||
break;
|
||||
case AMDVI_IOAPIC_INT_TYPE_NMI:
|
||||
pass = dte[3] & AMDVI_DEV_NMI_PASS_MASK;
|
||||
pass = dte[2] & AMDVI_DEV_NMI_PASS_MASK;
|
||||
trace_amdvi_ir_delivery_mode("nmi");
|
||||
break;
|
||||
case AMDVI_IOAPIC_INT_TYPE_INIT:
|
||||
pass = dte[3] & AMDVI_DEV_INT_PASS_MASK;
|
||||
pass = dte[2] & AMDVI_DEV_INT_PASS_MASK;
|
||||
trace_amdvi_ir_delivery_mode("init");
|
||||
break;
|
||||
case AMDVI_IOAPIC_INT_TYPE_EINT:
|
||||
pass = dte[3] & AMDVI_DEV_EINT_PASS_MASK;
|
||||
pass = dte[2] & AMDVI_DEV_EINT_PASS_MASK;
|
||||
trace_amdvi_ir_delivery_mode("eint");
|
||||
break;
|
||||
default:
|
||||
@@ -1593,9 +1593,9 @@ static void amdvi_pci_realize(PCIDevice *pdev, Error **errp)
|
||||
/* reset AMDVI specific capabilities, all r/o */
|
||||
pci_set_long(pdev->config + s->capab_offset, AMDVI_CAPAB_FEATURES);
|
||||
pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_BAR_LOW,
|
||||
AMDVI_BASE_ADDR & ~(0xffff0000));
|
||||
AMDVI_BASE_ADDR & MAKE_64BIT_MASK(14, 18));
|
||||
pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_BAR_HIGH,
|
||||
(AMDVI_BASE_ADDR & ~(0xffff)) >> 16);
|
||||
AMDVI_BASE_ADDR >> 32);
|
||||
pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_RANGE,
|
||||
0xff000000);
|
||||
pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_MISC, 0);
|
||||
|
||||
+1
-1
@@ -187,7 +187,7 @@
|
||||
AMDVI_CAPAB_FLAG_HTTUNNEL | AMDVI_CAPAB_EFR_SUP)
|
||||
|
||||
/* AMDVI default address */
|
||||
#define AMDVI_BASE_ADDR 0xfed80000
|
||||
#define AMDVI_BASE_ADDR 0xfed80000ULL
|
||||
|
||||
/* page management constants */
|
||||
#define AMDVI_PAGE_SHIFT 12
|
||||
|
||||
@@ -4697,10 +4697,11 @@ static void vtd_init(IntelIOMMUState *s)
|
||||
/* Should not reset address_spaces when reset because devices will still use
|
||||
* the address space they got at first (won't ask the bus again).
|
||||
*/
|
||||
static void vtd_reset(DeviceState *dev)
|
||||
static void vtd_reset_exit(Object *obj, ResetType type)
|
||||
{
|
||||
IntelIOMMUState *s = INTEL_IOMMU_DEVICE(dev);
|
||||
IntelIOMMUState *s = INTEL_IOMMU_DEVICE(obj);
|
||||
|
||||
trace_vtd_reset_exit();
|
||||
vtd_init(s);
|
||||
vtd_address_space_refresh_all(s);
|
||||
}
|
||||
@@ -4864,8 +4865,13 @@ static void vtd_class_init(ObjectClass *klass, void *data)
|
||||
{
|
||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||
X86IOMMUClass *x86_class = X86_IOMMU_DEVICE_CLASS(klass);
|
||||
ResettableClass *rc = RESETTABLE_CLASS(klass);
|
||||
|
||||
device_class_set_legacy_reset(dc, vtd_reset);
|
||||
/*
|
||||
* Use 'exit' reset phase to make sure all DMA requests
|
||||
* have been quiesced during 'enter' or 'hold' phase
|
||||
*/
|
||||
rc->phases.exit = vtd_reset_exit;
|
||||
dc->vmsd = &vtd_vmstate;
|
||||
device_class_set_props(dc, vtd_properties);
|
||||
dc->hotpluggable = false;
|
||||
|
||||
+33
-33
@@ -451,11 +451,44 @@ static HotplugHandler *microvm_get_hotplug_handler(MachineState *machine,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void microvm_machine_done(Notifier *notifier, void *data)
|
||||
{
|
||||
MicrovmMachineState *mms = container_of(notifier, MicrovmMachineState,
|
||||
machine_done);
|
||||
X86MachineState *x86ms = X86_MACHINE(mms);
|
||||
|
||||
acpi_setup_microvm(mms);
|
||||
dt_setup_microvm(mms);
|
||||
fw_cfg_add_e820(x86ms->fw_cfg);
|
||||
}
|
||||
|
||||
static void microvm_powerdown_req(Notifier *notifier, void *data)
|
||||
{
|
||||
MicrovmMachineState *mms = container_of(notifier, MicrovmMachineState,
|
||||
powerdown_req);
|
||||
X86MachineState *x86ms = X86_MACHINE(mms);
|
||||
|
||||
if (x86ms->acpi_dev) {
|
||||
Object *obj = OBJECT(x86ms->acpi_dev);
|
||||
AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
|
||||
adevc->send_event(ACPI_DEVICE_IF(x86ms->acpi_dev),
|
||||
ACPI_POWER_DOWN_STATUS);
|
||||
}
|
||||
}
|
||||
|
||||
static void microvm_machine_state_init(MachineState *machine)
|
||||
{
|
||||
MicrovmMachineState *mms = MICROVM_MACHINE(machine);
|
||||
X86MachineState *x86ms = X86_MACHINE(machine);
|
||||
|
||||
/* State */
|
||||
mms->kernel_cmdline_fixed = false;
|
||||
|
||||
mms->machine_done.notify = microvm_machine_done;
|
||||
qemu_add_machine_init_done_notifier(&mms->machine_done);
|
||||
mms->powerdown_req.notify = microvm_powerdown_req;
|
||||
qemu_register_powerdown_notifier(&mms->powerdown_req);
|
||||
|
||||
microvm_memory_init(mms);
|
||||
|
||||
x86_cpus_init(x86ms, CPU_VERSION_LATEST);
|
||||
@@ -581,31 +614,6 @@ static void microvm_machine_set_auto_kernel_cmdline(Object *obj, bool value,
|
||||
mms->auto_kernel_cmdline = value;
|
||||
}
|
||||
|
||||
static void microvm_machine_done(Notifier *notifier, void *data)
|
||||
{
|
||||
MicrovmMachineState *mms = container_of(notifier, MicrovmMachineState,
|
||||
machine_done);
|
||||
X86MachineState *x86ms = X86_MACHINE(mms);
|
||||
|
||||
acpi_setup_microvm(mms);
|
||||
dt_setup_microvm(mms);
|
||||
fw_cfg_add_e820(x86ms->fw_cfg);
|
||||
}
|
||||
|
||||
static void microvm_powerdown_req(Notifier *notifier, void *data)
|
||||
{
|
||||
MicrovmMachineState *mms = container_of(notifier, MicrovmMachineState,
|
||||
powerdown_req);
|
||||
X86MachineState *x86ms = X86_MACHINE(mms);
|
||||
|
||||
if (x86ms->acpi_dev) {
|
||||
Object *obj = OBJECT(x86ms->acpi_dev);
|
||||
AcpiDeviceIfClass *adevc = ACPI_DEVICE_IF_GET_CLASS(obj);
|
||||
adevc->send_event(ACPI_DEVICE_IF(x86ms->acpi_dev),
|
||||
ACPI_POWER_DOWN_STATUS);
|
||||
}
|
||||
}
|
||||
|
||||
static void microvm_machine_initfn(Object *obj)
|
||||
{
|
||||
MicrovmMachineState *mms = MICROVM_MACHINE(obj);
|
||||
@@ -617,14 +625,6 @@ static void microvm_machine_initfn(Object *obj)
|
||||
mms->isa_serial = true;
|
||||
mms->option_roms = true;
|
||||
mms->auto_kernel_cmdline = true;
|
||||
|
||||
/* State */
|
||||
mms->kernel_cmdline_fixed = false;
|
||||
|
||||
mms->machine_done.notify = microvm_machine_done;
|
||||
qemu_add_machine_init_done_notifier(&mms->machine_done);
|
||||
mms->powerdown_req.notify = microvm_powerdown_req;
|
||||
qemu_register_powerdown_notifier(&mms->powerdown_req);
|
||||
}
|
||||
|
||||
GlobalProperty microvm_properties[] = {
|
||||
|
||||
+3
-3
@@ -1241,6 +1241,9 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
||||
/* Super I/O */
|
||||
pc_superio_init(isa_bus, create_fdctrl, pcms->i8042_enabled,
|
||||
pcms->vmport != ON_OFF_AUTO_ON, &error_fatal);
|
||||
|
||||
pcms->machine_done.notify = pc_machine_done;
|
||||
qemu_add_machine_init_done_notifier(&pcms->machine_done);
|
||||
}
|
||||
|
||||
void pc_nic_init(PCMachineClass *pcmc, ISABus *isa_bus, PCIBus *pci_bus)
|
||||
@@ -1714,9 +1717,6 @@ static void pc_machine_initfn(Object *obj)
|
||||
if (pcmc->pci_enabled) {
|
||||
cxl_machine_init(obj, &pcms->cxl_devices_state);
|
||||
}
|
||||
|
||||
pcms->machine_done.notify = pc_machine_done;
|
||||
qemu_add_machine_init_done_notifier(&pcms->machine_done);
|
||||
}
|
||||
|
||||
static void pc_machine_reset(MachineState *machine, ResetType type)
|
||||
|
||||
@@ -68,6 +68,7 @@ vtd_frr_new(int index, uint64_t hi, uint64_t lo) "index %d high 0x%"PRIx64" low
|
||||
vtd_warn_invalid_qi_tail(uint16_t tail) "tail 0x%"PRIx16
|
||||
vtd_warn_ir_vector(uint16_t sid, int index, int vec, int target) "sid 0x%"PRIx16" index %d vec %d (should be: %d)"
|
||||
vtd_warn_ir_trigger(uint16_t sid, int index, int trig, int target) "sid 0x%"PRIx16" index %d trigger %d (should be: %d)"
|
||||
vtd_reset_exit(void) ""
|
||||
|
||||
# amd_iommu.c
|
||||
amdvi_evntlog_fail(uint64_t addr, uint32_t head) "error: fail to write at addr 0x%"PRIx64" + offset 0x%"PRIx32
|
||||
|
||||
+31
-14
@@ -30,6 +30,14 @@
|
||||
#include "hw/cxl/cxl.h"
|
||||
#include "hw/pci/msix.h"
|
||||
|
||||
/* type3 device private */
|
||||
enum CXL_T3_MSIX_VECTOR {
|
||||
CXL_T3_MSIX_PCIE_DOE_TABLE_ACCESS = 0,
|
||||
CXL_T3_MSIX_EVENT_START = 2,
|
||||
CXL_T3_MSIX_MBOX = CXL_T3_MSIX_EVENT_START + CXL_EVENT_TYPE_MAX,
|
||||
CXL_T3_MSIX_VECTOR_NR
|
||||
};
|
||||
|
||||
#define DWORD_BYTE 4
|
||||
#define CXL_CAPACITY_MULTIPLIER (256 * MiB)
|
||||
|
||||
@@ -843,7 +851,6 @@ static void ct3_realize(PCIDevice *pci_dev, Error **errp)
|
||||
ComponentRegisters *regs = &cxl_cstate->crb;
|
||||
MemoryRegion *mr = ®s->component_registers;
|
||||
uint8_t *pci_conf = pci_dev->config;
|
||||
unsigned short msix_num = 10;
|
||||
int i, rc;
|
||||
uint16_t count;
|
||||
|
||||
@@ -884,31 +891,32 @@ static void ct3_realize(PCIDevice *pci_dev, Error **errp)
|
||||
&ct3d->cxl_dstate.device_registers);
|
||||
|
||||
/* MSI(-X) Initialization */
|
||||
rc = msix_init_exclusive_bar(pci_dev, msix_num, 4, NULL);
|
||||
rc = msix_init_exclusive_bar(pci_dev, CXL_T3_MSIX_VECTOR_NR, 4, errp);
|
||||
if (rc) {
|
||||
goto err_address_space_free;
|
||||
goto err_free_special_ops;
|
||||
}
|
||||
for (i = 0; i < msix_num; i++) {
|
||||
for (i = 0; i < CXL_T3_MSIX_VECTOR_NR; i++) {
|
||||
msix_vector_use(pci_dev, i);
|
||||
}
|
||||
|
||||
/* DOE Initialization */
|
||||
pcie_doe_init(pci_dev, &ct3d->doe_cdat, 0x190, doe_cdat_prot, true, 0);
|
||||
pcie_doe_init(pci_dev, &ct3d->doe_cdat, 0x190, doe_cdat_prot, true,
|
||||
CXL_T3_MSIX_PCIE_DOE_TABLE_ACCESS);
|
||||
|
||||
cxl_cstate->cdat.build_cdat_table = ct3_build_cdat_table;
|
||||
cxl_cstate->cdat.free_cdat_table = ct3_free_cdat_table;
|
||||
cxl_cstate->cdat.private = ct3d;
|
||||
if (!cxl_doe_cdat_init(cxl_cstate, errp)) {
|
||||
goto err_free_special_ops;
|
||||
goto err_msix_uninit;
|
||||
}
|
||||
|
||||
pcie_cap_deverr_init(pci_dev);
|
||||
/* Leave a bit of room for expansion */
|
||||
rc = pcie_aer_init(pci_dev, PCI_ERR_VER, 0x200, PCI_ERR_SIZEOF, NULL);
|
||||
rc = pcie_aer_init(pci_dev, PCI_ERR_VER, 0x200, PCI_ERR_SIZEOF, errp);
|
||||
if (rc) {
|
||||
goto err_release_cdat;
|
||||
}
|
||||
cxl_event_init(&ct3d->cxl_dstate, 2);
|
||||
cxl_event_init(&ct3d->cxl_dstate, CXL_T3_MSIX_EVENT_START);
|
||||
|
||||
/* Set default value for patrol scrub attributes */
|
||||
ct3d->patrol_scrub_attrs.scrub_cycle_cap =
|
||||
@@ -935,9 +943,10 @@ static void ct3_realize(PCIDevice *pci_dev, Error **errp)
|
||||
|
||||
err_release_cdat:
|
||||
cxl_doe_cdat_release(cxl_cstate);
|
||||
err_msix_uninit:
|
||||
msix_uninit_exclusive_bar(pci_dev);
|
||||
err_free_special_ops:
|
||||
g_free(regs->special_ops);
|
||||
err_address_space_free:
|
||||
if (ct3d->dc.host_dc) {
|
||||
cxl_destroy_dc_regions(ct3d);
|
||||
address_space_destroy(&ct3d->dc.host_dc_as);
|
||||
@@ -959,6 +968,7 @@ static void ct3_exit(PCIDevice *pci_dev)
|
||||
|
||||
pcie_aer_exit(pci_dev);
|
||||
cxl_doe_cdat_release(cxl_cstate);
|
||||
msix_uninit_exclusive_bar(pci_dev);
|
||||
g_free(regs->special_ops);
|
||||
if (ct3d->dc.host_dc) {
|
||||
cxl_destroy_dc_regions(ct3d);
|
||||
@@ -1090,10 +1100,17 @@ static bool cxl_type3_dpa(CXLType3Dev *ct3d, hwaddr host_addr, uint64_t *dpa)
|
||||
continue;
|
||||
}
|
||||
|
||||
*dpa = dpa_base +
|
||||
((MAKE_64BIT_MASK(0, 8 + ig) & hpa_offset) |
|
||||
((MAKE_64BIT_MASK(8 + ig + iw, 64 - 8 - ig - iw) & hpa_offset)
|
||||
>> iw));
|
||||
if (iw < 8) {
|
||||
*dpa = dpa_base +
|
||||
((MAKE_64BIT_MASK(0, 8 + ig) & hpa_offset) |
|
||||
((MAKE_64BIT_MASK(8 + ig + iw, 64 - 8 - ig - iw) & hpa_offset)
|
||||
>> iw));
|
||||
} else {
|
||||
*dpa = dpa_base +
|
||||
((MAKE_64BIT_MASK(0, 8 + ig) & hpa_offset) |
|
||||
((((MAKE_64BIT_MASK(ig + iw, 64 - ig - iw) & hpa_offset)
|
||||
>> (ig + iw)) / 3) << (ig + 8)));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -1202,7 +1219,7 @@ static void ct3d_reset(DeviceState *dev)
|
||||
|
||||
pcie_cap_fill_link_ep_usp(PCI_DEVICE(dev), ct3d->width, ct3d->speed);
|
||||
cxl_component_register_init_common(reg_state, write_msk, CXL2_TYPE3_DEVICE);
|
||||
cxl_device_register_init_t3(ct3d);
|
||||
cxl_device_register_init_t3(ct3d, CXL_T3_MSIX_MBOX);
|
||||
|
||||
/*
|
||||
* Bring up an endpoint to target with MCTP over VDM.
|
||||
|
||||
+7
-3
@@ -446,9 +446,13 @@ static void igb_pci_realize(PCIDevice *pci_dev, Error **errp)
|
||||
|
||||
pcie_ari_init(pci_dev, 0x150);
|
||||
|
||||
pcie_sriov_pf_init(pci_dev, IGB_CAP_SRIOV_OFFSET, TYPE_IGBVF,
|
||||
IGB_82576_VF_DEV_ID, IGB_MAX_VF_FUNCTIONS, IGB_MAX_VF_FUNCTIONS,
|
||||
IGB_VF_OFFSET, IGB_VF_STRIDE);
|
||||
if (!pcie_sriov_pf_init(pci_dev, IGB_CAP_SRIOV_OFFSET, TYPE_IGBVF,
|
||||
IGB_82576_VF_DEV_ID, IGB_MAX_VF_FUNCTIONS,
|
||||
IGB_MAX_VF_FUNCTIONS, IGB_VF_OFFSET, IGB_VF_STRIDE,
|
||||
errp)) {
|
||||
igb_cleanup_msix(s);
|
||||
return;
|
||||
}
|
||||
|
||||
pcie_sriov_pf_init_vf_bar(pci_dev, IGBVF_MMIO_BAR_IDX,
|
||||
PCI_BASE_ADDRESS_MEM_TYPE_64 | PCI_BASE_ADDRESS_MEM_PREFETCH,
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user