* [PATCH 1/6] MAINTAINERS: Mark AMD-Vi emulation as orphan
2023-03-13 15:30 [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
@ 2023-03-13 15:30 ` Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 2/6] hw/i386/amd_iommu: Explicit use of AMDVI_BASE_ADDR in amdvi_init Philippe Mathieu-Daudé
` (5 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-13 15:30 UTC (permalink / raw)
To: Wei Huang, qemu-devel
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost, Philippe Mathieu-Daudé,
Roman Kapl, Brijesh Singh, David Kiarie, Jean-Philippe Brucker
hw/i386/amd_iommu.c seems unmaintained:
After commit 1c7955c450 ("x86-iommu: introduce parent class",
2016-07-14), almost no feature added, 2 bug fixes, other changes
are generic tree-wide API cleanups.
Cc: Roman Kapl <rka@sysgo.com>
Cc: Wei Huang <wei.huang2@amd.com>
Cc: Brijesh Singh <brijesh.singh@amd.com>
Cc: David Kiarie <davidkiarie4@gmail.com>
Cc: Jean-Philippe Brucker <jean-philippe@linaro.org>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
Following
https://lore.kernel.org/qemu-devel/CACGkMEtjmpX8G9HYZ0r3n5ErhAENKhQ81f4ocfCYrh=XoF=5hw@mail.gmail.com/
---
MAINTAINERS | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/MAINTAINERS b/MAINTAINERS
index 95c957d587..8badbb01d3 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -3356,6 +3356,10 @@ F: hw/i386/intel_iommu.c
F: hw/i386/intel_iommu_internal.h
F: include/hw/i386/intel_iommu.h
+AMD-Vi Emulation
+S: Orphan
+F: hw/i386/amd_iommu.?
+
OpenSBI Firmware
M: Bin Meng <bmeng.cn@gmail.com>
S: Supported
--
2.38.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/6] hw/i386/amd_iommu: Explicit use of AMDVI_BASE_ADDR in amdvi_init
2023-03-13 15:30 [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 1/6] MAINTAINERS: Mark AMD-Vi emulation as orphan Philippe Mathieu-Daudé
@ 2023-03-13 15:30 ` Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 3/6] hw/i386/amd_iommu: Remove intermediate AMDVIState::devid field Philippe Mathieu-Daudé
` (4 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-13 15:30 UTC (permalink / raw)
To: Wei Huang, qemu-devel
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost, Philippe Mathieu-Daudé
By accessing MemoryRegion internals, amdvi_init() gives the false
idea that the PCI BAR can be modified. However this isn't true
(at least the model isn't ready for that): the device is explicitly
maps at the BAR at the fixed AMDVI_BASE_ADDR address in
amdvi_sysbus_realize(). Since the SysBus API isn't designed to
remap regions, directly use the fixed address in amdvi_init().
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/i386/amd_iommu.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
index bcd016f5c5..3813b341ec 100644
--- a/hw/i386/amd_iommu.c
+++ b/hw/i386/amd_iommu.c
@@ -1519,9 +1519,9 @@ static void amdvi_init(AMDVIState *s)
/* reset AMDVI specific capabilities, all r/o */
pci_set_long(s->pci.dev.config + s->capab_offset, AMDVI_CAPAB_FEATURES);
pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_BAR_LOW,
- s->mmio.addr & ~(0xffff0000));
+ AMDVI_BASE_ADDR & ~(0xffff0000));
pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_BAR_HIGH,
- (s->mmio.addr & ~(0xffff)) >> 16);
+ (AMDVI_BASE_ADDR & ~(0xffff)) >> 16);
pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_RANGE,
0xff000000);
pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_MISC, 0);
--
2.38.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/6] hw/i386/amd_iommu: Remove intermediate AMDVIState::devid field
2023-03-13 15:30 [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 1/6] MAINTAINERS: Mark AMD-Vi emulation as orphan Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 2/6] hw/i386/amd_iommu: Explicit use of AMDVI_BASE_ADDR in amdvi_init Philippe Mathieu-Daudé
@ 2023-03-13 15:30 ` Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 4/6] hw/i386/amd_iommu: Move capab_offset from AMDVIState to AMDVIPCIState Philippe Mathieu-Daudé
` (3 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-13 15:30 UTC (permalink / raw)
To: Wei Huang, qemu-devel
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost, Philippe Mathieu-Daudé
AMDVIState::devid is only accessed by build_amd_iommu() which
has access to the PCIDevice state. Directly get the property
calling object_property_get_int() there.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/i386/acpi-build.c | 4 +++-
hw/i386/amd_iommu.c | 2 --
hw/i386/amd_iommu.h | 2 --
3 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index ec857a117e..a27bc33956 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2395,7 +2395,9 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
/* IVHD length */
build_append_int_noprefix(table_data, ivhd_table_len, 2);
/* DeviceID */
- build_append_int_noprefix(table_data, s->devid, 2);
+ build_append_int_noprefix(table_data,
+ object_property_get_int(OBJECT(&s->pci), "addr",
+ &error_abort), 2);
/* Capability offset */
build_append_int_noprefix(table_data, s->capab_offset, 2);
/* IOMMU base address */
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
index 3813b341ec..19f57e6318 100644
--- a/hw/i386/amd_iommu.c
+++ b/hw/i386/amd_iommu.c
@@ -1513,7 +1513,6 @@ static void amdvi_init(AMDVIState *s)
/* reset device ident */
pci_config_set_vendor_id(s->pci.dev.config, PCI_VENDOR_ID_AMD);
pci_config_set_prog_interface(s->pci.dev.config, 00);
- pci_config_set_device_id(s->pci.dev.config, s->devid);
pci_config_set_class(s->pci.dev.config, 0x0806);
/* reset AMDVI specific capabilities, all r/o */
@@ -1581,7 +1580,6 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->mmio);
sysbus_mmio_map(SYS_BUS_DEVICE(s), 0, AMDVI_BASE_ADDR);
pci_setup_iommu(bus, amdvi_host_dma_iommu, s);
- s->devid = object_property_get_int(OBJECT(&s->pci), "addr", &error_abort);
msi_init(&s->pci.dev, 0, 1, true, false, errp);
amdvi_init(s);
}
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
index 79d38a3e41..5eccaad790 100644
--- a/hw/i386/amd_iommu.h
+++ b/hw/i386/amd_iommu.h
@@ -319,8 +319,6 @@ struct AMDVIState {
uint64_t mmio_addr;
- uint32_t devid; /* auto-assigned devid */
-
bool enabled; /* IOMMU enabled */
bool ats_enabled; /* address translation enabled */
bool cmdbuf_enabled; /* command buffer enabled */
--
2.38.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 4/6] hw/i386/amd_iommu: Move capab_offset from AMDVIState to AMDVIPCIState
2023-03-13 15:30 [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
` (2 preceding siblings ...)
2023-03-13 15:30 ` [PATCH 3/6] hw/i386/amd_iommu: Remove intermediate AMDVIState::devid field Philippe Mathieu-Daudé
@ 2023-03-13 15:30 ` Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 5/6] hw/i386/amd_iommu: Set PCI static/const fields via PCIDeviceClass Philippe Mathieu-Daudé
` (2 subsequent siblings)
6 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-13 15:30 UTC (permalink / raw)
To: Wei Huang, qemu-devel
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost, Philippe Mathieu-Daudé
The 'PCI capability offset' is a *PCI* notion. Since AMDVIPCIState
inherits PCIDevice and hold PCI-related fields, move capab_offset
from AMDVIState to AMDVIPCIState.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/i386/acpi-build.c | 2 +-
hw/i386/amd_iommu.c | 14 +++++++-------
hw/i386/amd_iommu.h | 2 +-
3 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
index a27bc33956..7f211e1f48 100644
--- a/hw/i386/acpi-build.c
+++ b/hw/i386/acpi-build.c
@@ -2399,7 +2399,7 @@ build_amd_iommu(GArray *table_data, BIOSLinker *linker, const char *oem_id,
object_property_get_int(OBJECT(&s->pci), "addr",
&error_abort), 2);
/* Capability offset */
- build_append_int_noprefix(table_data, s->capab_offset, 2);
+ build_append_int_noprefix(table_data, s->pci.capab_offset, 2);
/* IOMMU base address */
build_append_int_noprefix(table_data, s->mmio.addr, 8);
/* PCI Segment Group */
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
index 19f57e6318..9f6622e11f 100644
--- a/hw/i386/amd_iommu.c
+++ b/hw/i386/amd_iommu.c
@@ -1516,15 +1516,15 @@ static void amdvi_init(AMDVIState *s)
pci_config_set_class(s->pci.dev.config, 0x0806);
/* reset AMDVI specific capabilities, all r/o */
- pci_set_long(s->pci.dev.config + s->capab_offset, AMDVI_CAPAB_FEATURES);
- pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_BAR_LOW,
+ pci_set_long(s->pci.dev.config + s->pci.capab_offset, AMDVI_CAPAB_FEATURES);
+ pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_BAR_LOW,
AMDVI_BASE_ADDR & ~(0xffff0000));
- pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_BAR_HIGH,
+ pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_BAR_HIGH,
(AMDVI_BASE_ADDR & ~(0xffff)) >> 16);
- pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_RANGE,
+ pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_RANGE,
0xff000000);
- pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_MISC, 0);
- pci_set_long(s->pci.dev.config + s->capab_offset + AMDVI_CAPAB_MISC,
+ pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_MISC, 0);
+ pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_MISC,
AMDVI_MAX_PH_ADDR | AMDVI_MAX_GVA_ADDR | AMDVI_MAX_VA_ADDR);
}
@@ -1557,7 +1557,7 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
if (ret < 0) {
return;
}
- s->capab_offset = ret;
+ s->pci.capab_offset = ret;
ret = pci_add_capability(&s->pci.dev, PCI_CAP_ID_MSI, 0,
AMDVI_CAPAB_REG_SIZE, errp);
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
index 5eccaad790..1c0cb54bd4 100644
--- a/hw/i386/amd_iommu.h
+++ b/hw/i386/amd_iommu.h
@@ -308,6 +308,7 @@ typedef struct AMDVIAddressSpace AMDVIAddressSpace;
/* functions to steal PCI config space */
typedef struct AMDVIPCIState {
PCIDevice dev; /* The PCI device itself */
+ uint32_t capab_offset; /* capability offset pointer */
} AMDVIPCIState;
struct AMDVIState {
@@ -315,7 +316,6 @@ struct AMDVIState {
AMDVIPCIState pci; /* IOMMU PCI device */
uint32_t version;
- uint32_t capab_offset; /* capability offset pointer */
uint64_t mmio_addr;
--
2.38.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 5/6] hw/i386/amd_iommu: Set PCI static/const fields via PCIDeviceClass
2023-03-13 15:30 [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
` (3 preceding siblings ...)
2023-03-13 15:30 ` [PATCH 4/6] hw/i386/amd_iommu: Move capab_offset from AMDVIState to AMDVIPCIState Philippe Mathieu-Daudé
@ 2023-03-13 15:30 ` Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 6/6] hw/i386/amd_iommu: Factor amdvi_pci_realize out of amdvi_sysbus_realize Philippe Mathieu-Daudé
2023-03-13 15:32 ` [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
6 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-13 15:30 UTC (permalink / raw)
To: Wei Huang, qemu-devel
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost, Philippe Mathieu-Daudé
Set PCI static/const fields once in amdvi_pci_class_init.
They will be propagated via DeviceClassRealize handler via
pci_qdev_realize() -> do_pci_register_device() -> pci_config_set*().
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/i386/amd_iommu.c | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
index 9f6622e11f..8e4ce63f8e 100644
--- a/hw/i386/amd_iommu.c
+++ b/hw/i386/amd_iommu.c
@@ -1511,9 +1511,7 @@ static void amdvi_init(AMDVIState *s)
amdvi_set_quad(s, AMDVI_MMIO_STATUS, 0, 0x98, 0x67);
/* reset device ident */
- pci_config_set_vendor_id(s->pci.dev.config, PCI_VENDOR_ID_AMD);
pci_config_set_prog_interface(s->pci.dev.config, 00);
- pci_config_set_class(s->pci.dev.config, 0x0806);
/* reset AMDVI specific capabilities, all r/o */
pci_set_long(s->pci.dev.config + s->pci.capab_offset, AMDVI_CAPAB_FEATURES);
@@ -1623,6 +1621,10 @@ static const TypeInfo amdvi_sysbus = {
static void amdvi_pci_class_init(ObjectClass *klass, void *data)
{
DeviceClass *dc = DEVICE_CLASS(klass);
+ PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
+
+ k->vendor_id = PCI_VENDOR_ID_AMD;
+ k->class_id = 0x0806;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
dc->desc = "AMD IOMMU (AMD-Vi) DMA Remapping device";
--
2.38.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 6/6] hw/i386/amd_iommu: Factor amdvi_pci_realize out of amdvi_sysbus_realize
2023-03-13 15:30 [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
` (4 preceding siblings ...)
2023-03-13 15:30 ` [PATCH 5/6] hw/i386/amd_iommu: Set PCI static/const fields via PCIDeviceClass Philippe Mathieu-Daudé
@ 2023-03-13 15:30 ` Philippe Mathieu-Daudé
2023-03-13 15:32 ` [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
6 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-13 15:30 UTC (permalink / raw)
To: Wei Huang, qemu-devel
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost, Philippe Mathieu-Daudé
Aside the Frankenstein model of a SysBusDevice realizing a PCIDevice,
QOM parents shouldn't access children internals. In this particular
case, amdvi_sysbus_realize() is just open-coding TYPE_AMD_IOMMU_PCI's
DeviceRealize() handler. Factor it out.
Declare QOM-cast macros with OBJECT_DECLARE_SIMPLE_TYPE() so we can
cast the AMDVIPCIState in amdvi_pci_realize().
Note this commit removes the single use in the repository of
pci_add_capability() and msi_init() on a *realized* QDev instance.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
hw/i386/amd_iommu.c | 62 ++++++++++++++++++++++++++-------------------
hw/i386/amd_iommu.h | 5 ++--
2 files changed, 39 insertions(+), 28 deletions(-)
diff --git a/hw/i386/amd_iommu.c b/hw/i386/amd_iommu.c
index 8e4ce63f8e..9c77304438 100644
--- a/hw/i386/amd_iommu.c
+++ b/hw/i386/amd_iommu.c
@@ -1509,20 +1509,48 @@ static void amdvi_init(AMDVIState *s)
amdvi_set_quad(s, AMDVI_MMIO_EXT_FEATURES, AMDVI_EXT_FEATURES,
0xffffffffffffffef, 0);
amdvi_set_quad(s, AMDVI_MMIO_STATUS, 0, 0x98, 0x67);
+}
+
+static void amdvi_pci_realize(PCIDevice *pdev, Error **errp)
+{
+ AMDVIPCIState *s = AMD_IOMMU_PCI(pdev);
+ int ret;
+
+ ret = pci_add_capability(pdev, AMDVI_CAPAB_ID_SEC, 0,
+ AMDVI_CAPAB_SIZE, errp);
+ if (ret < 0) {
+ return;
+ }
+ s->capab_offset = ret;
+
+ ret = pci_add_capability(pdev, PCI_CAP_ID_MSI, 0,
+ AMDVI_CAPAB_REG_SIZE, errp);
+ if (ret < 0) {
+ return;
+ }
+ ret = pci_add_capability(pdev, PCI_CAP_ID_HT, 0,
+ AMDVI_CAPAB_REG_SIZE, errp);
+ if (ret < 0) {
+ return;
+ }
+
+ if (msi_init(pdev, 0, 1, true, false, errp) < 0) {
+ return;
+ }
/* reset device ident */
- pci_config_set_prog_interface(s->pci.dev.config, 00);
+ pci_config_set_prog_interface(pdev->config, 0);
/* reset AMDVI specific capabilities, all r/o */
- pci_set_long(s->pci.dev.config + s->pci.capab_offset, AMDVI_CAPAB_FEATURES);
- pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_BAR_LOW,
+ 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));
- pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_BAR_HIGH,
+ pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_BAR_HIGH,
(AMDVI_BASE_ADDR & ~(0xffff)) >> 16);
- pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_RANGE,
+ pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_RANGE,
0xff000000);
- pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_MISC, 0);
- pci_set_long(s->pci.dev.config + s->pci.capab_offset + AMDVI_CAPAB_MISC,
+ pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_MISC, 0);
+ pci_set_long(pdev->config + s->capab_offset + AMDVI_CAPAB_MISC,
AMDVI_MAX_PH_ADDR | AMDVI_MAX_GVA_ADDR | AMDVI_MAX_VA_ADDR);
}
@@ -1536,7 +1564,6 @@ static void amdvi_sysbus_reset(DeviceState *dev)
static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
{
- int ret = 0;
AMDVIState *s = AMD_IOMMU_DEVICE(dev);
MachineState *ms = MACHINE(qdev_get_machine());
PCMachineState *pcms = PC_MACHINE(ms);
@@ -1550,23 +1577,6 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
if (!qdev_realize(DEVICE(&s->pci), &bus->qbus, errp)) {
return;
}
- ret = pci_add_capability(&s->pci.dev, AMDVI_CAPAB_ID_SEC, 0,
- AMDVI_CAPAB_SIZE, errp);
- if (ret < 0) {
- return;
- }
- s->pci.capab_offset = ret;
-
- ret = pci_add_capability(&s->pci.dev, PCI_CAP_ID_MSI, 0,
- AMDVI_CAPAB_REG_SIZE, errp);
- if (ret < 0) {
- return;
- }
- ret = pci_add_capability(&s->pci.dev, PCI_CAP_ID_HT, 0,
- AMDVI_CAPAB_REG_SIZE, errp);
- if (ret < 0) {
- return;
- }
/* Pseudo address space under root PCI bus. */
x86ms->ioapic_as = amdvi_host_dma_iommu(bus, s, AMDVI_IOAPIC_SB_DEVID);
@@ -1578,7 +1588,6 @@ static void amdvi_sysbus_realize(DeviceState *dev, Error **errp)
sysbus_init_mmio(SYS_BUS_DEVICE(s), &s->mmio);
sysbus_mmio_map(SYS_BUS_DEVICE(s), 0, AMDVI_BASE_ADDR);
pci_setup_iommu(bus, amdvi_host_dma_iommu, s);
- msi_init(&s->pci.dev, 0, 1, true, false, errp);
amdvi_init(s);
}
@@ -1625,6 +1634,7 @@ static void amdvi_pci_class_init(ObjectClass *klass, void *data)
k->vendor_id = PCI_VENDOR_ID_AMD;
k->class_id = 0x0806;
+ k->realize = amdvi_pci_realize;
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
dc->desc = "AMD IOMMU (AMD-Vi) DMA Remapping device";
diff --git a/hw/i386/amd_iommu.h b/hw/i386/amd_iommu.h
index 1c0cb54bd4..6da893ee57 100644
--- a/hw/i386/amd_iommu.h
+++ b/hw/i386/amd_iommu.h
@@ -300,16 +300,17 @@ struct irte_ga {
OBJECT_DECLARE_SIMPLE_TYPE(AMDVIState, AMD_IOMMU_DEVICE)
#define TYPE_AMD_IOMMU_PCI "AMDVI-PCI"
+OBJECT_DECLARE_SIMPLE_TYPE(AMDVIPCIState, AMD_IOMMU_PCI)
#define TYPE_AMD_IOMMU_MEMORY_REGION "amd-iommu-iommu-memory-region"
typedef struct AMDVIAddressSpace AMDVIAddressSpace;
/* functions to steal PCI config space */
-typedef struct AMDVIPCIState {
+struct AMDVIPCIState {
PCIDevice dev; /* The PCI device itself */
uint32_t capab_offset; /* capability offset pointer */
-} AMDVIPCIState;
+};
struct AMDVIState {
X86IOMMUState iommu; /* IOMMU bus device */
--
2.38.1
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups
2023-03-13 15:30 [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
` (5 preceding siblings ...)
2023-03-13 15:30 ` [PATCH 6/6] hw/i386/amd_iommu: Factor amdvi_pci_realize out of amdvi_sysbus_realize Philippe Mathieu-Daudé
@ 2023-03-13 15:32 ` Philippe Mathieu-Daudé
2025-02-18 16:52 ` Philippe Mathieu-Daudé
6 siblings, 1 reply; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-03-13 15:32 UTC (permalink / raw)
To: Wei Huang, qemu-devel, Jason Wang
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost
I forgot to Cc Jason!
On 13/3/23 16:30, Philippe Mathieu-Daudé wrote:
> Following [*]:
>
> "Last time I tried AMD vIOMMU it didn't even boot."
>
> mark amd_iommu as orphan in preparation of deprecating it
> (or should we do that directly?).
>
> Extract the PCI realize() code from sysbus one in order to
> remove the single case of calling pci_add_capability() and
> msi_init() on a *realized* QDev instance (in order to
> strengthen the PCI/MSI APIs in a follow up series).
>
> [*] https://lore.kernel.org/qemu-devel/CACGkMEtjmpX8G9HYZ0r3n5ErhAENKhQ81f4ocfCYrh=XoF=5hw@mail.gmail.com/
>
> Philippe Mathieu-Daudé (6):
> MAINTAINERS: Mark AMD-Vi emulation as orphan
> hw/i386/amd_iommu: Explicit use of AMDVI_BASE_ADDR in amdvi_init
> hw/i386/amd_iommu: Remove intermediate AMDVIState::devid field
> hw/i386/amd_iommu: Move capab_offset from AMDVIState to AMDVIPCIState
> hw/i386/amd_iommu: Set PCI static/const fields via PCIDeviceClass
> hw/i386/amd_iommu: Factor amdvi_pci_realize out of
> amdvi_sysbus_realize
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups
2023-03-13 15:32 ` [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups Philippe Mathieu-Daudé
@ 2025-02-18 16:52 ` Philippe Mathieu-Daudé
0 siblings, 0 replies; 9+ messages in thread
From: Philippe Mathieu-Daudé @ 2025-02-18 16:52 UTC (permalink / raw)
To: Wei Huang, qemu-devel, Jason Wang
Cc: Thomas Huth, Richard Henderson, Ani Sinha, Peter Xu,
Igor Mammedov, Michael S. Tsirkin, Paolo Bonzini,
Marcel Apfelbaum, Eduardo Habkost
Hi,
> On 13/3/23 16:30, Philippe Mathieu-Daudé wrote:
>> Following [*]:
>>
>> "Last time I tried AMD vIOMMU it didn't even boot."
>>
>> mark amd_iommu as orphan in preparation of deprecating it
>> (or should we do that directly?).
Almost 2 years passed, should I respin?
>> [*] https://lore.kernel.org/qemu-devel/
>> CACGkMEtjmpX8G9HYZ0r3n5ErhAENKhQ81f4ocfCYrh=XoF=5hw@mail.gmail.com/
>>
>> Philippe Mathieu-Daudé (6):
>> MAINTAINERS: Mark AMD-Vi emulation as orphan
>> hw/i386/amd_iommu: Explicit use of AMDVI_BASE_ADDR in amdvi_init
>> hw/i386/amd_iommu: Remove intermediate AMDVIState::devid field
>> hw/i386/amd_iommu: Move capab_offset from AMDVIState to AMDVIPCIState
>> hw/i386/amd_iommu: Set PCI static/const fields via PCIDeviceClass
>> hw/i386/amd_iommu: Factor amdvi_pci_realize out of
>> amdvi_sysbus_realize
^ permalink raw reply [flat|nested] 9+ messages in thread