【待评审】thermal_mgmt 共享风扇控制权属性新增

thermal_mgmt 共享风扇控制权属性新增

1. 评审背景

支持风扇共享的转速和转速模式设置
现有手动模式(SetCtrlMode/SetManualLevel)仅支持单 BMC。新场景为双单板控制器机框:每板一个 BMC(一主一从),共 14 个独立风扇(每板 7 个)+ 2 个共享风扇(两板中间,仅主控可访问)。

协同要求:

  1. 独立风扇各板本地生效,不分主从
  2. 共享风扇仅主控生效;调用方为从控时,转发 RPC 至主控,主控设置后再同步

多控建模已确认:两 BMC 资源树上均存在风扇对象;主从同步远期走 bmc_datasync,不在本次范围。

核心诉求:需要一个可承载"独立控制 or 仅共享主控控制"语义的属性。

2. 已有属性复用结论:均不可复用

属性 所属类 语义 不可复用原因
IsTwins/Position/FunctionDesc Fan 结构/位置/描述 与控制权无关
ManageFans PWMChannel 通道管辖的风扇 ID 数组 "通道→风扇"映射,非"风扇→控制方"归属
FanCtrlEnable CoolingConfig 整板调速使能(Enabled/Disabled) 整板级开关,非每风扇粒度
WorkInStandby Fans standby 是否可运转 电源域语义,无关

强行复用会破坏现有语义,影响上层呈现,故需新增属性。

3. 新增属性方案对比

方案 A:Fan 类新增单风扇标记(私有属性)

"Fan": {
    "path": "/bmc/kepler/Systems/:SystemId/Thermal/Fans/:Id",
    "properties": {
        "ControlOwner": {
            "usage": ["CSR"],
            "baseType": "U8",
            "default": 0,
            "description": "0=本板独立控制, 1=共享风扇仅主控控制"
        }
    }
}
  • 优点:建模正确(共享/独立是风扇固有属性),单风扇粒度精确;与风扇硬件数据同层,basic_cooling 遍历风扇时可直接读取,逻辑层读取零跨层;远期若组件拆分后属性归属下层 thermal 组件,无跨组件引用

  • 缺点:方法在 CoolingConfig(上层)、属性在 Fan(硬件层),RPC 实现需跨两层(上层入口 → 逻辑层 → 硬件层对象)读取,调用链较长;每个 Fan 对象字段膨胀;需改设备树同步

接口变更

属性名称 变化类型 签名 资源path 持久化 变化通知 接口说明 接口约束
ControlOwner 新增属性 y /bmc/kepler/Systems/:SystemId/Thermal/Fans/:Id 不持久化 false 风扇控制权归属:0=本板独立控制,1=共享风扇仅主控控制 取值仅 0/1,由板级 CSR 逐风扇配置

方案 B:CoolingConfig 类新增共享风扇 ID 列表(私有属性)

"CoolingConfig": {
    "path": "/bmc/kepler/Systems/:SystemId/CoolingConfig",
    "properties": {
        "SharedFanIds": {
            "usage": ["CSR"],
            "baseType": "U8[]",
            "description": "共享风扇ID列表,多控下仅主控可设置转速"
        }
    }
}
  • 优点:与方法同类、改动集中;配置集中(整框概念);扩展好(加共享风扇仅改 CSR)

  • 缺点:依赖两控 CSR 一致;风扇热插拔需维护列表;与硬件层 Fan 对象跨层——属性在上层,需将风扇 FanId 列表映射到硬件层风扇对象才能定位共享风扇;远期若组件拆分后属性在上层 basic_cooling,但语义属于下层风扇,存在跨组件引用风险

接口变更

属性名称 变化类型 签名 资源path 持久化 变化通知 接口说明 接口约束
SharedFanIds 新增属性 ay /bmc/kepler/Systems/:SystemId/CoolingConfig 不持久化 false 共享风扇ID列表,多控下仅主控可设置转速 两控 CSR 配置须一致;列表为风扇 FanId 数组

4.评审结论