摘要
TODO(https://fxbug.dev/42108078)
声明
#include <zircon/syscalls.h>
zx_status_t zx_system_powerctl(zx_handle_t resource,
uint32_t cmd,
const zx_system_powerctl_arg_t* arg);
说明
zx_system_powerctl
会根据 cmd 的值更改系统的电源状态。Zircon 可能无法将系统置于给定的电源状态,具体取决于其对所用架构的支持级别。
arg 是指向结构体的可选指针,可提供有关要执行的命令的更多信息。
命令
ZX_SYSTEM_POWERCTL_ENABLE_ALL_CPUS
将所有处理器核心设置为活跃状态。
arg 类型:n/a
ZX_SYSTEM_POWERCTL_DISABLE_ALL_CPUS_BUT_PRIMARY
仅将主 CPU 设置为活动状态。
arg 类型:n/a
ZX_SYSTEM_POWERCTL_ACPI_TRANSITION_S_STATE
仅适用于 x86-64。
目前仅支持过渡到 S3 状态。
在调用此系统调用之前,应执行以下步骤:
1. 进入 ACPICA 非竞争模式
2. 关闭辅助 CPU
3. 执行 _PTS
控制方法
4. (可选)执行 _SST
控制方法
5. 清除 ACPI 唤醒状态位寄存器
6. 停用所有 ACPI GPE
7. 已启用所有 ACPI 唤醒 GPE
arg 类型:zx_system_powerctl_arg_t
(仅将 acpi_transition_s_state
并集元素视为有效)。
struct {
uint8_t target_s_state; // Value between 1 and 5 indicating which S-state
uint8_t sleep_type_a; // Value from ACPI VM (SLP_TYPa)
uint8_t sleep_type_b; // Value from ACPI VM (SLP_TYPb)
} acpi_transition_s_state;
如果目标 S 状态不在 1-5 范围内,则返回 ZX_ERR_INVALID_ARGS
。
如果不支持转换为目标 S 状态,则返回 ZX_ERR_NOT_SUPPORTED
。
如果目标 S 状态不是 5 并且辅助 CPU 尚未关闭,则返回 ZX_ERR_BAD_STATE
。
如果没有足够的资源来运行线程,则返回 ZX_ERR_NO_MEMORY
。
如果 S 状态转换失败,则返回 ZX_ERR_INTERNAL
。
ZX_SYSTEM_POWERCTL_X86_SET_PKG_PL1
仅适用于 x86-64。
将 CPU 的功率设为 1。
arg 类型:zx_system_powerctl_arg_t
(仅 x86_power_limit
并集元素被视为有效)。
struct {
uint32_t power_limit; // PL1 value in milliwatts
uint32_t time_window; // PL1 time window in microseconds
uint8_t clamp; // PL1 clamping enable
uint8_t enable; // PL1 enable
uint8_t padding2[2];
} x86_power_limit;
ZX_SYSTEM_POWERCTL_REBOOT
重启系统,控制项应通过所有相关的固件和引导加载程序。
arg 类型:n/a
ZX_SYSTEM_POWERCTL_REBOOT_BOOTLOADER
重启系统,但在引导加载程序中停止,而不是加载操作系统。
arg 类型:n/a
ZX_SYSTEM_POWERCTL_REBOOT_RECOVERY
重启系统,但加载恢复操作系统而不是主操作系统。
arg 类型:n/a
ZX_SYSTEM_POWERCTL_SHUTDOWN
关闭系统。
arg 类型:n/a
ZX_SYSTEM_POWERCTL_ACK_KERNEL_INITIATED_REBOOT
当用户空间准备好重新启动以响应内核想要重新启动系统的先前信号时,由用户空间使用。
arg 类型:n/a
如果内核之前未发出需要重新启动的信号,则返回 ZX_ERR_BAD_STATE
。
权限
resource 必须具有以 ZX_RSRC_SYSTEM_POWER_BASE
为基数的资源种类 ZX_RSRC_KIND_SYSTEM
。
返回值
ZX_OK
错误
如果提供的 cmd
值无法识别,则返回 ZX_ERR_INVALID_ARGS
。
另请参阅
TODO(https://fxbug.dev/42108078)