diff mbox series

[RESEND,RFC,3/3] samples: devsec: Add support for PCI_DOMAINS_GENERIC

Message ID 20250311144601.145736-3-suzuki.poulose@arm.com (mailing list archive)
State RFC
Delegated to: Bjorn Helgaas
Headers show
Series [RESEND,RFC,1/3] pci: ide: Fix build failure | expand

Commit Message

Suzuki K Poulose March 11, 2025, 2:46 p.m. UTC
Allocate/free a domain at runtime for the sample devsec TSM.

Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
---
 samples/Kconfig         |  1 -
 samples/devsec/bus.c    | 32 +++++++++++++++++++++-----------
 samples/devsec/common.c |  2 +-
 samples/devsec/devsec.h |  2 +-
 4 files changed, 23 insertions(+), 14 deletions(-)
diff mbox series

Patch

diff --git a/samples/Kconfig b/samples/Kconfig
index 6bd64fc54ac1..f23be5088b9e 100644
--- a/samples/Kconfig
+++ b/samples/Kconfig
@@ -308,7 +308,6 @@  config SAMPLE_DEVSEC
 	tristate "Build a sample TEE Security Manager with an emulated PCI endpoint"
 	depends on PCI
 	depends on VIRT_DRIVERS
-	depends on X86 # TODO: PCI_DOMAINS_GENERIC support
 	select PCI_BRIDGE_EMUL
 	select PCI_TSM
 	select TSM
diff --git a/samples/devsec/bus.c b/samples/devsec/bus.c
index b78c04b21eb9..8ec04b3549f0 100644
--- a/samples/devsec/bus.c
+++ b/samples/devsec/bus.c
@@ -21,7 +21,7 @@ 
 #define NR_DEVSEC_DEVS 1
 
 struct devsec {
-	struct pci_sysdata sysdata;
+	int domain;
 	struct gen_pool *iomem_pool;
 	struct resource resource[2];
 	struct pci_bus *bus;
@@ -70,7 +70,7 @@  struct devsec {
 
 static struct devsec *bus_to_devsec(struct pci_bus *bus)
 {
-	return container_of(bus->sysdata, struct devsec, sysdata);
+	return container_of(bus->sysdata, struct devsec, domain);
 }
 
 static int devsec_dev_config_read(struct devsec *devsec, struct pci_bus *bus,
@@ -309,6 +309,17 @@  static struct pci_ops devsec_ops = {
 };
 
 /* borrowed from vmd_find_free_domain() */
+#ifdef CONFIG_PCI_GENERIC_DOMAINS
+static int find_free_domain(void)
+{
+	return pci_alloc_dynamic_domain();
+}
+
+static int release_domain(int domain)
+{
+	pci_free_dynamic_domain(domain);
+}
+#else
 static int find_free_domain(void)
 {
 	int domain = 0xffff;
@@ -318,13 +329,15 @@  static int find_free_domain(void)
 		domain = max_t(int, domain, pci_domain_nr(bus));
 	return domain + 1;
 }
-
+static void release_domain(int domain) {}
+#endif
 static void destroy_bus(void *data)
 {
 	struct devsec *devsec = data;
 
 	pci_stop_root_bus(devsec->bus);
 	pci_remove_root_bus(devsec->bus);
+	release_domain(devsec->domain);
 }
 
 static u32 build_ext_cap_header(u32 id, u32 ver, u32 next)
@@ -588,7 +601,6 @@  static int __init devsec_bus_probe(struct platform_device *pdev)
 	int rc;
 	LIST_HEAD(resources);
 	struct devsec *devsec;
-	struct pci_sysdata *sd;
 	u64 mmio_size = SZ_64G;
 	struct pci_host_bridge *hb;
 	struct device *dev = &pdev->dev;
@@ -633,15 +645,13 @@  static int __init devsec_bus_probe(struct platform_device *pdev)
 	};
 	pci_add_resource(&resources, &devsec->resource[1]);
 
-	sd = &devsec->sysdata;
-	devsec_sysdata = sd;
-	sd->domain = find_free_domain();
-	if (sd->domain < 0)
-		return sd->domain;
-
+	devsec_sysdata = &devsec->domain;
+	devsec->domain = find_free_domain();
+	if (devsec->domain < 0)
+		return devsec->domain;
 
 	devsec->bus = pci_create_root_bus(dev, 0, &devsec_ops,
-					  &devsec->sysdata, &resources);
+					  &devsec->domain, &resources);
 	if (!devsec->bus) {
 		pci_free_resource_list(&resources);
 		return -ENOMEM;
diff --git a/samples/devsec/common.c b/samples/devsec/common.c
index 9b6f4022f241..4da85b53b6a9 100644
--- a/samples/devsec/common.c
+++ b/samples/devsec/common.c
@@ -8,7 +8,7 @@ 
  * devsec_bus and devsec_tsm need a common location for this data to
  * avoid depending on each other. Enables load order testing
  */
-struct pci_sysdata *devsec_sysdata;
+void *devsec_sysdata;
 EXPORT_SYMBOL_GPL(devsec_sysdata);
 
 static int __init common_init(void)
diff --git a/samples/devsec/devsec.h b/samples/devsec/devsec.h
index 794a9898ee2d..496020c9cb6d 100644
--- a/samples/devsec/devsec.h
+++ b/samples/devsec/devsec.h
@@ -3,5 +3,5 @@ 
 
 #ifndef __DEVSEC_H__
 #define __DEVSEC_H__
-extern struct pci_sysdata *devsec_sysdata;
+extern void *devsec_sysdata;
 #endif /* __DEVSEC_H__ */