mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-17 17:24:17 +08:00
Merge branch 'suspend-ioremap-cache' into release
This commit is contained in:
commit
d16675e1f1
@ -426,6 +426,11 @@ extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size)
|
||||
extern void iounmap (volatile void __iomem *addr);
|
||||
extern void __iomem * early_ioremap (unsigned long phys_addr, unsigned long size);
|
||||
extern void early_iounmap (volatile void __iomem *addr, unsigned long size);
|
||||
static inline void __iomem * ioremap_cache (unsigned long phys_addr, unsigned long size)
|
||||
{
|
||||
return ioremap(phys_addr, size);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* String version of IO memory access ops:
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/pfn.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <linux/firmware-map.h>
|
||||
#include <linux/memblock.h>
|
||||
|
||||
|
@ -24,7 +24,7 @@ acpi-y += atomicio.o
|
||||
# sleep related files
|
||||
acpi-y += wakeup.o
|
||||
acpi-y += sleep.o
|
||||
acpi-$(CONFIG_ACPI_SLEEP) += proc.o
|
||||
acpi-$(CONFIG_ACPI_SLEEP) += proc.o nvs.o
|
||||
|
||||
|
||||
#
|
||||
|
@ -83,8 +83,16 @@ extern int acpi_sleep_init(void);
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
int acpi_sleep_proc_init(void);
|
||||
int suspend_nvs_alloc(void);
|
||||
void suspend_nvs_free(void);
|
||||
int suspend_nvs_save(void);
|
||||
void suspend_nvs_restore(void);
|
||||
#else
|
||||
static inline int acpi_sleep_proc_init(void) { return 0; }
|
||||
static inline int suspend_nvs_alloc(void) { return 0; }
|
||||
static inline void suspend_nvs_free(void) {}
|
||||
static inline int suspend_nvs_save(void) {}
|
||||
static inline void suspend_nvs_restore(void) {}
|
||||
#endif
|
||||
|
||||
#endif /* _ACPI_INTERNAL_H_ */
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* linux/kernel/power/hibernate_nvs.c - Routines for handling NVS memory
|
||||
* nvs.c - Routines for saving and restoring ACPI NVS memory region
|
||||
*
|
||||
* Copyright (C) 2008,2009 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
|
||||
* Copyright (C) 2008-2011 Rafael J. Wysocki <rjw@sisk.pl>, Novell Inc.
|
||||
*
|
||||
* This file is released under the GPLv2.
|
||||
*/
|
||||
@ -11,7 +11,8 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/suspend.h>
|
||||
#include <linux/acpi.h>
|
||||
#include <acpi/acpiosxf.h>
|
||||
|
||||
/*
|
||||
* Platforms, like ACPI, may want us to save some memory used by them during
|
||||
@ -79,7 +80,7 @@ void suspend_nvs_free(void)
|
||||
free_page((unsigned long)entry->data);
|
||||
entry->data = NULL;
|
||||
if (entry->kaddr) {
|
||||
iounmap(entry->kaddr);
|
||||
acpi_os_unmap_memory(entry->kaddr, entry->size);
|
||||
entry->kaddr = NULL;
|
||||
}
|
||||
}
|
||||
@ -105,7 +106,7 @@ int suspend_nvs_alloc(void)
|
||||
/**
|
||||
* suspend_nvs_save - save NVS memory regions
|
||||
*/
|
||||
void suspend_nvs_save(void)
|
||||
int suspend_nvs_save(void)
|
||||
{
|
||||
struct nvs_page *entry;
|
||||
|
||||
@ -113,9 +114,16 @@ void suspend_nvs_save(void)
|
||||
|
||||
list_for_each_entry(entry, &nvs_list, node)
|
||||
if (entry->data) {
|
||||
entry->kaddr = ioremap(entry->phys_start, entry->size);
|
||||
entry->kaddr = acpi_os_map_memory(entry->phys_start,
|
||||
entry->size);
|
||||
if (!entry->kaddr) {
|
||||
suspend_nvs_free();
|
||||
return -ENOMEM;
|
||||
}
|
||||
memcpy(entry->data, entry->kaddr, entry->size);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
@ -320,7 +320,7 @@ acpi_os_map_memory(acpi_physical_address phys, acpi_size size)
|
||||
|
||||
pg_off = round_down(phys, PAGE_SIZE);
|
||||
pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off;
|
||||
virt = ioremap(pg_off, pg_sz);
|
||||
virt = ioremap_cache(pg_off, pg_sz);
|
||||
if (!virt) {
|
||||
kfree(map);
|
||||
return NULL;
|
||||
@ -642,7 +642,7 @@ acpi_os_read_memory(acpi_physical_address phys_addr, u32 * value, u32 width)
|
||||
virt_addr = acpi_map_vaddr_lookup(phys_addr, size);
|
||||
rcu_read_unlock();
|
||||
if (!virt_addr) {
|
||||
virt_addr = ioremap(phys_addr, size);
|
||||
virt_addr = ioremap_cache(phys_addr, size);
|
||||
unmap = 1;
|
||||
}
|
||||
if (!value)
|
||||
@ -678,7 +678,7 @@ acpi_os_write_memory(acpi_physical_address phys_addr, u32 value, u32 width)
|
||||
virt_addr = acpi_map_vaddr_lookup(phys_addr, size);
|
||||
rcu_read_unlock();
|
||||
if (!virt_addr) {
|
||||
virt_addr = ioremap(phys_addr, size);
|
||||
virt_addr = ioremap_cache(phys_addr, size);
|
||||
unmap = 1;
|
||||
}
|
||||
|
||||
|
@ -124,8 +124,7 @@ static int acpi_pm_freeze(void)
|
||||
static int acpi_pm_pre_suspend(void)
|
||||
{
|
||||
acpi_pm_freeze();
|
||||
suspend_nvs_save();
|
||||
return 0;
|
||||
return suspend_nvs_save();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -151,7 +150,7 @@ static int acpi_pm_prepare(void)
|
||||
{
|
||||
int error = __acpi_pm_prepare();
|
||||
if (!error)
|
||||
acpi_pm_pre_suspend();
|
||||
error = acpi_pm_pre_suspend();
|
||||
|
||||
return error;
|
||||
}
|
||||
|
@ -254,6 +254,15 @@ void __init acpi_old_suspend_ordering(void);
|
||||
void __init acpi_nvs_nosave(void);
|
||||
#endif /* CONFIG_PM_SLEEP */
|
||||
|
||||
#ifdef CONFIG_ACPI_SLEEP
|
||||
int suspend_nvs_register(unsigned long start, unsigned long size);
|
||||
#else
|
||||
static inline int suspend_nvs_register(unsigned long a, unsigned long b)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
struct acpi_osc_context {
|
||||
char *uuid_str; /* uuid string */
|
||||
int rev;
|
||||
|
@ -258,23 +258,6 @@ static inline int hibernate(void) { return -ENOSYS; }
|
||||
static inline bool system_entering_hibernation(void) { return false; }
|
||||
#endif /* CONFIG_HIBERNATION */
|
||||
|
||||
#ifdef CONFIG_SUSPEND_NVS
|
||||
extern int suspend_nvs_register(unsigned long start, unsigned long size);
|
||||
extern int suspend_nvs_alloc(void);
|
||||
extern void suspend_nvs_free(void);
|
||||
extern void suspend_nvs_save(void);
|
||||
extern void suspend_nvs_restore(void);
|
||||
#else /* CONFIG_SUSPEND_NVS */
|
||||
static inline int suspend_nvs_register(unsigned long a, unsigned long b)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
static inline int suspend_nvs_alloc(void) { return 0; }
|
||||
static inline void suspend_nvs_free(void) {}
|
||||
static inline void suspend_nvs_save(void) {}
|
||||
static inline void suspend_nvs_restore(void) {}
|
||||
#endif /* CONFIG_SUSPEND_NVS */
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
void save_processor_state(void);
|
||||
void restore_processor_state(void);
|
||||
|
@ -100,13 +100,9 @@ config PM_SLEEP_ADVANCED_DEBUG
|
||||
depends on PM_ADVANCED_DEBUG
|
||||
default n
|
||||
|
||||
config SUSPEND_NVS
|
||||
bool
|
||||
|
||||
config SUSPEND
|
||||
bool "Suspend to RAM and standby"
|
||||
depends on PM && ARCH_SUSPEND_POSSIBLE
|
||||
select SUSPEND_NVS if HAS_IOMEM
|
||||
default y
|
||||
---help---
|
||||
Allow the system to enter sleep states in which main memory is
|
||||
@ -140,7 +136,6 @@ config HIBERNATION
|
||||
depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE
|
||||
select LZO_COMPRESS
|
||||
select LZO_DECOMPRESS
|
||||
select SUSPEND_NVS if HAS_IOMEM
|
||||
---help---
|
||||
Enable the suspend to disk (STD) functionality, which is usually
|
||||
called "hibernation" in user interfaces. STD checkpoints the
|
||||
|
@ -10,6 +10,5 @@ obj-$(CONFIG_SUSPEND) += suspend.o
|
||||
obj-$(CONFIG_PM_TEST_SUSPEND) += suspend_test.o
|
||||
obj-$(CONFIG_HIBERNATION) += hibernate.o snapshot.o swap.o user.o \
|
||||
block_io.o
|
||||
obj-$(CONFIG_SUSPEND_NVS) += nvs.o
|
||||
|
||||
obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o
|
||||
|
Loading…
Reference in New Issue
Block a user