Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit dd4c4f17 authored by Matthew Garrett's avatar Matthew Garrett Committed by Len Brown
Browse files

suspend: Move NVS save/restore code to generic suspend functionality



Saving platform non-volatile state may be required for suspend to RAM as
well as hibernation. Move it to more generic code.

Signed-off-by: default avatarMatthew Garrett <mjg@redhat.com>
Acked-by: default avatarRafael J. Wysocki <rjw@sisk.pl>
Tested-by: default avatarMaxim Levitsky <maximlevitsky@gmail.com>
Signed-off-by: default avatarLen Brown <len.brown@intel.com>
parent 67a3e12b
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -729,7 +729,7 @@ static int __init e820_mark_nvs_memory(void)
		struct e820entry *ei = &e820.map[i];
		struct e820entry *ei = &e820.map[i];


		if (ei->type == E820_NVS)
		if (ei->type == E820_NVS)
			hibernate_nvs_register(ei->addr, ei->size);
			suspend_nvs_register(ei->addr, ei->size);
	}
	}


	return 0;
	return 0;
+6 −6
Original line number Original line Diff line number Diff line
@@ -393,7 +393,7 @@ static int acpi_hibernation_begin(void)
{
{
	int error;
	int error;


	error = s4_no_nvs ? 0 : hibernate_nvs_alloc();
	error = s4_no_nvs ? 0 : suspend_nvs_alloc();
	if (!error) {
	if (!error) {
		acpi_target_sleep_state = ACPI_STATE_S4;
		acpi_target_sleep_state = ACPI_STATE_S4;
		acpi_sleep_tts_switch(acpi_target_sleep_state);
		acpi_sleep_tts_switch(acpi_target_sleep_state);
@@ -407,7 +407,7 @@ static int acpi_hibernation_pre_snapshot(void)
	int error = acpi_pm_prepare();
	int error = acpi_pm_prepare();


	if (!error)
	if (!error)
		hibernate_nvs_save();
		suspend_nvs_save();


	return error;
	return error;
}
}
@@ -432,7 +432,7 @@ static int acpi_hibernation_enter(void)


static void acpi_hibernation_finish(void)
static void acpi_hibernation_finish(void)
{
{
	hibernate_nvs_free();
	suspend_nvs_free();
	acpi_pm_finish();
	acpi_pm_finish();
}
}


@@ -452,7 +452,7 @@ static void acpi_hibernation_leave(void)
		panic("ACPI S4 hardware signature mismatch");
		panic("ACPI S4 hardware signature mismatch");
	}
	}
	/* Restore the NVS memory area */
	/* Restore the NVS memory area */
	hibernate_nvs_restore();
	suspend_nvs_restore();
}
}


static int acpi_pm_pre_restore(void)
static int acpi_pm_pre_restore(void)
@@ -501,7 +501,7 @@ static int acpi_hibernation_begin_old(void)


	if (!error) {
	if (!error) {
		if (!s4_no_nvs)
		if (!s4_no_nvs)
			error = hibernate_nvs_alloc();
			error = suspend_nvs_alloc();
		if (!error)
		if (!error)
			acpi_target_sleep_state = ACPI_STATE_S4;
			acpi_target_sleep_state = ACPI_STATE_S4;
	}
	}
@@ -513,7 +513,7 @@ static int acpi_hibernation_pre_snapshot_old(void)
	int error = acpi_pm_disable_gpes();
	int error = acpi_pm_disable_gpes();


	if (!error)
	if (!error)
		hibernate_nvs_save();
		suspend_nvs_save();


	return error;
	return error;
}
}
+13 −13
Original line number Original line Diff line number Diff line
@@ -256,22 +256,22 @@ static inline int hibernate(void) { return -ENOSYS; }
static inline bool system_entering_hibernation(void) { return false; }
static inline bool system_entering_hibernation(void) { return false; }
#endif /* CONFIG_HIBERNATION */
#endif /* CONFIG_HIBERNATION */


#ifdef CONFIG_HIBERNATION_NVS
#ifdef CONFIG_SUSPEND_NVS
extern int hibernate_nvs_register(unsigned long start, unsigned long size);
extern int suspend_nvs_register(unsigned long start, unsigned long size);
extern int hibernate_nvs_alloc(void);
extern int suspend_nvs_alloc(void);
extern void hibernate_nvs_free(void);
extern void suspend_nvs_free(void);
extern void hibernate_nvs_save(void);
extern void suspend_nvs_save(void);
extern void hibernate_nvs_restore(void);
extern void suspend_nvs_restore(void);
#else /* CONFIG_HIBERNATION_NVS */
#else /* CONFIG_SUSPEND_NVS */
static inline int hibernate_nvs_register(unsigned long a, unsigned long b)
static inline int suspend_nvs_register(unsigned long a, unsigned long b)
{
{
	return 0;
	return 0;
}
}
static inline int hibernate_nvs_alloc(void) { return 0; }
static inline int suspend_nvs_alloc(void) { return 0; }
static inline void hibernate_nvs_free(void) {}
static inline void suspend_nvs_free(void) {}
static inline void hibernate_nvs_save(void) {}
static inline void suspend_nvs_save(void) {}
static inline void hibernate_nvs_restore(void) {}
static inline void suspend_nvs_restore(void) {}
#endif /* CONFIG_HIBERNATION_NVS */
#endif /* CONFIG_SUSPEND_NVS */


#ifdef CONFIG_PM_SLEEP
#ifdef CONFIG_PM_SLEEP
void save_processor_state(void);
void save_processor_state(void);
+5 −4
Original line number Original line Diff line number Diff line
@@ -99,9 +99,13 @@ config PM_SLEEP_ADVANCED_DEBUG
	depends on PM_ADVANCED_DEBUG
	depends on PM_ADVANCED_DEBUG
	default n
	default n


config SUSPEND_NVS
       bool

config SUSPEND
config SUSPEND
	bool "Suspend to RAM and standby"
	bool "Suspend to RAM and standby"
	depends on PM && ARCH_SUSPEND_POSSIBLE
	depends on PM && ARCH_SUSPEND_POSSIBLE
	select SUSPEND_NVS if HAS_IOMEM
	default y
	default y
	---help---
	---help---
	  Allow the system to enter sleep states in which main memory is
	  Allow the system to enter sleep states in which main memory is
@@ -130,13 +134,10 @@ config SUSPEND_FREEZER


	  Turning OFF this setting is NOT recommended! If in doubt, say Y.
	  Turning OFF this setting is NOT recommended! If in doubt, say Y.


config HIBERNATION_NVS
	bool

config HIBERNATION
config HIBERNATION
	bool "Hibernation (aka 'suspend to disk')"
	bool "Hibernation (aka 'suspend to disk')"
	depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE
	depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE
	select HIBERNATION_NVS if HAS_IOMEM
	select SUSPEND_NVS if HAS_IOMEM
	---help---
	---help---
	  Enable the suspend to disk (STD) functionality, which is usually
	  Enable the suspend to disk (STD) functionality, which is usually
	  called "hibernation" in user interfaces.  STD checkpoints the
	  called "hibernation" in user interfaces.  STD checkpoints the
+1 −1
Original line number Original line Diff line number Diff line
@@ -10,6 +10,6 @@ obj-$(CONFIG_SUSPEND) += suspend.o
obj-$(CONFIG_PM_TEST_SUSPEND)	+= suspend_test.o
obj-$(CONFIG_PM_TEST_SUSPEND)	+= suspend_test.o
obj-$(CONFIG_HIBERNATION)	+= hibernate.o snapshot.o swap.o user.o \
obj-$(CONFIG_HIBERNATION)	+= hibernate.o snapshot.o swap.o user.o \
				   block_io.o
				   block_io.o
obj-$(CONFIG_HIBERNATION_NVS)	+= hibernate_nvs.o
obj-$(CONFIG_SUSPEND_NVS)	+= nvs.o


obj-$(CONFIG_MAGIC_SYSRQ)	+= poweroff.o
obj-$(CONFIG_MAGIC_SYSRQ)	+= poweroff.o
Loading