* [PATCH 0/6] hw/i386/amd_iommu: Orphanize & QDev cleanups
@ 2023-03-13 15:30 Philippe Mathieu-Daudé
2023-03-13 15:30 ` [PATCH 1/6] MAINTAINERS: Mark AMD-Vi emulation as orphan Philippe Mathieu-Daudé
` (6 more replies)
0 siblings, 7 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é
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
MAINTAINERS | 4 +++
hw/i386/acpi-build.c | 6 ++--
hw/i386/amd_iommu.c | 74 +++++++++++++++++++++++++-------------------
hw/i386/amd_iommu.h | 9 +++---
4 files changed, 54 insertions(+), 39 deletions(-)
--
2.38.1
^ permalink raw reply [flat|nested] 9+ messages in thread
* [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
end of thread, other threads:[~2025-02-18 16:52 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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 ` [PATCH 3/6] hw/i386/amd_iommu: Remove intermediate AMDVIState::devid field 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é
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 ` [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é
2025-02-18 16:52 ` Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).