lkml.org 
[lkml]   [2011]   [Mar]   [10]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 06/14] xen: events: refactor GSI pirq bindings functions
    Date
    Following the example set by xen_allocate_pirq_msi and
    xen_bind_pirq_msi_to_irq:

    xen_allocate_pirq becomes xen_allocate_pirq_gsi and now only allocates
    a pirq number and does not bind it.

    xen_map_pirq_gsi becomes xen_bind_pirq_gsi_to_irq and binds an
    existing pirq.

    Signed-off-by: Ian Campbell <ian.campbell@citrix.com>
    ---
    arch/x86/pci/xen.c | 41 +++++++++++++++++++++++++++++------------
    drivers/xen/events.c | 7 ++++---
    include/xen/events.h | 10 +++++++---
    3 files changed, 40 insertions(+), 18 deletions(-)

    diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
    index 8c4085a..e37b407 100644
    --- a/arch/x86/pci/xen.c
    +++ b/arch/x86/pci/xen.c
    @@ -50,7 +50,7 @@ static int acpi_register_gsi_xen_hvm(struct device *dev, u32 gsi,
    name = "ioapic-level";
    }

    - irq = xen_map_pirq_gsi(map_irq.pirq, gsi, shareable, name);
    + irq = xen_bind_pirq_gsi_to_irq(gsi, map_irq.pirq, shareable, name);

    printk(KERN_DEBUG "xen: --> irq=%d, pirq=%d\n", irq, map_irq.pirq);

    @@ -237,6 +237,7 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev)
    {
    int rc;
    int share = 1;
    + int pirq;
    u8 gsi;

    rc = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi);
    @@ -246,13 +247,21 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev)
    return rc;
    }

    + rc = xen_allocate_pirq_gsi(gsi);
    + if (rc < 0) {
    + dev_warn(&dev->dev, "Xen PCI: failed to allocate a PIRQ for GSI%d: %d\n",
    + gsi, rc);
    + return rc;
    + }
    + pirq = rc;
    +
    if (gsi < NR_IRQS_LEGACY)
    share = 0;

    - rc = xen_allocate_pirq(gsi, share, "pcifront");
    + rc = xen_bind_pirq_gsi_to_irq(gsi, pirq, share, "pcifront");
    if (rc < 0) {
    - dev_warn(&dev->dev, "Xen PCI: failed to register GSI%d: %d\n",
    - gsi, rc);
    + dev_warn(&dev->dev, "Xen PCI: failed to bind GSI%d (PIRQ%d) to IRQ: %d\n",
    + gsi, pirq, rc);
    return rc;
    }

    @@ -309,7 +318,7 @@ int __init pci_xen_hvm_init(void)
    #ifdef CONFIG_XEN_DOM0
    static int xen_register_pirq(u32 gsi, int triggering)
    {
    - int rc, irq;
    + int rc, pirq, irq = -1;
    struct physdev_map_pirq map_irq;
    int shareable = 0;
    char *name;
    @@ -325,17 +334,20 @@ static int xen_register_pirq(u32 gsi, int triggering)
    name = "ioapic-level";
    }

    - irq = xen_allocate_pirq(gsi, shareable, name);
    -
    - printk(KERN_DEBUG "xen: --> irq=%d\n", irq);
    + pirq = xen_allocate_pirq_gsi(gsi);
    + if (pirq < 0)
    + goto out;

    + irq = xen_bind_pirq_gsi_to_irq(gsi, pirq, shareable, name);
    if (irq < 0)
    goto out;

    + printk(KERN_DEBUG "xen: --> pirq=%d -> irq=%d\n", pirq, irq);
    +
    map_irq.domid = DOMID_SELF;
    map_irq.type = MAP_PIRQ_TYPE_GSI;
    map_irq.index = gsi;
    - map_irq.pirq = irq;
    + map_irq.pirq = pirq;

    rc = HYPERVISOR_physdev_op(PHYSDEVOP_map_pirq, &map_irq);
    if (rc) {
    @@ -422,13 +434,18 @@ static int __init pci_xen_initial_domain(void)

    void __init xen_setup_pirqs(void)
    {
    - int irq;
    + int pirq, irq;

    pci_xen_initial_domain();

    if (0 == nr_ioapics) {
    - for (irq = 0; irq < NR_IRQS_LEGACY; irq++)
    - xen_allocate_pirq(irq, 0, "xt-pic");
    + for (irq = 0; irq < NR_IRQS_LEGACY; irq++) {
    + pirq = xen_allocate_pirq_gsi(irq);
    + if (WARN(pirq < 0,
    + "Could not allocate PIRQ for legacy interrupt\n"))
    + break;
    + irq = xen_bind_pirq_gsi_to_irq(irq, pirq, 0, "xt-pic");
    + }
    return;
    }

    diff --git a/drivers/xen/events.c b/drivers/xen/events.c
    index e828456..a40b2a1 100644
    --- a/drivers/xen/events.c
    +++ b/drivers/xen/events.c
    @@ -568,9 +568,9 @@ static int find_irq_by_gsi(unsigned gsi)
    return -1;
    }

    -int xen_allocate_pirq(unsigned gsi, int shareable, char *name)
    +int xen_allocate_pirq_gsi(unsigned gsi)
    {
    - return xen_map_pirq_gsi(gsi, gsi, shareable, name);
    + return gsi;
    }

    /*
    @@ -580,7 +580,8 @@ int xen_allocate_pirq(unsigned gsi, int shareable, char *name)
    * Note: We don't assign an event channel until the irq actually started
    * up. Return an existing irq if we've already got one for the gsi.
    */
    -int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name)
    +int xen_bind_pirq_gsi_to_irq(unsigned gsi,
    + unsigned pirq, int shareable, char *name)
    {
    int irq = -1;
    struct physdev_irq irq_op;
    diff --git a/include/xen/events.h b/include/xen/events.h
    index 99a64f0..32ebeba 100644
    --- a/include/xen/events.h
    +++ b/include/xen/events.h
    @@ -68,12 +68,16 @@ int xen_set_callback_via(uint64_t via);
    void xen_evtchn_do_upcall(struct pt_regs *regs);
    void xen_hvm_evtchn_do_upcall(void);

    -/* Allocate an irq for a physical interrupt, given a gsi. */
    -int xen_allocate_pirq(unsigned gsi, int shareable, char *name);
    -int xen_map_pirq_gsi(unsigned pirq, unsigned gsi, int shareable, char *name);
    +/* Allocate a pirq for a physical interrupt, given a gsi. */
    +int xen_allocate_pirq_gsi(unsigned gsi);
    +/* Bind a pirq for a physical interrupt to an irq. */
    +int xen_bind_pirq_gsi_to_irq(unsigned gsi,
    + unsigned pirq, int shareable, char *name);

    #ifdef CONFIG_PCI_MSI
    +/* Allocate a pirq for a MSI style physical interrupt. */
    int xen_allocate_pirq_msi(struct pci_dev *dev, struct msi_desc *msidesc);
    +/* Bind an PSI pirq to an irq. */
    int xen_bind_pirq_msi_to_irq(struct pci_dev *dev, struct msi_desc *msidesc,
    int pirq, int vector, const char *name);
    #endif
    --
    1.5.6.5


    \
     
     \ /
      Last update: 2011-03-10 17:13    [W:0.036 / U:0.972 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site