diff --git a/arch/loongarch/kernel/setup.c b/arch/loongarch/kernel/setup.c index 6da4736af3a8a7..c72f3606a796e2 100644 --- a/arch/loongarch/kernel/setup.c +++ b/arch/loongarch/kernel/setup.c @@ -510,36 +510,49 @@ static int __init add_legacy_isa_io(struct fwnode_handle *fwnode, static __init int arch_reserve_pio_range(void) { struct device_node *np; + struct fwnode_handle *fwnode; - for_each_node_by_name(np, "isa") { - struct of_range range; - struct of_range_parser parser; + if (acpi_disabled) { + for_each_node_by_name(np, "isa") { + struct of_range range; + struct of_range_parser parser; - pr_info("ISA Bridge: %pOF\n", np); + pr_info("ISA Bridge: %pOF\n", np); - if (of_range_parser_init(&parser, np)) { - pr_info("Failed to parse resources.\n"); - of_node_put(np); - break; - } - - for_each_of_range(&parser, &range) { - switch (range.flags & IORESOURCE_TYPE_BITS) { - case IORESOURCE_IO: - pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n", - range.cpu_addr, - range.cpu_addr + range.size - 1, - range.bus_addr); - if (add_legacy_isa_io(&np->fwnode, range.cpu_addr, range.size)) - pr_warn("Failed to reserve legacy IO in Logic PIO\n"); - break; - case IORESOURCE_MEM: - pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx\n", - range.cpu_addr, - range.cpu_addr + range.size - 1, - range.bus_addr); + if (of_range_parser_init(&parser, np)) { + pr_info("Failed to parse resources.\n"); + of_node_put(np); break; } + + for_each_of_range(&parser, &range) { + switch (range.flags & IORESOURCE_TYPE_BITS) { + case IORESOURCE_IO: + pr_info(" IO 0x%016llx..0x%016llx -> 0x%016llx\n", + range.cpu_addr, + range.cpu_addr + range.size - 1, + range.bus_addr); + if (add_legacy_isa_io(&np->fwnode, range.cpu_addr, range.size)) + pr_warn("Failed to reserve legacy IO in Logic PIO\n"); + break; + case IORESOURCE_MEM: + pr_info(" MEM 0x%016llx..0x%016llx -> 0x%016llx\n", + range.cpu_addr, + range.cpu_addr + range.size - 1, + range.bus_addr); + break; + } + } + } + } else { + fwnode = acpi_alloc_fwnode_static(); + if (!fwnode) { + pr_warn("Failed to allocate fwnode for legacy ISA\n"); + return 0; + } + if (add_legacy_isa_io(fwnode, LOONGSON_LIO_BASE, ISA_IOSIZE)) { + pr_warn("Failed to reserve legacy IO in Logic PIO\n"); + acpi_free_fwnode_static(fwnode); } }