【SOC】SMC 中的 function identifier 和 SCMI中 protocol_id 的区别

📅 2026/7/18 5:47:54
【SOC】SMC 中的 function identifier 和 SCMI中 protocol_id 的区别
SMC Function ID 和 SCMI Protocol ID 虽然都带“ID”但它们的性质、格式和作用范围完全不同。简单来说它们是两张不同坐标系里独立编制的“门牌号”SMC Function ID门牌号是开启“SMC这一扇大门”的钥匙。由 SMCCC (DEN0028)规范 定义它是一个32位数值其中的 OEN字段 标识了服务提供者。它的核心作用是路由告诉EL3的Secure Monitor固件该SMC调用属于哪类服务ARM标准服务、SiP服务还是OEM服务。SCMI Protocol ID房间号是在SCMI这一扇门内具体管理特定类型硬件资源的“协议模块”编号。由 SCMI (DEN0056)规范定义它是一个8位数值。它的核心作用是内部寻址在SCMI消息内部进一步指定当前要操作的目标比如电源管理0x11还是时钟0x14。 SMC Function ID通往安全世界的大门SMC Function ID是ARM定义的“SMC调用约定” (SMCCC, DEN0028) 中的核心概念。AP通过执行SMC指令并传递这个32位的ID来请求EL3的安全固件执行某项服务。寻址方式基于 OEN (Owner Entity Number)功能服务路由将调用指向对应的服务提供方ARM, SiP, OEM等格式[31]调用类型 [30]调用约定 [29:24] OEN [15:0]功能号示例0x82000001 (OEN0b10, SiP功能), 0x84000001 (OEN0b11, OEM功能)规范SMCCC (DEN0028)[reference:10]在实现上SMC Function ID由AP在SMC指令的参数通常是x0寄存器中传递。通过OEN区分调用目标例如OEN0x02是SiP服务OEN0x03是OEM服务使得EL3固件能将后续处理交给对应的服务模块。而SCMI是一个上层协议其实现通常与SMC调用绑定例如在Devicetree中定义一个arm,smc-id 0x82004000的SMC Function ID作为SCMI消息传输的“通道触发”。 SCMI Protocol ID系统管理的功能模块SCMI Protocol ID是ARM定义的“系统控制与管理接口” (SCMI, DEN0056) 协议中的概念。它标识了SCMI协议框架内部的一组功能集合用于管理特定类型的系统资源。寻址方式基于 Protocol ID功能功能寻址在SCMI框架内指定要操作的资源类型格式8位整数十六进制示例0x11 (电源域管理), 0x14 (时钟管理), 0x16 (复位域管理)规范SCMI (DEN0056)[reference:15]在实现上SCMI Protocol ID由AP在SCMI消息的头部中传递。它用于指定本次SCMI操作要管理的资源类型。然后通过Message ID消息ID进一步指定具体的操作比如POWER_STATE_SET是设置电源状态。SCMI通常作为一个上层服务可以通过多种传输方式实现。当使用SMC作为传输层时FW会解析SCMI消息内的Protocol ID来调用相应的底层驱动。SCMI 的消息格式: Message_Header (32bit) Payload32bit x NMessage_Header 内容bits[31:28] reservedmust be zerobits[27:18] tokenbits[17:10] protocol_idbits[9:8] message_typebits[7:0] message_id 从整栋楼到房间理解二者的层级关系如果我们将整个系统抽象为一栋大楼SMC Function ID 更像是进入不同楼层如SIP/OEM服务的大门钥匙。SCMI Protocol ID 则是SCMI服务这一层楼内的房间门牌号。 实际案例与检查清单通过一个具体的使用场景可以帮助理解它们的协作流程配置设备树在arm,scmi-smc节点中定义arm,smc-idSMC Function ID。这相当于在房子上安装了一个特定的门。发起调用AP执行SMC指令使用该arm,smc-id进入“SCMI服务”这扇门。进入后通过共享内存传递的SCMI消息中携带Protocol ID例如0x14表示要管理时钟。服务处理EL3中的SCMI服务固件如TF-A接收到请求。它首先根据arm,smc-id路由到SCMI处理程序然后解析出SCMI消息中的Protocol ID和Message ID最终调用时钟驱动程序来完成操作。这是典型的“共享内存 门铃中断”的传输模式。代码分析在SCP-firmware的smc_transport.c模块中smc_id用于注册SMC处理程序arm_smccc_smc这在运行时起到服务路由的作用。而scmi_power_domain.c模块则负责解析消息中的Protocol ID (0x11) 并进行功能寻址。SMC 只负责解决“如何将请求送达EL3”的路由问题 Function ID使用SMC 调用时 两端的 function id 要一致两个ID的层次和职责截然不同你可以通过以下清单来帮助判断和理解特性 SMC Function ID SCMI Protocol ID主要职责 服务路由 功能寻址定义规范 SMCCC (DEN0028) SCMI (DEN0056)所在位置 SMC指令参数 SCMI消息头部值/范围 32位由OEN字段分类 8位例如 0x11, 0x14