CCing Jan
On Thu, 8 Jun 2017, Sameer Goel wrote:
> Add limited support for parsing IORT table to initialize SMMU devices.
>
> Signed-off-by: Sameer Goel <sg...@codeaurora.org>
> ---
> xen/arch/arm/setup.c | 3 +
> xen/drivers/acpi/Makefile | 1 +
> xen/drivers/acpi/arm/Makefile | 1 +
> xen/drivers/acpi/arm/iort.c | 232
> +++++++++++++++++++-----------------
> xen/drivers/passthrough/arm/iommu.c | 15 +--
> xen/include/acpi/acpi.h | 1 +
> xen/include/acpi/acpi_iort.h | 25 ++--
> xen/include/asm-arm/device.h | 2 +
> xen/include/xen/acpi.h | 21 ++++
> xen/include/xen/lib.h | 7 +-
> xen/include/xen/pci.h | 1 +
> 11 files changed, 184 insertions(+), 125 deletions(-)
> create mode 100644 xen/drivers/acpi/arm/Makefile
This patch doesn't apply with "git am" and doesn't build on x86 with:
In file included from /local/repos/xen-upstream/xen/include/xen/iommu.h:24:0,
from /local/repos/xen-upstream/xen/include/asm/hvm/domain.h:23,
from /local/repos/xen-upstream/xen/include/asm/domain.h:7,
from /local/repos/xen-upstream/xen/include/xen/domain.h:8,
from /local/repos/xen-upstream/xen/include/xen/sched.h:11,
from x86_64/asm-offsets.c:9:
/local/repos/xen-upstream/xen/include/xen/pci.h:91:19: error: field ‘dev’ has
incomplete type
struct device dev;
^
In file included from /local/repos/xen-upstream/xen/include/acpi/acpi.h:63:0,
from /local/repos/xen-upstream/xen/include/xen/acpi.h:33,
from /local/repos/xen-upstream/xen/include/asm/fixmap.h:21,
from x86_64/asm-offsets.c:12:
/local/repos/xen-upstream/xen/include/acpi/acpi_iort.h:60:23: error: expected
‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘iort_iommu_configure’
acpi_status iommu_ops iort_iommu_configure(struct device *dev)
^
make[3]: *** [asm-offsets.s] Error 1
And it doesn't build on arm64 with:
/local/repos/xen-upstream/xen/arch/arm/setup.c:765: undefined reference to
`acpi_iort_init'
/local/repos/gcc-linaro-4.9-2014.05-aarch64-linux-gnu-x86_64-linux-gnu/bin/aarch64-linux-gnu-ld:
/local/repos/xen-upstream/xen/.xen-syms.0: hidden symbol `acpi_iort_init'
isn't defined
/local/repos/gcc-linaro-4.9-2014.05-aarch64-linux-gnu-x86_64-linux-gnu/bin/aarch64-linux-gnu-ld:
final link failed: Bad value
make[3]: *** [/local/repos/xen-upstream/xen/xen-syms] Error 1
> diff --git a/xen/arch/arm/setup.c b/xen/arch/arm/setup.c
> index 92a2de6..5dc93ff 100644
> --- a/xen/arch/arm/setup.c
> +++ b/xen/arch/arm/setup.c
> @@ -753,6 +753,9 @@ void __init start_xen(unsigned long boot_phys_offset,
> /* Parse the ACPI tables for possible boot-time configuration */
> acpi_boot_table_init();
>
> + /* Initialize the IORT tables */
> + acpi_iort_init();
> +
> if ( acpi_disabled )
> printk("Booting using Device Tree\n");
> else
> diff --git a/xen/drivers/acpi/Makefile b/xen/drivers/acpi/Makefile
> index 444b11d..4165318 100644
> --- a/xen/drivers/acpi/Makefile
> +++ b/xen/drivers/acpi/Makefile
> @@ -1,5 +1,6 @@
> subdir-y += tables
> subdir-y += utilities
> +subdir-$(CONFIG_ARM_64) += arm
> subdir-$(CONFIG_X86) += apei
>
> obj-bin-y += tables.init.o
> diff --git a/xen/drivers/acpi/arm/Makefile b/xen/drivers/acpi/arm/Makefile
> new file mode 100644
> index 0000000..7c039bb
> --- /dev/null
> +++ b/xen/drivers/acpi/arm/Makefile
> @@ -0,0 +1 @@
> +obj-y += iort.o
> diff --git a/xen/drivers/acpi/arm/iort.c b/xen/drivers/acpi/arm/iort.c
> index 4a5bb96..c22ec31 100644
> --- a/xen/drivers/acpi/arm/iort.c
> +++ b/xen/drivers/acpi/arm/iort.c
> @@ -14,29 +14,40 @@
> * This file implements early detection/parsing of I/O mapping
> * reported to OS through firmware via I/O Remapping Table (IORT)
> * IORT document number: ARM DEN 0049A
> + *
> + * Based on Linux drivers/acpi/arm64/iort.c
> + * => commit ca78d3173cff3503bcd15723b049757f75762d15
> + *
> + * Xen modification:
> + * Sameer Goel <sg...@codeaurora.org>
> + * Copyright (C) 2017, The Linux Foundation, All rights reserved.
> + *
> */
>
> -#define pr_fmt(fmt) "ACPI: IORT: " fmt
> +#include <xen/acpi.h>
> +#include <xen/fwnode.h>
> +#include <xen/iommu.h>
> +#include <xen/lib.h>
> +#include <xen/list.h>
> +#include <xen/pci.h>
> +
> +#include <asm/device.h>
>
> -#include <linux/acpi_iort.h>
> -#include <linux/iommu.h>
> -#include <linux/kernel.h>
> -#include <linux/list.h>
> -#include <linux/pci.h>
> -#include <linux/platform_device.h>
> -#include <linux/slab.h>
>
> #define IORT_TYPE_MASK(type) (1 << (type))
> #define IORT_MSI_TYPE (1 << ACPI_IORT_NODE_ITS_GROUP)
> #define IORT_IOMMU_TYPE ((1 << ACPI_IORT_NODE_SMMU) | \
> (1 << ACPI_IORT_NODE_SMMU_V3))
>
> +#if 0
> struct iort_its_msi_chip {
> struct list_head list;
> struct fwnode_handle *fw_node;
> u32 translation_id;
> };
>
> +#endif
> +
> struct iort_fwnode {
> struct list_head list;
> struct acpi_iort_node *iort_node;
> @@ -60,7 +71,7 @@ static inline int iort_set_fwnode(struct acpi_iort_node
> *iort_node,
> {
> struct iort_fwnode *np;
>
> - np = kzalloc(sizeof(struct iort_fwnode), GFP_ATOMIC);
> + np = xzalloc(struct iort_fwnode);
>
> if (WARN_ON(!np))
> return -ENOMEM;
> @@ -114,7 +125,7 @@ static inline void iort_delete_fwnode(struct
> acpi_iort_node *node)
> list_for_each_entry_safe(curr, tmp, &iort_fwnode_list, list) {
> if (curr->iort_node == node) {
> list_del(&curr->list);
> - kfree(curr);
> + xfree(curr);
> break;
> }
> }
> @@ -127,6 +138,7 @@ typedef acpi_status (*iort_find_node_callback)
> /* Root pointer to the mapped IORT table */
> static struct acpi_table_header *iort_table;
>
> +#if 0
> static LIST_HEAD(iort_msi_chip_list);
> static DEFINE_SPINLOCK(iort_msi_chip_lock);
>
> @@ -199,7 +211,7 @@ struct fwnode_handle *iort_find_domain_token(int trans_id)
>
> return fw_node;
> }
> -
> +#endif
> static struct acpi_iort_node *iort_scan_node(enum acpi_iort_node_type type,
> iort_find_node_callback callback,
> void *context)
> @@ -219,9 +231,10 @@ static struct acpi_iort_node *iort_scan_node(enum
> acpi_iort_node_type type,
> iort_table->length);
>
> for (i = 0; i < iort->node_count; i++) {
> - if (WARN_TAINT(iort_node >= iort_end, TAINT_FIRMWARE_WORKAROUND,
> - "IORT node pointer overflows, bad table!\n"))
> + if (iort_node >= iort_end) {
> + printk(XENLOG_ERR "IORT node pointer overflows, bad
> table!\n");
> return NULL;
> + }
>
> if (iort_node->type == type &&
> ACPI_SUCCESS(callback(iort_node, context)))
> @@ -249,6 +262,14 @@ bool iort_node_match(u8 type)
> return node != NULL;
> }
>
> +/*
> + * Following 2 definies should come from the PCI passthrough implementation.
> + * Based on the current pci_dev define the bus number and seg number come
> + * from pci_dev so making an API assumption
> + */
> +#define to_pci_dev(p) container_of(p, struct pci_dev,dev)
> +#define pci_domain_nr(dev) dev->seg
> +
> static acpi_status iort_match_node_callback(struct acpi_iort_node *node,
> void *context)
> {
> @@ -256,6 +277,11 @@ static acpi_status iort_match_node_callback(struct
> acpi_iort_node *node,
> acpi_status status;
>
> if (node->type == ACPI_IORT_NODE_NAMED_COMPONENT) {
> + status = AE_NOT_IMPLEMENTED;
> +/*
> + * Named components not supported yet.
> + */
> +#if 0
> struct acpi_buffer buf = { ACPI_ALLOCATE_BUFFER, NULL };
> struct acpi_device *adev = to_acpi_device_node(dev->fwnode);
> struct acpi_iort_named_component *ncomp;
> @@ -275,11 +301,12 @@ static acpi_status iort_match_node_callback(struct
> acpi_iort_node *node,
> status = !strcmp(ncomp->device_name, buf.pointer) ?
> AE_OK : AE_NOT_FOUND;
> acpi_os_free(buf.pointer);
> +#endif
> } else if (node->type == ACPI_IORT_NODE_PCI_ROOT_COMPLEX) {
> struct acpi_iort_root_complex *pci_rc;
> - struct pci_bus *bus;
> + struct pci_dev *pci_dev;
>
> - bus = to_pci_bus(dev);
> + pci_dev = to_pci_dev(dev);
> pci_rc = (struct acpi_iort_root_complex *)node->node_data;
>
> /*
> @@ -287,12 +314,11 @@ static acpi_status iort_match_node_callback(struct
> acpi_iort_node *node,
> * with root complexes. Each segment number can represent only
> * one root complex.
> */
> - status = pci_rc->pci_segment_number == pci_domain_nr(bus) ?
> + status = pci_rc->pci_segment_number == pci_domain_nr(pci_dev) ?
> AE_OK : AE_NOT_FOUND;
> } else {
> status = AE_NOT_FOUND;
> }
> -out:
> return status;
> }
>
> @@ -307,7 +333,8 @@ static int iort_id_map(struct acpi_iort_id_mapping *map,
> u8 type, u32 rid_in,
> return 0;
> }
>
> - pr_warn(FW_BUG "[map %p] SINGLE MAPPING flag not allowed for
> node type %d, skipping ID map\n",
> + printk(XENLOG_WARNING "[map %p] SINGLE MAPPING flag not \
> + allowed for node type %d, skipping ID map\n",
> map, type);
> return -ENXIO;
> }
> @@ -320,6 +347,11 @@ static int iort_id_map(struct acpi_iort_id_mapping *map,
> u8 type, u32 rid_in,
> return 0;
> }
>
> +/*
> + * Name components are not supported yet so we do not need the
> + * iort_node_get_id function
> + */
> +#if 0
> static
> struct acpi_iort_node *iort_node_get_id(struct acpi_iort_node *node,
> u32 *id_out, u8 type_mask,
> @@ -337,8 +369,8 @@ struct acpi_iort_node *iort_node_get_id(struct
> acpi_iort_node *node,
>
> /* Firmware bug! */
> if (!map->output_reference) {
> - pr_err(FW_BUG "[node %p type %d] ID map has NULL parent
> reference\n",
> - node, node->type);
> + printk(XENLOG_ERR "[node %p type %d] ID map has NULL parent \
> + reference\n", node, node->type);
> return NULL;
> }
>
> @@ -358,6 +390,7 @@ struct acpi_iort_node *iort_node_get_id(struct
> acpi_iort_node *node,
>
> return NULL;
> }
> +#endif
>
> static struct acpi_iort_node *iort_node_map_rid(struct acpi_iort_node *node,
> u32 rid_in, u32 *rid_out,
> @@ -384,8 +417,8 @@ static struct acpi_iort_node *iort_node_map_rid(struct
> acpi_iort_node *node,
>
> /* Firmware bug! */
> if (!map->output_reference) {
> - pr_err(FW_BUG "[node %p type %d] ID map has NULL parent
> reference\n",
> - node, node->type);
> + printk(XENLOG_ERR "[node %p type %d] ID map has NULL \
> + parent reference\n", node, node->type);
> goto fail_map;
> }
>
> @@ -410,6 +443,10 @@ fail_map:
> return NULL;
> }
>
> +/* Xen: Comment out the NamedComponent and ITS mapping code till the support
> + * is available.
> + * */
> +#if 0
> static struct acpi_iort_node *iort_find_dev_node(struct device *dev)
> {
> struct pci_bus *pbus;
> @@ -503,6 +540,9 @@ struct irq_domain *iort_get_device_domain(struct device
> *dev, u32 req_id)
> return irq_find_matching_fwnode(handle, DOMAIN_BUS_PCI_MSI);
> }
>
> +/*
> + * RID is the same as PCI_DEVID(BDF) for QDF2400
> + */
> static int __get_pci_rid(struct pci_dev *pdev, u16 alias, void *data)
> {
> u32 *rid = data;
> @@ -510,7 +550,7 @@ static int __get_pci_rid(struct pci_dev *pdev, u16 alias,
> void *data)
> *rid = alias;
> return 0;
> }
> -
> +#endif
> static int arm_smmu_iort_xlate(struct device *dev, u32 streamid,
> struct fwnode_handle *fwnode,
> const struct iommu_ops *ops)
> @@ -523,29 +563,24 @@ static int arm_smmu_iort_xlate(struct device *dev, u32
> streamid,
> return ret;
> }
>
> -static const struct iommu_ops *iort_iommu_xlate(struct device *dev,
> - struct acpi_iort_node *node,
> - u32 streamid)
> +static int iort_iommu_xlate(struct device *dev, struct acpi_iort_node *node,
> + u32 streamid)
> {
> - const struct iommu_ops *ops = NULL;
> int ret = -ENODEV;
> struct fwnode_handle *iort_fwnode;
>
> if (node) {
> iort_fwnode = iort_get_fwnode(node);
> if (!iort_fwnode)
> - return NULL;
> -
> - ops = iommu_ops_from_fwnode(iort_fwnode);
> - if (!ops)
> - return NULL;
> + return ret;
>
> - ret = arm_smmu_iort_xlate(dev, streamid, iort_fwnode, ops);
> + ret = arm_smmu_iort_xlate(dev, streamid, iort_fwnode, NULL);
> }
>
> - return ret ? NULL : ops;
> + return ret;
> }
>
> +#if 0 /* Xen: We do not need this function for Xen */
> /**
> * iort_set_dma_mask - Set-up dma mask for a device.
> *
> @@ -567,39 +602,43 @@ void iort_set_dma_mask(struct device *dev)
> if (!dev->dma_mask)
> dev->dma_mask = &dev->coherent_dma_mask;
> }
> -
> +#endif
> /**
> - * iort_iommu_configure - Set-up IOMMU configuration for a device.
> + * iort_iommu_configure - Set-up IOMMU configuration for a device. This
> + * function sets up the fwspec as needed for a given device. Only PCI
> + * devices are supported for now.
> *
> * @dev: device to configure
> *
> - * Returns: iommu_ops pointer on configuration success
> - * NULL on configuration failure
> + * Returns: Appropriate acpi_status
> */
> -const struct iommu_ops *iort_iommu_configure(struct device *dev)
> +acpi_status iort_iommu_configure(struct device *dev)
> {
> struct acpi_iort_node *node, *parent;
> - const struct iommu_ops *ops = NULL;
> u32 streamid = 0;
> + acpi_status status = AE_OK;
>
> if (dev_is_pci(dev)) {
> - struct pci_bus *bus = to_pci_dev(dev)->bus;
> + struct pci_dev *pci_device = to_pci_dev(dev);
> u32 rid;
>
> - pci_for_each_dma_alias(to_pci_dev(dev), __get_pci_rid,
> - &rid);
> + rid = PCI_BDF2(pci_device->bus,pci_device->devfn);
>
> node = iort_scan_node(ACPI_IORT_NODE_PCI_ROOT_COMPLEX,
> - iort_match_node_callback, &bus->dev);
> + iort_match_node_callback, dev);
> if (!node)
> - return NULL;
> + return AE_NOT_FOUND;
>
> parent = iort_node_map_rid(node, rid, &streamid,
> IORT_IOMMU_TYPE);
>
> - ops = iort_iommu_xlate(dev, parent, streamid);
> + status = iort_iommu_xlate(dev, parent, streamid);
> +
> + status = status ? AE_ERROR : AE_OK;
>
> } else {
> + status = AE_NOT_IMPLEMENTED;
> +#if 0
> int i = 0;
>
> node = iort_scan_node(ACPI_IORT_NODE_NAMED_COMPONENT,
> @@ -616,11 +655,17 @@ const struct iommu_ops *iort_iommu_configure(struct
> device *dev)
> parent = iort_node_get_id(node, &streamid,
> IORT_IOMMU_TYPE, i++);
> }
> +#endif
> }
>
> - return ops;
> + return status;
> }
>
> +/*
> + * Xen: Not using the parsin ops for now. Need to check and see if it will
> + * be useful to use these in some form, or let the driver parse IORT node.
> + */
> +#if 0
> static void __init acpi_iort_register_irq(int hwirq, const char *name,
> int trigger,
> struct resource *res)
> @@ -807,93 +852,63 @@ const struct iort_iommu_config
> *iort_get_iommu_cfg(struct acpi_iort_node *node)
> return NULL;
> }
> }
> -
> +#endif
> /**
> - * iort_add_smmu_platform_device() - Allocate a platform device for SMMU
> + * Xen: rename the function to iort_add_smmu_device
> + * iort_add_smmu_device() - Allocate a device for SMMU
> * @node: Pointer to SMMU ACPI IORT node
> *
> * Returns: 0 on success, <0 failure
> */
> -static int __init iort_add_smmu_platform_device(struct acpi_iort_node *node)
> +static int __init iort_add_smmu_device(struct acpi_iort_node *node)
> {
> struct fwnode_handle *fwnode;
> - struct platform_device *pdev;
> - struct resource *r;
> - enum dev_dma_attr attr;
> - int ret, count;
> - const struct iort_iommu_config *ops = iort_get_iommu_cfg(node);
> -
> - if (!ops)
> - return -ENODEV;
> -
> - pdev = platform_device_alloc(ops->name, PLATFORM_DEVID_AUTO);
> - if (!pdev)
> - return -ENOMEM;
> -
> - count = ops->iommu_count_resources(node);
> + struct device *dev;
> + int ret;
>
> - r = kcalloc(count, sizeof(*r), GFP_KERNEL);
> - if (!r) {
> - ret = -ENOMEM;
> - goto dev_put;
> - }
> -
> - ops->iommu_init_resources(r, node);
> -
> - ret = platform_device_add_resources(pdev, r, count);
> /*
> - * Resources are duplicated in platform_device_add_resources,
> - * free their allocated memory
> + * Not enabling the parsing ops for now. The corresponding driver
> + * can parse this information as needed, so deleting relevent code as
> + * compared to base revision.
> */
> - kfree(r);
>
> - if (ret)
> - goto dev_put;
> + dev = xzalloc(struct device);
> + if (!dev)
> + return -ENOMEM;
>
> /*
> * Add a copy of IORT node pointer to platform_data to
> * be used to retrieve IORT data information.
> */
> - ret = platform_device_add_data(pdev, &node, sizeof(node));
> - if (ret)
> - goto dev_put;
> -
> - /*
> - * We expect the dma masks to be equivalent for
> - * all SMMUs set-ups
> - */
> - pdev->dev.dma_mask = &pdev->dev.coherent_dma_mask;
> + dev->type = DEV_ACPI; /* This should not be needed and we can check
> + fwnode. Defining for legacy support */
> + dev->acpi_node = node;/* A copy of the node does not seem necessary */
>
> fwnode = iort_get_fwnode(node);
>
> if (!fwnode) {
> ret = -ENODEV;
> - goto dev_put;
> + goto error;
> }
>
> - pdev->dev.fwnode = fwnode;
> -
> - attr = ops->iommu_is_coherent(node) ?
> - DEV_DMA_COHERENT : DEV_DMA_NON_COHERENT;
> -
> - /* Configure DMA for the page table walker */
> - acpi_dma_configure(&pdev->dev, attr);
> + dev->fwnode = fwnode;
>
> - ret = platform_device_add(pdev);
> - if (ret)
> - goto dma_deconfigure;
> + /* Call the acpi init functions for IOMMU devices */
> + ret = acpi_device_init(DEVICE_IOMMU, (void*)dev, node->type);
>
> return 0;
>
> -dma_deconfigure:
> - acpi_dma_deconfigure(&pdev->dev);
> -dev_put:
> - platform_device_put(pdev);
> +error:
> + xfree(dev);
>
> return ret;
> }
>
> -static void __init iort_init_platform_devices(void)
> +/*
> + * Xen: Rename the function to iort_init_devices as this function will
> + * populate the device object for SMMU devices.
> + */
> +static void __init iort_init_devices(void)
> {
> struct acpi_iort_node *iort_node, *iort_end;
> struct acpi_table_iort *iort;
> @@ -914,7 +929,7 @@ static void __init iort_init_platform_devices(void)
>
> for (i = 0; i < iort->node_count; i++) {
> if (iort_node >= iort_end) {
> - pr_err("iort node pointer overflows, bad table\n");
> + printk(XENLOG_ERR "iort node pointer overflows, bad
> table\n");
> return;
> }
>
> @@ -927,7 +942,7 @@ static void __init iort_init_platform_devices(void)
>
> iort_set_fwnode(iort_node, fwnode);
>
> - ret = iort_add_smmu_platform_device(iort_node);
> + ret = iort_add_smmu_device(iort_node);
> if (ret) {
> iort_delete_fwnode(iort_node);
> acpi_free_fwnode_static(fwnode);
> @@ -949,13 +964,14 @@ void __init acpi_iort_init(void)
> if (status != AE_NOT_FOUND) {
> const char *msg = acpi_format_exception(status);
>
> - pr_err("Failed to get table, %s\n", msg);
> + printk(XENLOG_ERR "Failed to get table, %s\n", msg);
> }
>
> return;
> }
>
> - iort_init_platform_devices();
> + iort_init_devices();
>
> - acpi_probe_device_table(iort);
> + /* Not used for now */
> + //acpi_probe_device_table(iort);
> }
> diff --git a/xen/drivers/passthrough/arm/iommu.c
> b/xen/drivers/passthrough/arm/iommu.c
> index edf70c2..1397da5 100644
> --- a/xen/drivers/passthrough/arm/iommu.c
> +++ b/xen/drivers/passthrough/arm/iommu.c
> @@ -74,24 +74,26 @@ int arch_iommu_populate_page_table(struct domain *d)
> return -ENOSYS;
> }
>
> +/*
> + * The ops parameter in this function will always be NULL for Xen,
> + * as the ops are set per domain.
> + */
> int iommu_fwspec_init(struct device *dev, struct fwnode_handle *iommu_fwnode,
> const struct iommu_ops *ops)
> {
> struct iommu_fwspec *fwspec = dev->iommu_fwspec;
>
> + /*
> + * fwspec is already allocated for this device.
> + */
> if (fwspec)
> - return ops == fwspec->ops ? 0 : -EINVAL;
> + return 0;
>
> fwspec = xzalloc(struct iommu_fwspec);
> if (!fwspec)
> return -ENOMEM;
>
> - /* Ref counting for the dt device node is not needed */
> -
> - /*of_node_get(to_of_node(iommu_fwnode));*/
> -
> fwspec->iommu_fwnode = iommu_fwnode;
> - fwspec->ops = ops;
> dev->iommu_fwspec = fwspec;
> return 0;
> }
> @@ -101,7 +103,6 @@ void iommu_fwspec_free(struct device *dev)
> struct iommu_fwspec *fwspec = dev->iommu_fwspec;
>
> if (fwspec) {
> - /*fwnode_handle_put(fwspec->iommu_fwnode);*/
> xfree(fwspec);
> dev->iommu_fwspec = NULL;
> }
> diff --git a/xen/include/acpi/acpi.h b/xen/include/acpi/acpi.h
> index c852701..1ac92b2 100644
> --- a/xen/include/acpi/acpi.h
> +++ b/xen/include/acpi/acpi.h
> @@ -60,6 +60,7 @@
> #include "actbl.h" /* ACPI table definitions */
> #include "aclocal.h" /* Internal data types */
> #include "acoutput.h" /* Error output and Debug macros */
> +#include "acpi_iort.h" /* Utility defines for IORT */
> #include "acpiosxf.h" /* Interfaces to the ACPI-to-OS layer */
> #include "acpixf.h" /* ACPI core subsystem external interfaces */
> #include "acglobal.h" /* All global variables */
> diff --git a/xen/include/acpi/acpi_iort.h b/xen/include/acpi/acpi_iort.h
> index 77e0809..c0b5b8d 100644
> --- a/xen/include/acpi/acpi_iort.h
> +++ b/xen/include/acpi/acpi_iort.h
> @@ -19,27 +19,35 @@
> #ifndef __ACPI_IORT_H__
> #define __ACPI_IORT_H__
>
> -#include <linux/acpi.h>
> -#include <linux/fwnode.h>
> -#include <linux/irqdomain.h>
> +#include <xen/acpi.h>
> +#include <asm/device.h>
>
> +/*
> + * We are not using IORT IRQ bindings for this change set
> + */
> +#if 0
> #define IORT_IRQ_MASK(irq) (irq & 0xffffffffULL)
> #define IORT_IRQ_TRIGGER_MASK(irq) ((irq >> 32) & 0xffffffffULL)
>
> int iort_register_domain_token(int trans_id, struct fwnode_handle *fw_node);
> void iort_deregister_domain_token(int trans_id);
> struct fwnode_handle *iort_find_domain_token(int trans_id);
> -#ifdef CONFIG_ACPI_IORT
> +#endif
> +
> +#ifdef CONFIG_ARM_64
> void acpi_iort_init(void);
> bool iort_node_match(u8 type);
> +#if 0
> u32 iort_msi_map_rid(struct device *dev, u32 req_id);
> struct irq_domain *iort_get_device_domain(struct device *dev, u32 req_id);
> /* IOMMU interface */
> void iort_set_dma_mask(struct device *dev);
> -const struct iommu_ops *iort_iommu_configure(struct device *dev);
> +#endif
> +acpi_status iort_iommu_configure(struct device *dev);
> #else
> static inline void acpi_iort_init(void) { }
> static inline bool iort_node_match(u8 type) { return false; }
> +#if 0
> static inline u32 iort_msi_map_rid(struct device *dev, u32 req_id)
> { return req_id; }
> static inline struct irq_domain *iort_get_device_domain(struct device *dev,
> @@ -47,12 +55,11 @@ static inline struct irq_domain
> *iort_get_device_domain(struct device *dev,
> { return NULL; }
> /* IOMMU interface */
> static inline void iort_set_dma_mask(struct device *dev) { }
> +#endif
> static inline
> -const struct iommu_ops *iort_iommu_configure(struct device *dev)
> -{ return NULL; }
> +acpi_status iommu_ops iort_iommu_configure(struct device *dev)
> +{ return AE_NOT_IMPLEMENTED; }
> #endif
>
> -#define IORT_ACPI_DECLARE(name, table_id, fn) \
> - ACPI_DECLARE_PROBE_ENTRY(iort, name, table_id, 0, NULL, 0, fn)
>
> #endif /* __ACPI_IORT_H__ */
> diff --git a/xen/include/asm-arm/device.h b/xen/include/asm-arm/device.h
> index 5027c87..4eef9ce 100644
> --- a/xen/include/asm-arm/device.h
> +++ b/xen/include/asm-arm/device.h
> @@ -7,6 +7,7 @@
> enum device_type
> {
> DEV_DT,
> + DEV_ACPI,
> };
>
> struct dev_archdata {
> @@ -20,6 +21,7 @@ struct device
> #ifdef CONFIG_HAS_DEVICE_TREE
> struct dt_device_node *of_node; /* Used by drivers imported from Linux */
> #endif
> + void *acpi_node; /*Current use case is acpi_iort_node */
> struct fwnode_handle *fwnode; /*fw device node identifier */
> struct iommu_fwspec *iommu_fwspec;
> struct dev_archdata archdata;
> diff --git a/xen/include/xen/acpi.h b/xen/include/xen/acpi.h
> index 30ec0ee..2106ba9 100644
> --- a/xen/include/xen/acpi.h
> +++ b/xen/include/xen/acpi.h
> @@ -32,6 +32,7 @@
>
> #include <acpi/acpi.h>
> #include <asm/acpi.h>
> +#include <xen/fwnode.h>
>
> #define ACPI_MADT_GET_(fld, x) (((x) & ACPI_MADT_##fld##_MASK) / \
> (ACPI_MADT_##fld##_MASK & -ACPI_MADT_##fld##_MASK))
> @@ -49,6 +50,26 @@
> (!(entry)) || (unsigned long)(entry) + sizeof(*(entry)) >
> (end) || \
> (entry)->header.length < sizeof(*(entry)))
>
> +static inline struct fwnode_handle *acpi_alloc_fwnode_static(void)
> +{
> + struct fwnode_handle *fwnode;
> +
> + fwnode = xzalloc(struct fwnode_handle);
> + if (!fwnode)
> + return NULL;
> +
> + fwnode->type = FWNODE_ACPI_STATIC;
> +
> + return fwnode;
> +}
> +
> +static inline void acpi_free_fwnode_static(struct fwnode_handle *fwnode)
> +{
> + if (WARN_ON(!fwnode || fwnode->type != FWNODE_ACPI_STATIC))
> + return;
> +
> + xfree(fwnode);
> +}
> #ifdef CONFIG_ACPI
>
> enum acpi_interrupt_id {
> diff --git a/xen/include/xen/lib.h b/xen/include/xen/lib.h
> index 995a85a..3785fae 100644
> --- a/xen/include/xen/lib.h
> +++ b/xen/include/xen/lib.h
> @@ -9,7 +9,12 @@
> #include <asm/bug.h>
>
> #define BUG_ON(p) do { if (unlikely(p)) BUG(); } while (0)
> -#define WARN_ON(p) do { if (unlikely(p)) WARN(); } while (0)
> +#define WARN_ON(p) ({ \
> + int __ret_warn_on = !!(p); \
> + if (unlikely(__ret_warn_on)) \
> + WARN(); \
> + unlikely(__ret_warn_on); \
> +})
Why this change?
> #if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)
> /* Force a compilation error if condition is true */
> diff --git a/xen/include/xen/pci.h b/xen/include/xen/pci.h
> index 59b6e8a..c518569 100644
> --- a/xen/include/xen/pci.h
> +++ b/xen/include/xen/pci.h
> @@ -88,6 +88,7 @@ struct pci_dev {
> #define PT_FAULT_THRESHOLD 10
> } fault;
> u64 vf_rlen[6];
> + struct device dev;
> };
>
> #define for_each_pdev(domain, pdev) \
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel