mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-01 08:04:22 +08:00
irqchip/gic-v3: Claim iomem resources
As a simple quality-of-life tweak, claim our MMIO regions when mapping them, such that the GIC shows up in /proc/iomem. No effort is spent on trying to release them, since frankly if the GIC fails to probe then it's never getting a second try anyway. Signed-off-by: Robin Murphy <robin.murphy@arm.com> Signed-off-by: Marc Zyngier <maz@kernel.org> Link: https://lore.kernel.org/r/c534c2a458a3bf94ccdae8abc6edc3d45a689c30.1649777295.git.robin.murphy@arm.com
This commit is contained in:
parent
4053b6b43f
commit
2b2cd74a06
@ -1990,10 +1990,10 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
|
|||||||
u32 nr_redist_regions;
|
u32 nr_redist_regions;
|
||||||
int err, i;
|
int err, i;
|
||||||
|
|
||||||
dist_base = of_iomap(node, 0);
|
dist_base = of_io_request_and_map(node, 0, "GICD");
|
||||||
if (!dist_base) {
|
if (IS_ERR(dist_base)) {
|
||||||
pr_err("%pOF: unable to map gic dist registers\n", node);
|
pr_err("%pOF: unable to map gic dist registers\n", node);
|
||||||
return -ENXIO;
|
return PTR_ERR(dist_base);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = gic_validate_dist_version(dist_base);
|
err = gic_validate_dist_version(dist_base);
|
||||||
@ -2017,8 +2017,8 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
|
|||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = of_address_to_resource(node, 1 + i, &res);
|
ret = of_address_to_resource(node, 1 + i, &res);
|
||||||
rdist_regs[i].redist_base = of_iomap(node, 1 + i);
|
rdist_regs[i].redist_base = of_io_request_and_map(node, 1 + i, "GICR");
|
||||||
if (ret || !rdist_regs[i].redist_base) {
|
if (ret || IS_ERR(rdist_regs[i].redist_base)) {
|
||||||
pr_err("%pOF: couldn't map region %d\n", node, i);
|
pr_err("%pOF: couldn't map region %d\n", node, i);
|
||||||
err = -ENODEV;
|
err = -ENODEV;
|
||||||
goto out_unmap_rdist;
|
goto out_unmap_rdist;
|
||||||
@ -2044,7 +2044,7 @@ static int __init gic_of_init(struct device_node *node, struct device_node *pare
|
|||||||
|
|
||||||
out_unmap_rdist:
|
out_unmap_rdist:
|
||||||
for (i = 0; i < nr_redist_regions; i++)
|
for (i = 0; i < nr_redist_regions; i++)
|
||||||
if (rdist_regs[i].redist_base)
|
if (rdist_regs[i].redist_base && !IS_ERR(rdist_regs[i].redist_base))
|
||||||
iounmap(rdist_regs[i].redist_base);
|
iounmap(rdist_regs[i].redist_base);
|
||||||
kfree(rdist_regs);
|
kfree(rdist_regs);
|
||||||
out_unmap_dist:
|
out_unmap_dist:
|
||||||
@ -2091,6 +2091,7 @@ gic_acpi_parse_madt_redist(union acpi_subtable_headers *header,
|
|||||||
pr_err("Couldn't map GICR region @%llx\n", redist->base_address);
|
pr_err("Couldn't map GICR region @%llx\n", redist->base_address);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
request_mem_region(redist->base_address, redist->length, "GICR");
|
||||||
|
|
||||||
gic_acpi_register_redist(redist->base_address, redist_base);
|
gic_acpi_register_redist(redist->base_address, redist_base);
|
||||||
return 0;
|
return 0;
|
||||||
@ -2113,6 +2114,7 @@ gic_acpi_parse_madt_gicc(union acpi_subtable_headers *header,
|
|||||||
redist_base = ioremap(gicc->gicr_base_address, size);
|
redist_base = ioremap(gicc->gicr_base_address, size);
|
||||||
if (!redist_base)
|
if (!redist_base)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
request_mem_region(gicc->gicr_base_address, size, "GICR");
|
||||||
|
|
||||||
gic_acpi_register_redist(gicc->gicr_base_address, redist_base);
|
gic_acpi_register_redist(gicc->gicr_base_address, redist_base);
|
||||||
return 0;
|
return 0;
|
||||||
@ -2314,6 +2316,7 @@ gic_acpi_init(union acpi_subtable_headers *header, const unsigned long end)
|
|||||||
pr_err("Unable to map GICD registers\n");
|
pr_err("Unable to map GICD registers\n");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
request_mem_region(dist->base_address, ACPI_GICV3_DIST_MEM_SIZE, "GICD");
|
||||||
|
|
||||||
err = gic_validate_dist_version(acpi_data.dist_base);
|
err = gic_validate_dist_version(acpi_data.dist_base);
|
||||||
if (err) {
|
if (err) {
|
||||||
|
Loading…
Reference in New Issue
Block a user