]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
LoongArch: Preserve firmware configuration when desired
authorHuacai Chen <chenhuacai@loongson.cn>
Fri, 30 May 2025 13:45:48 +0000 (21:45 +0800)
committerHuacai Chen <chenhuacai@loongson.cn>
Fri, 30 May 2025 13:45:48 +0000 (21:45 +0800)
If we must preserve the firmware resource assignments, claim the existing
resources rather than reassigning everything.

According to PCI Firmware Specification: if ACPI DSM#5 function returns
0, the OS must retain the resource allocation for PCI in the firmware; if
ACPI DSM#5 function returns 1, the OS can ignore the resource allocation
for PCI and reallocate it.

Signed-off-by: Qihang Gao <gaoqihang@loongson.cn>
Signed-off-by: Juxin Gao <gaojuxin@loongson.cn>
Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
arch/loongarch/pci/acpi.c

index 1da4dc46df43e5b77bb0666cb849d00f0443d7f8..50c9016641a48d45274bb401c1c02ebad4b8021a 100644 (file)
@@ -194,6 +194,7 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
 {
        struct pci_bus *bus;
        struct pci_root_info *info;
+       struct pci_host_bridge *host;
        struct acpi_pci_root_ops *root_ops;
        int domain = root->segment;
        int busnum = root->secondary.start;
@@ -237,8 +238,17 @@ struct pci_bus *pci_acpi_scan_root(struct acpi_pci_root *root)
                        return NULL;
                }
 
-               pci_bus_size_bridges(bus);
-               pci_bus_assign_resources(bus);
+               /* If we must preserve the resource configuration, claim now */
+               host = pci_find_host_bridge(bus);
+               if (host->preserve_config)
+                       pci_bus_claim_resources(bus);
+
+               /*
+                * Assign whatever was left unassigned. If we didn't claim above,
+                * this will reassign everything.
+                */
+               pci_assign_unassigned_root_bus_resources(bus);
+
                list_for_each_entry(child, &bus->children, node)
                        pcie_bus_configure_settings(child);
        }