You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ARMv8/ARM64架构下ACPI S3(挂起到内存)功能实现求助

解决ARM64 Linaro v4.9 LSK系统ACPI S3(挂起到内存)失败的问题

我来帮你梳理下这个问题的关键排查点和配置细节——你已经确认了ATF支持PSCI 1.0,但仍遇到echo mem > /sys/power/state返回Invalid argument的错误,大概率是内核配置或设备树的PSCI映射没做全,下面是具体的解决方向:

一、先检查内核配置是否遗漏

Linaro v4.9 LSK的内核默认可能没有完全开启S3相关的PSCI睡眠支持,你需要确保以下几个关键配置项已经启用:

  • CONFIG_PM_SLEEP:基础睡眠框架,必须开启
  • CONFIG_PM_SLEEP_SMP:多核心系统的睡眠协同支持,ARM64多核心环境下必备
  • CONFIG_ARM64_PSCI 和 CONFIG_ARM64_PSCI_SLEEP:PSCI睡眠功能的核心驱动,缺一不可
  • CONFIG_ACPI_SLEEP:虽然你用PSCI,但ACPI S3状态的映射依赖这个配置
  • 可选开启CONFIG_PM_DEBUG:方便后续通过内核日志排查具体失败原因

你可以用zcat /proc/config.gz | grep <配置项>来验证这些配置是否生效,如果有缺失,需要重新编译内核并勾选对应选项。

二、PSCI 1.0的设备树具体配置

即使ATF支持PSCI 1.0,设备树也必须正确声明PSCI节点和CPU睡眠映射,这是很多人容易忽略的点:

1. 根节点下添加PSCI核心节点

psci {
    compatible = "arm,psci-1.0";
    method = "smc"; // 注意:如果你的ATF用的是hvc调用,这里要改成"hvc"
    standby-state = "power-down";
};
  • compatible必须指定为arm,psci-1.0,明确告诉内核使用PSCI 1.0协议
  • method要和你的ATF配置完全匹配,绝大多数ATF实现用smc,少数特殊平台用hvc
  • standby-state设置为power-down才能支持深度挂起到内存的状态

2. 为每个CPU节点添加PSCI睡眠参数

每个CPU节点都需要配置以下内容(以cpu@0为例):

cpu@0 {
    device_type = "cpu";
    reg = <0x0>;
    enable-method = "psci";
    psci-suspend-param = <0x0010000>; // 这个值取决于你的平台,通常是0x10000,可参考芯片厂商的官方设备树
};
  • enable-method必须设为psci,让内核通过PSCI接口管理CPU的睡眠和唤醒
  • psci-suspend-param是PSCI挂起到内存的状态参数,不同平台可能有差异,建议查阅你所用芯片的参考文档或官方设备树示例确认正确值

三、ATF和平台固件的额外检查

  • 确认ATF编译时已经开启了PSCI_SUSPEND_TO_RAM相关的配置,有些平台需要在ATF的编译选项中显式启用S3支持
  • 检查平台的PMIC(电源管理芯片)是否配置了睡眠模式下的DRAM供电策略——挂起到内存需要保持DRAM的供电,否则唤醒时会丢失数据
  • 查看内核日志(dmesg | grep -i psci 或 dmesg | grep -i suspend),获取更详细的错误信息,比如PSCI调用的返回码,这能帮你快速定位具体是哪一步出了问题

四、验证步骤

完成上述配置后重启系统:

  1. 先检查/sys/firmware/psci/version,确认输出是1.0,确保PSCI 1.0已被内核识别
  2. 再次尝试执行echo mem > /sys/power/state,如果还是报错,直接看dmesg里的具体错误提示,针对性排查

内容的提问来源于stack exchange,提问作者logic seeker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:18:15