Skip to content

Commit

Permalink
Merge branch 'suspend-ioremap-cache' into release
Browse files Browse the repository at this point in the history
  • Loading branch information
Len Brown committed Jan 12, 2011
2 parents fb4af41 + 6d5bbf0 commit d16675e
Show file tree
Hide file tree
Showing 11 changed files with 43 additions and 36 deletions.
5 changes: 5 additions & 0 deletions arch/ia64/include/asm/io.h
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down
1 change: 1 addition & 0 deletions arch/x86/kernel/e820.c
Original file line number Diff line number Diff line change
Expand Up @@ -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>

Expand Down
2 changes: 1 addition & 1 deletion drivers/acpi/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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


#
Expand Down
8 changes: 8 additions & 0 deletions drivers/acpi/internal.h
Original file line number Diff line number Diff line change
Expand Up @@ -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_ */
20 changes: 14 additions & 6 deletions kernel/power/nvs.c → drivers/acpi/nvs.c
Original file line number Diff line number Diff line change
@@ -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.
*/
Expand All @@ -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
Expand Down Expand Up @@ -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;
}
}
Expand All @@ -105,17 +106,24 @@ 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;

printk(KERN_INFO "PM: Saving platform NVS memory\n");

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;
}

/**
Expand Down
6 changes: 3 additions & 3 deletions drivers/acpi/osl.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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;
}

Expand Down
5 changes: 2 additions & 3 deletions drivers/acpi/sleep.c
Original file line number Diff line number Diff line change
Expand Up @@ -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();
}

/**
Expand All @@ -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;
}
Expand Down
9 changes: 9 additions & 0 deletions include/linux/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
17 changes: 0 additions & 17 deletions include/linux/suspend.h
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
5 changes: 0 additions & 5 deletions kernel/power/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
1 change: 0 additions & 1 deletion kernel/power/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit d16675e

Please sign in to comment.