]> git.baikalelectronics.ru Git - kernel.git/commitdiff
Merge tag 'pm-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm
authorLinus Torvalds <torvalds@linux-foundation.org>
Wed, 16 Dec 2020 00:30:31 +0000 (16:30 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Wed, 16 Dec 2020 00:30:31 +0000 (16:30 -0800)
Pull power management updates from Rafael Wysocki:
 "These update cpufreq (core and drivers), cpuidle (polling state
  implementation and the PSCI driver), the OPP (operating performance
  points) framework, devfreq (core and drivers), the power capping RAPL
  (Running Average Power Limit) driver, the Energy Model support, the
  generic power domains (genpd) framework, the ACPI device power
  management, the core system-wide suspend code and power management
  utilities.

  Specifics:

   - Use local_clock() instead of jiffies in the cpufreq statistics to
     improve accuracy (Viresh Kumar).

   - Fix up OPP usage in the cpufreq-dt and qcom-cpufreq-nvmem cpufreq
     drivers (Viresh Kumar).

   - Clean up the cpufreq core, the intel_pstate driver and the
     schedutil cpufreq governor (Rafael Wysocki).

   - Fix up error code paths in the sti-cpufreq and mediatek cpufreq
     drivers (Yangtao Li, Qinglang Miao).

   - Fix cpufreq_online() to return error codes instead of success (0)
     in all cases when it fails (Wang ShaoBo).

   - Add mt8167 support to the mediatek cpufreq driver and blacklist
     mt8516 in the cpufreq-dt-platdev driver (Fabien Parent).

   - Modify the tegra194 cpufreq driver to always return values from the
     frequency table as the current frequency and clean up that driver
     (Sumit Gupta, Jon Hunter).

   - Modify the arm_scmi cpufreq driver to allow it to discover the
     power scale present in the performance protocol and provide this
     information to the Energy Model (Lukasz Luba).

   - Add missing MODULE_DEVICE_TABLE to several cpufreq drivers (Pali
     Rohár).

   - Clean up the CPPC cpufreq driver (Ionela Voinescu).

   - Fix NVMEM_IMX_OCOTP dependency in the imx cpufreq driver (Arnd
     Bergmann).

   - Rework the poling interval selection for the polling state in
     cpuidle (Mel Gorman).

   - Enable suspend-to-idle for PSCI OSI mode in the PSCI cpuidle driver
     (Ulf Hansson).

   - Modify the OPP framework to support empty (node-less) OPP tables in
     DT for passing dependency information (Nicola Mazzucato).

   - Fix potential lockdep issue in the OPP core and clean up the OPP
     core (Viresh Kumar).

   - Modify dev_pm_opp_put_regulators() to accept a NULL argument and
     update its users accordingly (Viresh Kumar).

   - Add frequency changes tracepoint to devfreq (Matthias Kaehlcke).

   - Add support for governor feature flags to devfreq, make devfreq
     sysfs file permissions depend on the governor and clean up the
     devfreq core (Chanwoo Choi).

   - Clean up the tegra20 devfreq driver and deprecate it to allow
     another driver based on EMC_STAT to be used instead of it (Dmitry
     Osipenko).

   - Add interconnect support to the tegra30 devfreq driver, allow it to
     take the interconnect and OPP information from DT and clean it up
     (Dmitry Osipenko).

   - Add interconnect support to the exynos-bus devfreq driver along
     with interconnect properties documentation (Sylwester Nawrocki).

   - Add suport for AMD Fam17h and Fam19h processors to the RAPL power
     capping driver (Victor Ding, Kim Phillips).

   - Fix handling of overly long constraint names in the powercap
     framework (Lukasz Luba).

   - Fix the wakeup configuration handling for bridges in the ACPI
     device power management core (Rafael Wysocki).

   - Add support for using an abstract scale for power units in the
     Energy Model (EM) and document it (Lukasz Luba).

   - Add em_cpu_energy() micro-optimization to the EM (Pavankumar
     Kondeti).

   - Modify the generic power domains (genpd) framwework to support
     suspend-to-idle (Ulf Hansson).

   - Fix creation of debugfs nodes in genpd (Thierry Strudel).

   - Clean up genpd (Lina Iyer).

   - Clean up the core system-wide suspend code and make it print driver
     flags for devices with debug enabled (Alex Shi, Patrice Chotard,
     Chen Yu).

   - Modify the ACPI system reboot code to make it prepare for system
     power off to avoid confusing the platform firmware (Kai-Heng Feng).

   - Update the pm-graph (multiple changes, mostly usability-related)
     and cpupower (online and offline CPU information support) PM
     utilities (Todd Brandt, Brahadambal Srinivasan)"

* tag 'pm-5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/rafael/linux-pm: (86 commits)
  cpufreq: Fix cpufreq_online() return value on errors
  cpufreq: Fix up several kerneldoc comments
  cpufreq: stats: Use local_clock() instead of jiffies
  cpufreq: schedutil: Simplify sugov_update_next_freq()
  cpufreq: intel_pstate: Simplify intel_cpufreq_update_pstate()
  PM: domains: create debugfs nodes when adding power domains
  opp: of: Allow empty opp-table with opp-shared
  dt-bindings: opp: Allow empty OPP tables
  media: venus: dev_pm_opp_put_*() accepts NULL argument
  drm/panfrost: dev_pm_opp_put_*() accepts NULL argument
  drm/lima: dev_pm_opp_put_*() accepts NULL argument
  PM / devfreq: exynos: dev_pm_opp_put_*() accepts NULL argument
  cpufreq: qcom-cpufreq-nvmem: dev_pm_opp_put_*() accepts NULL argument
  cpufreq: dt: dev_pm_opp_put_regulators() accepts NULL argument
  opp: Allow dev_pm_opp_put_*() APIs to accept NULL opp_table
  opp: Don't create an OPP table from dev_pm_opp_get_opp_table()
  cpufreq: dt: Don't (ab)use dev_pm_opp_get_opp_table() to create OPP table
  opp: Reduce the size of critical section in _opp_kref_release()
  PM / EM: Micro optimization in em_cpu_energy
  cpufreq: arm_scmi: Discover the power scale in performance protocol
  ...

1  2 
MAINTAINERS
arch/x86/include/asm/msr-index.h
drivers/clocksource/sh_cmt.c
drivers/gpu/drm/lima/lima_devfreq.c
drivers/gpu/drm/panfrost/panfrost_devfreq.c
drivers/media/platform/qcom/venus/pm_helpers.c
include/linux/scmi_protocol.h
kernel/sched/cpufreq_schedutil.c
tools/power/cpupower/utils/helpers/helpers.h
tools/power/cpupower/utils/helpers/misc.c

diff --cc MAINTAINERS
Simple merge
Simple merge
Simple merge
index da7099d20bd5c11d307aacad390e14ac5aa29a38,e7b7b8dfd7928e919780a066d57f2ff316cefa81..5686ad4aaf7c11d6ba70c432a787c6599b1d2140
@@@ -100,17 -105,15 +100,12 @@@ void lima_devfreq_fini(struct lima_devi
                devfreq->devfreq = NULL;
        }
  
 -      if (devfreq->opp_of_table_added) {
 -              dev_pm_opp_of_remove_table(ldev->dev);
 -              devfreq->opp_of_table_added = false;
 -      }
 +      dev_pm_opp_of_remove_table(ldev->dev);
  
-       if (devfreq->regulators_opp_table) {
-               dev_pm_opp_put_regulators(devfreq->regulators_opp_table);
-               devfreq->regulators_opp_table = NULL;
-       }
-       if (devfreq->clkname_opp_table) {
-               dev_pm_opp_put_clkname(devfreq->clkname_opp_table);
-               devfreq->clkname_opp_table = NULL;
-       }
+       dev_pm_opp_put_regulators(devfreq->regulators_opp_table);
+       dev_pm_opp_put_clkname(devfreq->clkname_opp_table);
+       devfreq->regulators_opp_table = NULL;
+       devfreq->clkname_opp_table = NULL;
  }
  
  int lima_devfreq_init(struct lima_device *ldev)
Simple merge
Simple merge
index e8f8f643a627f03dd4c4bf3043a09d837fb5bbe1,2ead98169cf58f195162bebfd6dbb6c20f1999cc..650b9a9a6584fe9b5547dc129e3682ee617e864d
@@@ -1,16 -1,12 +1,16 @@@
  // SPDX-License-Identifier: GPL-2.0
  
  #include <stdio.h>
 +#include <errno.h>
  #include <stdlib.h>
  
- #if defined(__i386__) || defined(__x86_64__)
  #include "helpers/helpers.h"
 +#include "helpers/sysfs.h"
  
+ #if defined(__i386__) || defined(__x86_64__)
 +#include "cpupower_intern.h"
 +
  #define MSR_AMD_HWCR  0xc0010015
  
  int cpufreq_has_boost_support(unsigned int cpu, int *support, int *active,
                *support = *active = 1;
        return 0;
  }
 +
 +int cpupower_intel_get_perf_bias(unsigned int cpu)
 +{
 +      char linebuf[MAX_LINE_LEN];
 +      char path[SYSFS_PATH_MAX];
 +      unsigned long val;
 +      char *endp;
 +
 +      if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS))
 +              return -1;
 +
 +      snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/power/energy_perf_bias", cpu);
 +
 +      if (cpupower_read_sysfs(path, linebuf, MAX_LINE_LEN) == 0)
 +              return -1;
 +
 +      val = strtol(linebuf, &endp, 0);
 +      if (endp == linebuf || errno == ERANGE)
 +              return -1;
 +
 +      return val;
 +}
 +
 +int cpupower_intel_set_perf_bias(unsigned int cpu, unsigned int val)
 +{
 +      char path[SYSFS_PATH_MAX];
 +      char linebuf[3] = {};
 +
 +      if (!(cpupower_cpu_info.caps & CPUPOWER_CAP_PERF_BIAS))
 +              return -1;
 +
 +      snprintf(path, sizeof(path), PATH_TO_CPU "cpu%u/power/energy_perf_bias", cpu);
 +      snprintf(linebuf, sizeof(linebuf), "%d", val);
 +
 +      if (cpupower_write_sysfs(path, linebuf, 3) <= 0)
 +              return -1;
 +
 +      return 0;
 +}
 +
  #endif /* #if defined(__i386__) || defined(__x86_64__) */
+ /* get_cpustate
+  *
+  * Gather the information of all online CPUs into bitmask struct
+  */
+ void get_cpustate(void)
+ {
+       unsigned int cpu = 0;
+       bitmask_clearall(online_cpus);
+       bitmask_clearall(offline_cpus);
+       for (cpu = bitmask_first(cpus_chosen);
+               cpu <= bitmask_last(cpus_chosen); cpu++) {
+               if (cpupower_is_cpu_online(cpu) == 1)
+                       bitmask_setbit(online_cpus, cpu);
+               else
+                       bitmask_setbit(offline_cpus, cpu);
+               continue;
+       }
+ }
+ /* print_online_cpus
+  *
+  * Print the CPU numbers of all CPUs that are online currently
+  */
+ void print_online_cpus(void)
+ {
+       int str_len = 0;
+       char *online_cpus_str = NULL;
+       str_len = online_cpus->size * 5;
+       online_cpus_str = (void *)malloc(sizeof(char) * str_len);
+       if (!bitmask_isallclear(online_cpus)) {
+               bitmask_displaylist(online_cpus_str, str_len, online_cpus);
+               printf(_("Following CPUs are online:\n%s\n"), online_cpus_str);
+       }
+ }
+ /* print_offline_cpus
+  *
+  * Print the CPU numbers of all CPUs that are offline currently
+  */
+ void print_offline_cpus(void)
+ {
+       int str_len = 0;
+       char *offline_cpus_str = NULL;
+       str_len = offline_cpus->size * 5;
+       offline_cpus_str = (void *)malloc(sizeof(char) * str_len);
+       if (!bitmask_isallclear(offline_cpus)) {
+               bitmask_displaylist(offline_cpus_str, str_len, offline_cpus);
+               printf(_("Following CPUs are offline:\n%s\n"), offline_cpus_str);
+               printf(_("cpupower set operation was not performed on them\n"));
+       }
+ }