Skip to content

Commit 80f2a24

Browse files
committed
Merge tag 'irqchip-fixes-5.19-2' of git://git.kernel.org/pub/scm/linux/kernel/git/maz/arm-platforms into irq/urgent
Pull irqchip fixes from Marc Zygnier: - Gracefully handle failure to request MMIO resources in the GICv3 driver - Make a static key static in the Apple AIC driver - Fix the Xilinx intc driver dependency on OF_ADDRESS Link: https://lore.kernel.org/all/20220701133531.1545319-1-maz@kernel.org
2 parents e35e5b6 + 1357d2a commit 80f2a24

File tree

3 files changed

+33
-12
lines changed

3 files changed

+33
-12
lines changed

drivers/irqchip/Kconfig

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ config XTENSA_MX
298298

299299
config XILINX_INTC
300300
bool "Xilinx Interrupt Controller IP"
301-
depends on OF
301+
depends on OF_ADDRESS
302302
select IRQ_DOMAIN
303303
help
304304
Support for the Xilinx Interrupt Controller IP core.

drivers/irqchip/irq-apple-aic.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@
228228
#define AIC_TMR_EL02_PHYS AIC_TMR_GUEST_PHYS
229229
#define AIC_TMR_EL02_VIRT AIC_TMR_GUEST_VIRT
230230

231-
DEFINE_STATIC_KEY_TRUE(use_fast_ipi);
231+
static DEFINE_STATIC_KEY_TRUE(use_fast_ipi);
232232

233233
struct aic_info {
234234
int version;

drivers/irqchip/irq-gic-v3.c

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2042,15 +2042,40 @@ static void __init gic_of_setup_kvm_info(struct device_node *node)
20422042
vgic_set_kvm_info(&gic_v3_kvm_info);
20432043
}
20442044

2045+
static void gic_request_region(resource_size_t base, resource_size_t size,
2046+
const char *name)
2047+
{
2048+
if (!request_mem_region(base, size, name))
2049+
pr_warn_once(FW_BUG "%s region %pa has overlapping address\n",
2050+
name, &base);
2051+
}
2052+
2053+
static void __iomem *gic_of_iomap(struct device_node *node, int idx,
2054+
const char *name, struct resource *res)
2055+
{
2056+
void __iomem *base;
2057+
int ret;
2058+
2059+
ret = of_address_to_resource(node, idx, res);
2060+
if (ret)
2061+
return IOMEM_ERR_PTR(ret);
2062+
2063+
gic_request_region(res->start, resource_size(res), name);
2064+
base = of_iomap(node, idx);
2065+
2066+
return base ?: IOMEM_ERR_PTR(-ENOMEM);
2067+
}
2068+
20452069
static int __init gic_of_init(struct device_node *node, struct device_node *parent)
20462070
{
20472071
void __iomem *dist_base;
20482072
struct redist_region *rdist_regs;
2073+
struct resource res;
20492074
u64 redist_stride;
20502075
u32 nr_redist_regions;
20512076
int err, i;
20522077

2053-
dist_base = of_io_request_and_map(node, 0, "GICD");
2078+
dist_base = gic_of_iomap(node, 0, "GICD", &res);
20542079
if (IS_ERR(dist_base)) {
20552080
pr_err("%pOF: unable to map gic dist registers\n", node);
20562081
return PTR_ERR(dist_base);
@@ -2073,12 +2098,8 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
20732098
}
20742099

20752100
for (i = 0; i < nr_redist_regions; i++) {
2076-
struct resource res;
2077-
int ret;
2078-
2079-
ret = of_address_to_resource(node, 1 + i, &res);
2080-
rdist_regs[i].redist_base = of_io_request_and_map(node, 1 + i, "GICR");
2081-
if (ret || IS_ERR(rdist_regs[i].redist_base)) {
2101+
rdist_regs[i].redist_base = gic_of_iomap(node, 1 + i, "GICR", &res);
2102+
if (IS_ERR(rdist_regs[i].redist_base)) {
20822103
pr_err("%pOF: couldn't map region %d\n", node, i);
20832104
err = -ENODEV;
20842105
goto out_unmap_rdist;
@@ -2151,7 +2172,7 @@ gic_acpi_parse_madt_redist(union acpi_subtable_headers *header,
21512172
pr_err("Couldn't map GICR region @%llx\n", redist->base_address);
21522173
return -ENOMEM;
21532174
}
2154-
request_mem_region(redist->base_address, redist->length, "GICR");
2175+
gic_request_region(redist->base_address, redist->length, "GICR");
21552176

21562177
gic_acpi_register_redist(redist->base_address, redist_base);
21572178
return 0;
@@ -2174,7 +2195,7 @@ gic_acpi_parse_madt_gicc(union acpi_subtable_headers *header,
21742195
redist_base = ioremap(gicc->gicr_base_address, size);
21752196
if (!redist_base)
21762197
return -ENOMEM;
2177-
request_mem_region(gicc->gicr_base_address, size, "GICR");
2198+
gic_request_region(gicc->gicr_base_address, size, "GICR");
21782199

21792200
gic_acpi_register_redist(gicc->gicr_base_address, redist_base);
21802201
return 0;
@@ -2376,7 +2397,7 @@ gic_acpi_init(union acpi_subtable_headers *header, const unsigned long end)
23762397
pr_err("Unable to map GICD registers\n");
23772398
return -ENOMEM;
23782399
}
2379-
request_mem_region(dist->base_address, ACPI_GICV3_DIST_MEM_SIZE, "GICD");
2400+
gic_request_region(dist->base_address, ACPI_GICV3_DIST_MEM_SIZE, "GICD");
23802401

23812402
err = gic_validate_dist_version(acpi_data.dist_base);
23822403
if (err) {

0 commit comments

Comments
 (0)