]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
ACPI: processor: Split out thermal initialization from ACPI PSS
authorRiwen Lu <luriwen@kylinos.cn>
Fri, 17 Jun 2022 02:51:51 +0000 (10:51 +0800)
committerRafael J. Wysocki <rafael.j.wysocki@intel.com>
Wed, 29 Jun 2022 16:51:22 +0000 (18:51 +0200)
Commit 239708a3af44 ("ACPI: Split out ACPI PSS from ACPI Processor
driver"), moves processor thermal registration to acpi_pss_perf_init(),
which doesn't get executed if ACPI_CPU_FREQ_PSS is not enabled.

As ARM64 supports P-states using CPPC, it should be possible to also
support processor passive cooling even if PSS is not enabled. Split
out the processor thermal cooling register from ACPI PSS to support
this, and move it into a separate function in processor_thermal.c.

Signed-off-by: Riwen Lu <luriwen@kylinos.cn>
Reviewed-by: Punit Agrawal <punit.agrawal@bytedance.com>
[ rjw: Subject edits ]
Signed-off-by: Rafael J. Wysocki <rafael.j.wysocki@intel.com>
drivers/acpi/Kconfig
drivers/acpi/Makefile
drivers/acpi/processor_driver.c
drivers/acpi/processor_thermal.c
include/acpi/processor.h

index 1e34f846508fbc9787b874e7de43879f14e5af78..2457ade3f82d7550a11d88d7d9bd15ac08d4321e 100644 (file)
@@ -255,7 +255,6 @@ config ACPI_DOCK
 
 config ACPI_CPU_FREQ_PSS
        bool
-       select THERMAL
 
 config ACPI_PROCESSOR_CSTATE
        def_bool y
@@ -287,6 +286,7 @@ config ACPI_PROCESSOR
        depends on X86 || IA64 || ARM64 || LOONGARCH
        select ACPI_PROCESSOR_IDLE
        select ACPI_CPU_FREQ_PSS if X86 || IA64 || LOONGARCH
+       select THERMAL
        default y
        help
          This driver adds support for the ACPI Processor package. It is required
index b5a8d3e00a52be430772f673851327ede14d8ede..0002eecbf870a074ec4bb07bba33aeeef9c6ee89 100644 (file)
@@ -109,10 +109,9 @@ obj-$(CONFIG_ACPI_PPTT)    += pptt.o
 obj-$(CONFIG_ACPI_PFRUT)       += pfr_update.o pfr_telemetry.o
 
 # processor has its own "processor." module_param namespace
-processor-y                    := processor_driver.o
+processor-y                    := processor_driver.o processor_thermal.o
 processor-$(CONFIG_ACPI_PROCESSOR_IDLE) += processor_idle.o
-processor-$(CONFIG_ACPI_CPU_FREQ_PSS)  += processor_throttling.o       \
-       processor_thermal.o
+processor-$(CONFIG_ACPI_CPU_FREQ_PSS)  += processor_throttling.o
 processor-$(CONFIG_CPU_FREQ)   += processor_perflib.o
 
 obj-$(CONFIG_ACPI_PROCESSOR_AGGREGATOR) += acpi_pad.o
index 368a9edefd0cbafcae1fdda5fbf568e3d45f254a..1278969eec1f9928ed75dbbd00aefa1620f08575 100644 (file)
@@ -139,75 +139,17 @@ static int acpi_soft_cpu_dead(unsigned int cpu)
 }
 
 #ifdef CONFIG_ACPI_CPU_FREQ_PSS
-static int acpi_pss_perf_init(struct acpi_processor *pr,
-               struct acpi_device *device)
+static void acpi_pss_perf_init(struct acpi_processor *pr)
 {
-       int result = 0;
-
        acpi_processor_ppc_has_changed(pr, 0);
 
        acpi_processor_get_throttling_info(pr);
 
        if (pr->flags.throttling)
                pr->flags.limit = 1;
-
-       pr->cdev = thermal_cooling_device_register("Processor", device,
-                                                  &processor_cooling_ops);
-       if (IS_ERR(pr->cdev)) {
-               result = PTR_ERR(pr->cdev);
-               return result;
-       }
-
-       dev_dbg(&device->dev, "registered as cooling_device%d\n",
-               pr->cdev->id);
-
-       result = sysfs_create_link(&device->dev.kobj,
-                                  &pr->cdev->device.kobj,
-                                  "thermal_cooling");
-       if (result) {
-               dev_err(&device->dev,
-                       "Failed to create sysfs link 'thermal_cooling'\n");
-               goto err_thermal_unregister;
-       }
-
-       result = sysfs_create_link(&pr->cdev->device.kobj,
-                                  &device->dev.kobj,
-                                  "device");
-       if (result) {
-               dev_err(&pr->cdev->device,
-                       "Failed to create sysfs link 'device'\n");
-               goto err_remove_sysfs_thermal;
-       }
-
-       return 0;
-
- err_remove_sysfs_thermal:
-       sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
- err_thermal_unregister:
-       thermal_cooling_device_unregister(pr->cdev);
-
-       return result;
-}
-
-static void acpi_pss_perf_exit(struct acpi_processor *pr,
-               struct acpi_device *device)
-{
-       if (pr->cdev) {
-               sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
-               sysfs_remove_link(&pr->cdev->device.kobj, "device");
-               thermal_cooling_device_unregister(pr->cdev);
-               pr->cdev = NULL;
-       }
 }
 #else
-static inline int acpi_pss_perf_init(struct acpi_processor *pr,
-               struct acpi_device *device)
-{
-       return 0;
-}
-
-static inline void acpi_pss_perf_exit(struct acpi_processor *pr,
-               struct acpi_device *device) {}
+static inline void acpi_pss_perf_init(struct acpi_processor *pr) {}
 #endif /* CONFIG_ACPI_CPU_FREQ_PSS */
 
 static int __acpi_processor_start(struct acpi_device *device)
@@ -229,7 +171,9 @@ static int __acpi_processor_start(struct acpi_device *device)
        if (!cpuidle_get_driver() || cpuidle_get_driver() == &acpi_idle_driver)
                acpi_processor_power_init(pr);
 
-       result = acpi_pss_perf_init(pr, device);
+       acpi_pss_perf_init(pr);
+
+       result = acpi_processor_thermal_init(pr, device);
        if (result)
                goto err_power_exit;
 
@@ -239,7 +183,7 @@ static int __acpi_processor_start(struct acpi_device *device)
                return 0;
 
        result = -ENODEV;
-       acpi_pss_perf_exit(pr, device);
+       acpi_processor_thermal_exit(pr, device);
 
 err_power_exit:
        acpi_processor_power_exit(pr);
@@ -277,10 +221,10 @@ static int acpi_processor_stop(struct device *dev)
                return 0;
        acpi_processor_power_exit(pr);
 
-       acpi_pss_perf_exit(pr, device);
-
        acpi_cppc_processor_exit(pr);
 
+       acpi_processor_thermal_exit(pr, device);
+
        return 0;
 }
 
index d8b2dfcd59b5ffa40e0d154a0dedbc3c8cf7f54f..db6ac540e924a75f51b41ba7fd35922d0dfa1f58 100644 (file)
@@ -266,3 +266,57 @@ const struct thermal_cooling_device_ops processor_cooling_ops = {
        .get_cur_state = processor_get_cur_state,
        .set_cur_state = processor_set_cur_state,
 };
+
+int acpi_processor_thermal_init(struct acpi_processor *pr,
+                               struct acpi_device *device)
+{
+       int result = 0;
+
+       pr->cdev = thermal_cooling_device_register("Processor", device,
+                                                  &processor_cooling_ops);
+       if (IS_ERR(pr->cdev)) {
+               result = PTR_ERR(pr->cdev);
+               return result;
+       }
+
+       dev_dbg(&device->dev, "registered as cooling_device%d\n",
+               pr->cdev->id);
+
+       result = sysfs_create_link(&device->dev.kobj,
+                                  &pr->cdev->device.kobj,
+                                  "thermal_cooling");
+       if (result) {
+               dev_err(&device->dev,
+                       "Failed to create sysfs link 'thermal_cooling'\n");
+               goto err_thermal_unregister;
+       }
+
+       result = sysfs_create_link(&pr->cdev->device.kobj,
+                                  &device->dev.kobj,
+                                  "device");
+       if (result) {
+               dev_err(&pr->cdev->device,
+                       "Failed to create sysfs link 'device'\n");
+               goto err_remove_sysfs_thermal;
+       }
+
+       return 0;
+
+err_remove_sysfs_thermal:
+       sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
+err_thermal_unregister:
+       thermal_cooling_device_unregister(pr->cdev);
+
+       return result;
+}
+
+void acpi_processor_thermal_exit(struct acpi_processor *pr,
+                                struct acpi_device *device)
+{
+       if (pr->cdev) {
+               sysfs_remove_link(&device->dev.kobj, "thermal_cooling");
+               sysfs_remove_link(&pr->cdev->device.kobj, "device");
+               thermal_cooling_device_unregister(pr->cdev);
+               pr->cdev = NULL;
+       }
+}
index 1940273719285e2b63e2abc9c78d4210fa449a8c..ba1e3ed98d3d831904fd9713eaf4b1528d33e082 100644 (file)
@@ -442,8 +442,12 @@ static inline int acpi_processor_hotplug(struct acpi_processor *pr)
 
 /* in processor_thermal.c */
 int acpi_processor_get_limit_info(struct acpi_processor *pr);
+int acpi_processor_thermal_init(struct acpi_processor *pr,
+                               struct acpi_device *device);
+void acpi_processor_thermal_exit(struct acpi_processor *pr,
+                                struct acpi_device *device);
 extern const struct thermal_cooling_device_ops processor_cooling_ops;
-#if defined(CONFIG_ACPI_CPU_FREQ_PSS) & defined(CONFIG_CPU_FREQ)
+#ifdef CONFIG_CPU_FREQ
 void acpi_thermal_cpufreq_init(struct cpufreq_policy *policy);
 void acpi_thermal_cpufreq_exit(struct cpufreq_policy *policy);
 #else
@@ -455,6 +459,6 @@ static inline void acpi_thermal_cpufreq_exit(struct cpufreq_policy *policy)
 {
        return;
 }
-#endif /* CONFIG_ACPI_CPU_FREQ_PSS */
+#endif /* CONFIG_CPU_FREQ */
 
 #endif