96 lines
3.1 KiB
Diff
96 lines
3.1 KiB
Diff
|
|
From afca50145f52601d912a805b65bd4530e9278388 Mon Sep 17 00:00:00 2001
|
||
|
|
From: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||
|
|
Date: Wed, 6 Nov 2024 15:53:45 +0000
|
||
|
|
Subject: [PATCH] hw/arm/smmuv3: Associate a pci bus with a SMMUv3 Nested
|
||
|
|
device
|
||
|
|
|
||
|
|
Subsequent patches will add IORT modifications to get this working.
|
||
|
|
|
||
|
|
Signed-off-by: Shameer Kolothum <shameerali.kolothum.thodi@huawei.com>
|
||
|
|
---
|
||
|
|
hw/arm/smmuv3.c | 27 +++++++++++++++++++++++++++
|
||
|
|
include/hw/arm/smmuv3.h | 2 ++
|
||
|
|
2 files changed, 29 insertions(+)
|
||
|
|
|
||
|
|
diff --git a/hw/arm/smmuv3.c b/hw/arm/smmuv3.c
|
||
|
|
index 3010471cdc..66e4e1b57d 100644
|
||
|
|
--- a/hw/arm/smmuv3.c
|
||
|
|
+++ b/hw/arm/smmuv3.c
|
||
|
|
@@ -24,6 +24,7 @@
|
||
|
|
#include "hw/qdev-properties.h"
|
||
|
|
#include "hw/qdev-core.h"
|
||
|
|
#include "hw/pci/pci.h"
|
||
|
|
+#include "hw/pci/pci_bridge.h"
|
||
|
|
#include "cpu.h"
|
||
|
|
#include "trace.h"
|
||
|
|
#include "qemu/log.h"
|
||
|
|
@@ -2069,12 +2070,32 @@ static void smmu_realize(DeviceState *d, Error **errp)
|
||
|
|
smmu_init_irq(s, dev);
|
||
|
|
}
|
||
|
|
|
||
|
|
+static int smmuv3_nested_pci_host_bridge(Object *obj, void *opaque)
|
||
|
|
+{
|
||
|
|
+ DeviceState *d = opaque;
|
||
|
|
+ SMMUv3NestedState *s_nested = ARM_SMMUV3_NESTED(d);
|
||
|
|
+
|
||
|
|
+ if (object_dynamic_cast(obj, TYPE_PCI_HOST_BRIDGE)) {
|
||
|
|
+ PCIBus *bus = PCI_HOST_BRIDGE(obj)->bus;
|
||
|
|
+ if (s_nested->pci_bus && !strcmp(bus->qbus.name, s_nested->pci_bus)) {
|
||
|
|
+ object_property_set_link(OBJECT(d), "primary-bus", OBJECT(bus),
|
||
|
|
+ &error_abort);
|
||
|
|
+ }
|
||
|
|
+ }
|
||
|
|
+ return 0;
|
||
|
|
+}
|
||
|
|
+
|
||
|
|
static void smmu_nested_realize(DeviceState *d, Error **errp)
|
||
|
|
{
|
||
|
|
SMMUv3NestedState *s_nested = ARM_SMMUV3_NESTED(d);
|
||
|
|
SMMUv3NestedClass *c = ARM_SMMUV3_NESTED_GET_CLASS(s_nested);
|
||
|
|
+ SysBusDevice *dev = SYS_BUS_DEVICE(d);
|
||
|
|
Error *local_err = NULL;
|
||
|
|
|
||
|
|
+ object_child_foreach_recursive(object_get_root(),
|
||
|
|
+ smmuv3_nested_pci_host_bridge, d);
|
||
|
|
+ object_property_set_bool(OBJECT(dev), "nested", true, &error_abort);
|
||
|
|
+
|
||
|
|
c->parent_realize(d, &local_err);
|
||
|
|
if (local_err) {
|
||
|
|
error_propagate(errp, local_err);
|
||
|
|
@@ -2161,6 +2182,11 @@ static Property smmuv3_properties[] = {
|
||
|
|
DEFINE_PROP_END_OF_LIST()
|
||
|
|
};
|
||
|
|
|
||
|
|
+static Property smmuv3_nested_properties[] = {
|
||
|
|
+ DEFINE_PROP_STRING("pci-bus", SMMUv3NestedState, pci_bus),
|
||
|
|
+ DEFINE_PROP_END_OF_LIST()
|
||
|
|
+};
|
||
|
|
+
|
||
|
|
static void smmuv3_instance_init(Object *obj)
|
||
|
|
{
|
||
|
|
/* Nothing much to do here as of now */
|
||
|
|
@@ -2188,6 +2214,7 @@ static void smmuv3_nested_class_init(ObjectClass *klass, void *data)
|
||
|
|
dc->vmsd = &vmstate_smmuv3;
|
||
|
|
device_class_set_parent_realize(dc, smmu_nested_realize,
|
||
|
|
&c->parent_realize);
|
||
|
|
+ device_class_set_props(dc, smmuv3_nested_properties);
|
||
|
|
dc->user_creatable = true;
|
||
|
|
dc->hotpluggable = false;
|
||
|
|
}
|
||
|
|
diff --git a/include/hw/arm/smmuv3.h b/include/hw/arm/smmuv3.h
|
||
|
|
index 87e628be7a..96513fce56 100644
|
||
|
|
--- a/include/hw/arm/smmuv3.h
|
||
|
|
+++ b/include/hw/arm/smmuv3.h
|
||
|
|
@@ -89,6 +89,8 @@ OBJECT_DECLARE_TYPE(SMMUv3NestedState, SMMUv3NestedClass, ARM_SMMUV3_NESTED)
|
||
|
|
|
||
|
|
struct SMMUv3NestedState {
|
||
|
|
SMMUv3State smmuv3_state;
|
||
|
|
+
|
||
|
|
+ char *pci_bus;
|
||
|
|
};
|
||
|
|
|
||
|
|
struct SMMUv3NestedClass {
|
||
|
|
--
|
||
|
|
2.41.0.windows.1
|
||
|
|
|