Hi Manish,
On 02/01/18 09:27, manish.ja...@linaro.org wrote:
From: Manish Jaggi <manish.ja...@linaro.org>
Public API to populate and query map between requester id and
The commit message should not be indented.
streamId/DeviceID. IORT is parsed one time (outside this patch)
and two lists are created one for mapping between reuesterId and streamid
s/reuesterId/requesterID/
Please stay consistent in the naming (including the lowercase/uppercase).
Cheers,
and another between requesterID and deviceID.
These lists eliminate the need to reparse IORT for querying streamid
or deviceid using requesterid.
Signed-off-by: Manish Jaggi <manish.ja...@linaro.org>
---
xen/drivers/acpi/Makefile | 1 +
xen/drivers/acpi/arm/Makefile | 1 +
xen/drivers/acpi/arm/ridmap.c | 124 ++++++++++++++++++++++++++++++++++++++++++
xen/include/acpi/ridmap.h | 77 ++++++++++++++++++++++++++
4 files changed, 203 insertions(+)
diff --git a/xen/drivers/acpi/Makefile b/xen/drivers/acpi/Makefile
index 444b11d583..80a074e007 100644
--- a/xen/drivers/acpi/Makefile
+++ b/xen/drivers/acpi/Makefile
@@ -1,6 +1,7 @@
subdir-y += tables
subdir-y += utilities
subdir-$(CONFIG_X86) += apei
+subdir-$(CONFIG_ARM) += arm
obj-bin-y += tables.init.o
obj-$(CONFIG_NUMA) += numa.o
diff --git a/xen/drivers/acpi/arm/Makefile b/xen/drivers/acpi/arm/Makefile
new file mode 100644
index 0000000000..046fad5e3d
--- /dev/null
+++ b/xen/drivers/acpi/arm/Makefile
@@ -0,0 +1 @@
+obj-y = ridmap.o
diff --git a/xen/drivers/acpi/arm/ridmap.c b/xen/drivers/acpi/arm/ridmap.c
new file mode 100644
index 0000000000..2c3a8876ea
--- /dev/null
+++ b/xen/drivers/acpi/arm/ridmap.c
@@ -0,0 +1,124 @@
+/*
+ * xen/drivers/acpi/arm/ridmap.c
+ *
+ * Public API to populate and query map between requester id and
+ * streamId/DeviceID
+ *
+ * Manish Jaggi <manish.ja...@linaro.org>
+ * Copyright (c) 2018 Linaro.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#include <acpi/ridmap.h>
+#include <xen/iommu.h>
+#include <xen/kernel.h>
+#include <xen/list.h>
+#include <xen/pci.h>
+
+struct list_head rid_streamid_map_list;
+struct list_head rid_deviceid_map_list;
+
+void init_ridmaps(void)
+{
+ INIT_LIST_HEAD(&rid_deviceid_map_list);
+ INIT_LIST_HEAD(&rid_streamid_map_list);
+}
+
+int add_rid_streamid_map(struct acpi_iort_node *pcirc_node,
+ struct acpi_iort_node *smmu_node,
+ u32 input_base, u32 output_base, u32 id_count)
+{
+ struct rid_streamid_map *rid_map;
+ rid_map = xzalloc(struct rid_streamid_map);
+
+ if (!rid_map)
+ return -ENOMEM;
+
+ rid_map->idmap.input_base = input_base;
+ rid_map->idmap.output_base = output_base;
+ rid_map->idmap.id_count = id_count;
+ rid_map->pcirc_node = pcirc_node;
+ rid_map->smmu_node = smmu_node;
+
+ list_add_tail(&rid_map->entry, &rid_streamid_map_list);
+ return 0;
+}
+
+int add_rid_deviceid_map(struct acpi_iort_node *pcirc_node,
+ struct acpi_iort_node *its_node,
+ u32 input_base, u32 output_base, u32 id_count)
+{
+ struct rid_deviceid_map *rid_map;
+ rid_map = xzalloc(struct rid_deviceid_map);
+
+ if (!rid_map)
+ return -ENOMEM;
+
+ rid_map->idmap.input_base = input_base;
+ rid_map->idmap.output_base = output_base;
+ rid_map->idmap.id_count = id_count;
+ rid_map->pcirc_node = pcirc_node;
+ rid_map->its_node = its_node;
+
+ list_add_tail(&rid_map->entry, &rid_deviceid_map_list);
+ return 0;
+}
+
+void query_streamid(struct acpi_iort_node *pcirc_node, u16 rid, u32 *streamid,
+ struct acpi_iort_node **smmu_node)
+{
+ struct rid_streamid_map *rmap;
+
+ list_for_each_entry(rmap, &rid_streamid_map_list, entry)
+ {
+ if (rmap->pcirc_node == pcirc_node)
+ {
+ if ( (rid >= rmap->idmap.input_base) &&
+ (rid < rmap->idmap.input_base + rmap->idmap.id_count) )
+ {
+ *streamid = rid - rmap->idmap.input_base +
+ rmap->idmap.output_base;
+ *smmu_node = rmap->smmu_node;
+ break;
+ }
+ }
+ }
+
+}
+
+void query_deviceid(struct acpi_iort_node *pcirc_node, u16 rid, u32 *deviceid)
+{
+ struct rid_deviceid_map *rmap;
+
+ list_for_each_entry(rmap, &rid_deviceid_map_list, entry)
+ {
+ if (rmap->pcirc_node == pcirc_node)
+ {
+ if ( (rid >= rmap->idmap.input_base) &&
+ (rid < rmap->idmap.input_base + rmap->idmap.id_count) )
+ {
+ *deviceid = rid - rmap->idmap.input_base +
+ rmap->idmap.output_base;
+ break;
+ }
+ }
+ }
+}
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
diff --git a/xen/include/acpi/ridmap.h b/xen/include/acpi/ridmap.h
new file mode 100644
index 0000000000..806f401d89
--- /dev/null
+++ b/xen/include/acpi/ridmap.h
@@ -0,0 +1,77 @@
+/*
+ * xen/include/acpi/ridmap.h
+ *
+ * Mapping structures to hold map between requester id and streamId/DeviceID
+ * after paring the IORT table.
+ *
+ * Manish Jaggi <manish.ja...@linaro.org>
+ * Copyright (c) 2018 Linaro.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ */
+
+#ifndef RID_MAP_H
+#define RID_MAP_H
+
+#include <xen/acpi.h>
+
+struct id_map_struct
+{
+ u16 input_base;
+ u32 output_base;
+ u16 id_count;
+};
+
+struct rid_streamid_map
+{
+ struct acpi_iort_node *pcirc_node;
+ struct id_map_struct idmap;
+ struct list_head entry;
+ struct acpi_iort_node *smmu_node;
+};
+
+struct rid_deviceid_map
+{
+ struct acpi_iort_node *pcirc_node;
+ struct acpi_iort_node *its_node;
+ struct id_map_struct idmap;
+ struct list_head entry;
+};
+
+extern struct list_head rid_streamid_map_list;
+extern struct list_head rid_deviceid_map_list;
+
+int add_rid_streamid_map(struct acpi_iort_node *pcirc_node,
+ struct acpi_iort_node *smmu_node,
+ u32 input_base, u32 output_base, u32 id_count);
+
+int add_rid_deviceid_map(struct acpi_iort_node *pcirc_node,
+ struct acpi_iort_node *its_node,
+ u32 input_base, u32 output_base, u32 id_count);
+
+void query_streamid(struct acpi_iort_node *pcirc_node, u16 rid, u32 *streamid,
+ struct acpi_iort_node **smmu_node);
+
+void query_deviceid(struct acpi_iort_node *pcirc_node,
+ u16 rid, u32 *deviceid);
+
+void init_ridmaps(void);
+
+#endif
+
+/*
+ * Local variables:
+ * mode: C
+ * c-file-style: "BSD"
+ * c-basic-offset: 4
+ * indent-tabs-mode: nil
+ * End:
+ */
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xenproject.org
https://lists.xenproject.org/mailman/listinfo/xen-devel