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