mirror of
https://github.com/tbsdtv/linux_media.git
synced 2025-07-23 20:51:03 +02:00
Merge branches 'pm-sleep' and 'pm-domains'
Merge updates related to system-wide power management and generic power domains (genpd) updates for 6.5-rc1: - Fix the handling of pm_suspend_target_state when CONFIG_PM is unset (Kai-Heng Feng). - Correct spelling mistake in a comment in the hibernation code (Wang Honghui). - Add arch_resume_nosmt() prototype to avoid a "missing prototypes" build warning (Arnd Bergmann). - Restrict pm_pr_dbg() to system-wide power transitions and use it in a few additional places (Mario Limonciello). - Drop verification of in-params from genpd_add_device() and ensure that all of its callers will do it (Ulf Hansson). - Prevent possible integer overflows from occurring in genpd_parse_state() (Nikita Zhandarovich). * pm-sleep: platform/x86/amd: pmc: Use pm_pr_dbg() for suspend related messages pinctrl: amd: Use pm_pr_dbg to show debugging messages ACPI: x86: Add pm_debug_messages for LPS0 _DSM state tracking include/linux/suspend.h: Only show pm_pr_dbg messages at suspend/resume PM: suspend: add a arch_resume_nosmt() prototype PM: hibernate: Correct spelling mistake in a comment PM: suspend: Fix pm_suspend_target_state handling for !CONFIG_PM * pm-domains: PM: domains: Move the verification of in-params from genpd_add_device() PM: domains: fix integer overflow issues in genpd_parse_state()
This commit is contained in:
@@ -59,6 +59,7 @@ static int lps0_dsm_func_mask;
|
|||||||
|
|
||||||
static guid_t lps0_dsm_guid_microsoft;
|
static guid_t lps0_dsm_guid_microsoft;
|
||||||
static int lps0_dsm_func_mask_microsoft;
|
static int lps0_dsm_func_mask_microsoft;
|
||||||
|
static int lps0_dsm_state;
|
||||||
|
|
||||||
/* Device constraint entry structure */
|
/* Device constraint entry structure */
|
||||||
struct lpi_device_info {
|
struct lpi_device_info {
|
||||||
@@ -320,6 +321,44 @@ static void lpi_check_constraints(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool acpi_s2idle_vendor_amd(void)
|
||||||
|
{
|
||||||
|
return boot_cpu_data.x86_vendor == X86_VENDOR_AMD;
|
||||||
|
}
|
||||||
|
|
||||||
|
static const char *acpi_sleep_dsm_state_to_str(unsigned int state)
|
||||||
|
{
|
||||||
|
if (lps0_dsm_func_mask_microsoft || !acpi_s2idle_vendor_amd()) {
|
||||||
|
switch (state) {
|
||||||
|
case ACPI_LPS0_SCREEN_OFF:
|
||||||
|
return "screen off";
|
||||||
|
case ACPI_LPS0_SCREEN_ON:
|
||||||
|
return "screen on";
|
||||||
|
case ACPI_LPS0_ENTRY:
|
||||||
|
return "lps0 entry";
|
||||||
|
case ACPI_LPS0_EXIT:
|
||||||
|
return "lps0 exit";
|
||||||
|
case ACPI_LPS0_MS_ENTRY:
|
||||||
|
return "lps0 ms entry";
|
||||||
|
case ACPI_LPS0_MS_EXIT:
|
||||||
|
return "lps0 ms exit";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
switch (state) {
|
||||||
|
case ACPI_LPS0_SCREEN_ON_AMD:
|
||||||
|
return "screen on";
|
||||||
|
case ACPI_LPS0_SCREEN_OFF_AMD:
|
||||||
|
return "screen off";
|
||||||
|
case ACPI_LPS0_ENTRY_AMD:
|
||||||
|
return "lps0 entry";
|
||||||
|
case ACPI_LPS0_EXIT_AMD:
|
||||||
|
return "lps0 exit";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return "unknown";
|
||||||
|
}
|
||||||
|
|
||||||
static void acpi_sleep_run_lps0_dsm(unsigned int func, unsigned int func_mask, guid_t dsm_guid)
|
static void acpi_sleep_run_lps0_dsm(unsigned int func, unsigned int func_mask, guid_t dsm_guid)
|
||||||
{
|
{
|
||||||
union acpi_object *out_obj;
|
union acpi_object *out_obj;
|
||||||
@@ -331,14 +370,15 @@ static void acpi_sleep_run_lps0_dsm(unsigned int func, unsigned int func_mask, g
|
|||||||
rev_id, func, NULL);
|
rev_id, func, NULL);
|
||||||
ACPI_FREE(out_obj);
|
ACPI_FREE(out_obj);
|
||||||
|
|
||||||
acpi_handle_debug(lps0_device_handle, "_DSM function %u evaluation %s\n",
|
lps0_dsm_state = func;
|
||||||
func, out_obj ? "successful" : "failed");
|
if (pm_debug_messages_on) {
|
||||||
|
acpi_handle_info(lps0_device_handle,
|
||||||
|
"%s transitioned to state %s\n",
|
||||||
|
out_obj ? "Successfully" : "Failed to",
|
||||||
|
acpi_sleep_dsm_state_to_str(lps0_dsm_state));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool acpi_s2idle_vendor_amd(void)
|
|
||||||
{
|
|
||||||
return boot_cpu_data.x86_vendor == X86_VENDOR_AMD;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int validate_dsm(acpi_handle handle, const char *uuid, int rev, guid_t *dsm_guid)
|
static int validate_dsm(acpi_handle handle, const char *uuid, int rev, guid_t *dsm_guid)
|
||||||
{
|
{
|
||||||
|
@@ -1632,9 +1632,6 @@ static int genpd_add_device(struct generic_pm_domain *genpd, struct device *dev,
|
|||||||
|
|
||||||
dev_dbg(dev, "%s()\n", __func__);
|
dev_dbg(dev, "%s()\n", __func__);
|
||||||
|
|
||||||
if (IS_ERR_OR_NULL(genpd) || IS_ERR_OR_NULL(dev))
|
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
gpd_data = genpd_alloc_dev_data(dev, gd);
|
gpd_data = genpd_alloc_dev_data(dev, gd);
|
||||||
if (IS_ERR(gpd_data))
|
if (IS_ERR(gpd_data))
|
||||||
return PTR_ERR(gpd_data);
|
return PTR_ERR(gpd_data);
|
||||||
@@ -1676,6 +1673,9 @@ int pm_genpd_add_device(struct generic_pm_domain *genpd, struct device *dev)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!genpd || !dev)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&gpd_list_lock);
|
mutex_lock(&gpd_list_lock);
|
||||||
ret = genpd_add_device(genpd, dev, dev);
|
ret = genpd_add_device(genpd, dev, dev);
|
||||||
mutex_unlock(&gpd_list_lock);
|
mutex_unlock(&gpd_list_lock);
|
||||||
@@ -2523,6 +2523,9 @@ int of_genpd_add_device(struct of_phandle_args *genpdspec, struct device *dev)
|
|||||||
struct generic_pm_domain *genpd;
|
struct generic_pm_domain *genpd;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
if (!dev)
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
mutex_lock(&gpd_list_lock);
|
mutex_lock(&gpd_list_lock);
|
||||||
|
|
||||||
genpd = genpd_get_from_provider(genpdspec);
|
genpd = genpd_get_from_provider(genpdspec);
|
||||||
@@ -2939,10 +2942,10 @@ static int genpd_parse_state(struct genpd_power_state *genpd_state,
|
|||||||
|
|
||||||
err = of_property_read_u32(state_node, "min-residency-us", &residency);
|
err = of_property_read_u32(state_node, "min-residency-us", &residency);
|
||||||
if (!err)
|
if (!err)
|
||||||
genpd_state->residency_ns = 1000 * residency;
|
genpd_state->residency_ns = 1000LL * residency;
|
||||||
|
|
||||||
genpd_state->power_on_latency_ns = 1000 * exit_latency;
|
genpd_state->power_on_latency_ns = 1000LL * exit_latency;
|
||||||
genpd_state->power_off_latency_ns = 1000 * entry_latency;
|
genpd_state->power_off_latency_ns = 1000LL * entry_latency;
|
||||||
genpd_state->fwnode = &state_node->fwnode;
|
genpd_state->fwnode = &state_node->fwnode;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@@ -19,11 +19,6 @@
|
|||||||
|
|
||||||
#include "power.h"
|
#include "power.h"
|
||||||
|
|
||||||
#ifndef CONFIG_SUSPEND
|
|
||||||
suspend_state_t pm_suspend_target_state;
|
|
||||||
#define pm_suspend_target_state (PM_SUSPEND_ON)
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define list_for_each_entry_rcu_locked(pos, head, member) \
|
#define list_for_each_entry_rcu_locked(pos, head, member) \
|
||||||
list_for_each_entry_rcu(pos, head, member, \
|
list_for_each_entry_rcu(pos, head, member, \
|
||||||
srcu_read_lock_held(&wakeup_srcu))
|
srcu_read_lock_held(&wakeup_srcu))
|
||||||
|
@@ -30,6 +30,7 @@
|
|||||||
#include <linux/pinctrl/pinconf.h>
|
#include <linux/pinctrl/pinconf.h>
|
||||||
#include <linux/pinctrl/pinconf-generic.h>
|
#include <linux/pinctrl/pinconf-generic.h>
|
||||||
#include <linux/pinctrl/pinmux.h>
|
#include <linux/pinctrl/pinmux.h>
|
||||||
|
#include <linux/suspend.h>
|
||||||
|
|
||||||
#include "core.h"
|
#include "core.h"
|
||||||
#include "pinctrl-utils.h"
|
#include "pinctrl-utils.h"
|
||||||
@@ -636,9 +637,8 @@ static bool do_amd_gpio_irq_handler(int irq, void *dev_id)
|
|||||||
regval = readl(regs + i);
|
regval = readl(regs + i);
|
||||||
|
|
||||||
if (regval & PIN_IRQ_PENDING)
|
if (regval & PIN_IRQ_PENDING)
|
||||||
dev_dbg(&gpio_dev->pdev->dev,
|
pm_pr_dbg("GPIO %d is active: 0x%x",
|
||||||
"GPIO %d is active: 0x%x",
|
irqnr + i, regval);
|
||||||
irqnr + i, regval);
|
|
||||||
|
|
||||||
/* caused wake on resume context for shared IRQ */
|
/* caused wake on resume context for shared IRQ */
|
||||||
if (irq < 0 && (regval & BIT(WAKE_STS_OFF)))
|
if (irq < 0 && (regval & BIT(WAKE_STS_OFF)))
|
||||||
|
@@ -543,7 +543,7 @@ static int amd_pmc_idlemask_read(struct amd_pmc_dev *pdev, struct device *dev,
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (dev)
|
if (dev)
|
||||||
dev_dbg(pdev->dev, "SMU idlemask s0i3: 0x%x\n", val);
|
pm_pr_dbg("SMU idlemask s0i3: 0x%x\n", val);
|
||||||
|
|
||||||
if (s)
|
if (s)
|
||||||
seq_printf(s, "SMU idlemask : 0x%x\n", val);
|
seq_printf(s, "SMU idlemask : 0x%x\n", val);
|
||||||
@@ -769,7 +769,7 @@ static int amd_pmc_verify_czn_rtc(struct amd_pmc_dev *pdev, u32 *arg)
|
|||||||
|
|
||||||
*arg |= (duration << 16);
|
*arg |= (duration << 16);
|
||||||
rc = rtc_alarm_irq_enable(rtc_device, 0);
|
rc = rtc_alarm_irq_enable(rtc_device, 0);
|
||||||
dev_dbg(pdev->dev, "wakeup timer programmed for %lld seconds\n", duration);
|
pm_pr_dbg("wakeup timer programmed for %lld seconds\n", duration);
|
||||||
|
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
@@ -202,6 +202,7 @@ struct platform_s2idle_ops {
|
|||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_SUSPEND
|
#ifdef CONFIG_SUSPEND
|
||||||
|
extern suspend_state_t pm_suspend_target_state;
|
||||||
extern suspend_state_t mem_sleep_current;
|
extern suspend_state_t mem_sleep_current;
|
||||||
extern suspend_state_t mem_sleep_default;
|
extern suspend_state_t mem_sleep_default;
|
||||||
|
|
||||||
@@ -337,6 +338,8 @@ extern bool sync_on_suspend_enabled;
|
|||||||
#else /* !CONFIG_SUSPEND */
|
#else /* !CONFIG_SUSPEND */
|
||||||
#define suspend_valid_only_mem NULL
|
#define suspend_valid_only_mem NULL
|
||||||
|
|
||||||
|
#define pm_suspend_target_state (PM_SUSPEND_ON)
|
||||||
|
|
||||||
static inline void pm_suspend_clear_flags(void) {}
|
static inline void pm_suspend_clear_flags(void) {}
|
||||||
static inline void pm_set_suspend_via_firmware(void) {}
|
static inline void pm_set_suspend_via_firmware(void) {}
|
||||||
static inline void pm_set_resume_via_firmware(void) {}
|
static inline void pm_set_resume_via_firmware(void) {}
|
||||||
@@ -468,6 +471,8 @@ static inline int hibernate_quiet_exec(int (*func)(void *data), void *data) {
|
|||||||
}
|
}
|
||||||
#endif /* CONFIG_HIBERNATION */
|
#endif /* CONFIG_HIBERNATION */
|
||||||
|
|
||||||
|
int arch_resume_nosmt(void);
|
||||||
|
|
||||||
#ifdef CONFIG_HIBERNATION_SNAPSHOT_DEV
|
#ifdef CONFIG_HIBERNATION_SNAPSHOT_DEV
|
||||||
int is_hibernate_resume_dev(dev_t dev);
|
int is_hibernate_resume_dev(dev_t dev);
|
||||||
#else
|
#else
|
||||||
@@ -503,7 +508,6 @@ extern void pm_report_max_hw_sleep(u64 t);
|
|||||||
|
|
||||||
/* drivers/base/power/wakeup.c */
|
/* drivers/base/power/wakeup.c */
|
||||||
extern bool events_check_enabled;
|
extern bool events_check_enabled;
|
||||||
extern suspend_state_t pm_suspend_target_state;
|
|
||||||
|
|
||||||
extern bool pm_wakeup_pending(void);
|
extern bool pm_wakeup_pending(void);
|
||||||
extern void pm_system_wakeup(void);
|
extern void pm_system_wakeup(void);
|
||||||
@@ -551,6 +555,7 @@ static inline void unlock_system_sleep(unsigned int flags) {}
|
|||||||
#ifdef CONFIG_PM_SLEEP_DEBUG
|
#ifdef CONFIG_PM_SLEEP_DEBUG
|
||||||
extern bool pm_print_times_enabled;
|
extern bool pm_print_times_enabled;
|
||||||
extern bool pm_debug_messages_on;
|
extern bool pm_debug_messages_on;
|
||||||
|
extern bool pm_debug_messages_should_print(void);
|
||||||
static inline int pm_dyn_debug_messages_on(void)
|
static inline int pm_dyn_debug_messages_on(void)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_DYNAMIC_DEBUG
|
#ifdef CONFIG_DYNAMIC_DEBUG
|
||||||
@@ -564,14 +569,14 @@ static inline int pm_dyn_debug_messages_on(void)
|
|||||||
#endif
|
#endif
|
||||||
#define __pm_pr_dbg(fmt, ...) \
|
#define __pm_pr_dbg(fmt, ...) \
|
||||||
do { \
|
do { \
|
||||||
if (pm_debug_messages_on) \
|
if (pm_debug_messages_should_print()) \
|
||||||
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
|
printk(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
|
||||||
else if (pm_dyn_debug_messages_on()) \
|
else if (pm_dyn_debug_messages_on()) \
|
||||||
pr_debug(fmt, ##__VA_ARGS__); \
|
pr_debug(fmt, ##__VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#define __pm_deferred_pr_dbg(fmt, ...) \
|
#define __pm_deferred_pr_dbg(fmt, ...) \
|
||||||
do { \
|
do { \
|
||||||
if (pm_debug_messages_on) \
|
if (pm_debug_messages_should_print()) \
|
||||||
printk_deferred(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
|
printk_deferred(KERN_DEBUG pr_fmt(fmt), ##__VA_ARGS__); \
|
||||||
} while (0)
|
} while (0)
|
||||||
#else
|
#else
|
||||||
@@ -589,7 +594,8 @@ static inline int pm_dyn_debug_messages_on(void)
|
|||||||
/**
|
/**
|
||||||
* pm_pr_dbg - print pm sleep debug messages
|
* pm_pr_dbg - print pm sleep debug messages
|
||||||
*
|
*
|
||||||
* If pm_debug_messages_on is enabled, print message.
|
* If pm_debug_messages_on is enabled and the system is entering/leaving
|
||||||
|
* suspend, print message.
|
||||||
* If pm_debug_messages_on is disabled and CONFIG_DYNAMIC_DEBUG is enabled,
|
* If pm_debug_messages_on is disabled and CONFIG_DYNAMIC_DEBUG is enabled,
|
||||||
* print message only from instances explicitly enabled on dynamic debug's
|
* print message only from instances explicitly enabled on dynamic debug's
|
||||||
* control.
|
* control.
|
||||||
|
@@ -556,6 +556,12 @@ power_attr_ro(pm_wakeup_irq);
|
|||||||
|
|
||||||
bool pm_debug_messages_on __read_mostly;
|
bool pm_debug_messages_on __read_mostly;
|
||||||
|
|
||||||
|
bool pm_debug_messages_should_print(void)
|
||||||
|
{
|
||||||
|
return pm_debug_messages_on && pm_suspend_target_state != PM_SUSPEND_ON;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pm_debug_messages_should_print);
|
||||||
|
|
||||||
static ssize_t pm_debug_messages_show(struct kobject *kobj,
|
static ssize_t pm_debug_messages_show(struct kobject *kobj,
|
||||||
struct kobj_attribute *attr, char *buf)
|
struct kobj_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
|
@@ -398,7 +398,7 @@ struct mem_zone_bm_rtree {
|
|||||||
unsigned int blocks; /* Number of Bitmap Blocks */
|
unsigned int blocks; /* Number of Bitmap Blocks */
|
||||||
};
|
};
|
||||||
|
|
||||||
/* strcut bm_position is used for browsing memory bitmaps */
|
/* struct bm_position is used for browsing memory bitmaps */
|
||||||
|
|
||||||
struct bm_position {
|
struct bm_position {
|
||||||
struct mem_zone_bm_rtree *zone;
|
struct mem_zone_bm_rtree *zone;
|
||||||
|
Reference in New Issue
Block a user