blob: cb4917c8d7b22a3d6ccd1c0ea7bd6e14cda9fed5 [file] [log] [blame]
/*
* kernel/power/tuxonice.h
*
* Copyright (C) 2004-2010 Nigel Cunningham (nigel at tuxonice net)
*
* This file is released under the GPLv2.
*
* It contains declarations used throughout swsusp.
*
*/
#ifndef KERNEL_POWER_TOI_H
#define KERNEL_POWER_TOI_H
#include <linux/delay.h>
#include <linux/bootmem.h>
#include <linux/suspend.h>
#include <linux/fs.h>
#include <linux/module.h>
#include <asm/setup.h>
#include "tuxonice_pageflags.h"
#include "power.h"
#define TOI_CORE_VERSION "3.3"
#define TOI_HEADER_VERSION 3
#define MY_BOOT_KERNEL_DATA_VERSION 4
#define HIB_TOI_DEBUG 1
#define _TAG_HIB_M "HIB/TOI"
#if (HIB_TOI_DEBUG)
#undef hib_log
#define hib_log(fmt, ...) pr_warn("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__);
#else
#define hib_log(fmt, ...)
#endif
#undef hib_warn
#define hib_warn(fmt, ...) pr_warn("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__);
#undef hib_err
#define hib_err(fmt, ...) pr_err("[%s] [%s()]" fmt, _TAG_HIB_M, __func__, ##__VA_ARGS__);
/* for set_env() by MTK */
#include <mach/env.h>
struct toi_boot_kernel_data {
int version;
int size;
unsigned long toi_action;
unsigned long toi_debug_state;
u32 toi_default_console_level;
int toi_io_time[2][2];
char toi_nosave_commandline[COMMAND_LINE_SIZE];
unsigned long pages_used[33];
unsigned long incremental_bytes_in;
unsigned long incremental_bytes_out;
unsigned long compress_bytes_in;
unsigned long compress_bytes_out;
unsigned long pruned_pages;
};
extern struct toi_boot_kernel_data toi_bkd;
/* Location of book kernel data struct in kernel being resumed */
extern unsigned long boot_kernel_data_buffer;
/* == Action states == */
enum {
TOI_REBOOT,
TOI_PAUSE,
TOI_LOGALL,
TOI_CAN_CANCEL,
TOI_KEEP_IMAGE,
TOI_FREEZER_TEST,
TOI_SINGLESTEP,
TOI_PAUSE_NEAR_PAGESET_END,
TOI_TEST_FILTER_SPEED,
TOI_TEST_BIO,
TOI_NO_PAGESET2,
TOI_IGNORE_ROOTFS,
TOI_REPLACE_SWSUSP,
TOI_PAGESET2_FULL,
TOI_ABORT_ON_RESAVE_NEEDED,
TOI_NO_MULTITHREADED_IO,
TOI_NO_DIRECT_LOAD, /* Obsolete */
TOI_LATE_CPU_HOTPLUG,
TOI_GET_MAX_MEM_ALLOCD,
TOI_NO_FLUSHER_THREAD,
TOI_NO_PS2_IF_UNNEEDED,
TOI_POST_RESUME_BREAKPOINT,
TOI_NO_READAHEAD,
};
extern unsigned long toi_bootflags_mask;
#define clear_action_state(bit) (test_and_clear_bit(bit, &toi_bkd.toi_action))
/* == Result states == */
enum {
TOI_ABORTED,
TOI_ABORT_REQUESTED,
TOI_NOSTORAGE_AVAILABLE,
TOI_INSUFFICIENT_STORAGE,
TOI_FREEZING_FAILED,
TOI_KEPT_IMAGE,
TOI_WOULD_EAT_MEMORY,
TOI_UNABLE_TO_FREE_ENOUGH_MEMORY,
TOI_PM_SEM,
TOI_DEVICE_REFUSED,
TOI_SYSDEV_REFUSED,
TOI_EXTRA_PAGES_ALLOW_TOO_SMALL,
TOI_UNABLE_TO_PREPARE_IMAGE,
TOI_FAILED_MODULE_INIT,
TOI_FAILED_MODULE_CLEANUP,
TOI_FAILED_IO,
TOI_OUT_OF_MEMORY,
TOI_IMAGE_ERROR,
TOI_PLATFORM_PREP_FAILED,
TOI_CPU_HOTPLUG_FAILED,
TOI_ARCH_PREPARE_FAILED, /* Removed Linux-3.0 */
TOI_RESAVE_NEEDED,
TOI_CANT_SUSPEND,
TOI_NOTIFIERS_PREPARE_FAILED,
TOI_PRE_SNAPSHOT_FAILED,
TOI_PRE_RESTORE_FAILED,
TOI_USERMODE_HELPERS_ERR,
TOI_CANT_USE_ALT_RESUME,
TOI_HEADER_TOO_BIG,
TOI_WAKEUP_EVENT,
TOI_SYSCORE_REFUSED,
TOI_DPM_PREPARE_FAILED,
/* FIXME: jonathan.jmchen: BUG here, TOI_DPM_SUSPEND_FAILED is the last 31-th bit here */
/* TOI_DPM_PREPARE_FAILED will exceed the # of bit when set_abort_result(TOI_DPM_SUSPEND_FAILED) is called!!! */
TOI_DPM_SUSPEND_FAILED = TOI_DPM_PREPARE_FAILED,
TOI_NUM_RESULT_STATES /* Used in printing debug info only */
};
extern unsigned long toi_result;
#define set_result_state(bit) (test_and_set_bit(bit, &toi_result))
#define set_abort_result(bit) (test_and_set_bit(TOI_ABORTED, &toi_result), \
test_and_set_bit(bit, &toi_result))
#define clear_result_state(bit) (test_and_clear_bit(bit, &toi_result))
#define test_result_state(bit) (test_bit(bit, &toi_result))
/* == Debug sections and levels == */
/* debugging levels. */
enum {
TOI_STATUS = 0,
TOI_ERROR = 2,
TOI_LOW,
TOI_MEDIUM,
TOI_HIGH,
TOI_VERBOSE,
};
enum {
TOI_ANY_SECTION,
TOI_EAT_MEMORY,
TOI_IO,
TOI_HEADER,
TOI_WRITER,
TOI_MEMORY,
TOI_PAGEDIR,
TOI_COMPRESS,
TOI_BIO,
};
#define set_debug_state(bit) (test_and_set_bit(bit, &toi_bkd.toi_debug_state))
#define clear_debug_state(bit) \
(test_and_clear_bit(bit, &toi_bkd.toi_debug_state))
#define test_debug_state(bit) (test_bit(bit, &toi_bkd.toi_debug_state))
/* == Steps in hibernating == */
enum {
STEP_HIBERNATE_PREPARE_IMAGE,
STEP_HIBERNATE_SAVE_IMAGE,
STEP_HIBERNATE_POWERDOWN,
STEP_RESUME_CAN_RESUME,
STEP_RESUME_LOAD_PS1,
STEP_RESUME_DO_RESTORE,
STEP_RESUME_READ_PS2,
STEP_RESUME_GO,
STEP_RESUME_ALT_IMAGE,
STEP_CLEANUP,
STEP_QUIET_CLEANUP
};
/* == TuxOnIce states ==
(see also include/linux/suspend.h) */
#define get_toi_state() (toi_state)
#define restore_toi_state(saved_state) \
do { toi_state = saved_state; } while (0)
/* == Module support == */
struct toi_core_fns {
int (*post_context_save) (void);
unsigned long (*get_nonconflicting_page) (void);
int (*try_hibernate) (void);
void (*try_resume) (void);
};
extern struct toi_core_fns *toi_core_fns;
/* == All else == */
#undef KB
#undef MB
#define KB(x) ((x) << (PAGE_SHIFT - 10))
#define MB(x) ((x) >> (20 - PAGE_SHIFT))
extern int toi_start_anything(int toi_or_resume);
extern void toi_finish_anything(int toi_or_resume);
extern int save_image_part1(void);
extern int toi_atomic_restore(void);
extern int toi_try_hibernate(void);
extern void toi_try_resume(void);
extern int __toi_post_context_save(void);
extern unsigned int nr_hibernates;
extern char alt_resume_param[256];
extern void copyback_post(void);
extern int toi_hibernate(void);
extern unsigned long extra_pd1_pages_used;
#define SECTOR_SIZE 512
extern void toi_early_boot_message(int can_erase_image, int default_answer,
char *warning_reason, ...);
extern int do_check_can_resume(void);
extern int do_toi_step(int step);
extern int toi_launch_userspace_program(char *command, int channel_no, int wait, int debug);
extern char tuxonice_signature[9];
extern int toi_start_other_threads(void);
extern void toi_stop_other_threads(void);
#endif