162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _LINUX_REBOOT_H 362306a36Sopenharmony_ci#define _LINUX_REBOOT_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci 662306a36Sopenharmony_ci#include <linux/notifier.h> 762306a36Sopenharmony_ci#include <uapi/linux/reboot.h> 862306a36Sopenharmony_ci 962306a36Sopenharmony_cistruct device; 1062306a36Sopenharmony_cistruct sys_off_handler; 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#define SYS_DOWN 0x0001 /* Notify of system down */ 1362306a36Sopenharmony_ci#define SYS_RESTART SYS_DOWN 1462306a36Sopenharmony_ci#define SYS_HALT 0x0002 /* Notify of system halt */ 1562306a36Sopenharmony_ci#define SYS_POWER_OFF 0x0003 /* Notify of system power off */ 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_cienum reboot_mode { 1862306a36Sopenharmony_ci REBOOT_UNDEFINED = -1, 1962306a36Sopenharmony_ci REBOOT_COLD = 0, 2062306a36Sopenharmony_ci REBOOT_WARM, 2162306a36Sopenharmony_ci REBOOT_HARD, 2262306a36Sopenharmony_ci REBOOT_SOFT, 2362306a36Sopenharmony_ci REBOOT_GPIO, 2462306a36Sopenharmony_ci}; 2562306a36Sopenharmony_ciextern enum reboot_mode reboot_mode; 2662306a36Sopenharmony_ciextern enum reboot_mode panic_reboot_mode; 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_cienum reboot_type { 2962306a36Sopenharmony_ci BOOT_TRIPLE = 't', 3062306a36Sopenharmony_ci BOOT_KBD = 'k', 3162306a36Sopenharmony_ci BOOT_BIOS = 'b', 3262306a36Sopenharmony_ci BOOT_ACPI = 'a', 3362306a36Sopenharmony_ci BOOT_EFI = 'e', 3462306a36Sopenharmony_ci BOOT_CF9_FORCE = 'p', 3562306a36Sopenharmony_ci BOOT_CF9_SAFE = 'q', 3662306a36Sopenharmony_ci}; 3762306a36Sopenharmony_ciextern enum reboot_type reboot_type; 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ciextern int reboot_default; 4062306a36Sopenharmony_ciextern int reboot_cpu; 4162306a36Sopenharmony_ciextern int reboot_force; 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciextern int register_reboot_notifier(struct notifier_block *); 4562306a36Sopenharmony_ciextern int unregister_reboot_notifier(struct notifier_block *); 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciextern int devm_register_reboot_notifier(struct device *, struct notifier_block *); 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ciextern int register_restart_handler(struct notifier_block *); 5062306a36Sopenharmony_ciextern int unregister_restart_handler(struct notifier_block *); 5162306a36Sopenharmony_ciextern void do_kernel_restart(char *cmd); 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci/* 5462306a36Sopenharmony_ci * Architecture-specific implementations of sys_reboot commands. 5562306a36Sopenharmony_ci */ 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ciextern void migrate_to_reboot_cpu(void); 5862306a36Sopenharmony_ciextern void machine_restart(char *cmd); 5962306a36Sopenharmony_ciextern void machine_halt(void); 6062306a36Sopenharmony_ciextern void machine_power_off(void); 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ciextern void machine_shutdown(void); 6362306a36Sopenharmony_cistruct pt_regs; 6462306a36Sopenharmony_ciextern void machine_crash_shutdown(struct pt_regs *); 6562306a36Sopenharmony_ci 6662306a36Sopenharmony_civoid do_kernel_power_off(void); 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci/* 6962306a36Sopenharmony_ci * sys-off handler API. 7062306a36Sopenharmony_ci */ 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci/* 7362306a36Sopenharmony_ci * Standard sys-off priority levels. Users are expected to set priorities 7462306a36Sopenharmony_ci * relative to the standard levels. 7562306a36Sopenharmony_ci * 7662306a36Sopenharmony_ci * SYS_OFF_PRIO_PLATFORM: Use this for platform-level handlers. 7762306a36Sopenharmony_ci * 7862306a36Sopenharmony_ci * SYS_OFF_PRIO_LOW: Use this for handler of last resort. 7962306a36Sopenharmony_ci * 8062306a36Sopenharmony_ci * SYS_OFF_PRIO_DEFAULT: Use this for normal handlers. 8162306a36Sopenharmony_ci * 8262306a36Sopenharmony_ci * SYS_OFF_PRIO_HIGH: Use this for higher priority handlers. 8362306a36Sopenharmony_ci * 8462306a36Sopenharmony_ci * SYS_OFF_PRIO_FIRMWARE: Use this if handler uses firmware call. 8562306a36Sopenharmony_ci */ 8662306a36Sopenharmony_ci#define SYS_OFF_PRIO_PLATFORM -256 8762306a36Sopenharmony_ci#define SYS_OFF_PRIO_LOW -128 8862306a36Sopenharmony_ci#define SYS_OFF_PRIO_DEFAULT 0 8962306a36Sopenharmony_ci#define SYS_OFF_PRIO_HIGH 192 9062306a36Sopenharmony_ci#define SYS_OFF_PRIO_FIRMWARE 224 9162306a36Sopenharmony_ci 9262306a36Sopenharmony_cienum sys_off_mode { 9362306a36Sopenharmony_ci /** 9462306a36Sopenharmony_ci * @SYS_OFF_MODE_POWER_OFF_PREPARE: 9562306a36Sopenharmony_ci * 9662306a36Sopenharmony_ci * Handlers prepare system to be powered off. Handlers are 9762306a36Sopenharmony_ci * allowed to sleep. 9862306a36Sopenharmony_ci */ 9962306a36Sopenharmony_ci SYS_OFF_MODE_POWER_OFF_PREPARE, 10062306a36Sopenharmony_ci 10162306a36Sopenharmony_ci /** 10262306a36Sopenharmony_ci * @SYS_OFF_MODE_POWER_OFF: 10362306a36Sopenharmony_ci * 10462306a36Sopenharmony_ci * Handlers power-off system. Handlers are disallowed to sleep. 10562306a36Sopenharmony_ci */ 10662306a36Sopenharmony_ci SYS_OFF_MODE_POWER_OFF, 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci /** 10962306a36Sopenharmony_ci * @SYS_OFF_MODE_RESTART_PREPARE: 11062306a36Sopenharmony_ci * 11162306a36Sopenharmony_ci * Handlers prepare system to be restarted. Handlers are 11262306a36Sopenharmony_ci * allowed to sleep. 11362306a36Sopenharmony_ci */ 11462306a36Sopenharmony_ci SYS_OFF_MODE_RESTART_PREPARE, 11562306a36Sopenharmony_ci 11662306a36Sopenharmony_ci /** 11762306a36Sopenharmony_ci * @SYS_OFF_MODE_RESTART: 11862306a36Sopenharmony_ci * 11962306a36Sopenharmony_ci * Handlers restart system. Handlers are disallowed to sleep. 12062306a36Sopenharmony_ci */ 12162306a36Sopenharmony_ci SYS_OFF_MODE_RESTART, 12262306a36Sopenharmony_ci}; 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ci/** 12562306a36Sopenharmony_ci * struct sys_off_data - sys-off callback argument 12662306a36Sopenharmony_ci * 12762306a36Sopenharmony_ci * @mode: Mode ID. Currently used only by the sys-off restart mode, 12862306a36Sopenharmony_ci * see enum reboot_mode for the available modes. 12962306a36Sopenharmony_ci * @cb_data: User's callback data. 13062306a36Sopenharmony_ci * @cmd: Command string. Currently used only by the sys-off restart mode, 13162306a36Sopenharmony_ci * NULL otherwise. 13262306a36Sopenharmony_ci */ 13362306a36Sopenharmony_cistruct sys_off_data { 13462306a36Sopenharmony_ci int mode; 13562306a36Sopenharmony_ci void *cb_data; 13662306a36Sopenharmony_ci const char *cmd; 13762306a36Sopenharmony_ci}; 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_cistruct sys_off_handler * 14062306a36Sopenharmony_ciregister_sys_off_handler(enum sys_off_mode mode, 14162306a36Sopenharmony_ci int priority, 14262306a36Sopenharmony_ci int (*callback)(struct sys_off_data *data), 14362306a36Sopenharmony_ci void *cb_data); 14462306a36Sopenharmony_civoid unregister_sys_off_handler(struct sys_off_handler *handler); 14562306a36Sopenharmony_ci 14662306a36Sopenharmony_ciint devm_register_sys_off_handler(struct device *dev, 14762306a36Sopenharmony_ci enum sys_off_mode mode, 14862306a36Sopenharmony_ci int priority, 14962306a36Sopenharmony_ci int (*callback)(struct sys_off_data *data), 15062306a36Sopenharmony_ci void *cb_data); 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ciint devm_register_power_off_handler(struct device *dev, 15362306a36Sopenharmony_ci int (*callback)(struct sys_off_data *data), 15462306a36Sopenharmony_ci void *cb_data); 15562306a36Sopenharmony_ci 15662306a36Sopenharmony_ciint devm_register_restart_handler(struct device *dev, 15762306a36Sopenharmony_ci int (*callback)(struct sys_off_data *data), 15862306a36Sopenharmony_ci void *cb_data); 15962306a36Sopenharmony_ci 16062306a36Sopenharmony_ciint register_platform_power_off(void (*power_off)(void)); 16162306a36Sopenharmony_civoid unregister_platform_power_off(void (*power_off)(void)); 16262306a36Sopenharmony_ci 16362306a36Sopenharmony_ci/* 16462306a36Sopenharmony_ci * Architecture independent implemenations of sys_reboot commands. 16562306a36Sopenharmony_ci */ 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ciextern void kernel_restart_prepare(char *cmd); 16862306a36Sopenharmony_ciextern void kernel_restart(char *cmd); 16962306a36Sopenharmony_ciextern void kernel_halt(void); 17062306a36Sopenharmony_ciextern void kernel_power_off(void); 17162306a36Sopenharmony_ciextern bool kernel_can_power_off(void); 17262306a36Sopenharmony_ci 17362306a36Sopenharmony_civoid ctrl_alt_del(void); 17462306a36Sopenharmony_ci 17562306a36Sopenharmony_ciextern void orderly_poweroff(bool force); 17662306a36Sopenharmony_ciextern void orderly_reboot(void); 17762306a36Sopenharmony_civoid hw_protection_shutdown(const char *reason, int ms_until_forced); 17862306a36Sopenharmony_ci 17962306a36Sopenharmony_ci/* 18062306a36Sopenharmony_ci * Emergency restart, callable from an interrupt handler. 18162306a36Sopenharmony_ci */ 18262306a36Sopenharmony_ci 18362306a36Sopenharmony_ciextern void emergency_restart(void); 18462306a36Sopenharmony_ci#include <asm/emergency-restart.h> 18562306a36Sopenharmony_ci 18662306a36Sopenharmony_ci#endif /* _LINUX_REBOOT_H */ 187