Commit b7fd35a0 authored by Thomas Gleixner's avatar Thomas Gleixner

Merge tag 'irqchip-fixes-5.16-2' of...

Merge tag 'irqchip-fixes-5.16-2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent

Pull irqchip fixes from Marc Zyngier:

 - Fix Armada-370-XP Multi-MSi allocation to be aligned on the allocation
   size, as required by the PCI spec

 - Fix aspeed-scu interrupt acknowledgement by directly writing to the
   register instead of a read-modify-write sequence

 - Use standard bitfirl helpers in the MIPS GIC driver instead of custom
   constructs

 - Fix the NVIC driver IPR register offset

 - Correctly drop the reference of the device node in the irq-bcm7120-l2
   driver

 - Fix the GICv3 ITS INVALL command by issueing a following SYNC command

 - Add a missing __init attribute to the init function of the Apple AIC
   driver

Link: https://lore.kernel.org/r/20211210133516.664497-1-maz@kernel.org
parents 0fcfb00b c3fbab77
...@@ -707,7 +707,7 @@ static const struct irq_domain_ops aic_ipi_domain_ops = { ...@@ -707,7 +707,7 @@ static const struct irq_domain_ops aic_ipi_domain_ops = {
.free = aic_ipi_free, .free = aic_ipi_free,
}; };
static int aic_init_smp(struct aic_irq_chip *irqc, struct device_node *node) static int __init aic_init_smp(struct aic_irq_chip *irqc, struct device_node *node)
{ {
struct irq_domain *ipi_domain; struct irq_domain *ipi_domain;
int base_ipi; int base_ipi;
......
...@@ -232,16 +232,12 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq, ...@@ -232,16 +232,12 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq,
int hwirq, i; int hwirq, i;
mutex_lock(&msi_used_lock); 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, if (hwirq < 0)
0, nr_irqs, 0);
if (hwirq >= PCI_MSI_DOORBELL_NR) {
mutex_unlock(&msi_used_lock);
return -ENOSPC; return -ENOSPC;
}
bitmap_set(msi_used, hwirq, nr_irqs);
mutex_unlock(&msi_used_lock);
for (i = 0; i < nr_irqs; i++) { for (i = 0; i < nr_irqs; i++) {
irq_domain_set_info(domain, virq + i, hwirq + i, irq_domain_set_info(domain, virq + i, hwirq + i,
...@@ -250,7 +246,7 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq, ...@@ -250,7 +246,7 @@ static int armada_370_xp_msi_alloc(struct irq_domain *domain, unsigned int virq,
NULL, NULL); NULL, NULL);
} }
return hwirq; return 0;
} }
static void armada_370_xp_msi_free(struct irq_domain *domain, static void armada_370_xp_msi_free(struct irq_domain *domain,
...@@ -259,7 +255,7 @@ static void armada_370_xp_msi_free(struct irq_domain *domain, ...@@ -259,7 +255,7 @@ static void armada_370_xp_msi_free(struct irq_domain *domain,
struct irq_data *d = irq_domain_get_irq_data(domain, virq); struct irq_data *d = irq_domain_get_irq_data(domain, virq);
mutex_lock(&msi_used_lock); 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); mutex_unlock(&msi_used_lock);
} }
......
...@@ -76,8 +76,8 @@ static void aspeed_scu_ic_irq_handler(struct irq_desc *desc) ...@@ -76,8 +76,8 @@ static void aspeed_scu_ic_irq_handler(struct irq_desc *desc)
generic_handle_domain_irq(scu_ic->irq_domain, generic_handle_domain_irq(scu_ic->irq_domain,
bit - scu_ic->irq_shift); bit - scu_ic->irq_shift);
regmap_update_bits(scu_ic->scu, scu_ic->reg, mask, regmap_write_bits(scu_ic->scu, scu_ic->reg, mask,
BIT(bit + ASPEED_SCU_IC_STATUS_SHIFT)); BIT(bit + ASPEED_SCU_IC_STATUS_SHIFT));
} }
chained_irq_exit(chip, desc); chained_irq_exit(chip, desc);
......
...@@ -238,6 +238,7 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn, ...@@ -238,6 +238,7 @@ static int __init bcm7120_l2_intc_probe(struct device_node *dn,
} }
data->num_parent_irqs = platform_irq_count(pdev); data->num_parent_irqs = platform_irq_count(pdev);
put_device(&pdev->dev);
if (data->num_parent_irqs <= 0) { if (data->num_parent_irqs <= 0) {
pr_err("invalid number of parent interrupts\n"); pr_err("invalid number of parent interrupts\n");
ret = -ENOMEM; ret = -ENOMEM;
......
...@@ -742,7 +742,7 @@ static struct its_collection *its_build_invall_cmd(struct its_node *its, ...@@ -742,7 +742,7 @@ static struct its_collection *its_build_invall_cmd(struct its_node *its,
its_fixup_cmd(cmd); its_fixup_cmd(cmd);
return NULL; return desc->its_invall_cmd.col;
} }
static struct its_vpe *its_build_vinvall_cmd(struct its_node *its, static struct its_vpe *its_build_vinvall_cmd(struct its_node *its,
......
...@@ -9,6 +9,7 @@ ...@@ -9,6 +9,7 @@
#define pr_fmt(fmt) "irq-mips-gic: " fmt #define pr_fmt(fmt) "irq-mips-gic: " fmt
#include <linux/bitfield.h>
#include <linux/bitmap.h> #include <linux/bitmap.h>
#include <linux/clocksource.h> #include <linux/clocksource.h>
#include <linux/cpuhotplug.h> #include <linux/cpuhotplug.h>
...@@ -735,8 +736,7 @@ static int __init gic_of_init(struct device_node *node, ...@@ -735,8 +736,7 @@ static int __init gic_of_init(struct device_node *node,
mips_gic_base = ioremap(gic_base, gic_len); mips_gic_base = ioremap(gic_base, gic_len);
gicconfig = read_gic_config(); gicconfig = read_gic_config();
gic_shared_intrs = gicconfig & GIC_CONFIG_NUMINTERRUPTS; gic_shared_intrs = FIELD_GET(GIC_CONFIG_NUMINTERRUPTS, gicconfig);
gic_shared_intrs >>= __ffs(GIC_CONFIG_NUMINTERRUPTS);
gic_shared_intrs = (gic_shared_intrs + 1) * 8; gic_shared_intrs = (gic_shared_intrs + 1) * 8;
if (cpu_has_veic) { if (cpu_has_veic) {
......
...@@ -26,7 +26,7 @@ ...@@ -26,7 +26,7 @@
#define NVIC_ISER 0x000 #define NVIC_ISER 0x000
#define NVIC_ICER 0x080 #define NVIC_ICER 0x080
#define NVIC_IPR 0x300 #define NVIC_IPR 0x400
#define NVIC_MAX_BANKS 16 #define NVIC_MAX_BANKS 16
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment