aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorThomas Gleixner <tglx@linutronix.de>2017-09-13 17:29:12 -0400
committerThomas Gleixner <tglx@linutronix.de>2017-09-25 14:38:25 -0400
commit42e1cc2dc5b698181ab1ffb7972bd880230c506e (patch)
tree7d7e16c91a3f4056d1885ceb66817867882b96c4
parentbb9b428a5c832d7abb494fbabac37c515c01c6c4 (diff)
genirq/irqdomain: Propagate early activation
Propagate the early activation mode to the irqdomain activate() callbacks. This is required for the upcoming reservation, late vector assignment scheme, so that the early activation call can act accordingly. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Tested-by: Juergen Gross <jgross@suse.com> Tested-by: Yu Chen <yu.c.chen@intel.com> Acked-by: Juergen Gross <jgross@suse.com> Cc: Boris Ostrovsky <boris.ostrovsky@oracle.com> Cc: Tony Luck <tony.luck@intel.com> Cc: Marc Zyngier <marc.zyngier@arm.com> Cc: Alok Kataria <akataria@vmware.com> Cc: Joerg Roedel <joro@8bytes.org> Cc: "Rafael J. Wysocki" <rjw@rjwysocki.net> Cc: Steven Rostedt <rostedt@goodmis.org> Cc: Christoph Hellwig <hch@lst.de> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Borislav Petkov <bp@alien8.de> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Rui Zhang <rui.zhang@intel.com> Cc: "K. Y. Srinivasan" <kys@microsoft.com> Cc: Arjan van de Ven <arjan@linux.intel.com> Cc: Dan Williams <dan.j.williams@intel.com> Cc: Len Brown <lenb@kernel.org> Link: https://lkml.kernel.org/r/20170913213153.028353660@linutronix.de
-rw-r--r--arch/x86/kernel/apic/io_apic.c4
-rw-r--r--include/linux/irqdomain.h2
-rw-r--r--kernel/irq/chip.c4
-rw-r--r--kernel/irq/internals.h2
-rw-r--r--kernel/irq/irqdomain.c11
-rw-r--r--kernel/irq/msi.c2
6 files changed, 13 insertions, 12 deletions
diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
index d50e46757f6d..6f1007fd9783 100644
--- a/arch/x86/kernel/apic/io_apic.c
+++ b/arch/x86/kernel/apic/io_apic.c
@@ -2096,7 +2096,7 @@ static inline void __init check_timer(void)
2096 unmask_ioapic_irq(irq_get_irq_data(0)); 2096 unmask_ioapic_irq(irq_get_irq_data(0));
2097 } 2097 }
2098 irq_domain_deactivate_irq(irq_data); 2098 irq_domain_deactivate_irq(irq_data);
2099 irq_domain_activate_irq(irq_data); 2099 irq_domain_activate_irq(irq_data, false);
2100 if (timer_irq_works()) { 2100 if (timer_irq_works()) {
2101 if (disable_timer_pin_1 > 0) 2101 if (disable_timer_pin_1 > 0)
2102 clear_IO_APIC_pin(0, pin1); 2102 clear_IO_APIC_pin(0, pin1);
@@ -2118,7 +2118,7 @@ static inline void __init check_timer(void)
2118 */ 2118 */
2119 replace_pin_at_irq_node(data, node, apic1, pin1, apic2, pin2); 2119 replace_pin_at_irq_node(data, node, apic1, pin1, apic2, pin2);
2120 irq_domain_deactivate_irq(irq_data); 2120 irq_domain_deactivate_irq(irq_data);
2121 irq_domain_activate_irq(irq_data); 2121 irq_domain_activate_irq(irq_data, false);
2122 legacy_pic->unmask(0); 2122 legacy_pic->unmask(0);
2123 if (timer_irq_works()) { 2123 if (timer_irq_works()) {
2124 apic_printk(APIC_QUIET, KERN_INFO "....... works.\n"); 2124 apic_printk(APIC_QUIET, KERN_INFO "....... works.\n");
diff --git a/include/linux/irqdomain.h b/include/linux/irqdomain.h
index 8fb877121984..7d0c6c144708 100644
--- a/include/linux/irqdomain.h
+++ b/include/linux/irqdomain.h
@@ -441,7 +441,7 @@ extern int __irq_domain_alloc_irqs(struct irq_domain *domain, int irq_base,
441 unsigned int nr_irqs, int node, void *arg, 441 unsigned int nr_irqs, int node, void *arg,
442 bool realloc, const struct cpumask *affinity); 442 bool realloc, const struct cpumask *affinity);
443extern void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs); 443extern void irq_domain_free_irqs(unsigned int virq, unsigned int nr_irqs);
444extern int irq_domain_activate_irq(struct irq_data *irq_data); 444extern int irq_domain_activate_irq(struct irq_data *irq_data, bool early);
445extern void irq_domain_deactivate_irq(struct irq_data *irq_data); 445extern void irq_domain_deactivate_irq(struct irq_data *irq_data);
446 446
447static inline int irq_domain_alloc_irqs(struct irq_domain *domain, 447static inline int irq_domain_alloc_irqs(struct irq_domain *domain,
diff --git a/kernel/irq/chip.c b/kernel/irq/chip.c
index cd5b3eb38082..82333835ac66 100644
--- a/kernel/irq/chip.c
+++ b/kernel/irq/chip.c
@@ -223,7 +223,7 @@ __irq_startup_managed(struct irq_desc *desc, struct cpumask *aff, bool force)
223 * Managed interrupts have reserved resources, so this should not 223 * Managed interrupts have reserved resources, so this should not
224 * happen. 224 * happen.
225 */ 225 */
226 if (WARN_ON(irq_domain_activate_irq(d))) 226 if (WARN_ON(irq_domain_activate_irq(d, false)))
227 return IRQ_STARTUP_ABORT; 227 return IRQ_STARTUP_ABORT;
228 return IRQ_STARTUP_MANAGED; 228 return IRQ_STARTUP_MANAGED;
229} 229}
@@ -290,7 +290,7 @@ int irq_activate(struct irq_desc *desc)
290 struct irq_data *d = irq_desc_get_irq_data(desc); 290 struct irq_data *d = irq_desc_get_irq_data(desc);
291 291
292 if (!irqd_affinity_is_managed(d)) 292 if (!irqd_affinity_is_managed(d))
293 return irq_domain_activate_irq(d); 293 return irq_domain_activate_irq(d, false);
294 return 0; 294 return 0;
295} 295}
296 296
diff --git a/kernel/irq/internals.h b/kernel/irq/internals.h
index e84d0e3899f6..a0327136e469 100644
--- a/kernel/irq/internals.h
+++ b/kernel/irq/internals.h
@@ -439,7 +439,7 @@ static inline bool irq_fixup_move_pending(struct irq_desc *desc, bool fclear)
439#endif /* !CONFIG_GENERIC_PENDING_IRQ */ 439#endif /* !CONFIG_GENERIC_PENDING_IRQ */
440 440
441#if !defined(CONFIG_IRQ_DOMAIN) || !defined(CONFIG_IRQ_DOMAIN_HIERARCHY) 441#if !defined(CONFIG_IRQ_DOMAIN) || !defined(CONFIG_IRQ_DOMAIN_HIERARCHY)
442static inline int irq_domain_activate_irq(struct irq_data *data) 442static inline int irq_domain_activate_irq(struct irq_data *data, bool early)
443{ 443{
444 irqd_set_activated(data); 444 irqd_set_activated(data);
445 return 0; 445 return 0;
diff --git a/kernel/irq/irqdomain.c b/kernel/irq/irqdomain.c
index 47e8ddd9e8cf..b50f737574ae 100644
--- a/kernel/irq/irqdomain.c
+++ b/kernel/irq/irqdomain.c
@@ -1694,7 +1694,7 @@ static void __irq_domain_deactivate_irq(struct irq_data *irq_data)
1694 } 1694 }
1695} 1695}
1696 1696
1697static int __irq_domain_activate_irq(struct irq_data *irqd) 1697static int __irq_domain_activate_irq(struct irq_data *irqd, bool early)
1698{ 1698{
1699 int ret = 0; 1699 int ret = 0;
1700 1700
@@ -1702,9 +1702,10 @@ static int __irq_domain_activate_irq(struct irq_data *irqd)
1702 struct irq_domain *domain = irqd->domain; 1702 struct irq_domain *domain = irqd->domain;
1703 1703
1704 if (irqd->parent_data) 1704 if (irqd->parent_data)
1705 ret = __irq_domain_activate_irq(irqd->parent_data); 1705 ret = __irq_domain_activate_irq(irqd->parent_data,
1706 early);
1706 if (!ret && domain->ops->activate) { 1707 if (!ret && domain->ops->activate) {
1707 ret = domain->ops->activate(domain, irqd, false); 1708 ret = domain->ops->activate(domain, irqd, early);
1708 /* Rollback in case of error */ 1709 /* Rollback in case of error */
1709 if (ret && irqd->parent_data) 1710 if (ret && irqd->parent_data)
1710 __irq_domain_deactivate_irq(irqd->parent_data); 1711 __irq_domain_deactivate_irq(irqd->parent_data);
@@ -1721,12 +1722,12 @@ static int __irq_domain_activate_irq(struct irq_data *irqd)
1721 * This is the second step to call domain_ops->activate to program interrupt 1722 * This is the second step to call domain_ops->activate to program interrupt
1722 * controllers, so the interrupt could actually get delivered. 1723 * controllers, so the interrupt could actually get delivered.
1723 */ 1724 */
1724int irq_domain_activate_irq(struct irq_data *irq_data) 1725int irq_domain_activate_irq(struct irq_data *irq_data, bool early)
1725{ 1726{
1726 int ret = 0; 1727 int ret = 0;
1727 1728
1728 if (!irqd_is_activated(irq_data)) 1729 if (!irqd_is_activated(irq_data))
1729 ret = __irq_domain_activate_irq(irq_data); 1730 ret = __irq_domain_activate_irq(irq_data, early);
1730 if (!ret) 1731 if (!ret)
1731 irqd_set_activated(irq_data); 1732 irqd_set_activated(irq_data);
1732 return ret; 1733 return ret;
diff --git a/kernel/irq/msi.c b/kernel/irq/msi.c
index 5ece369950ec..d7553d015175 100644
--- a/kernel/irq/msi.c
+++ b/kernel/irq/msi.c
@@ -401,7 +401,7 @@ int msi_domain_alloc_irqs(struct irq_domain *domain, struct device *dev,
401 struct irq_data *irq_data; 401 struct irq_data *irq_data;
402 402
403 irq_data = irq_domain_get_irq_data(domain, desc->irq); 403 irq_data = irq_domain_get_irq_data(domain, desc->irq);
404 ret = irq_domain_activate_irq(irq_data); 404 ret = irq_domain_activate_irq(irq_data, true);
405 if (ret) 405 if (ret)
406 goto cleanup; 406 goto cleanup;
407 } 407 }