Merge branch 'suspend-ioremap-cache' into release
This commit is contained in:
@@ -426,6 +426,11 @@ extern void __iomem * ioremap_nocache (unsigned long offset, unsigned long size)
|
|||||||
extern void iounmap (volatile void __iomem *addr);
|
extern void iounmap (volatile void __iomem *addr);
|
||||||
extern void __iomem * early_ioremap (unsigned long phys_addr, unsigned long size);
|
extern void __iomem * early_ioremap (unsigned long phys_addr, unsigned long size);
|
||||||
extern void early_iounmap (volatile void __iomem *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:
|
* String version of IO memory access ops:
|
||||||
|
@@ -14,6 +14,7 @@
|
|||||||
#include <linux/bootmem.h>
|
#include <linux/bootmem.h>
|
||||||
#include <linux/pfn.h>
|
#include <linux/pfn.h>
|
||||||
#include <linux/suspend.h>
|
#include <linux/suspend.h>
|
||||||
|
#include <linux/acpi.h>
|
||||||
#include <linux/firmware-map.h>
|
#include <linux/firmware-map.h>
|
||||||
#include <linux/memblock.h>
|
#include <linux/memblock.h>
|
||||||
|
|
||||||
|
@@ -24,7 +24,7 @@ acpi-y += atomicio.o
|
|||||||
# sleep related files
|
# sleep related files
|
||||||
acpi-y += wakeup.o
|
acpi-y += wakeup.o
|
||||||
acpi-y += sleep.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
|
#ifdef CONFIG_ACPI_SLEEP
|
||||||
int acpi_sleep_proc_init(void);
|
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
|
#else
|
||||||
static inline int acpi_sleep_proc_init(void) { return 0; }
|
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
|
||||||
|
|
||||||
#endif /* _ACPI_INTERNAL_H_ */
|
#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.
|
* This file is released under the GPLv2.
|
||||||
*/
|
*/
|
||||||
@@ -11,7 +11,8 @@
|
|||||||
#include <linux/list.h>
|
#include <linux/list.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/slab.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
|
* 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);
|
free_page((unsigned long)entry->data);
|
||||||
entry->data = NULL;
|
entry->data = NULL;
|
||||||
if (entry->kaddr) {
|
if (entry->kaddr) {
|
||||||
iounmap(entry->kaddr);
|
acpi_os_unmap_memory(entry->kaddr, entry->size);
|
||||||
entry->kaddr = NULL;
|
entry->kaddr = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -105,7 +106,7 @@ int suspend_nvs_alloc(void)
|
|||||||
/**
|
/**
|
||||||
* suspend_nvs_save - save NVS memory regions
|
* suspend_nvs_save - save NVS memory regions
|
||||||
*/
|
*/
|
||||||
void suspend_nvs_save(void)
|
int suspend_nvs_save(void)
|
||||||
{
|
{
|
||||||
struct nvs_page *entry;
|
struct nvs_page *entry;
|
||||||
|
|
||||||
@@ -113,9 +114,16 @@ void suspend_nvs_save(void)
|
|||||||
|
|
||||||
list_for_each_entry(entry, &nvs_list, node)
|
list_for_each_entry(entry, &nvs_list, node)
|
||||||
if (entry->data) {
|
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);
|
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_off = round_down(phys, PAGE_SIZE);
|
||||||
pg_sz = round_up(phys + size, PAGE_SIZE) - pg_off;
|
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) {
|
if (!virt) {
|
||||||
kfree(map);
|
kfree(map);
|
||||||
return NULL;
|
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);
|
virt_addr = acpi_map_vaddr_lookup(phys_addr, size);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
if (!virt_addr) {
|
if (!virt_addr) {
|
||||||
virt_addr = ioremap(phys_addr, size);
|
virt_addr = ioremap_cache(phys_addr, size);
|
||||||
unmap = 1;
|
unmap = 1;
|
||||||
}
|
}
|
||||||
if (!value)
|
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);
|
virt_addr = acpi_map_vaddr_lookup(phys_addr, size);
|
||||||
rcu_read_unlock();
|
rcu_read_unlock();
|
||||||
if (!virt_addr) {
|
if (!virt_addr) {
|
||||||
virt_addr = ioremap(phys_addr, size);
|
virt_addr = ioremap_cache(phys_addr, size);
|
||||||
unmap = 1;
|
unmap = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -124,8 +124,7 @@ static int acpi_pm_freeze(void)
|
|||||||
static int acpi_pm_pre_suspend(void)
|
static int acpi_pm_pre_suspend(void)
|
||||||
{
|
{
|
||||||
acpi_pm_freeze();
|
acpi_pm_freeze();
|
||||||
suspend_nvs_save();
|
return suspend_nvs_save();
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -151,7 +150,7 @@ static int acpi_pm_prepare(void)
|
|||||||
{
|
{
|
||||||
int error = __acpi_pm_prepare();
|
int error = __acpi_pm_prepare();
|
||||||
if (!error)
|
if (!error)
|
||||||
acpi_pm_pre_suspend();
|
error = acpi_pm_pre_suspend();
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
@@ -254,6 +254,15 @@ void __init acpi_old_suspend_ordering(void);
|
|||||||
void __init acpi_nvs_nosave(void);
|
void __init acpi_nvs_nosave(void);
|
||||||
#endif /* CONFIG_PM_SLEEP */
|
#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 {
|
struct acpi_osc_context {
|
||||||
char *uuid_str; /* uuid string */
|
char *uuid_str; /* uuid string */
|
||||||
int rev;
|
int rev;
|
||||||
|
@@ -258,23 +258,6 @@ 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_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
|
#ifdef CONFIG_PM_SLEEP
|
||||||
void save_processor_state(void);
|
void save_processor_state(void);
|
||||||
void restore_processor_state(void);
|
void restore_processor_state(void);
|
||||||
|
@@ -100,13 +100,9 @@ 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
|
||||||
@@ -140,7 +136,6 @@ config HIBERNATION
|
|||||||
depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE
|
depends on PM && SWAP && ARCH_HIBERNATION_POSSIBLE
|
||||||
select LZO_COMPRESS
|
select LZO_COMPRESS
|
||||||
select LZO_DECOMPRESS
|
select LZO_DECOMPRESS
|
||||||
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
|
||||||
|
@@ -10,6 +10,5 @@ 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_SUSPEND_NVS) += nvs.o
|
|
||||||
|
|
||||||
obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o
|
obj-$(CONFIG_MAGIC_SYSRQ) += poweroff.o
|
||||||
|
Reference in New Issue
Block a user