aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJake Oshins <jakeo@microsoft.com>2015-12-10 12:52:59 -0500
committerThomas Gleixner <tglx@linutronix.de>2015-12-20 06:40:49 -0500
commitc8f3e518d3444ee9200a4987421fcee60f768f11 (patch)
tree4f7109ba489b5b04a620963117973bc8f663b273
parent9f318e3fcb1d4c48c26e8ca2ff2a459b82f36a23 (diff)
x86/irq: Export functions to allow MSI domains in modules
The Linux kernel already has the concept of IRQ domain, wherein a component can expose a set of IRQs which are managed by a particular interrupt controller chip or other subsystem. The PCI driver exposes the notion of an IRQ domain for Message-Signaled Interrupts (MSI) from PCI Express devices. This patch exposes the functions which are necessary for creating a MSI IRQ domain within a module. [ tglx: Split it into x86 and core irq parts ] Signed-off-by: Jake Oshins <jakeo@microsoft.com> Cc: gregkh@linuxfoundation.org Cc: kys@microsoft.com Cc: devel@linuxdriverproject.org Cc: olaf@aepfle.de Cc: apw@canonical.com Cc: vkuznets@redhat.com Cc: haiyangz@microsoft.com Cc: marc.zyngier@arm.com Cc: bhelgaas@google.com Link: http://lkml.kernel.org/r/1449769983-12948-4-git-send-email-jakeo@microsoft.com Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r--arch/x86/include/asm/msi.h6
-rw-r--r--arch/x86/kernel/apic/msi.c8
-rw-r--r--arch/x86/kernel/apic/vector.c2
3 files changed, 13 insertions, 3 deletions
diff --git a/arch/x86/include/asm/msi.h b/arch/x86/include/asm/msi.h
index 93724cc62177..eb4b09b41df5 100644
--- a/arch/x86/include/asm/msi.h
+++ b/arch/x86/include/asm/msi.h
@@ -1,7 +1,13 @@
1#ifndef _ASM_X86_MSI_H 1#ifndef _ASM_X86_MSI_H
2#define _ASM_X86_MSI_H 2#define _ASM_X86_MSI_H
3#include <asm/hw_irq.h> 3#include <asm/hw_irq.h>
4#include <asm/irqdomain.h>
4 5
5typedef struct irq_alloc_info msi_alloc_info_t; 6typedef struct irq_alloc_info msi_alloc_info_t;
6 7
8int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
9 msi_alloc_info_t *arg);
10
11void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc);
12
7#endif /* _ASM_X86_MSI_H */ 13#endif /* _ASM_X86_MSI_H */
diff --git a/arch/x86/kernel/apic/msi.c b/arch/x86/kernel/apic/msi.c
index 5f1feb6854af..ade25320df96 100644
--- a/arch/x86/kernel/apic/msi.c
+++ b/arch/x86/kernel/apic/msi.c
@@ -96,8 +96,8 @@ static irq_hw_number_t pci_msi_get_hwirq(struct msi_domain_info *info,
96 return arg->msi_hwirq; 96 return arg->msi_hwirq;
97} 97}
98 98
99static int pci_msi_prepare(struct irq_domain *domain, struct device *dev, 99int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
100 int nvec, msi_alloc_info_t *arg) 100 msi_alloc_info_t *arg)
101{ 101{
102 struct pci_dev *pdev = to_pci_dev(dev); 102 struct pci_dev *pdev = to_pci_dev(dev);
103 struct msi_desc *desc = first_pci_msi_entry(pdev); 103 struct msi_desc *desc = first_pci_msi_entry(pdev);
@@ -113,11 +113,13 @@ static int pci_msi_prepare(struct irq_domain *domain, struct device *dev,
113 113
114 return 0; 114 return 0;
115} 115}
116EXPORT_SYMBOL_GPL(pci_msi_prepare);
116 117
117static void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc) 118void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
118{ 119{
119 arg->msi_hwirq = pci_msi_domain_calc_hwirq(arg->msi_dev, desc); 120 arg->msi_hwirq = pci_msi_domain_calc_hwirq(arg->msi_dev, desc);
120} 121}
122EXPORT_SYMBOL_GPL(pci_msi_set_desc);
121 123
122static struct msi_domain_ops pci_msi_domain_ops = { 124static struct msi_domain_ops pci_msi_domain_ops = {
123 .get_hwirq = pci_msi_get_hwirq, 125 .get_hwirq = pci_msi_get_hwirq,
diff --git a/arch/x86/kernel/apic/vector.c b/arch/x86/kernel/apic/vector.c
index 861bc59c8f25..908cb37da171 100644
--- a/arch/x86/kernel/apic/vector.c
+++ b/arch/x86/kernel/apic/vector.c
@@ -29,6 +29,7 @@ struct apic_chip_data {
29}; 29};
30 30
31struct irq_domain *x86_vector_domain; 31struct irq_domain *x86_vector_domain;
32EXPORT_SYMBOL_GPL(x86_vector_domain);
32static DEFINE_RAW_SPINLOCK(vector_lock); 33static DEFINE_RAW_SPINLOCK(vector_lock);
33static cpumask_var_t vector_cpumask; 34static cpumask_var_t vector_cpumask;
34static struct irq_chip lapic_controller; 35static struct irq_chip lapic_controller;
@@ -66,6 +67,7 @@ struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
66 67
67 return data ? &data->cfg : NULL; 68 return data ? &data->cfg : NULL;
68} 69}
70EXPORT_SYMBOL_GPL(irqd_cfg);
69 71
70struct irq_cfg *irq_cfg(unsigned int irq) 72struct irq_cfg *irq_cfg(unsigned int irq)
71{ 73{