mirror of https://gitee.com/openkylin/linux.git
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>
This commit is contained in:
parent
9f318e3fcb
commit
c8f3e518d3
|
@ -1,7 +1,13 @@
|
||||||
#ifndef _ASM_X86_MSI_H
|
#ifndef _ASM_X86_MSI_H
|
||||||
#define _ASM_X86_MSI_H
|
#define _ASM_X86_MSI_H
|
||||||
#include <asm/hw_irq.h>
|
#include <asm/hw_irq.h>
|
||||||
|
#include <asm/irqdomain.h>
|
||||||
|
|
||||||
typedef struct irq_alloc_info msi_alloc_info_t;
|
typedef struct irq_alloc_info msi_alloc_info_t;
|
||||||
|
|
||||||
|
int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
|
||||||
|
msi_alloc_info_t *arg);
|
||||||
|
|
||||||
|
void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc);
|
||||||
|
|
||||||
#endif /* _ASM_X86_MSI_H */
|
#endif /* _ASM_X86_MSI_H */
|
||||||
|
|
|
@ -96,8 +96,8 @@ static irq_hw_number_t pci_msi_get_hwirq(struct msi_domain_info *info,
|
||||||
return arg->msi_hwirq;
|
return arg->msi_hwirq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int pci_msi_prepare(struct irq_domain *domain, struct device *dev,
|
int pci_msi_prepare(struct irq_domain *domain, struct device *dev, int nvec,
|
||||||
int nvec, msi_alloc_info_t *arg)
|
msi_alloc_info_t *arg)
|
||||||
{
|
{
|
||||||
struct pci_dev *pdev = to_pci_dev(dev);
|
struct pci_dev *pdev = to_pci_dev(dev);
|
||||||
struct msi_desc *desc = first_pci_msi_entry(pdev);
|
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,
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_msi_prepare);
|
||||||
|
|
||||||
static void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
|
void pci_msi_set_desc(msi_alloc_info_t *arg, struct msi_desc *desc)
|
||||||
{
|
{
|
||||||
arg->msi_hwirq = pci_msi_domain_calc_hwirq(arg->msi_dev, desc);
|
arg->msi_hwirq = pci_msi_domain_calc_hwirq(arg->msi_dev, desc);
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pci_msi_set_desc);
|
||||||
|
|
||||||
static struct msi_domain_ops pci_msi_domain_ops = {
|
static struct msi_domain_ops pci_msi_domain_ops = {
|
||||||
.get_hwirq = pci_msi_get_hwirq,
|
.get_hwirq = pci_msi_get_hwirq,
|
||||||
|
|
|
@ -29,6 +29,7 @@ struct apic_chip_data {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct irq_domain *x86_vector_domain;
|
struct irq_domain *x86_vector_domain;
|
||||||
|
EXPORT_SYMBOL_GPL(x86_vector_domain);
|
||||||
static DEFINE_RAW_SPINLOCK(vector_lock);
|
static DEFINE_RAW_SPINLOCK(vector_lock);
|
||||||
static cpumask_var_t vector_cpumask;
|
static cpumask_var_t vector_cpumask;
|
||||||
static struct irq_chip lapic_controller;
|
static struct irq_chip lapic_controller;
|
||||||
|
@ -66,6 +67,7 @@ struct irq_cfg *irqd_cfg(struct irq_data *irq_data)
|
||||||
|
|
||||||
return data ? &data->cfg : NULL;
|
return data ? &data->cfg : NULL;
|
||||||
}
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(irqd_cfg);
|
||||||
|
|
||||||
struct irq_cfg *irq_cfg(unsigned int irq)
|
struct irq_cfg *irq_cfg(unsigned int irq)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue