此前Linux平台虽已推出苹果系统管理控制器(SMC)硬件监控驱动,目标是在Apple Silicon SoC上向系统暴露电池/功耗状态、温度等各类硬件监测数据,但该驱动至今仍无法在主线内核中正常运行。问题根源一方面是设备树节点缺失,另一方面是不同苹果M系列SoC之间的传感器配置零散混乱,整体适配局面十分棘手。
长期参与Apple Silicon平台Linux适配工作的贡献者James Calligeros一直在梳理这套混乱的适配逻辑,目标是让苹果SMC硬件监控(HWMON)节点正常工作,最终实现Apple Silicon的各类传感器可在Linux系统下准确上报温度、电压、功耗及风扇转速数据。相关最新补丁系列已于今日正式上传至Linux内核邮件列表,推进问题的最终解决。

针对不同Apple Silicon SoC之间硬件传感器的差异化极大这一极其混乱的现状,James作出了如下解释:
在此前合并SMC硬件监控驱动的补丁系列基础上,本次提交的补丁系列将相关配置独立拆分,补充了该硬件监控驱动正常运行所必需的设备树节点——这批节点早在去年12月的驱动提交阶段就被遗漏了。
Apple Silicon设备上的系统管理控制器(SMC)会对外暴露分布在SoC及整机各处的大量传感器(数量可能多达数百个)采集的温度、电压、功耗与风扇转速数据。但遗憾的是,苹果通过SMC固件的FourCC键值系统对外暴露这些传感器的逻辑完全毫无规律可循:部分传感器在所有设备、所有SoC上都通用,比如用于统计整机平台总功耗的PSTR传感器;部分传感器仅面向特定品类的设备,比如仅在带风扇的机型上才会存在的风扇控制键值;部分传感器仅为某一款特定SoC专属;还有部分传感器甚至仅对应某一台特定的设备。更复杂的是,部分同型号SoC在不同设备上的传感器定义都不统一:某款指定SoC的应用核心温度传感器,需要根据该SoC搭载的具体设备型号,从完全不同的SMC键值中读取数据……
如果试图为每一台设备单独编写完整的传感器配置设备树,完全是徒劳无用的重复劳动。为了消除冗余代码,开发团队转而通过.dtsi头文件,以更合理的方式为每款设备组合生成对应的传感器配置集:
- 经实测验证在所有SoC、所有设备上都存在的通用传感器,统一放入hwmon-common.dtsi文件中
- 经实测验证搭载某款指定SoC的所有设备都支持的传感器,放入对应SoC专属的hwmon-${soc}.dtsi文件中,这套逻辑和当前项目中PMGR电源管理单元、GPIO外设的适配方式完全一致
- 经实测验证某一特定品类的所有设备都支持的传感器,放入对应品类的hwmon-${class}.dtsi文件中(例如面向笔记本品类的hwmon-laptop.dtsi)
- 所有带风扇的设备都通用的风扇控制端点,通过预编译指令#include引入hwmon-fan-*.dtsi文件统一配置
- 仅为单台特定设备专属的传感器,直接在该设备对应的专属.dts文件中单独定义即可
本补丁系列先行引入一批已完成验证的基础传感器配置,为整套适配工作拉开序幕。不难想见,要遍历找出每款设备上所有可用的有效传感器、同时明确每个传感器的实际监测对象,是一项极其繁琐且耗费大量人力的工作,因此后续版本会在合适的时机陆续补充更多传感器的适配支持。
这是一项棘手的遗留适配难题,需要投入大量时间才能彻底解决,但至少针对传感器适配的相关开发工作已经取得了实质性进展,能满足那些在Linux系统下使用苹果Mac设备、关注功耗与温度监控功能的用户的核心需求。与此同时,面向Apple M4芯片的设备树补丁仍在走审核流程,目前该适配版本仅能实现基础的有限功能,仅支持设备正常启动;除此之外,针对M3 Pro/Max/Ultra硬件的启动适配工作也在同步推进中。
Linuxeden开源社区