风扇适配指导

一、thermal_mgmt介绍

散热器件管理组件,提供散热器件状态监测、调速、异常告警和基础信息收集与展示的功能。

代码目录结构

	device_tree:                                            --设备树相关实现
      adapters:
        14100363_0000000xxxxxxxxxxxxx                       --14100363_0000000xxxxxxxxxxxxx单板对应adapter实现
        14100363_0000000xxxxxxxxxxxxx                       --14100363_0000000xxxxxxxxxxxxx单板对应adapter实现
        thermal_common:
            pwm_channel.lua:                                -- pwm_channel对象,用于描述共pwm通道场景
            Fan.lua                                         -- 单风扇PWM设置默认实现
            FanGroup.lua                                    -- 风扇组默认实现
            Fans.lua                                        -- PWM批量下发默认实现
            PumpGroup.lua                                   -- 泵组默认实现
manufacture:
	thermal_mgmt_manufacture.lua                            --装备测试项代码
src:
	lualib:
		ipmi_service:
			fan_ipmi.lua                                    --风扇ipmi实现
			valve_ipmi.lua                                  --电磁阀ipmi实现
		basic_cooling_config.lua                            --基础散热配置对象管理
		fan_group.lua                                       --风扇组对象管理
	    fan_info.lua                                        --faninfo对象管理
		fan_object.lua                                      --fan对象管理
		fan_service.lua                                     --风扇服务
		fan_type_object.lua                                 --fantype对象管理
		fans_object.lua                                     --fans对象管理
		metric_collect.lua                                  --数据采集
		power_supplies.lua                                  --电源风扇管理
		pump_object.lua                                     --pump对象管理
		pumps_object.lua                                    --pumps象管理
		thermal_mgmt_app.lua                                --app入口
		thermal_mgmt_utils.lua                              --散热组件工具函数实现
		valve_enums.lua                                     --电磁阀枚举
		valve_object.lua                                    --valve对象管理
		valve_service.lua                                   --电磁阀服务
		valves_object.lua                                   --valves对象管理

二、风扇加载流程

1、自发现识别加载CSR
2、自发现上树ObejctGroup对象
3、sd-bus发送InterfaceAdd信号给各个组件
4、各个组件向自发现请求CSR对象(解析出来的CSR文本)
5、libmc4lua创建资源树对象
6、libmc4lua将自发现解析出来的属性赋值给对象
7、libmc4lua从持久化恢复数据到对象上
8、libmc4lua把对象注册上树
9、调用各个组件的addobject回调
10、执行组件设备树的差异性适配
11、执行orm初始化回调,对象初始化完成

三、风扇CSR适配

1、配置风扇转速信息、在位信息、PWM信息(通常位于风扇板上)

"Scanner_Fan1_Presence": {
    "Chip": "#/Smc_FanBoardSMC",
    "Offset": 402656001,
    "Size": 1,
    "Mask": 1,
    "Type": 0,
    "Period": 2000,
    "Debounce": "None",
    "ScanEnabled": "<=/Scanner_PowerGood.Value",
    "NominalValue": 1,
    "@Default": {
      "ScanEnabled": 0
    },
      "Value": 0
    }
}

"Scanner_Fan1_FSpeed": {
      "Chip": "#/Smc_FanBoardSMC",                     # 关联的chip
      "Offset": 402657025,                             # 偏移
      "Size": 4,                                       # 读取数据长度
      "Mask": 4294901760,                              # 位读时有效,从硬件读取数据后与掩码按位与操作
      "Type": 0,                                       # 读类型,0:位读,1:块读
      "Period": 1000,                                  # 扫描周期,单位ms
      "Debounce": "None",                              # 防抖类型
      "Value": 0                                       # 读值
}

"Accessor_Fan1_PWM": {
    "Chip": "#/Smc_FanBoardSMC",                       # 关联的chip
    "Offset": 402657281,                               # 偏移
    "Size": 1,                                         # 读取数据长度
    "Mask": 255,                                       # 位读时有效,从硬件读取数据后与掩码按位与操作
    "Type": 0,                                         # 读类型,0:位读,1:块读
    "Value": 0                                         # 读值
}

2、配置风扇chip(通常位于风扇板上,用作风扇板风扇PWM设置)

"Chip_Fan_PWM": {
    "OffsetWidth": 4,
    "AddrWidth": 4,
    "Address": 96
}

Fans_0": {
    "PWMChip": "#/Chip_Fan_PWM",                          # 关联Chip对象
    SetPWMCmd": 402657792                                 # SMC命令
}

3、配置风扇CSR(通常位于风扇板上)

"Fan_1": {
    "FanId": 1,                                           # 风扇ID
    "Slot": 1,                                            # 风扇槽位
    "FrontPresence": "<=/Scanner_Fan1_Presence.Value",    # 前转子在位状态 1:在位;0:不在位
    "RearPresence": "<=/Scanner_Fan1_Presence.Value",     # 后转子在位状态 1:在位;0:不在位
    "FrontSpeed": "<=/Scanner_Fan1_FSpeed.Value",         # 前转子转速
    "RearSpeed": "<=/Scanner_Fan1_RSpeed.Value",          # 后转子转速
    "HardwarePWM": "#/Accessor_Fan1_PWM.Value",           # 硬件占空比 从硬件获取的占空比信息
    "SystemId": 1,                                        # 系统Id
    "FrontStatus": 0,                                     # 前转子状态 由软件进行刷新
    "RearStatus": 0,                                      # 后转子状态 由软件进行刷新
    "MaxSupportedPWM": 255,                               # 该风扇支持的最大占空比
    "IdentifySpeedLevel": 35,                             # 风扇型号识别时使用的转速级别
    "Position": "CLU${Slot}",                             # 风扇的位置 如 CLU1
    "PowerGood": "<=/Scanner_PowerGood.Value"             # OS上下电信息
}
"FanType_1": {
      "Name": "8038+",                                    # 风扇型号
      "Index": 1,                                         # 风扇型号的索引 
      "IsTwins": true,                                    # 是否为双转子风扇
      "FrontMaxSpeed": 15000,                             # 前转子最大转速
      "RearMaxSpeed": 15000,                              # 后转子最大转速
      "IdentifyRangeLow": 3230,                           # 风扇型号识别转速左区间
      "IdentifyRangeHigh": 4750,                          # 风扇型号识别转速右区间
      "PartNumber": "02314BLG",                           # 部件编码
      "BOM": "BOM32030275",                               # BOM编码
      "SystemId": 1                                       # 系统Id
}                 

5、调试
例:风扇4后转子转速查询
busctl --user call bmc.kepler.hwproxy /bmc/kepler/Chip/Smc/Smc_FanBoardSMC_010103 bmc.kepler.Chip.BlockIO Read a{ss}uu 0 0x18000F04 2
ay 2 236 4
解释:/bmc/kepler/Chip/Smc/Smc_FanBoardSMC_010103:对应Chip的资源树路径(根据环境上路径进行调整)
bmc.kepler.Chip.BlockIO:资源树块读写接口
Read:方法名
a{ss}uu:请求参数签名,其中a{ss}为上下文可以直接填0,第一个u代表偏移,第二个u代表读取字节数

236 = 0xEC
则转速为:0x04EC = 1260

四、风扇设备树适配

风扇板差异,风扇转速设置方式可能有所不同,如共PWM通道场景,通过设备树在不同风扇板下实现该差异性。设备树加载通用模型,与通用逻辑不一致的需要自行在对应的csr目录下补充adapter, 在init()函数中声明各接口

1、Fan

提供接口如下

接口 描述
SetFanExpectedPWM 设置期望占空比
SetFanPWM 设置风扇占空比 (校验风扇是否在位且型号已识别)
SetFanHardwarePWM 设置风扇占空比 (无校验)
Configurable 风扇是否在位且型号已识别

2、Fans

提供接口如下

接口 描述
SetFansPWM 批量设置风扇占空比

五、风扇型号加载流程

风扇型号识别备选池由配置的FanType对象决定。通过Fan对象下配置的IdentifySpeedLevel属性明确该风扇风扇识别时的使用的PWM,当设置该PWM下,风扇转速处于FanType IdentifyRangeLow与IdentifyRangeHigh之间,则认为风扇类型为该FanType

六、常见踩坑点及注意事项

1、风扇转速下发不生效
可优先设置手动模式后,使用smc命令进行占空比下发与查询排除CSR配置问题
(1)设置手动模式

ipmcset -d fanmode -v 1 0
Set fan mode successfully.
Current Mode:       manual
Time out    :       100000000 seconds

(2)占空比设置

mdbctl call Smc_FanBoardSMC_010103 bmc.kepler.Chip.BlockIO Write 0 0x18001000 
4 254 254 254 254

(3)占空比查询

mdbctl call Smc_FanBoardSMC_010103 bmc.kepler.Chip.BlockIO Read 0 0x18001100 4
[89,89,89,89]

2、风扇类型识别错误
关键日志

identify fan%d model successfully. identify_cnt = %d. record_pwm = [%s], record_speed = [%s]

record_pwm 应当每个都是MaxSupportedPWM * IdentifySpeedLevel,record_speed应当每个都在预期的IdentifyRangeLow和IdentifyRangeHigh之间。

如果record_pwm 符合预期但是record_speed不符合预期,则是硬件问题。如果record_pwm出现不一致的或者不是MaxSupportedPWM * IdentifySpeedLevel的,可能问题点:
1.thermal_mgmt软件问题,需要排查是否在风扇转速识别过程中没正确拦截其余PWM设置任务,识别风扇型号PWM被覆盖
2.Accessor_Fan1_PWM寄存器无法写入
3.框架上报的值错误,可以手动读寄存器与资源树上的值进行对比

2 个赞