lkml.org 
[lkml]   [2021]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.4 84/88] irqchip/armada-370-xp: Fix support for Multi-MSI interrupts
    Date
    From: Pali Rohár <pali@kernel.org>

    commit d0a553502efd545c1ce3fd08fc4d423f8e4ac3d6 upstream.

    irq-armada-370-xp driver already sets MSI_FLAG_MULTI_PCI_MSI flag into
    msi_domain_info structure. But allocated interrupt numbers for Multi-MSI
    needs to be properly aligned otherwise devices send MSI interrupt with
    wrong number.

    Fix this issue by using function bitmap_find_free_region() instead of
    bitmap_find_next_zero_area() to allocate aligned interrupt numbers.

    Signed-off-by: Pali Rohár <pali@kernel.org>
    Fixes: a71b9412c90c ("irqchip/armada-370-xp: Allow allocation of multiple MSIs")
    Cc: stable@vger.kernel.org
    Signed-off-by: Marc Zyngier <maz@kernel.org>
    Link: https://lore.kernel.org/r/20211125130057.26705-2-pali@kernel.org
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    drivers/irqchip/irq-armada-370-xp.c | 14 +++++---------
    1 file changed, 5 insertions(+), 9 deletions(-)

    --- a/drivers/irqchip/irq-armada-370-xp.c
    +++ b/drivers/irqchip/irq-armada-370-xp.c
    @@ -232,16 +232,12 @@ static int armada_370_xp_msi_alloc(struc
    int hwirq, i;

    mutex_lock(&msi_used_lock);
    + hwirq = bitmap_find_free_region(msi_used, PCI_MSI_DOORBELL_NR,
    + order_base_2(nr_irqs));
    + mutex_unlock(&msi_used_lock);

    - hwirq = bitmap_find_next_zero_area(msi_used, PCI_MSI_DOORBELL_NR,
    - 0, nr_irqs, 0);
    - if (hwirq >= PCI_MSI_DOORBELL_NR) {
    - mutex_unlock(&msi_used_lock);
    + if (hwirq < 0)
    return -ENOSPC;
    - }
    -
    - bitmap_set(msi_used, hwirq, nr_irqs);
    - mutex_unlock(&msi_used_lock);

    for (i = 0; i < nr_irqs; i++) {
    irq_domain_set_info(domain, virq + i, hwirq + i,
    @@ -259,7 +255,7 @@ static void armada_370_xp_msi_free(struc
    struct irq_data *d = irq_domain_get_irq_data(domain, virq);

    mutex_lock(&msi_used_lock);
    - bitmap_clear(msi_used, d->hwirq, nr_irqs);
    + bitmap_release_region(msi_used, d->hwirq, order_base_2(nr_irqs));
    mutex_unlock(&msi_used_lock);
    }


    \
     
     \ /
      Last update: 2021-12-13 11:00    [W:3.186 / U:0.196 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site