Skip to content

Commit 7d2fed1

Browse files
committed
Merge tag 'irq_urgent_for_v6.17_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull irq fixes from Borislav Petkov: - Fix a wrong ioremap size in mvebu-gicp - Remove yet another compile-test case for a driver which needs an additional dependency - Fix a lock inversion scenario in the IRQ unit test suite - Remove an impossible flag situation in gic-v5 - Do not iounmap resources in gic-v5 which are managed by devm - Make sure stale, left-over interrupts in mvebu-gicp are cleared on driver init - Fix a reference counting mishap in msi-lib - Fix a dereference-before-null-ptr-check case in the riscv-imsic irqchip driver * tag 'irq_urgent_for_v6.17_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: irqchip/mvebu-gicp: Use resource_size() for ioremap() irqchip: Build IMX_MU_MSI only on ARM genirq/test: Resolve irq lock inversion warnings irqchip/gic-v5: Remove IRQD_RESEND_WHEN_IN_PROGRESS for ITS IRQs irqchip/gic-v5: iwb: Fix iounmap probe failure path irqchip/mvebu-gicp: Clear pending interrupts on init irqchip/msi-lib: Fix fwnode refcount in msi_lib_irq_domain_select() irqchip/riscv-imsic: Don't dereference before NULL pointer check
2 parents acaa21a + 9f7488f commit 7d2fed1

File tree

7 files changed

+20
-15
lines changed

7 files changed

+20
-15
lines changed

drivers/irqchip/Kconfig

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -554,6 +554,7 @@ config IMX_MU_MSI
554554
tristate "i.MX MU used as MSI controller"
555555
depends on OF && HAS_IOMEM
556556
depends on ARCH_MXC || COMPILE_TEST
557+
depends on ARM || ARM64
557558
default m if ARCH_MXC
558559
select IRQ_DOMAIN
559560
select IRQ_DOMAIN_HIERARCHY

drivers/irqchip/irq-gic-v5-its.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -973,7 +973,6 @@ static int gicv5_its_irq_domain_alloc(struct irq_domain *domain, unsigned int vi
973973
irqd = irq_get_irq_data(virq + i);
974974
irqd_set_single_target(irqd);
975975
irqd_set_affinity_on_activate(irqd);
976-
irqd_set_resend_when_in_progress(irqd);
977976
}
978977

979978
return 0;

drivers/irqchip/irq-gic-v5-iwb.c

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,6 @@ static int gicv5_iwb_device_probe(struct platform_device *pdev)
241241
struct gicv5_iwb_chip_data *iwb_node;
242242
void __iomem *iwb_base;
243243
struct resource *res;
244-
int ret;
245244

246245
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
247246
if (!res)
@@ -254,16 +253,10 @@ static int gicv5_iwb_device_probe(struct platform_device *pdev)
254253
}
255254

256255
iwb_node = gicv5_iwb_init_bases(iwb_base, pdev);
257-
if (IS_ERR(iwb_node)) {
258-
ret = PTR_ERR(iwb_node);
259-
goto out_unmap;
260-
}
256+
if (IS_ERR(iwb_node))
257+
return PTR_ERR(iwb_node);
261258

262259
return 0;
263-
264-
out_unmap:
265-
iounmap(iwb_base);
266-
return ret;
267260
}
268261

269262
static const struct of_device_id gicv5_iwb_of_match[] = {

drivers/irqchip/irq-msi-lib.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -133,13 +133,13 @@ int msi_lib_irq_domain_select(struct irq_domain *d, struct irq_fwspec *fwspec,
133133
{
134134
const struct msi_parent_ops *ops = d->msi_parent_ops;
135135
u32 busmask = BIT(bus_token);
136-
struct fwnode_handle *fwh;
137136

138137
if (!ops)
139138
return 0;
140139

141-
fwh = d->flags & IRQ_DOMAIN_FLAG_FWNODE_PARENT ? fwnode_get_parent(fwspec->fwnode)
142-
: fwspec->fwnode;
140+
struct fwnode_handle *fwh __free(fwnode_handle) =
141+
d->flags & IRQ_DOMAIN_FLAG_FWNODE_PARENT ? fwnode_get_parent(fwspec->fwnode)
142+
: fwnode_handle_get(fwspec->fwnode);
143143
if (fwh != d->fwnode || fwspec->param_count != 0)
144144
return 0;
145145

drivers/irqchip/irq-mvebu-gicp.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ static int mvebu_gicp_probe(struct platform_device *pdev)
177177
.ops = &gicp_domain_ops,
178178
};
179179
struct mvebu_gicp *gicp;
180+
void __iomem *base;
180181
int ret, i;
181182

182183
gicp = devm_kzalloc(&pdev->dev, sizeof(*gicp), GFP_KERNEL);
@@ -236,6 +237,15 @@ static int mvebu_gicp_probe(struct platform_device *pdev)
236237
return -ENODEV;
237238
}
238239

240+
base = ioremap(gicp->res->start, resource_size(gicp->res));
241+
if (IS_ERR(base)) {
242+
dev_err(&pdev->dev, "ioremap() failed. Unable to clear pending interrupts.\n");
243+
} else {
244+
for (i = 0; i < 64; i++)
245+
writel(i, base + GICP_CLRSPI_NSR_OFFSET);
246+
iounmap(base);
247+
}
248+
239249
return msi_create_parent_irq_domain(&info, &gicp_msi_parent_ops) ? 0 : -ENOMEM;
240250
}
241251

drivers/irqchip/irq-riscv-imsic-platform.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,6 @@ static const struct msi_parent_ops imsic_msi_parent_ops = {
308308
int imsic_irqdomain_init(void)
309309
{
310310
struct irq_domain_info info = {
311-
.fwnode = imsic->fwnode,
312311
.ops = &imsic_base_domain_ops,
313312
.host_data = imsic,
314313
};
@@ -325,6 +324,7 @@ int imsic_irqdomain_init(void)
325324
}
326325

327326
/* Create Base IRQ domain */
327+
info.fwnode = imsic->fwnode,
328328
imsic->base_domain = msi_create_parent_irq_domain(&info, &imsic_msi_parent_ops);
329329
if (!imsic->base_domain) {
330330
pr_err("%pfwP: failed to create IMSIC base domain\n", imsic->fwnode);

kernel/irq/irq_test.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
// SPDX-License-Identifier: LGPL-2.1+
22

3+
#include <linux/cleanup.h>
34
#include <linux/cpu.h>
45
#include <linux/cpumask.h>
56
#include <linux/interrupt.h>
@@ -134,7 +135,8 @@ static void irq_shutdown_depth_test(struct kunit *test)
134135
disable_irq(virq);
135136
KUNIT_EXPECT_EQ(test, desc->depth, 1);
136137

137-
irq_shutdown_and_deactivate(desc);
138+
scoped_guard(raw_spinlock_irqsave, &desc->lock)
139+
irq_shutdown_and_deactivate(desc);
138140

139141
KUNIT_EXPECT_FALSE(test, irqd_is_activated(data));
140142
KUNIT_EXPECT_FALSE(test, irqd_is_started(data));

0 commit comments

Comments
 (0)