Merge branches 'pm-sleep', 'pm-acpi', 'pm-domains' and 'powercap'
* 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
This commit is contained in:
Коммит
42b4ca04cb
|
@ -326,8 +326,9 @@
|
|||
#define MSR_PP1_ENERGY_STATUS 0x00000641
|
||||
#define MSR_PP1_POLICY 0x00000642
|
||||
|
||||
#define MSR_AMD_PKG_ENERGY_STATUS 0xc001029b
|
||||
#define MSR_AMD_RAPL_POWER_UNIT 0xc0010299
|
||||
#define MSR_AMD_CORE_ENERGY_STATUS 0xc001029a
|
||||
#define MSR_AMD_PKG_ENERGY_STATUS 0xc001029b
|
||||
|
||||
/* Config TDP MSRs */
|
||||
#define MSR_CONFIG_TDP_NOMINAL 0x00000648
|
||||
|
|
|
@ -749,7 +749,7 @@ static void acpi_pm_notify_work_func(struct acpi_device_wakeup_context *context)
|
|||
static DEFINE_MUTEX(acpi_wakeup_lock);
|
||||
|
||||
static int __acpi_device_wakeup_enable(struct acpi_device *adev,
|
||||
u32 target_state, int max_count)
|
||||
u32 target_state)
|
||||
{
|
||||
struct acpi_device_wakeup *wakeup = &adev->wakeup;
|
||||
acpi_status status;
|
||||
|
@ -757,16 +757,27 @@ static int __acpi_device_wakeup_enable(struct acpi_device *adev,
|
|||
|
||||
mutex_lock(&acpi_wakeup_lock);
|
||||
|
||||
if (wakeup->enable_count >= max_count)
|
||||
/*
|
||||
* If the device wakeup power is already enabled, disable it and enable
|
||||
* it again in case it depends on the configuration of subordinate
|
||||
* devices and the conditions have changed since it was enabled last
|
||||
* time.
|
||||
*/
|
||||
if (wakeup->enable_count > 0)
|
||||
acpi_disable_wakeup_device_power(adev);
|
||||
|
||||
error = acpi_enable_wakeup_device_power(adev, target_state);
|
||||
if (error) {
|
||||
if (wakeup->enable_count > 0) {
|
||||
acpi_disable_gpe(wakeup->gpe_device, wakeup->gpe_number);
|
||||
wakeup->enable_count = 0;
|
||||
}
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (wakeup->enable_count > 0)
|
||||
goto inc;
|
||||
|
||||
error = acpi_enable_wakeup_device_power(adev, target_state);
|
||||
if (error)
|
||||
goto out;
|
||||
|
||||
status = acpi_enable_gpe(wakeup->gpe_device, wakeup->gpe_number);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
acpi_disable_wakeup_device_power(adev);
|
||||
|
@ -778,7 +789,10 @@ static int __acpi_device_wakeup_enable(struct acpi_device *adev,
|
|||
(unsigned int)wakeup->gpe_number);
|
||||
|
||||
inc:
|
||||
wakeup->enable_count++;
|
||||
if (wakeup->enable_count < INT_MAX)
|
||||
wakeup->enable_count++;
|
||||
else
|
||||
acpi_handle_info(adev->handle, "Wakeup enable count out of bounds!\n");
|
||||
|
||||
out:
|
||||
mutex_unlock(&acpi_wakeup_lock);
|
||||
|
@ -799,7 +813,7 @@ out:
|
|||
*/
|
||||
static int acpi_device_wakeup_enable(struct acpi_device *adev, u32 target_state)
|
||||
{
|
||||
return __acpi_device_wakeup_enable(adev, target_state, 1);
|
||||
return __acpi_device_wakeup_enable(adev, target_state);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -829,8 +843,12 @@ out:
|
|||
mutex_unlock(&acpi_wakeup_lock);
|
||||
}
|
||||
|
||||
static int __acpi_pm_set_device_wakeup(struct device *dev, bool enable,
|
||||
int max_count)
|
||||
/**
|
||||
* acpi_pm_set_device_wakeup - Enable/disable remote wakeup for given device.
|
||||
* @dev: Device to enable/disable to generate wakeup events.
|
||||
* @enable: Whether to enable or disable the wakeup functionality.
|
||||
*/
|
||||
int acpi_pm_set_device_wakeup(struct device *dev, bool enable)
|
||||
{
|
||||
struct acpi_device *adev;
|
||||
int error;
|
||||
|
@ -850,36 +868,14 @@ static int __acpi_pm_set_device_wakeup(struct device *dev, bool enable,
|
|||
return 0;
|
||||
}
|
||||
|
||||
error = __acpi_device_wakeup_enable(adev, acpi_target_system_state(),
|
||||
max_count);
|
||||
error = __acpi_device_wakeup_enable(adev, acpi_target_system_state());
|
||||
if (!error)
|
||||
dev_dbg(dev, "Wakeup enabled by ACPI\n");
|
||||
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
* acpi_pm_set_device_wakeup - Enable/disable remote wakeup for given device.
|
||||
* @dev: Device to enable/disable to generate wakeup events.
|
||||
* @enable: Whether to enable or disable the wakeup functionality.
|
||||
*/
|
||||
int acpi_pm_set_device_wakeup(struct device *dev, bool enable)
|
||||
{
|
||||
return __acpi_pm_set_device_wakeup(dev, enable, 1);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_pm_set_device_wakeup);
|
||||
|
||||
/**
|
||||
* acpi_pm_set_bridge_wakeup - Enable/disable remote wakeup for given bridge.
|
||||
* @dev: Bridge device to enable/disable to generate wakeup events.
|
||||
* @enable: Whether to enable or disable the wakeup functionality.
|
||||
*/
|
||||
int acpi_pm_set_bridge_wakeup(struct device *dev, bool enable)
|
||||
{
|
||||
return __acpi_pm_set_device_wakeup(dev, enable, INT_MAX);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(acpi_pm_set_bridge_wakeup);
|
||||
|
||||
/**
|
||||
* acpi_dev_pm_low_power - Put ACPI device into a low-power state.
|
||||
* @dev: Device to put into a low-power state.
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include <linux/suspend.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <linux/debugfs.h>
|
||||
|
||||
#include "power.h"
|
||||
|
||||
|
@ -210,6 +211,18 @@ static void genpd_sd_counter_inc(struct generic_pm_domain *genpd)
|
|||
}
|
||||
|
||||
#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;
|
||||
|
@ -234,6 +247,8 @@ static void genpd_update_accounting(struct generic_pm_domain *genpd)
|
|||
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 +1157,7 @@ static int genpd_finish_suspend(struct device *dev, bool poweroff)
|
|||
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 +1211,7 @@ static int genpd_resume_noirq(struct device *dev)
|
|||
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);
|
||||
|
@ -1973,6 +1988,7 @@ int pm_genpd_init(struct generic_pm_domain *genpd,
|
|||
|
||||
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 +2022,7 @@ static int genpd_remove(struct generic_pm_domain *genpd)
|
|||
kfree(link);
|
||||
}
|
||||
|
||||
genpd_debug_remove(genpd);
|
||||
list_del(&genpd->gpd_list_node);
|
||||
genpd_unlock(genpd);
|
||||
cancel_work_sync(&genpd->power_off_work);
|
||||
|
@ -2912,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 +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);
|
||||
|
@ -3206,25 +3240,8 @@ static int __init genpd_debug_init(void)
|
|||
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;
|
||||
}
|
||||
|
|
|
@ -441,9 +441,9 @@ static pm_callback_t pm_noirq_op(const struct dev_pm_ops *ops, pm_message_t stat
|
|||
|
||||
static void pm_dev_dbg(struct device *dev, pm_message_t state, const char *info)
|
||||
{
|
||||
dev_dbg(dev, "%s%s%s\n", info, pm_verb(state.event),
|
||||
dev_dbg(dev, "%s%s%s driver flags: %x\n", info, pm_verb(state.event),
|
||||
((state.event & PM_EVENT_SLEEP) && device_may_wakeup(dev)) ?
|
||||
", may wakeup" : "");
|
||||
", may wakeup" : "", dev->power.driver_flags);
|
||||
}
|
||||
|
||||
static void pm_dev_err(struct device *dev, pm_message_t state, const char *info,
|
||||
|
@ -1359,7 +1359,7 @@ static void dpm_propagate_wakeup_to_parent(struct device *dev)
|
|||
|
||||
spin_lock_irq(&parent->power.lock);
|
||||
|
||||
if (dev->power.wakeup_path && !parent->power.ignore_children)
|
||||
if (device_wakeup_path(dev) && !parent->power.ignore_children)
|
||||
parent->power.wakeup_path = true;
|
||||
|
||||
spin_unlock_irq(&parent->power.lock);
|
||||
|
@ -1627,7 +1627,7 @@ static int __device_suspend(struct device *dev, pm_message_t state, bool async)
|
|||
goto Complete;
|
||||
|
||||
/* Avoid direct_complete to let wakeup_path propagate. */
|
||||
if (device_may_wakeup(dev) || dev->power.wakeup_path)
|
||||
if (device_may_wakeup(dev) || device_wakeup_path(dev))
|
||||
dev->power.direct_complete = false;
|
||||
|
||||
if (dev->power.direct_complete) {
|
||||
|
|
|
@ -2322,7 +2322,7 @@ static int stm32f7_i2c_suspend(struct device *dev)
|
|||
|
||||
i2c_mark_adapter_suspended(&i2c_dev->adap);
|
||||
|
||||
if (!device_may_wakeup(dev) && !dev->power.wakeup_path) {
|
||||
if (!device_may_wakeup(dev) && !device_wakeup_path(dev)) {
|
||||
ret = stm32f7_i2c_regs_backup(i2c_dev);
|
||||
if (ret < 0) {
|
||||
i2c_mark_adapter_resumed(&i2c_dev->adap);
|
||||
|
@ -2341,7 +2341,7 @@ static int stm32f7_i2c_resume(struct device *dev)
|
|||
struct stm32f7_i2c_dev *i2c_dev = dev_get_drvdata(dev);
|
||||
int ret;
|
||||
|
||||
if (!device_may_wakeup(dev) && !dev->power.wakeup_path) {
|
||||
if (!device_may_wakeup(dev) && !device_wakeup_path(dev)) {
|
||||
ret = pm_runtime_force_resume(dev);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
|
|
@ -1060,7 +1060,7 @@ static int acpi_pci_propagate_wakeup(struct pci_bus *bus, bool enable)
|
|||
{
|
||||
while (bus->parent) {
|
||||
if (acpi_pm_device_can_wakeup(&bus->self->dev))
|
||||
return acpi_pm_set_bridge_wakeup(&bus->self->dev, enable);
|
||||
return acpi_pm_set_device_wakeup(&bus->self->dev, enable);
|
||||
|
||||
bus = bus->parent;
|
||||
}
|
||||
|
@ -1068,7 +1068,7 @@ static int acpi_pci_propagate_wakeup(struct pci_bus *bus, bool enable)
|
|||
/* We have reached the root bus. */
|
||||
if (bus->bridge) {
|
||||
if (acpi_pm_device_can_wakeup(bus->bridge))
|
||||
return acpi_pm_set_bridge_wakeup(bus->bridge, enable);
|
||||
return acpi_pm_set_device_wakeup(bus->bridge, enable);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1011,6 +1011,10 @@ static const struct rapl_defaults rapl_defaults_cht = {
|
|||
.compute_time_window = rapl_compute_time_window_atom,
|
||||
};
|
||||
|
||||
static const struct rapl_defaults rapl_defaults_amd = {
|
||||
.check_unit = rapl_check_unit_core,
|
||||
};
|
||||
|
||||
static const struct x86_cpu_id rapl_ids[] __initconst = {
|
||||
X86_MATCH_INTEL_FAM6_MODEL(SANDYBRIDGE, &rapl_defaults_core),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(SANDYBRIDGE_X, &rapl_defaults_core),
|
||||
|
@ -1061,6 +1065,9 @@ static const struct x86_cpu_id rapl_ids[] __initconst = {
|
|||
|
||||
X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNL, &rapl_defaults_hsw_server),
|
||||
X86_MATCH_INTEL_FAM6_MODEL(XEON_PHI_KNM, &rapl_defaults_hsw_server),
|
||||
|
||||
X86_MATCH_VENDOR_FAM(AMD, 0x17, &rapl_defaults_amd),
|
||||
X86_MATCH_VENDOR_FAM(AMD, 0x19, &rapl_defaults_amd),
|
||||
{}
|
||||
};
|
||||
MODULE_DEVICE_TABLE(x86cpu, rapl_ids);
|
||||
|
|
|
@ -31,7 +31,9 @@
|
|||
#define MSR_VR_CURRENT_CONFIG 0x00000601
|
||||
|
||||
/* private data for RAPL MSR Interface */
|
||||
static struct rapl_if_priv rapl_msr_priv = {
|
||||
static struct rapl_if_priv *rapl_msr_priv;
|
||||
|
||||
static struct rapl_if_priv rapl_msr_priv_intel = {
|
||||
.reg_unit = MSR_RAPL_POWER_UNIT,
|
||||
.regs[RAPL_DOMAIN_PACKAGE] = {
|
||||
MSR_PKG_POWER_LIMIT, MSR_PKG_ENERGY_STATUS, MSR_PKG_PERF_STATUS, 0, MSR_PKG_POWER_INFO },
|
||||
|
@ -47,6 +49,14 @@ static struct rapl_if_priv rapl_msr_priv = {
|
|||
.limits[RAPL_DOMAIN_PLATFORM] = 2,
|
||||
};
|
||||
|
||||
static struct rapl_if_priv rapl_msr_priv_amd = {
|
||||
.reg_unit = MSR_AMD_RAPL_POWER_UNIT,
|
||||
.regs[RAPL_DOMAIN_PACKAGE] = {
|
||||
0, MSR_AMD_PKG_ENERGY_STATUS, 0, 0, 0 },
|
||||
.regs[RAPL_DOMAIN_PP0] = {
|
||||
0, MSR_AMD_CORE_ENERGY_STATUS, 0, 0, 0 },
|
||||
};
|
||||
|
||||
/* Handles CPU hotplug on multi-socket systems.
|
||||
* If a CPU goes online as the first CPU of the physical package
|
||||
* we add the RAPL package to the system. Similarly, when the last
|
||||
|
@ -58,9 +68,9 @@ static int rapl_cpu_online(unsigned int cpu)
|
|||
{
|
||||
struct rapl_package *rp;
|
||||
|
||||
rp = rapl_find_package_domain(cpu, &rapl_msr_priv);
|
||||
rp = rapl_find_package_domain(cpu, rapl_msr_priv);
|
||||
if (!rp) {
|
||||
rp = rapl_add_package(cpu, &rapl_msr_priv);
|
||||
rp = rapl_add_package(cpu, rapl_msr_priv);
|
||||
if (IS_ERR(rp))
|
||||
return PTR_ERR(rp);
|
||||
}
|
||||
|
@ -73,7 +83,7 @@ static int rapl_cpu_down_prep(unsigned int cpu)
|
|||
struct rapl_package *rp;
|
||||
int lead_cpu;
|
||||
|
||||
rp = rapl_find_package_domain(cpu, &rapl_msr_priv);
|
||||
rp = rapl_find_package_domain(cpu, rapl_msr_priv);
|
||||
if (!rp)
|
||||
return 0;
|
||||
|
||||
|
@ -136,40 +146,51 @@ static int rapl_msr_probe(struct platform_device *pdev)
|
|||
const struct x86_cpu_id *id = x86_match_cpu(pl4_support_ids);
|
||||
int ret;
|
||||
|
||||
rapl_msr_priv.read_raw = rapl_msr_read_raw;
|
||||
rapl_msr_priv.write_raw = rapl_msr_write_raw;
|
||||
switch (boot_cpu_data.x86_vendor) {
|
||||
case X86_VENDOR_INTEL:
|
||||
rapl_msr_priv = &rapl_msr_priv_intel;
|
||||
break;
|
||||
case X86_VENDOR_AMD:
|
||||
rapl_msr_priv = &rapl_msr_priv_amd;
|
||||
break;
|
||||
default:
|
||||
pr_err("intel-rapl does not support CPU vendor %d\n", boot_cpu_data.x86_vendor);
|
||||
return -ENODEV;
|
||||
}
|
||||
rapl_msr_priv->read_raw = rapl_msr_read_raw;
|
||||
rapl_msr_priv->write_raw = rapl_msr_write_raw;
|
||||
|
||||
if (id) {
|
||||
rapl_msr_priv.limits[RAPL_DOMAIN_PACKAGE] = 3;
|
||||
rapl_msr_priv.regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_PL4] =
|
||||
rapl_msr_priv->limits[RAPL_DOMAIN_PACKAGE] = 3;
|
||||
rapl_msr_priv->regs[RAPL_DOMAIN_PACKAGE][RAPL_DOMAIN_REG_PL4] =
|
||||
MSR_VR_CURRENT_CONFIG;
|
||||
pr_info("PL4 support detected.\n");
|
||||
}
|
||||
|
||||
rapl_msr_priv.control_type = powercap_register_control_type(NULL, "intel-rapl", NULL);
|
||||
if (IS_ERR(rapl_msr_priv.control_type)) {
|
||||
rapl_msr_priv->control_type = powercap_register_control_type(NULL, "intel-rapl", NULL);
|
||||
if (IS_ERR(rapl_msr_priv->control_type)) {
|
||||
pr_debug("failed to register powercap control_type.\n");
|
||||
return PTR_ERR(rapl_msr_priv.control_type);
|
||||
return PTR_ERR(rapl_msr_priv->control_type);
|
||||
}
|
||||
|
||||
ret = cpuhp_setup_state(CPUHP_AP_ONLINE_DYN, "powercap/rapl:online",
|
||||
rapl_cpu_online, rapl_cpu_down_prep);
|
||||
if (ret < 0)
|
||||
goto out;
|
||||
rapl_msr_priv.pcap_rapl_online = ret;
|
||||
rapl_msr_priv->pcap_rapl_online = ret;
|
||||
|
||||
return 0;
|
||||
|
||||
out:
|
||||
if (ret)
|
||||
powercap_unregister_control_type(rapl_msr_priv.control_type);
|
||||
powercap_unregister_control_type(rapl_msr_priv->control_type);
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int rapl_msr_remove(struct platform_device *pdev)
|
||||
{
|
||||
cpuhp_remove_state(rapl_msr_priv.pcap_rapl_online);
|
||||
powercap_unregister_control_type(rapl_msr_priv.control_type);
|
||||
cpuhp_remove_state(rapl_msr_priv->pcap_rapl_online);
|
||||
powercap_unregister_control_type(rapl_msr_priv->control_type);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -170,9 +170,8 @@ static ssize_t show_constraint_name(struct device *dev,
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -620,7 +620,6 @@ acpi_status acpi_remove_pm_notifier(struct acpi_device *adev);
|
|||
bool acpi_pm_device_can_wakeup(struct device *dev);
|
||||
int acpi_pm_device_sleep_state(struct device *, int *, int);
|
||||
int acpi_pm_set_device_wakeup(struct device *dev, bool enable);
|
||||
int acpi_pm_set_bridge_wakeup(struct device *dev, bool enable);
|
||||
#else
|
||||
static inline void acpi_pm_wakeup_event(struct device *dev)
|
||||
{
|
||||
|
@ -651,10 +650,6 @@ static inline int acpi_pm_set_device_wakeup(struct device *dev, bool enable)
|
|||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
static inline int acpi_pm_set_bridge_wakeup(struct device *dev, bool enable)
|
||||
{
|
||||
return -ENODEV;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_ACPI_SYSTEM_POWER_STATES_SUPPORT
|
||||
|
|
|
@ -255,24 +255,24 @@ static inline int pm_genpd_init(struct generic_pm_domain *genpd,
|
|||
}
|
||||
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))
|
||||
|
@ -325,13 +325,13 @@ struct device *genpd_dev_pm_attach_by_name(struct device *dev,
|
|||
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 @@ static inline struct device *genpd_dev_pm_attach_by_name(struct device *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 */
|
||||
|
||||
|
|
|
@ -84,6 +84,11 @@ static inline bool device_may_wakeup(struct device *dev)
|
|||
return dev->power.can_wakeup && !!dev->power.wakeup;
|
||||
}
|
||||
|
||||
static inline bool device_wakeup_path(struct device *dev)
|
||||
{
|
||||
return dev->power.wakeup_path;
|
||||
}
|
||||
|
||||
static inline void device_set_wakeup_path(struct device *dev)
|
||||
{
|
||||
dev->power.wakeup_path = true;
|
||||
|
@ -174,6 +179,11 @@ static inline bool device_may_wakeup(struct device *dev)
|
|||
return dev->power.can_wakeup && dev->power.should_wakeup;
|
||||
}
|
||||
|
||||
static inline bool device_wakeup_path(struct device *dev)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
static inline void device_set_wakeup_path(struct device *dev) {}
|
||||
|
||||
static inline void __pm_stay_awake(struct wakeup_source *ws) {}
|
||||
|
|
|
@ -224,6 +224,7 @@ EXPORT_SYMBOL_GPL(suspend_set_ops);
|
|||
|
||||
/**
|
||||
* suspend_valid_only_mem - Generic memory-only valid callback.
|
||||
* @state: Target system sleep state.
|
||||
*
|
||||
* Platform drivers that implement mem suspend only and only need to check for
|
||||
* that in their .valid() callback can use this instead of rolling their own
|
||||
|
@ -335,6 +336,7 @@ static int suspend_test(int level)
|
|||
|
||||
/**
|
||||
* suspend_prepare - Prepare for entering system sleep state.
|
||||
* @state: Target system sleep state.
|
||||
*
|
||||
* Common code run for every system sleep state that can be entered (except for
|
||||
* hibernation). Run suspend notifiers, allocate the "suspend" console and
|
||||
|
|
|
@ -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)
|
||||
|
|
Загрузка…
Ссылка в новой задаче