diff options
Diffstat (limited to 'meta-seattle/recipes-kernel/linux/files/412-6-styx-linux-tracking.git-1c9b07fb461d87b41854fef3a07fff65e0d95113.patch')
-rw-r--r-- | meta-seattle/recipes-kernel/linux/files/412-6-styx-linux-tracking.git-1c9b07fb461d87b41854fef3a07fff65e0d95113.patch | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/meta-seattle/recipes-kernel/linux/files/412-6-styx-linux-tracking.git-1c9b07fb461d87b41854fef3a07fff65e0d95113.patch b/meta-seattle/recipes-kernel/linux/files/412-6-styx-linux-tracking.git-1c9b07fb461d87b41854fef3a07fff65e0d95113.patch new file mode 100644 index 00000000..345218ca --- /dev/null +++ b/meta-seattle/recipes-kernel/linux/files/412-6-styx-linux-tracking.git-1c9b07fb461d87b41854fef3a07fff65e0d95113.patch @@ -0,0 +1,163 @@ +From 4f0837d4d1274b6e25d6bd76ac448e25592d6ea0 Mon Sep 17 00:00:00 2001 +From: Adrian Calianu <adrian.calianu@enea.com> +Date: Tue, 11 Aug 2015 13:37:41 +0200 +Subject: [PATCH] [PATCH] DO NOT UPSTREAM YET: irqdomain + +From: Suravee Suthikulpanit <Suravee.Suthikulpanit@amd.com> +Date: Tue, 20 Jan 2015 20:02:28 -0600 + +Upstream-Status: Pending + +Ported from 3.19 kernel, patch provided by AMD. + +Signed-off-by: Adrian Calianu <adrian.calianu@enea.com> +--- + include/linux/irqdomain.h | 14 +++++++++++++- + kernel/irq/irqdomain.c | 44 ++++++++++++++++++++++++++++++++++++-------- + 2 files changed, 49 insertions(+), 9 deletions(-) + +diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h +index 676d730..ddd6602 100644 +--- a/include/linux/irqdomain.h ++++ b/include/linux/irqdomain.h +@@ -45,6 +45,11 @@ struct irq_data; + /* Number of irqs reserved for a legacy isa controller */ + #define NUM_ISA_INTERRUPTS 16 + ++enum irq_domain_ref_type { ++ IRQ_DOMAIN_REF_OF_DEV_NODE = 0, ++ IRQ_DOMAIN_REF_ACPI_MSI_FRAME, ++}; ++ + /** + * struct irq_domain_ops - Methods for irq_domain objects + * @match: Match an interrupt controller device node to a host, returns +@@ -61,7 +66,7 @@ struct irq_data; + * to setup the irq_desc when returning from map(). + */ + struct irq_domain_ops { +- int (*match)(struct irq_domain *d, struct device_node *node); ++ int (*match)(struct irq_domain *d, enum irq_domain_ref_type type, void *data); + int (*map)(struct irq_domain *d, unsigned int virq, irq_hw_number_t hw); + void (*unmap)(struct irq_domain *d, unsigned int virq); + int (*xlate)(struct irq_domain *d, struct device_node *node, +@@ -116,6 +121,11 @@ struct irq_domain { + + /* Optional data */ + struct device_node *of_node; ++ enum irq_domain_ref_type type; ++ union { ++ struct device_node *of_node; ++ void *acpi_ref; ++ }; + struct irq_domain_chip_generic *gc; + #ifdef CONFIG_IRQ_DOMAIN_HIERARCHY + struct irq_domain *parent; +@@ -163,6 +173,8 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node, + void *host_data); + extern struct irq_domain *irq_find_host(struct device_node *node); + extern void irq_set_default_host(struct irq_domain *host); ++extern struct irq_domain *irq_find_domain(enum irq_domain_ref_type type, ++ void *ref); + + /** + * irq_domain_add_linear() - Allocate and register a linear revmap irq_domain. +diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c +index 7fac311..0f0559f 100644 +--- a/kernel/irq/irqdomain.c ++++ b/kernel/irq/irqdomain.c +@@ -1,5 +1,6 @@ + #define pr_fmt(fmt) "irq: " fmt + ++#include <linux/acpi.h> + #include <linux/debugfs.h> + #include <linux/hardirq.h> + #include <linux/interrupt.h> +@@ -187,10 +188,11 @@ struct irq_domain *irq_domain_add_legacy(struct device_node *of_node, + EXPORT_SYMBOL_GPL(irq_domain_add_legacy); + + /** +- * irq_find_host() - Locates a domain for a given device node +- * @node: device-tree node of the interrupt controller ++ * irq_find_domain() - Locates a domain for a given a refence pointer ++ * @type: specify irq domain reference pointer type to be match ++ * @ref: pointer to the reference data structure to be matched + */ +-struct irq_domain *irq_find_host(struct device_node *node) ++struct irq_domain *irq_find_domain(enum irq_domain_ref_type type, void *ref) + { + struct irq_domain *h, *found = NULL; + int rc; +@@ -202,10 +204,16 @@ struct irq_domain *irq_find_host(struct device_node *node) + */ + mutex_lock(&irq_domain_mutex); + list_for_each_entry(h, &irq_domain_list, link) { +- if (h->ops->match) +- rc = h->ops->match(h, node); +- else +- rc = (h->of_node != NULL) && (h->of_node == node); ++ if (h->ops->match) { ++ rc = h->ops->match(h, type, ref); ++ } else if (type == IRQ_DOMAIN_REF_OF_DEV_NODE || ++ type == IRQ_DOMAIN_REF_ACPI_MSI_FRAME) { ++ /* Here, we just need to compare reference pointer */ ++ rc = (h->of_node != NULL) && (h->of_node == ref); ++ } else { ++ /* For non-DT and non-ACPI reference, must specify match */ ++ BUG(); ++ } + + if (rc) { + found = h; +@@ -215,6 +223,16 @@ struct irq_domain *irq_find_host(struct device_node *node) + mutex_unlock(&irq_domain_mutex); + return found; + } ++EXPORT_SYMBOL_GPL(irq_find_domain); ++ ++/** ++ * irq_find_host() - Locates a domain for a given device node ++ * @node: device-tree node of the interrupt controller ++ */ ++struct irq_domain *irq_find_host(struct device_node *node) ++{ ++ return irq_find_domain(IRQ_DOMAIN_REF_OF_DEV_NODE, node); ++} + EXPORT_SYMBOL_GPL(irq_find_host); + + /** +@@ -464,12 +482,16 @@ int irq_create_strict_mappings(struct irq_domain *domain, unsigned int irq_base, + } + EXPORT_SYMBOL_GPL(irq_create_strict_mappings); + ++//SURAVEE: HACK ++#include <linux/irqchip/arm-gic.h> ++ + unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data) + { + struct irq_domain *domain; + irq_hw_number_t hwirq; + unsigned int type = IRQ_TYPE_NONE; + int virq; ++ struct gic_irq_alloc_info info; + + domain = irq_data->np ? irq_find_host(irq_data->np) : irq_default_domain; + if (!domain) { +@@ -496,7 +518,13 @@ unsigned int irq_create_of_mapping(struct of_phandle_args *irq_data) + if (virq) + return virq; + +- virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, irq_data); ++//SURAVEE: TODO: Need to make this as part of irqdomain ops ++ if (gic_init_irq_alloc_info(irq_data->args[0], irq_data->args[1], ++ irq_data->args[2], irq_data->np, ++ &info)) ++ return 0; ++ ++ virq = irq_domain_alloc_irqs(domain, 1, NUMA_NO_NODE, &info); + if (virq <= 0) + return 0; + } else { +-- +1.9.1 + |