lkml.org 
[lkml]   [2012]   [Aug]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/19] x86, msi: Use IRQ remapping specific setup_msi_irqs routine
    Date
    Use seperate routines to setup MSI IRQs for both
    irq_remapping_enabled cases.

    Signed-off-by: Joerg Roedel <joerg.roedel@amd.com>
    ---
    arch/x86/include/asm/irq_remapping.h | 12 -------
    arch/x86/include/asm/pci.h | 2 ++
    arch/x86/kernel/apic/io_apic.c | 26 ++--------------
    drivers/iommu/irq_remapping.c | 57 ++++++++++++++++++++++++++++++++--
    4 files changed, 59 insertions(+), 38 deletions(-)

    diff --git a/arch/x86/include/asm/irq_remapping.h b/arch/x86/include/asm/irq_remapping.h
    index 5fb9bbb..0ee1e88 100644
    --- a/arch/x86/include/asm/irq_remapping.h
    +++ b/arch/x86/include/asm/irq_remapping.h
    @@ -47,9 +47,6 @@ extern void free_remapped_irq(int irq);
    extern void compose_remapped_msi_msg(struct pci_dev *pdev,
    unsigned int irq, unsigned int dest,
    struct msi_msg *msg, u8 hpet_id);
    -extern int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec);
    -extern int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
    - int index, int sub_handle);
    extern int setup_hpet_msi_remapped(unsigned int irq, unsigned int id);

    #else /* CONFIG_IRQ_REMAP */
    @@ -83,15 +80,6 @@ static inline void compose_remapped_msi_msg(struct pci_dev *pdev,
    struct msi_msg *msg, u8 hpet_id)
    {
    }
    -static inline int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec)
    -{
    - return -ENODEV;
    -}
    -static inline int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
    - int index, int sub_handle)
    -{
    - return -ENODEV;
    -}
    static inline int setup_hpet_msi_remapped(unsigned int irq, unsigned int id)
    {
    return -ENODEV;
    diff --git a/arch/x86/include/asm/pci.h b/arch/x86/include/asm/pci.h
    index df75d07..1470b53 100644
    --- a/arch/x86/include/asm/pci.h
    +++ b/arch/x86/include/asm/pci.h
    @@ -121,9 +121,11 @@ static inline void x86_restore_msi_irqs(struct pci_dev *dev, int irq)
    #define arch_teardown_msi_irq x86_teardown_msi_irq
    #define arch_restore_msi_irqs x86_restore_msi_irqs
    /* implemented in arch/x86/kernel/apic/io_apic. */
    +struct msi_desc;
    int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type);
    void native_teardown_msi_irq(unsigned int irq);
    void native_restore_msi_irqs(struct pci_dev *dev, int irq);
    +int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq);
    /* default to the implementation in drivers/lib/msi.c */
    #define HAVE_DEFAULT_MSI_TEARDOWN_IRQS
    #define HAVE_DEFAULT_MSI_RESTORE_IRQS
    diff --git a/arch/x86/kernel/apic/io_apic.c b/arch/x86/kernel/apic/io_apic.c
    index 56a2427..f5e85ae 100644
    --- a/arch/x86/kernel/apic/io_apic.c
    +++ b/arch/x86/kernel/apic/io_apic.c
    @@ -3135,7 +3135,7 @@ static struct irq_chip msi_chip = {
    .irq_retrigger = ioapic_retrigger_irq,
    };

    -static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
    +int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)
    {
    struct irq_chip *chip = &msi_chip;
    struct msi_msg msg;
    @@ -3162,9 +3162,9 @@ static int setup_msi_irq(struct pci_dev *dev, struct msi_desc *msidesc, int irq)

    int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)
    {
    - int node, ret, sub_handle, index = 0;
    unsigned int irq, irq_want;
    struct msi_desc *msidesc;
    + int node, ret;

    /* x86 doesn't support multiple MSI yet */
    if (type == PCI_CAP_ID_MSI && nvec > 1)
    @@ -3172,36 +3172,16 @@ int native_setup_msi_irqs(struct pci_dev *dev, int nvec, int type)

    node = dev_to_node(&dev->dev);
    irq_want = nr_irqs_gsi;
    - sub_handle = 0;
    list_for_each_entry(msidesc, &dev->msi_list, list) {
    irq = create_irq_nr(irq_want, node);
    if (irq == 0)
    return -1;
    +
    irq_want = irq + 1;
    - if (!irq_remapping_enabled)
    - goto no_ir;

    - if (!sub_handle) {
    - /*
    - * allocate the consecutive block of IRTE's
    - * for 'nvec'
    - */
    - index = msi_alloc_remapped_irq(dev, irq, nvec);
    - if (index < 0) {
    - ret = index;
    - goto error;
    - }
    - } else {
    - ret = msi_setup_remapped_irq(dev, irq, index,
    - sub_handle);
    - if (ret < 0)
    - goto error;
    - }
    -no_ir:
    ret = setup_msi_irq(dev, msidesc, irq);
    if (ret < 0)
    goto error;
    - sub_handle++;
    }
    return 0;

    diff --git a/drivers/iommu/irq_remapping.c b/drivers/iommu/irq_remapping.c
    index f439151..984104b 100644
    --- a/drivers/iommu/irq_remapping.c
    +++ b/drivers/iommu/irq_remapping.c
    @@ -4,6 +4,8 @@
    #include <linux/cpumask.h>
    #include <linux/errno.h>
    #include <linux/msi.h>
    +#include <linux/irq.h>
    +#include <linux/pci.h>

    #include <asm/hw_irq.h>
    #include <asm/irq_remapping.h>
    @@ -21,6 +23,10 @@ int no_x2apic_optout;

    static struct irq_remap_ops *remap_ops;

    +static int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec);
    +static int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
    + int index, int sub_handle);
    +
    static void irq_remapping_disable_io_apic(void)
    {
    /*
    @@ -34,9 +40,54 @@ static void irq_remapping_disable_io_apic(void)
    disconnect_bsp_APIC(0);
    }

    +static int irq_remapping_setup_msi_irqs(struct pci_dev *dev,
    + int nvec, int type)
    +{
    + int node, ret, sub_handle, index = 0;
    + struct msi_desc *msidesc;
    + unsigned int irq;
    +
    + /* We don't support multiple MSI yet */
    + if (type == PCI_CAP_ID_MSI && nvec > 1)
    + return 1;
    +
    + node = dev_to_node(&dev->dev);
    + irq = get_nr_irqs_gsi();
    + sub_handle = 0;
    +
    + list_for_each_entry(msidesc, &dev->msi_list, list) {
    +
    + irq = create_irq_nr(irq, node);
    + if (irq == 0)
    + return -1;
    +
    + if (sub_handle == 0)
    + ret = index = msi_alloc_remapped_irq(dev, irq, nvec);
    + else
    + ret = msi_setup_remapped_irq(dev, irq, index, sub_handle);
    +
    + if (ret < 0)
    + goto error;
    +
    + ret = setup_msi_irq(dev, msidesc, irq);
    + if (ret < 0)
    + goto error;
    +
    + sub_handle += 1;
    + irq += 1;
    + }
    +
    + return 0;
    +
    +error:
    + destroy_irq(irq);
    + return ret;
    +}
    +
    static void __init irq_remapping_modify_x86_ops(void)
    {
    x86_io_apic_ops.disable = irq_remapping_disable_io_apic;
    + x86_msi.setup_msi_irqs = irq_remapping_setup_msi_irqs;
    x86_msi.setup_hpet_msi = setup_hpet_msi_remapped;
    }

    @@ -181,7 +232,7 @@ void compose_remapped_msi_msg(struct pci_dev *pdev,
    remap_ops->compose_msi_msg(pdev, irq, dest, msg, hpet_id);
    }

    -int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec)
    +static int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec)
    {
    if (!remap_ops || !remap_ops->msi_alloc_irq)
    return -ENODEV;
    @@ -189,8 +240,8 @@ int msi_alloc_remapped_irq(struct pci_dev *pdev, int irq, int nvec)
    return remap_ops->msi_alloc_irq(pdev, irq, nvec);
    }

    -int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
    - int index, int sub_handle)
    +static int msi_setup_remapped_irq(struct pci_dev *pdev, unsigned int irq,
    + int index, int sub_handle)
    {
    if (!remap_ops || !remap_ops->msi_setup_irq)
    return -ENODEV;
    --
    1.7.9.5



    \
     
     \ /
      Last update: 2012-08-07 18:42    [W:4.142 / U:0.092 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site