lkml.org 
[lkml]   [2014]   [Oct]   [27]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 11/16] s390/MSI: Use MSI controller framework to configure MSI/MSI-X irq
    Date
    Use MSI controller framework instead of arch MSI functions to configure
    MSI/MSI-X irq. So we can manage MSI/MSI-X irq in a unified framework.

    Signed-off-by: Yijing Wang <wangyijing@huawei.com>
    Acked-by: Sebastian Ott <sebott@linux.vnet.ibm.com>
    ---
    arch/s390/include/asm/pci.h | 1 +
    arch/s390/pci/pci.c | 19 +++++++++++++++++--
    2 files changed, 18 insertions(+), 2 deletions(-)

    diff --git a/arch/s390/include/asm/pci.h b/arch/s390/include/asm/pci.h
    index c030900..bf14da2 100644
    --- a/arch/s390/include/asm/pci.h
    +++ b/arch/s390/include/asm/pci.h
    @@ -88,6 +88,7 @@ struct zpci_dev {
    u32 uid; /* user defined id */
    u8 util_str[CLP_UTIL_STR_LEN]; /* utility string */

    + struct msi_controller *msi_ctrl;
    /* IRQ stuff */
    u64 msi_addr; /* MSI address */
    struct airq_iv *aibv; /* adapter interrupt bit vector */
    diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
    index 552b990..beed5ab 100644
    --- a/arch/s390/pci/pci.c
    +++ b/arch/s390/pci/pci.c
    @@ -358,7 +358,15 @@ static void zpci_irq_handler(struct airq_struct *airq)
    }
    }

    -int arch_setup_msi_irqs(struct pci_dev *pdev, int nvec, int type)
    +struct msi_controller *pcibios_msi_controller(struct pci_bus *bus)
    +{
    + struct zpci_dev *zpci = bus->sysdata;
    +
    + return zpci->msi_ctrl;
    +}
    +
    +static int zpci_setup_msi_irqs(struct msi_controller *ctrl,
    + struct pci_dev *pdev, int nvec, int type)
    {
    struct zpci_dev *zdev = get_zdev(pdev);
    unsigned int hwirq, msi_vecs;
    @@ -434,7 +442,8 @@ out:
    return rc;
    }

    -void arch_teardown_msi_irqs(struct pci_dev *pdev)
    +static void zpci_teardown_msi_irqs(struct msi_controller *ctrl,
    + struct pci_dev *pdev)
    {
    struct zpci_dev *zdev = get_zdev(pdev);
    struct msi_desc *msi;
    @@ -464,6 +473,11 @@ void arch_teardown_msi_irqs(struct pci_dev *pdev)
    airq_iv_free_bit(zpci_aisb_iv, zdev->aisb);
    }

    +static struct msi_controller zpci_msi_ctrl = {
    + .setup_irqs = zpci_setup_msi_irqs,
    + .teardown_irqs = zpci_teardown_msi_irqs,
    +};
    +
    static void zpci_map_resources(struct zpci_dev *zdev)
    {
    struct pci_dev *pdev = zdev->pdev;
    @@ -749,6 +763,7 @@ static int zpci_scan_bus(struct zpci_dev *zdev)
    if (ret)
    return ret;

    + zdev->msi_ctrl = &zpci_msi_ctrl;
    zdev->bus = pci_scan_root_bus(NULL, ZPCI_BUS_NR, &pci_root_ops,
    zdev, &resources);
    if (!zdev->bus) {
    --
    1.7.1


    \
     
     \ /
      Last update: 2014-10-27 14:21    [W:5.928 / U:0.528 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site