]> Git Repo - linux.git/commitdiff
Merge branches 'pm-sleep', 'pm-acpi', 'pm-domains' and 'powercap'
authorRafael J. Wysocki <[email protected]>
Tue, 15 Dec 2020 14:26:14 +0000 (15:26 +0100)
committerRafael J. Wysocki <[email protected]>
Tue, 15 Dec 2020 14:26:14 +0000 (15:26 +0100)
* pm-sleep:
  PM: sleep: Add dev_wakeup_path() helper
  PM / suspend: fix kernel-doc markup
  PM: sleep: Print driver flags for all devices during suspend/resume

* pm-acpi:
  PM: ACPI: Refresh wakeup device power configuration every time
  PM: ACPI: PCI: Drop acpi_pm_set_bridge_wakeup()
  PM: ACPI: reboot: Use S5 for reboot

* pm-domains:
  PM: domains: create debugfs nodes when adding power domains
  PM: domains: replace -ENOTSUPP with -EOPNOTSUPP

* powercap:
  powercap: Adjust printing the constraint name with new line
  powercap: RAPL: Add AMD Fam19h RAPL support
  powercap: Add AMD Fam17h RAPL support
  powercap/intel_rapl_msr: Convert rapl_msr_priv into pointer
  x86/msr-index: sort AMD RAPL MSRs by address

1  2  3  4  5 
drivers/base/power/domain.c
drivers/powercap/powercap_sys.c
include/linux/pm_domain.h
kernel/reboot.c

index 52d292617401864994106bc5d3743cf9595e2100,e0894ef8457cd1d8d64192b56893e1e473cd8232,743268996336db7dedc1f1bba6393ded3e6fd26b,bd4e0051e846b6b2d35586d886fa6a890438bd52,743268996336db7dedc1f1bba6393ded3e6fd26b..9a14eedacb92abe557bf217263921821dd63f45b
     #include <linux/suspend.h>
     #include <linux/export.h>
     #include <linux/cpu.h>
+++ +#include <linux/debugfs.h>
     
     #include "power.h"
     
@@@@@@ -210,6 -210,6 -210,6 -211,18 -210,6 +211,18 @@@@@@ static void genpd_sd_counter_inc(struc
     }
     
     #ifdef CONFIG_DEBUG_FS
+++ +static struct dentry *genpd_debugfs_dir;
+++ +
+++ +static void genpd_debug_add(struct generic_pm_domain *genpd);
+++ +
+++ +static void genpd_debug_remove(struct generic_pm_domain *genpd)
+++ +{
+++ +   struct dentry *d;
+++ +
+++ +   d = debugfs_lookup(genpd->name, genpd_debugfs_dir);
+++ +   debugfs_remove(d);
+++ +}
+++ +
     static void genpd_update_accounting(struct generic_pm_domain *genpd)
     {
        ktime_t delta, now;
        genpd->accounting_time = now;
     }
     #else
+++ +static inline void genpd_debug_add(struct generic_pm_domain *genpd) {}
+++ +static inline void genpd_debug_remove(struct generic_pm_domain *genpd) {}
     static inline void genpd_update_accounting(struct generic_pm_domain *genpd) {}
     #endif
     
@@@@@@ -1142,7 -1142,7 -1142,7 -1157,7 -1142,7 +1157,7 @@@@@@ static int genpd_finish_suspend(struct 
        if (ret)
                return ret;
     
- ---   if (dev->power.wakeup_path && genpd_is_active_wakeup(genpd))
+ +++   if (device_wakeup_path(dev) && genpd_is_active_wakeup(genpd))
                return 0;
     
        if (genpd->dev_ops.stop && genpd->dev_ops.start &&
@@@@@@ -1196,7 -1196,7 -1196,7 -1211,7 -1196,7 +1211,7 @@@@@@ static int genpd_resume_noirq(struct de
        if (IS_ERR(genpd))
                return -EINVAL;
     
- ---   if (dev->power.wakeup_path && genpd_is_active_wakeup(genpd))
+ +++   if (device_wakeup_path(dev) && genpd_is_active_wakeup(genpd))
                return pm_generic_resume_noirq(dev);
     
        genpd_lock(genpd);
@@@@@@ -1363,60 -1363,41 -1363,41 -1378,41 -1363,41 +1378,60 @@@@@@ static void genpd_complete(struct devic
        genpd_unlock(genpd);
     }
     
 ----/**
 ---- * genpd_syscore_switch - Switch power during system core suspend or resume.
 ---- * @dev: Device that normally is marked as "always on" to switch power for.
 ---- *
 ---- * This routine may only be called during the system core (syscore) suspend or
 ---- * resume phase for devices whose "always on" flags are set.
 ---- */
 ----static void genpd_syscore_switch(struct device *dev, bool suspend)
 ++++static void genpd_switch_state(struct device *dev, bool suspend)
     {
        struct generic_pm_domain *genpd;
 ++++   bool use_lock;
     
        genpd = dev_to_genpd_safe(dev);
        if (!genpd)
                return;
     
 ++++   use_lock = genpd_is_irq_safe(genpd);
 ++++
 ++++   if (use_lock)
 ++++           genpd_lock(genpd);
 ++++
        if (suspend) {
                genpd->suspended_count++;
 ----           genpd_sync_power_off(genpd, false, 0);
 ++++           genpd_sync_power_off(genpd, use_lock, 0);
        } else {
 ----           genpd_sync_power_on(genpd, false, 0);
 ++++           genpd_sync_power_on(genpd, use_lock, 0);
                genpd->suspended_count--;
        }
 ++++
 ++++   if (use_lock)
 ++++           genpd_unlock(genpd);
     }
     
 ----void pm_genpd_syscore_poweroff(struct device *dev)
 ++++/**
 ++++ * dev_pm_genpd_suspend - Synchronously try to suspend the genpd for @dev
 ++++ * @dev: The device that is attached to the genpd, that can be suspended.
 ++++ *
 ++++ * This routine should typically be called for a device that needs to be
 ++++ * suspended during the syscore suspend phase. It may also be called during
 ++++ * suspend-to-idle to suspend a corresponding CPU device that is attached to a
 ++++ * genpd.
 ++++ */
 ++++void dev_pm_genpd_suspend(struct device *dev)
     {
 ----   genpd_syscore_switch(dev, true);
 ++++   genpd_switch_state(dev, true);
     }
 ----EXPORT_SYMBOL_GPL(pm_genpd_syscore_poweroff);
 ++++EXPORT_SYMBOL_GPL(dev_pm_genpd_suspend);
     
 ----void pm_genpd_syscore_poweron(struct device *dev)
 ++++/**
 ++++ * dev_pm_genpd_resume - Synchronously try to resume the genpd for @dev
 ++++ * @dev: The device that is attached to the genpd, which needs to be resumed.
 ++++ *
 ++++ * This routine should typically be called for a device that needs to be resumed
 ++++ * during the syscore resume phase. It may also be called during suspend-to-idle
 ++++ * to resume a corresponding CPU device that is attached to a genpd.
 ++++ */
 ++++void dev_pm_genpd_resume(struct device *dev)
     {
 ----   genpd_syscore_switch(dev, false);
 ++++   genpd_switch_state(dev, false);
     }
 ----EXPORT_SYMBOL_GPL(pm_genpd_syscore_poweron);
 ++++EXPORT_SYMBOL_GPL(dev_pm_genpd_resume);
     
     #else /* !CONFIG_PM_SLEEP */
     
@@@@@@ -1973,6 -1954,6 -1954,6 -1969,7 -1954,6 +1988,7 @@@@@@ int pm_genpd_init(struct generic_pm_dom
     
        mutex_lock(&gpd_list_lock);
        list_add(&genpd->gpd_list_node, &gpd_list);
+++ +   genpd_debug_add(genpd);
        mutex_unlock(&gpd_list_lock);
     
        return 0;
@@@@@@ -2006,6 -1987,6 -1987,6 -2003,7 -1987,6 +2022,7 @@@@@@ static int genpd_remove(struct generic_
                kfree(link);
        }
     
+++ +   genpd_debug_remove(genpd);
        list_del(&genpd->gpd_list_node);
        genpd_unlock(genpd);
        cancel_work_sync(&genpd->power_off_work);
@@@@@@ -2268,7 -2249,7 -2249,7 -2266,7 -2249,7 +2285,7 @@@@@@ int of_genpd_add_provider_onecell(struc
                         * Save table for faster processing while setting
                         * performance state.
                         */
 ----                   genpd->opp_table = dev_pm_opp_get_opp_table_indexed(&genpd->dev, i);
 ++++                   genpd->opp_table = dev_pm_opp_get_opp_table(&genpd->dev);
                        WARN_ON(IS_ERR(genpd->opp_table));
                }
     
@@@@@@ -2912,14 -2893,14 -2893,14 -2910,6 -2893,14 +2929,6 @@@@@@ core_initcall(genpd_bus_init)
     /***        debugfs support        ***/
     
     #ifdef CONFIG_DEBUG_FS
--- -#include <linux/pm.h>
--- -#include <linux/device.h>
--- -#include <linux/debugfs.h>
--- -#include <linux/seq_file.h>
--- -#include <linux/init.h>
--- -#include <linux/kobject.h>
--- -static struct dentry *genpd_debugfs_dir;
--- -
     /*
      * TODO: This function is a slightly modified version of rtpm_status_show
      * from sysfs.c, so generalize it.
@@@@@@ -3196,9 -3177,9 -3177,9 -3186,34 -3177,9 +3205,34 @@@@@@ DEFINE_SHOW_ATTRIBUTE(total_idle_time)
     DEFINE_SHOW_ATTRIBUTE(devices);
     DEFINE_SHOW_ATTRIBUTE(perf_state);
     
--- -static int __init genpd_debug_init(void)
+++ +static void genpd_debug_add(struct generic_pm_domain *genpd)
     {
        struct dentry *d;
+++ +
+++ +   if (!genpd_debugfs_dir)
+++ +           return;
+++ +
+++ +   d = debugfs_create_dir(genpd->name, genpd_debugfs_dir);
+++ +
+++ +   debugfs_create_file("current_state", 0444,
+++ +                       d, genpd, &status_fops);
+++ +   debugfs_create_file("sub_domains", 0444,
+++ +                       d, genpd, &sub_domains_fops);
+++ +   debugfs_create_file("idle_states", 0444,
+++ +                       d, genpd, &idle_states_fops);
+++ +   debugfs_create_file("active_time", 0444,
+++ +                       d, genpd, &active_time_fops);
+++ +   debugfs_create_file("total_idle_time", 0444,
+++ +                       d, genpd, &total_idle_time_fops);
+++ +   debugfs_create_file("devices", 0444,
+++ +                       d, genpd, &devices_fops);
+++ +   if (genpd->set_performance_state)
+++ +           debugfs_create_file("perf_state", 0444,
+++ +                               d, genpd, &perf_state_fops);
+++ +}
+++ +
+++ +static int __init genpd_debug_init(void)
+++ +{
        struct generic_pm_domain *genpd;
     
        genpd_debugfs_dir = debugfs_create_dir("pm_genpd", NULL);
        debugfs_create_file("pm_genpd_summary", S_IRUGO, genpd_debugfs_dir,
                            NULL, &summary_fops);
     
--- -   list_for_each_entry(genpd, &gpd_list, gpd_list_node) {
--- -           d = debugfs_create_dir(genpd->name, genpd_debugfs_dir);
--- -
--- -           debugfs_create_file("current_state", 0444,
--- -                           d, genpd, &status_fops);
--- -           debugfs_create_file("sub_domains", 0444,
--- -                           d, genpd, &sub_domains_fops);
--- -           debugfs_create_file("idle_states", 0444,
--- -                           d, genpd, &idle_states_fops);
--- -           debugfs_create_file("active_time", 0444,
--- -                           d, genpd, &active_time_fops);
--- -           debugfs_create_file("total_idle_time", 0444,
--- -                           d, genpd, &total_idle_time_fops);
--- -           debugfs_create_file("devices", 0444,
--- -                           d, genpd, &devices_fops);
--- -           if (genpd->set_performance_state)
--- -                   debugfs_create_file("perf_state", 0444,
--- -                                       d, genpd, &perf_state_fops);
--- -   }
+++ +   list_for_each_entry(genpd, &gpd_list, gpd_list_node)
+++ +           genpd_debug_add(genpd);
     
        return 0;
     }
index 3f0b8e2ef3d46b88f2dddda3ef5a9b912483ec59,f808c5fa9838ce3b7cd8272b27c1aa38841c9f90,f808c5fa9838ce3b7cd8272b27c1aa38841c9f90,3f0b8e2ef3d46b88f2dddda3ef5a9b912483ec59,602c55287e7de67fb6202ddb73ae6e4ddf994322..f0654a932b3726e0f5174b07c29ba85de2d672b9
@@@@@@ -170,9 -170,9 -170,9 -170,9 -170,8 +170,8 @@@@@@ static ssize_t show_constraint_name(str
        if (pconst && pconst->ops && pconst->ops->get_name) {
                name = pconst->ops->get_name(power_zone, id);
                if (name) {
----                    snprintf(buf, POWERCAP_CONSTRAINT_NAME_LEN,
----                                                            "%s\n", name);
----                    buf[POWERCAP_CONSTRAINT_NAME_LEN] = '\0';
++++                    sprintf(buf, "%.*s\n", POWERCAP_CONSTRAINT_NAME_LEN - 1,
++++                            name);
                        len = strlen(buf);
                }
        }
@@@@@@ -367,9 -367,9 -367,9 -367,9 -366,9 +366,9 @@@@@@ static void create_power_zone_common_at
                                        &dev_attr_max_energy_range_uj.attr;
        if (power_zone->ops->get_energy_uj) {
                if (power_zone->ops->reset_energy_uj)
 -- -                   dev_attr_energy_uj.attr.mode = S_IWUSR | S_IRUGO;
 ++ +                   dev_attr_energy_uj.attr.mode = S_IWUSR | S_IRUSR;
                else
 -- -                   dev_attr_energy_uj.attr.mode = S_IRUGO;
 ++ +                   dev_attr_energy_uj.attr.mode = S_IRUSR;
                power_zone->zone_dev_attrs[count++] =
                                        &dev_attr_energy_uj.attr;
        }
index a8f93328daecbd210b387aedc4022316a2fb89c0,1ad0ec4814162ea59de337f238ce39bf16bc8d55,1ad0ec4814162ea59de337f238ce39bf16bc8d55,5fd20d117cbe975227adc8844c203c8403551483,1ad0ec4814162ea59de337f238ce39bf16bc8d55..2ca919ae8d3672904bcabb6a78b9043fb7d90131
@@@@@@ -255,24 -255,24 -255,24 -255,24 -255,24 +255,24 @@@@@@ static inline int pm_genpd_init(struct 
     }
     static inline int pm_genpd_remove(struct generic_pm_domain *genpd)
     {
--- -   return -ENOTSUPP;
+++ +   return -EOPNOTSUPP;
     }
     
     static inline int dev_pm_genpd_set_performance_state(struct device *dev,
                                                     unsigned int state)
     {
--- -   return -ENOTSUPP;
+++ +   return -EOPNOTSUPP;
     }
     
     static inline int dev_pm_genpd_add_notifier(struct device *dev,
                                            struct notifier_block *nb)
     {
--- -   return -ENOTSUPP;
+++ +   return -EOPNOTSUPP;
     }
     
     static inline int dev_pm_genpd_remove_notifier(struct device *dev)
     {
--- -   return -ENOTSUPP;
+++ +   return -EOPNOTSUPP;
     }
     
     #define simple_qos_governor                (*(struct dev_power_governor *)(NULL))
     #endif
     
     #ifdef CONFIG_PM_GENERIC_DOMAINS_SLEEP
 ----void pm_genpd_syscore_poweroff(struct device *dev);
 ----void pm_genpd_syscore_poweron(struct device *dev);
 ++++void dev_pm_genpd_suspend(struct device *dev);
 ++++void dev_pm_genpd_resume(struct device *dev);
     #else
 ----static inline void pm_genpd_syscore_poweroff(struct device *dev) {}
 ----static inline void pm_genpd_syscore_poweron(struct device *dev) {}
 ++++static inline void dev_pm_genpd_suspend(struct device *dev) {}
 ++++static inline void dev_pm_genpd_resume(struct device *dev) {}
     #endif
     
     /* OF PM domain providers */
@@@@@@ -325,13 -325,13 -325,13 -325,13 -325,13 +325,13 @@@@@@ struct device *genpd_dev_pm_attach_by_n
     static inline int of_genpd_add_provider_simple(struct device_node *np,
                                        struct generic_pm_domain *genpd)
     {
--- -   return -ENOTSUPP;
+++ +   return -EOPNOTSUPP;
     }
     
     static inline int of_genpd_add_provider_onecell(struct device_node *np,
                                        struct genpd_onecell_data *data)
     {
--- -   return -ENOTSUPP;
+++ +   return -EOPNOTSUPP;
     }
     
     static inline void of_genpd_del_provider(struct device_node *np) {}
@@@@@@ -387,7 -387,7 -387,7 -387,7 -387,7 +387,7 @@@@@@ static inline struct device *genpd_dev_
     static inline
     struct generic_pm_domain *of_genpd_remove_last(struct device_node *np)
     {
--- -   return ERR_PTR(-ENOTSUPP);
+++ +   return ERR_PTR(-EOPNOTSUPP);
     }
     #endif /* CONFIG_PM_GENERIC_DOMAINS_OF */
     
diff --combined kernel/reboot.c
index af6f23d8bea164f6929453bec3d9cc1fa7f92007,e7b78d5ae1abf8a0e207f662c95905030d09515c,7e5aa1f78693f51ca2f909ed5a846dd34cca058a,af6f23d8bea164f6929453bec3d9cc1fa7f92007,e7b78d5ae1abf8a0e207f662c95905030d09515c..2a18b76ffc06384180db67eb94beac6e29047365
@@@@@@ -244,6 -244,6 -244,8 -244,6 -244,6 +244,8 @@@@@@ void migrate_to_reboot_cpu(void
     void kernel_restart(char *cmd)
     {
        kernel_restart_prepare(cmd);
++ ++   if (pm_power_off_prepare)
++ ++           pm_power_off_prepare();
        migrate_to_reboot_cpu();
        syscore_shutdown();
        if (!cmd)
@@@@@@ -551,22 -551,22 -553,22 -551,22 -551,22 +553,22 @@@@@@ static int __init reboot_setup(char *st
                        break;
     
                case 's':
 -- -           {
 -- -                   int rc;
 -- -
 -- -                   if (isdigit(*(str+1))) {
 -- -                           rc = kstrtoint(str+1, 0, &reboot_cpu);
 -- -                           if (rc)
 -- -                                   return rc;
 -- -                   } else if (str[1] == 'm' && str[2] == 'p' &&
 -- -                              isdigit(*(str+3))) {
 -- -                           rc = kstrtoint(str+3, 0, &reboot_cpu);
 -- -                           if (rc)
 -- -                                   return rc;
 -- -                   } else
 ++ +                   if (isdigit(*(str+1)))
 ++ +                           reboot_cpu = simple_strtoul(str+1, NULL, 0);
 ++ +                   else if (str[1] == 'm' && str[2] == 'p' &&
 ++ +                                                   isdigit(*(str+3)))
 ++ +                           reboot_cpu = simple_strtoul(str+3, NULL, 0);
 ++ +                   else
                                *mode = REBOOT_SOFT;
 ++ +                   if (reboot_cpu >= num_possible_cpus()) {
 ++ +                           pr_err("Ignoring the CPU number in reboot= option. "
 ++ +                                  "CPU %d exceeds possible cpu number %d\n",
 ++ +                                  reboot_cpu, num_possible_cpus());
 ++ +                           reboot_cpu = 0;
 ++ +                           break;
 ++ +                   }
                        break;
 -- -           }
 ++ +
                case 'g':
                        *mode = REBOOT_GPIO;
                        break;
This page took 0.109448 seconds and 4 git commands to generate.