]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
ACPI: scan: Refactor dependency creation
authorSunil V L <sunilvl@ventanamicro.com>
Mon, 12 Aug 2024 00:59:16 +0000 (06:29 +0530)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Tue, 27 Aug 2024 13:48:35 +0000 (15:48 +0200)
Some architectures like RISC-V will use implicit dependencies like GSI
map to create dependencies between interrupt controller and devices. To
support doing that, the function which creates the dependency, is
refactored bit and made public so that dependency can be added from
outside of scan.c as well.

Signed-off-by: Sunil V L <sunilvl@ventanamicro.com>
Tested-by: Björn Töpel <bjorn@rivosinc.com>
Link: https://patch.msgid.link/20240812005929.113499-5-sunilvl@ventanamicro.com
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/scan.c
include/acpi/acpi_bus.h

index 607bbb8b90da18e884cecf61a86dc921531f1caa..90ae843e975febb6df30dec1327ef5b5a0de31ef 100644 (file)
@@ -2013,6 +2013,49 @@ void acpi_scan_hotplug_enabled(struct acpi_hotplug_profile *hotplug, bool val)
        mutex_unlock(&acpi_scan_lock);
 }
 
+int acpi_scan_add_dep(acpi_handle handle, struct acpi_handle_list *dep_devices)
+{
+       u32 count;
+       int i;
+
+       for (count = 0, i = 0; i < dep_devices->count; i++) {
+               struct acpi_device_info *info;
+               struct acpi_dep_data *dep;
+               bool skip, honor_dep;
+               acpi_status status;
+
+               status = acpi_get_object_info(dep_devices->handles[i], &info);
+               if (ACPI_FAILURE(status)) {
+                       acpi_handle_debug(handle, "Error reading _DEP device info\n");
+                       continue;
+               }
+
+               skip = acpi_info_matches_ids(info, acpi_ignore_dep_ids);
+               honor_dep = acpi_info_matches_ids(info, acpi_honor_dep_ids);
+               kfree(info);
+
+               if (skip)
+                       continue;
+
+               dep = kzalloc(sizeof(*dep), GFP_KERNEL);
+               if (!dep)
+                       continue;
+
+               count++;
+
+               dep->supplier = dep_devices->handles[i];
+               dep->consumer = handle;
+               dep->honor_dep = honor_dep;
+
+               mutex_lock(&acpi_dep_list_lock);
+               list_add_tail(&dep->node, &acpi_dep_list);
+               mutex_unlock(&acpi_dep_list_lock);
+       }
+
+       acpi_handle_list_free(dep_devices);
+       return count;
+}
+
 static void acpi_scan_init_hotplug(struct acpi_device *adev)
 {
        struct acpi_hardware_id *hwid;
@@ -2035,8 +2078,7 @@ static void acpi_scan_init_hotplug(struct acpi_device *adev)
 static u32 acpi_scan_check_dep(acpi_handle handle)
 {
        struct acpi_handle_list dep_devices;
-       u32 count;
-       int i;
+       u32 count = 0;
 
        /*
         * Check for _HID here to avoid deferring the enumeration of:
@@ -2045,48 +2087,14 @@ static u32 acpi_scan_check_dep(acpi_handle handle)
         * Still, checking for _HID catches more then just these cases ...
         */
        if (!acpi_has_method(handle, "_DEP") || !acpi_has_method(handle, "_HID"))
-               return 0;
+               return count;
 
        if (!acpi_evaluate_reference(handle, "_DEP", NULL, &dep_devices)) {
                acpi_handle_debug(handle, "Failed to evaluate _DEP.\n");
-               return 0;
-       }
-
-       for (count = 0, i = 0; i < dep_devices.count; i++) {
-               struct acpi_device_info *info;
-               struct acpi_dep_data *dep;
-               bool skip, honor_dep;
-               acpi_status status;
-
-               status = acpi_get_object_info(dep_devices.handles[i], &info);
-               if (ACPI_FAILURE(status)) {
-                       acpi_handle_debug(handle, "Error reading _DEP device info\n");
-                       continue;
-               }
-
-               skip = acpi_info_matches_ids(info, acpi_ignore_dep_ids);
-               honor_dep = acpi_info_matches_ids(info, acpi_honor_dep_ids);
-               kfree(info);
-
-               if (skip)
-                       continue;
-
-               dep = kzalloc(sizeof(*dep), GFP_KERNEL);
-               if (!dep)
-                       continue;
-
-               count++;
-
-               dep->supplier = dep_devices.handles[i];
-               dep->consumer = handle;
-               dep->honor_dep = honor_dep;
-
-               mutex_lock(&acpi_dep_list_lock);
-               list_add_tail(&dep->node , &acpi_dep_list);
-               mutex_unlock(&acpi_dep_list_lock);
+               return count;
        }
 
-       acpi_handle_list_free(&dep_devices);
+       count += acpi_scan_add_dep(handle, &dep_devices);
        return count;
 }
 
index 8db5bd3829151011924e082500190235dd4bd952..d6a4dd58e36f50d19444325ce6849f98370b453f 100644 (file)
@@ -993,6 +993,7 @@ static inline void acpi_put_acpi_dev(struct acpi_device *adev)
 
 int acpi_wait_for_acpi_ipmi(void);
 
+int acpi_scan_add_dep(acpi_handle handle, struct acpi_handle_list *dep_devices);
 #else  /* CONFIG_ACPI */
 
 static inline int register_acpi_bus_type(void *bus) { return 0; }