@@ -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
@@ -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;
@@ -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)
@@ -3,5 +3,5 @@
#ifndef __DEVSEC_H__
#define __DEVSEC_H__
-extern struct pci_sysdata *devsec_sysdata;
+extern void *devsec_sysdata;
#endif /* __DEVSEC_H__ */
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(-)