[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [RFC 01/11] acpi: arm: Public API for populating and query based on requesterid
Hi Manish, On 02/01/18 09:27, manish.jaggi@xxxxxxxxxx wrote: From: Manish Jaggi <manish.jaggi@xxxxxxxxxx> 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.jaggi@xxxxxxxxxx> --- 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) += armobj-bin-y += tables.init.oobj-$(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.jaggi@xxxxxxxxxx> + * 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.jaggi@xxxxxxxxxx> + * 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@xxxxxxxxxxxxxxxxxxxx https://lists.xenproject.org/mailman/listinfo/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |