SEU CSR配置指导书
更新时间: 2026/06/16
在Gitcode上查看源码

SEU CSR配置指导书

修订记录

日期修订版本修改描述
2025/06/14V1.0初版完成
2025/07/16V1.1刷新传感器capabilities属性和Scanner ScanEnabled属性配置规范
2025/07/28V1.2新增防抖配置指导链接
2025/08/19V1.3新增能效组件管理
2025/08/25V1.4新增异构算力组件管理
2025/08/28V1.5新增cpld/sr升级流程
2025/11/01V1.6SerialNumber直接关联FruData对象的BoardSerialNumber
2025/12/12V1.7新增920B代码仓拆分方式说明
2026/01/15V1.8新增温度海洋中门限配置说明
2026/01/17V1.9新增Scanner扫描周期说明,删除SMC Name属性,新增SmcCmdList
2026/01/22V2.0刷新HddBackplane的DeviceName/NodeId配置规范
2026/01/26V2.1刷新Drive的name动态变化的时候需要注意的事项
2026/01/27V2.2LogicFirmware对象新增ComponentID/ComponentIDEx字段配置说明
2026/06/16V2.3移除 UTF-8 BOM,刷新 CSR 目录合规性

[TOC]

一个完整的SR文件,包含硬件的版本描述信息、硬件的管理拓扑信息、硬件的传感器和状态信息、告警和时间信息、装备测试信息。

SR数据为json格式,完整的SR数据结构包含4部分数据:FormatVersion、DataVersion、ManagementTopology和Objects。

当前的920B的CSR分为两部分,硬件CSR和软件CSR,硬件CSR为存放在硬件EEPROM中的CSR内容,软件CSR为存放在BMC中的CSR内容,软件CSR文件名一般以soft结尾,形如****_soft.sr,正式使用时应将两部分合并起来看,同一对象的属性可能会拆开成两部分,一部分属性在硬件csr中,一部分属性在软件csr中。920B的CSR在构建出CSR包时,仅将硬件CSR打包放入EEPROM中;在构建BMC包时,会将硬件CSR与软件CSR合并,并内置于BMC中,此时如果硬件CSR与软件CSR中有重复对象,对象的属性会以软件CSR为准;在服务器实际运行过程中,BMC会比较内置CSR与从EEPROM中获取的CSR版本号,当BMC内置的CSR版本号高时,直接使用BMC内置CSR,当EEPROM中的版本号高时,会将内置CSR与EEPROM中的CSR进行合并,此时如果BMC内置CSR与EEPROM里的CSR有重复对象,以EEPROM里的对象为准。 其他新开发的CSR按照uid_version.sr,uid_mgmt_model.sr,uid_basic_info.sr拆分,构建时统一打包到EEPROM中。

1 CSR的版本描述信息

FormatVersion、DataVersion分别为CSR协议版本号和数据版本号,其定义规则具体如下:

  • FormatVersion:定义了SR协议版本,当前版本的SR协议版本为3.00
  • DataVersion:跟随SR数据内容变化而变化,作用与CPLD版本号相同,高位为大版本号,低位为小版本号;
  • FormatVersion、DataVersion为A.BC样式(A取值范围为1-255, B、C取值范围是0-9);范围约束:A为大版本,范围:1-255,BC为小版本,范围:01-99,小版本固定两位,不足两位需要补0;
  • Unit:定义当前SR描述的组件类型“Type”和单板名称“Name”,组件类型包括基础板BCU、扩展板EXU、硬盘背板SEU、风扇板CLU等,按照天池架构规范定义;单板名称需要与后续单板描述信息的对象对应起来;

以BC83NHBC硬盘背板为例进行说明:

json
  "FormatVersion": "3.00",    // 3.00为CSR协议版本号,当前均为3.00版本
  "DataVersion": "3.15",    // 3.15为CSR数据版本号,即BMC显示的CSR版本号,3为大版本号,29为小版本号
  "Unit": {
    "Type": "SEU",
    "Name": "HddBackplane_1"
  },

2 硬件的管理拓扑信息

ManagementTopology为本组件的管理拓扑,主要包含Anchor、Buses、Chips、 Connectors的层级关系。管理拓扑是SR中描述组件上的管理树模型,包括单板上的管理根链路I2C,hisport_over_I2C通道,以及单板上存在和内存、TPM、UBC连接器和软件虚拟的状态连接器。

以BC83NHBC硬盘背板为例进行说明:

json
  "ManagementTopology": {
    "Anchor": {
      "Buses": [
        "I2c_2",
        "I2c_5",
        "JtagOverLocalBus_1"
      ]
    },
    "I2c_5": {
      "Chips": [
        "Smc_EnclSMC",
        "Eeprom_SEU"
      ],
      "Connectors": [
        "Connector_SEU_Inner_1",
        "Connector_SEU_Inner_2"
      ]
    },
    "I2c_2": {
      "Chips": [
        "Smc_ExpBoardSMC"
      ]
    },
    "Smc_EnclSMC": {
      "Buses": [
        "I2cMux_SMC_1",
        "I2cMux_SMC_2",
        "I2cMux_SMC_3",
        "I2cMux_SMC_4"
      ]
    },
    "I2cMux_SMC_1": {
      "Connectors": [
        "Connector_ComVPDConnect_1"
      ]
    },
    "I2cMux_SMC_2": {
      "Connectors": [
        "Connector_ComVPDConnect_2"
      ]
    },
    "I2cMux_SMC_3": {
      "Connectors": [
        "Connector_ComVPDConnect_3"
      ]
    },
    "I2cMux_SMC_4": {
      "Connectors": [
        "Connector_ComVPDConnect_4"
      ]
    },
    "JtagOverLocalBus_1": {
      "Chips": [
        "Cpld_1"
      ]
    }
  },

3 组件信息获取和管理

3.1 单板信息

3.1.1 背板信息

CSR是单板自描述信息,首先应当描述本板的基本信息。对于硬盘背板来讲,主要包括以下信息: 1、单板身份信息:单板UID、单板板名、厂商信息、单板类型、类型描述、单板部件编码、PCB版本、BoardID; 2、单板管理信息:板上CPLD的位号和版本号,CSR的版本号、MCU版本号;

3、注意此处对单板信息描述的对象名称需要与第一章节中单板名称保持一致。

json
    "HddBackplane_1": {
      "Slot": 1,                    // slot就是用来区分不同槽位的同类型单板的,通常在上级Connector定义不同的slot值,然后在下级sr中引用,当前由软件进行更新
      "UID": "00000001030302023936",// 主板UID:vendor(00000001)+组件类型(03)+0302编码(0302023936)
      "Name": "BC83NHBC",            // 主板板名
      "Manufacturer": "<=/FruData_SEU.BoardManufacturer|> expr($1 == '' ? 'XXX' : $1)",    // 厂家信息,从EEPROM中的FRU中获取,例如厂商名称
      "Type": "SEU",                // 单板类型:硬盘背板为SEU
      "Description": "12*3.5 SAS/SATA(4*NVMe)",        // 单板类型描述
      "PartNumber": "<=/FruData_SEU.BoardPartNumber",    // 单板部件编码,即0302编码,此处直接从FRU中获取
      "LogicVersion": "",            // 逻辑CPLD版本号,无需配置,由软件设置
      "LogicUnit": 17,                // 逻辑CPLD的位号
      "PcbID": "#/Accessor_PcbID.Value",    // 单板的PCB版本
      "PcbVersion": "",                // 单板的PCB版本,BMC从CPLD中获取单板的PCB版本
      "LogicVersionID": "#/Accessor_LogicVersionID.Value",    // Cpld版本号关联寄存器
      "SRVersion": "${DataVersion}",// 引用CSR文件中定义的CSR固件版本号
      "BoardID": 65535,                // 单板BoardID,天池单板未使用BoardID,此值固定写成65535(CSR为json格式,数据均为10进制)
      "BoardType": "HddBackplane",    // 单板类型:HddBackplane
      "Number": 1,                    // 根据整机配置更新逻辑编号,目前仅背板使用,使用SlotConfigs配置属性。字典已标注未完成
      "DeviceName": "DiskBP${Slot}",// 板卡丝印信息,原则上采用大驼峰命名风格,不带下划线,redfish接口
      "Position": "SEU${Slot}",        // 位置信息,redfish接口
      "NodeId": "SEU${Slot}DiskBP${Slot}",    // 资源ID,Position和DeviceName拼接而成,redfish接口
      "RefSMCChip": "#/Smc_EnclSMC",// 硬盘背板挂载的SMC对象
      "FruID": "<=/Fru_SEU.FruId",    // 单板的FRUID
      "Container": "${Container}",    // 更新硬盘背板的起始槽位号
      "SerialNumber": "<=/FruData_SEU.BoardSerialNumber",    // 序列号
      "StartSlot": "${Slot} |> expr(($1 - 1) * 4)",    // 硬盘背板起始槽位号:硬盘ID=HddBackplaneStartSlot + RelativeSlot
      "CpldTestReg": "#/Accessor_CpldTest.Value",    // CPLD自检关联寄存器
      "CpldStatus": 0                // CPLD自检失败次数
    },

3.1.2 单板上的器件

单板上有很多关键器件和资源,需要先定义,再调用。

  • SMC

    天池架构下,通过SMC标准命令字承载通用软硬件接口,BMC、BIOS等均通过标准SMC命令字与硬件交互,一块单板只有一个SMC中心(非智能组件没有SMC,比如Riser),通常由CPLD或者MCU实现,比如920代际的SMC中心为CPLD,920新代际的SMC中心为MCU。 天池架构的管理根链路为I2C,BMC通过I2C与SMC通讯,因此SMC需要配置对应的I2C地址,访问带宽等参数,在天池规范中,SMC的地址固定为0x60。

json
    "Smc_EnclSMC": {
      "Address": 96,        // 天池架构中,所有单板的SMC地址固定为0x60即96
      "AddrWidth": 1,        // 地址宽度,单位Byte
      "OffsetWidth": 1,        // 地址偏移宽度,单位Byte
      "WriteTmout": 0,        // 写超时,单位ms,SMC的读写超时均设置为0
      "ReadTmout": 0        // 读超时,单位ms,SMC的读写超时均设置为0
    },
  • EEPROM

    天池规范要求每个组件在管理跟链路上下挂一个存储器件,用于存储自身的描述信息,即SR的存储载体。当前组件均采用Eeprom作为SR的存储载体。天池规范定义了SR的存储载体的I2C地址固定为0xAE。在这个EEPROM中不仅存储了硬件自描述信息,还包含电子标签和用于自定义数据等。

器件类对象EEPROM包含以下信息:

1、I2C器件公共属性(地址、地址宽度、偏移宽度、写超时、读超时)

2、EEPROM特有属性(分页写数据大小、分页写时间间隔、器件健康状态)

json
    "Eeprom_SEU": {
      "OffsetWidth": 2,        // 偏移宽度,单位byte
      "AddrWidth": 1,        // EEPROM的I2C地址位宽,单位byte
      "Address": 174,        // EEPROM的I2C地址,0xAE即10进制的174
      "WriteTmout": 100,    // 写超时,单位ms
      "ReadTmout": 100,        // 读超时,单位ms
      "RwBlockSize": 32,    // 分页读写EEPROM的数据大小,单位为byte,最大允许取值1024,程序默认值为32
      "WriteInterval": 20,    // 分页写延时间隔,单位ms,最大允许取值500
      "HealthStatus": 0        // 器件健康状态,默认配置为0,由软件更新
    },
  • CPLD

    硬盘背板(SEU)上的信号控制通常通过CPLD实现,如果板上有CPLD,则需要定义器件类对象CPLD。

json
"Cpld_1": {}  // 此对象在CSR中未定义属性

定义说明:BMC会调用CPLD对象的方法,因此即使CSR中未定义CPLD对象的属性,也要声明CPLD对象。

硬盘背板(SEU)上的硬盘管理对象。以Drive_1举例:

json
    "Drive_1": {
      "Id":   "${Slot} |> expr($1 != 1 ? 24: 0)",    // 硬盘id,硬盘对象的主键,不能重复
      "Name": "${Slot} |> expr($1 != 1 ? 24: 0) |> string.format('Disk%s', $1)",    //硬盘名称,命名举例:“Disk1“,”NMVeDisk1”等
      "PhysicalLocation": "HDD Plane",            // 当前盘的物理位置
      "NodeId": "HDDPlaneDisk0",                // 资源的唯一Id,“PhysicalLocation+Name”(注意字符间不要空格)用于redfish接口的显示
      "Presence": "<=/Scanner_Drive0PresentAccessor.Status;<=/Scanner_Drive0PresentAccessor.Value |> expr($1 != 0 ? 255 : $2)",                                                    // 硬盘在位状态,0为不在位,1为在位
      "LocateLed": "<=/Scanner_Drive0LocateAccessor.Value",        // 硬盘locate寄存器的值。0-关闭,1-闪烁,2-常亮
      "FaultLed": "<=/Scanner_Drive0FalutAccessor.Value",        // 硬盘fault寄存器的值。0-关闭,1-常亮,2-闪烁
      "ActivationLed": "<=/Scanner_Drive0ActivationAccessor.Value",    // 硬盘活动状态灯
      "SetLocateLed": "#/Accessor_Drive0LocateAccessor.Value",    // 修改硬盘locate寄存器的值。  0-关定位灯,1-开定位灯(闪烁)
      "SetFaultLed": "#/Accessor_Drive0FaultAccessor.Value",    // 修改硬盘fault寄存器的值。   0-关故障灯,1-点故障灯(常亮)
      "TemperatureCelsius": 255,    // 硬盘温度(摄氏度)  255是默认值-无效值
      "Missing": 0,                    // 硬盘的Missing状态
      "Health": "<=/Component_Drive0.Health",    // 控制器的健康状态 0:OK,1:Minor,2:Major,3:Critical
      "RebuildState": 0,            // 指定硬盘数据重建状态
      "FirmwareStatus": 255,        // 硬盘固件状态,来自于BMA或者Raid
      "PredictiveFailure": 0,        // 硬盘设备预故障检测,来自Raid。0:正常,1:故障。默认为0,支持软件写入
      "InAFailedArray": 0,            // 硬盘是否归属于一个故障阵列,来自Raid。0:否,1:是。默认为0,此处取值支持软件写入
      "FirmwareStatusError": false,    // 关联硬盘FaultLed
      "@Default": {
        "PredictedMediaLifeLeftPercent": 255    // 硬盘静态磨损率
      },
      "SerialNumber": "",            // 硬盘SN编码,来源于BMA,Riad,VPD
      "IODeteriorationHealthCode": 0,    // 硬盘I/O性能健康码
      "HddBackplaneStartSlot": "<=/HddBackplane_1.StartSlot",    // 硬盘背板起始槽位号:硬盘ID=HddBackplaneStartSlot + RelativeSlot
      "RelativeSlot": 0                // 槽位相对硬盘背板起始槽位(HddBackplaneStartSlot)的偏移量, 一般配置和ID相等
    },

硬盘相关的各种编号整理:

硬盘背板的硬盘Drive、Disk、Slot等序号配置较多,且起始数字不同(0/1),各个序号不能重复,按照顺序配置,但是要跟整机分配(整机规划的)的顺序保持一致。

当出现类似:

json
"Name": "${Slot} |> expr($1 != 1 ? 24: 0) |> string.format('Disk%s', $1)"

的配置,注意检查其他显示该硬盘名称的地方是否与此表达式一致,否则出现硬盘名称与实际硬盘编号对应不上的问题,如硬盘告警、硬盘传感器名称等

json
    "Drive_1": {                            // Drive从1开始排序
      "Id": 0,                                // 对于前置背板Id从0开始排序,对于整机中有多个硬盘背板场景,Id全局不可重复
      "Name": "Disk0",                        // 对于前置背板Name里的Disk从0开始排序,对于整机中有多个硬盘背板场景,Name全局不可重复
      "PhysicalLocation": "HDD Plane",
      "NodeId": "HDDPlaneDisk0",            // NodeId里的HDDPlaneDisk从0开始排序
      "Presence": "<=/Scanner_Drive0PresentAccessor.Status;<=/Scanner_Drive0PresentAccessor.Value |> expr($1 != 0 ? 255 : $2)",//这三个Scanner里的Drive从0开始排序
      "LocateLed": "<=/Scanner_Drive0LocateAccessor.Value",            // 这三个Scanner里的Drive从0开始排序
      "FaultLed": "<=/Scanner_Drive0FalutAccessor.Value",            // 这三个Scanner里的Drive从0开始排序
      "ActivationLed": "<=/Scanner_Drive0ActivationAccessor.Value",    // 这三个Scanner里的Drive从0开始排序
      "SetLocateLed": "#/Accessor_Drive0LocateAccessor.Value",        // 这两个Accessor里的Drive从0开始排序
      "SetFaultLed": "#/Accessor_Drive0FaultAccessor.Value",        // 这两个Accessor里的Drive从0开始排序
      "TemperatureCelsius": 255,
      "Missing": 0,
      "Health": "<=/Component_Drive0.Health",                       // Component_Drive从0开始排序
      "RebuildState": 0,
      "FirmwareStatus": 255,
      "PredictiveFailure": 0,
      "InAFailedArray": 0,
      "FirmwareStatusError": false,
      "@Default": {
        "PredictedMediaLifeLeftPercent": 255
      },
      "PassThrough": "<=/Scanner_Drive1PCIePresence.Value;<=/Scanner_Drive1PCIeType.Value|> expr(($1 == 1) && ($2 == 1))",//PCIePresencScanner里的Drive从1开始排序
      "SerialNumber": "",
      "IODeteriorationHealthCode": 0,
      "HddBackplaneStartSlot": "<=/HddBackplane_1.StartSlot",
      "RelativeSlot": 0
    },
Interface/Private属性描述是否由CSR配置
bmc.kepler.Systems.Storage.DriveId根据Slot值动态计算ID
bmc.kepler.Systems.Storage.DriveName基于计算出的ID生成名称,格式为"Diskx"
bmc.kepler.Systems.Storage.DriveNodeId节点标识符,格式为"HDDPlaneDiskx"
bmc.kepler.Systems.Storage.DrivePresence根据标志和槽位选择对应的存在状态扫描器
bmc.kepler.Systems.Storage.DriveLocateLed根据标志和槽位读取定位灯状态
bmc.kepler.Systems.Storage.DriveFaultLed根据标志和槽位读取故障灯状态
bmc.kepler.Systems.Storage.DriveTemperatureCelsius驱动器温度,固定值255
bmc.kepler.Systems.Storage.DriveFirmwareStatus固件状态,固定值255
bmc.kepler.Systems.Storage.DriveSlotNumber槽位号,默认值255
bmc.kepler.Systems.Storage.DriveEnclosureId机箱ID,默认值65535
bmc.kepler.Systems.Storage.DriveLocationIndicatorState位置指示器状态
bmc.kepler.Systems.Storage.DriveCapacityMiB容量(MiB),默认值4294967295
bmc.kepler.Systems.Storage.DriveModel型号,默认值"N/A"
bmc.kepler.Systems.Storage.DriveProtocol协议类型,默认值255
bmc.kepler.Systems.Storage.DriveCapableSpeedGbs支持的速度(Gbps),默认值255
bmc.kepler.Systems.Storage.DriveNegotiatedSpeedGbs协商速度(Gbps),默认值255
bmc.kepler.Systems.Storage.DriveMediaType介质类型,默认值255
bmc.kepler.Systems.Storage.DriveSerialNumber序列号,默认值"N/A"
bmc.kepler.Systems.Storage.DriveManufacturer制造商,默认值"N/A"
bmc.kepler.Systems.Storage.DrivePowerOnHours通电时间(小时)
bmc.kepler.Systems.Storage.DriveRevision固件版本,默认值"N/A"
bmc.kepler.Systems.Storage.DriveRotationSpeedRPM转速(RPM)
bmc.kepler.Systems.Storage.DriveBlockSizeBytes块大小(字节)
bmc.kepler.Systems.Storage.DriveSASAddress1SAS地址1
bmc.kepler.Systems.Storage.DriveSASAddress2SAS地址2
bmc.kepler.Systems.Storage.DriveLocation物理位置
bmc.kepler.Systems.Storage.DriveDeviceName设备名称,默认值"N/A"
bmc.kepler.Systems.Storage.DrivePredictedMediaLifeLeftPercent预测介质剩余寿命百分比,默认值255
bmc.kepler.Systems.Storage.DrivePredictedFailCount预测故障次数
bmc.kepler.Systems.Storage.DriveMediaErrorCount介质错误次数
bmc.kepler.Systems.Storage.DriveOtherErrorCount其他错误次数
bmc.kepler.Systems.Storage.DrivePatrolState巡检状态
bmc.kepler.Systems.Storage.DrivePowerState电源状态
bmc.kepler.Systems.Storage.DriveRebuildState重建状态,默认值0
bmc.kepler.Systems.Storage.DriveRebuildProgress重建进度
bmc.kepler.Systems.Storage.DriveBootPriority启动优先级
bmc.kepler.Systems.Storage.DriveHotspareType热备类型
bmc.kepler.Systems.Storage.DriveRefControllerId关联的控制器ID,默认值255
bmc.kepler.Systems.Storage.DriveRefVolumeList关联的卷列表
bmc.kepler.Systems.Storage.DriveRefDiskArrayId关联的磁盘阵列ID
bmc.kepler.Systems.Storage.DriveManufacturerId制造商ID
bmc.kepler.Systems.Storage.DrivePCIeLinkSpeedPCIe链路速度
bmc.kepler.Systems.Storage.DriveResourceId资源ID
bmc.kepler.Systems.Storage.DriveContainerPhysicalContext容器物理上下文
bmc.kepler.Systems.Storage.Drive.DriveStatusHealth从Drive组件获取健康状态,Drive_1从Component_Drive0,Drive_2从Component_Drive1
bmc.kepler.Systems.Storage.Drive.DriveStatusFirmwareStatusError固件状态错误,固定值false
bmc.kepler.Systems.Storage.Drive.DriveStatusMissing驱动器丢失状态,默认值0
bmc.kepler.Systems.Storage.Drive.DriveStatusPredictiveFailure预测故障状态,默认值0
bmc.kepler.Systems.Storage.Drive.DriveStatusInAFailedArray处于故障阵列状态,默认值0
bmc.kepler.Systems.Storage.Drive.DriveStatusCapacityError容量错误,默认值false
bmc.kepler.Systems.Storage.Drive.DriveStatusFailure故障状态,默认值false
bmc.kepler.Systems.Storage.Drive.DriveSubHealthEstimatedRemainingLifespanInsufficient预计剩余寿命不足,默认值0
bmc.kepler.Systems.Storage.Drive.DriveSubHealthSLCSpareBlockPercentageSLC备用块百分比,默认值255
bmc.kepler.Systems.Storage.Drive.DriveSubHealthTLCSpareBlockPercentageTLC备用块百分比,默认值255
bmc.kepler.Systems.Storage.Drive.DriveSubHealthEstimatedRemainingLifespan预计剩余寿命,默认值4294967295
bmc.kepler.Systems.Storage.Drive.DriveSubHealthIODeteriorationHealthCodeIO劣化健康码,默认值0
bmc.kepler.Systems.Storage.Drive.AddrInfoType地址类型,默认值"N/A"
bmc.kepler.Systems.Storage.Drive.AddrInfoSocketId插槽ID,默认值0
bmc.kepler.Systems.Storage.Drive.AddrInfoSlotId槽位ID,默认值0
bmc.kepler.Systems.Storage.Drive.AddrInfoPortId端口ID,默认值0
bmc.kepler.Systems.Storage.Drive.AddrInfoRootBDF根BDF,默认值"N/A"
PrivatePhysicalLocation物理位置固定设置为"HDD Plane"(硬盘平面)
PrivateActivationLed根据标志和槽位读取激活灯状态
PrivateSetLocateLed定位LED设置访问器路径
PrivateSetFaultLed故障LED设置访问器路径
PrivateHddBackplaneStartSlot从硬盘背板1获取起始槽位号
PrivateRelativeSlot相对槽位号

以下对象也从1开始排序:

PcieAddrInfo_SAS_1、Event_Hdd1FailedArray、Event_Hdd1Insert、Event_Hdd1MdWroutLow、Event_Hdd1PredicFail、Event_Hdd1Removed

天池架构支持组件自发现,组件与基础板、组件与组件均通过连接器连接,如果组件的自描述信息(csr文件)里配置了拓扑信息和connector,就可以根据connector的数据可以找到下一级连接的组件。

Connector对象包含下级硬件组件的参数信息,决定了下级硬件组件执行自发现的方式,也定义了与下级硬件组件关联的Buses信息。

对于硬盘背板而言,Connector主要分为以下几类:

1、Nvme连接器(Connector_ComVPDConnect)

2、后置两小盘背板连接器(Connector_SEU_Inner)

Nvme连接器:

json
    "Connector_ComVPDConnect_1": {
      "Bom": "14140224",                // 下级组件的Bom Id
      "Slot": 8,                        // 给下级组件分配的槽位信息
      "Position": 1,                    // 用于在命名中区分不同对象,无实际含义
      "Presence": "<=/Scanner_Drive8PresentAccessor.Value;<=/Scanner_Drive1PCIeType.Value|> expr(($1 == 1) && ($2 == 1))",    // 在位状态,可以直接配置,也可以间接获取
      "Id": "VPD",                        // 下级组件的Board Id
      "AuxId": "0",                        // 下级组件的额外Id信息
      "Buses": [                        // 下级csr中会用到的总线
        "I2cMux_SMC_1"
      ],
      "SystemId": "${SystemId}",        // 给下级组件分配的SystemId
      "ManagerId": "${ManagerId}",        // BMC ID,单BMC管理场景下配置1,多BMC场景下会有多个配置
      "ChassisId": "${ChassisId}",        // 机框ID,单机框配置1,多个机框有多个不同的ID
      "SilkText": "J13",                // 丝印信息
      "IdentifyMode": 2,                // 下级组件识别方式,3为天池标准类型组件,2为BoardId不可读(上报)类型组件,1为BoardId可读类型组件
      "Type": "NVMe"                    // 连接器后端设备类型,如PCIeSlot,PCIeRiser,NVMe,PSU,BCU,DiskBackplane等
    },

后置两小盘背板连接器:

json
    "Connector_SEU_Inner_1": {
      "Bom": "14100665",                // 下级组件的Bom Id
      "Slot": 3,                        // 给下级组件分配的槽位信息
      "Position": 5,                    // 用于在命名中区分不同对象,无实际含义
      "Id": "#/Accessor_Id_1.Value",    // 下级组件的Board Id
      "Presence": "<=/Scanner_SEU_Inner_1.Value",    // 在位状态,可以直接配置,也可以间接获取
      "Buses": [                        // 下级csr中会用到的总线
        "I2c_5"
      ],
      "SystemId": "${SystemId}",        // 给下级组件分配的SystemId
      "ManagerId": "${ManagerId}",        // BMC ID,单BMC管理场景下配置1,多BMC场景下会有多个配置
      "ChassisId": "${ChassisId}",        // 机框ID,单机框配置1,多个机框有多个不同的ID
      "SilkText": "SEU",                // 丝印信息
      "IdentifyMode": 1,                // 下级组件识别方式,3为天池标准类型组件,2为BoardId不可读(上报)类型组件,1为BoardId可读类型组件
      "Container": "Component_HddBackplane",
      "Type": "DiskBackplane"            // 连接器后端设备类型,如PCIeSlot,PCIeRiser,NVMe,PSU,BCU,DiskBackplane等
    },

I2C控制的Led灯对象

json
    "I2cLed_1": {
      "CtrlValue": "#/Accessor_LedTest.Value",    // 不需要用户管理的I2C控制的Led灯,仅装备项使用
      "LedOnValue": 1                            // 对应CtrlValue,亮灯对应的寄存器值
    },

FRU即现场可替换单元(field replacement unit ),在CSR中的FRU对象用于描述产品的身份信息,如制造厂商、产品型号、版本、资产标签等

json
    "Fru_SEU": {
      "PcbId": "#/Accessor_PcbID.Value", // 关联获取PcbID的Accessor
      "FruId": 1,                                     // 除挂耳外配成1即可
      "FruName": "DiskBP${Slot}",             // Fru的名称,如DiskBP
      "PcbVersion": ".A",                // PCB版本号
      "PowerState": 1,                   // 关联的热插拔状态,不支持热插拔直接配成1
      "Health": 0,                       // 当前未使用
      "EepStatus": 1,                    // 当前未使用
      "Type": 5,                         // "5"代表硬盘背板
      "FruDataId": "#/FruData_SEU",      // 关联的FruData对象
      "UniqueId": "00000001030302023936" // UID,代码自动赋值
    },

3.2 硬件资源获取

CSR中承载了所描述硬件对象(单板)的关键硬件资源,包括软件可获取的电压、温度、告警等传感器信息,和软件可以操作的比如复位、清除告警等能力。在天池架构下,组件上通过卫星管理中心SMC来管理单板上的硬件器件,BMC软件通过标准的SMC命令字来获取和控制对应的硬件,因此本章节所描述的Scanner、Accessor、DFX都与对应组件的SMC命令字一一对应,并且与硬件逻辑代码和MCU代码一一对应。

3.2.1 Scanner

  1. 硬件SR文件中包含硬件对象的描述,其中scanner可以理解为硬件传感器,用于BMC软件扫描对应的传感器,获取硬件状态信息。在天池组件设计规范中,为了更好的做到软硬件解耦,组件上的传感器都是由硬件获取,并且通过SMC标准命令字上报给BMC,所以Scanner对象可以简单理解为BMC通过SMC读取的硬件信息。
  2. 硬件代理对所有配置的Scanner,按照Period指定的周期进行扫描,并将值更新到资源树。

1. 属性说明

属性名类型描述
Chipro关联的Chip
ScanEnabledU8Scanner扫描使能状态 0:未使能 1:使能,不配置默认为1
StatusU8Scanner状态 0: 正常获取值 1: 获取值失败 2: 获取值预失败,正在进行防抖 3: 处于无效状态,未使能 4: 初始状态, 暂未开始扫描,无需配置
ValueU64读值,当Scanner处于无效状态(Status=3)时,Value将被置为NominalValue标称值
NominalValueU64扫描无效(初次扫描,扫描失败,禁用扫描)之后的默认值, 注意此值不能产生告警
SizeU8读数据长度
OffsetU32偏移地址,json不支持16进制,需转换成10进制:
1、对于简单器件,偏移为实际的硬件器件偏移,用于计算硬件的偏移地址,读取硬件下不同地址的数据。
2、对于SMC,偏移为SMC命令字
PeriodU32扫描周期 单位ms,最小配置值100, 小于100按100处理
TypeU8读类型 0:位读 1:块读
MaskU32位读时有效,从硬件读取数据后与掩码进行按位与操作
Debouncero防抖对象
FailureDebounceCountU8Scanner扫描获取失败时Status的防抖次数,失败超过防抖次数时将Status置为1
SuccessDebounceCountU8Scanner扫描获取失败时Status的防抖次数,失败状态下成功次数超过防抖次数时将Status置为0
AggregateStatusBooleanScanner是否从汇聚数据中读取到, 由hwproxy动态设置结果
AggregateOffsetU32Scanner在汇聚数据中的相对偏移

2. Scanner的配置说明

  • 对于Chip、Type、Mask、Offset、Size取值均一样的两个Scanner配置,表征的是同一硬件扫描对象,必然存在对象重复配置或属性值配置错误的情况;

  • 存在SmcDfxInfo对象生效并且关联到Scanner对象时,AggregateStatus会被程序设置为true,并且按照Scanner的Period指定的周期更新Status和Value取值

  • Debounce防抖对象的DefaultValue取值需要和Scanner的NominalValue取值一致,避免出现默认取值导致误告警等问题;

  • 对于预期使用Value=1来判断读取失败依据的,这里确认失败的时间并非为FailureDebounceCount*Period。硬件代理为降低连续读取失败的花销,对周期做如下调整:

    • 扫描间隔小于1000ms时,每次失败增加100ms间隔, 否则间隔时间 * 2
    • 间隔时间最长不超过60s
  • 配置Scanner时需要考虑Scanner是否需要一直使能,不需要的话需要在ScanEnabled属性配置使能条件,例如VCC上电才需要使能,需要在ScanEnabled同步单板的PG状态。

3. SEU配置举例

对于硬盘背板来说,传感器主要包括:

1、 板上所有硬盘的Present、Locate、Falut、Activation状态,用于硬盘点灯

2、 板上所有Nvme盘的PCIeType

3、 后置硬盘背板(部分前置硬盘背板支持级联后置背板)的在位标志

4、板上所有的温度传感器(单板温感、缓启mos过温传感器等)

5、系统上电状态的获取

其中所有的传感器列表应该从硬件设计的《软硬件接口文档》获取。

  • 硬盘背板板温获取
json
    "Scanner_HddBPTemp": {
      "Chip": "#/Smc_EnclSMC",        // SMC对象,告诉BMC软件这个Scanner需要从哪个SMC中获取数据
      "Offset": 4865,                // Smc命令字的Opcode+Param
      "Size": 2,                    // 获取数据的长度,单位字节
      "Type": 0,                    // 读类型 0:位读  1:块读
      "Mask": 65280,                // 位读时有效,从硬件读取数据后与掩码进行按位与操作
      "Period": 2000,                // BMC软件获取数据的周期,单位ms,最小配置值100,小于100按100处理。数据获取周期有相关规范,非规范内的需要找BMC评审
      "Debounce": "#/MidAvg_HddBpTemp",        // 防抖对象
      "Status": 0,                    // Scanner状态,0: 正常获取值
      "Value": 0                    // 读值,当前默认值为0,当Scanner处于无效状态(Status=3)时,Value将被置为NominalValue标称值
    },

【注意事项】Scanner扫描周期配置原则,必须按照如下分类进行配置,如果新增的Scanner不在已有分类,则需要规范评审刷新分类才能添加。

3.2.2 Accessor

  1. Accessor也可以理解为硬件传感器,与Scanner不同,Accessor适用于不需要随时读硬件寄存器的场景;
  2. Accessor对象是BMC可以写入的传感器,BMC能够往Accessor配置的寄存器写入数据;
  3. Accessor读的时候不会去轮询寄存器,而是通过感知寄存器值的变动来更新Value。

其在BMC中的用法如下:

1、获取值时,hwproxy监听property_read信号,实时读取硬件的值并更新到资源树;

2、当写入值时,hwproxy监听property_before_change信号,实时写入到硬件中。

1. 属性说明

属性名类型描述
Chipro关联的Chip
StatusU8Accessor状态 0: 正常获取值 1: 获取值失败 2: 获取值预失败,正在进行防抖 3: 处于无效状态 4: 初始状态,暂未开始扫描,无需配置
ValueU64读值
SizeU8读取数据的长度,单位为Byte
OffsetU32偏移地址,json不支持16进制,需转换成10进制:
1、对于简单器件,偏移为实际的硬件器件偏移,用于计算硬件的偏移地址,读取硬件下不同地址的数据。
2、对于SMC,偏移为SMC命令字
TypeU8读类型 0:位读/位写 1:块读/块写和SMC命令字相关
MaskU32位读时有效,从硬件读取数据后与掩码进行按位与操作
FailureDebounceCountU8Accessor扫描获取失败时Status的防抖次数,失败超过防抖次数时将Status置为1
SuccessDebounceCountU8Accessor扫描获取失败时Status的防抖次数,失败状态下成功次数超过防抖次数时将Status置为0

2. SEU配置举例

对于硬盘背板而言,Accessor类传感器主要包括以下几类:

1、系统状态类的获取(单板PCB版本、单板逻辑版本、BT物理通道)

2、系统状态类的配置(设置BMC启动状态灯、设置扩展板JTAG选通链路、设置整机Power Cycle、设置组件EEPROM写保护状态、CPLD自检设置)

3、级联组件的信息获取(级联后置背板ID获取)

4、硬盘点灯设置(Locate、Fault灯配置)

在SEU中,Accessor可以用来读取或写入Smc_EnclSMC:

其中所有的传感器列表应该从硬件设计的《软硬件接口文档》获取。

  • 读取单板PcbID
json
    "Accessor_PcbID": {
      "Chip": "#/Smc_EnclSMC",            // SMC对象,告诉BMC软件这个Scanner需要从哪个SMC中获取数据
      "Offset": 1792,                    // Smc命令字的Opcode+Param
      "Size": 2,                        // 获取数据的长度,单位字节
      "Mask": 15,                        // 位读时有效,从硬件读取数据后与掩码进行按位与操作
      "Type": 0,                        // 读类型 0:位读  1:块读
      "Value": 0                        // 读值,当前默认值为0
    },

注意:

Chip:引用对象,固定语法格式

Offset:配合硬盘背板SMC命令字与计算工具得出

Size:数据大小,固定配置为1

3.2.3 DFX

一块单板的CSR有大量Scanner需要轮询访问,但很多Scanner仅存在偏移差异,**BMC在获取每个scanner信息的时候,都需要消耗一条SMC命令字,导致总线效率很低。针对此情况需要做批量读取。**dfx是Scanner的扩展,为了减少硬件访问次数产生的一个机制,本质是通过dfx汇聚任务一次将chip的数据读取出来,再根据不同的掩码分配给不同的Scanner。在配置了DFX统一获取命令后,单条Scanner命令可以不在SR中配置。 假如Scanner在Dfx中有承载,则单条Scanner的扫描周期表示从Dfx同步数据的周期。比如Dfx的扫描周期为400ms,单条Scanner的扫描周期为2000ms,则表示Dfx刷新5次之后Scanner刷新1次数据。Dfx的Period并非Dfx的扫描周期,而是Dfx扫描完成之后的等待时间,实际Dfx扫描间隔时间会受到总线上其他进程数量影响(风扇板DFX Period设置100,但是在满配场景下测试由于IIC链路上进程过多导致两次Dfx间隔最大可达到7s)。

DFX对象中每个字节的具体信息,需要与硬件的SMC命令字实现保持一致

下面详细介绍对应的SmcDfxInfo下面的具体属性配置,一个标准的SmcDfxInfo包含如下信息:

1、传感器的获取方式(对应传感器的SMC命令字)

2、软件读取传感器的扫描周期

3、此单板支持SmcDfx的CPLD版本

4、SmcDfxInfo中每个字节与对应硬件寄存器的掩码对应关系

5、Scanner的名称与对应的配置表达式(json格式中的key为Scanner名称,Scanner必须位于同一CSR文件中,json格式中的"Value"表示为Scanner的值,通过配置表达式从硬件信号获取值)

json
    "SmcDfxInfo_SEU": {
      "Chip": "#/Smc_EnclSMC",            // 获取数据的smc对象
      "Offset": 7424,                    // smc命令字的偏移
      "Size": 62,                        // 数据的字节长度
      "Period": 2000,                    // 扫描周期,单位ms
      "SmcVersion": 100,                // 支持的SMC最低版本
      "Config": {                        // 此处配置每个字节与硬件信号对应关系树
        "1": {"cpld_ver": 255},            // 第一个(CSR中从1开始)字节对应的信号及掩码
        "2": {"lm75_data_low": 255},
        "3": {"lm75_data_high": 255},
        "4": {"inbp0_lm75_data_low": 255},
        "5": {"inbp0_lm75_data_high": 255},
        "6": {"inbp1_lm75_data_low": 255},
        "7": {"inbp1_lm75_data_high": 255},
        "22": {"power_error_code": 255},
        "23": {"disk_rst_0": 32, "bmc_set_disk_rst_0": 16, "pg_hdd_pwr_0": 8, "disk_type_0": 2, "disk_prsnt_0": 1},
        "24": {"disk_active_0": 48, "disk_locate_0": 12, "disk_fault_0": 3},
        "25": {"disk_rst_1": 32, "bmc_set_disk_rst_1": 16, "pg_hdd_pwr_1": 8, "disk_type_1": 2, "disk_prsnt_1": 1},
        "26": {"disk_active_1": 48, "disk_locate_1": 12, "disk_fault_1": 3},
        "27": {"disk_rst_2": 32, "bmc_set_disk_rst_2": 16, "pg_hdd_pwr_2": 8, "disk_type_2": 2, "disk_prsnt_2": 1},
        "28": {"disk_active_2": 48, "disk_locate_2": 12, "disk_fault_2": 3},
        "29": {"disk_rst_3": 32, "bmc_set_disk_rst_3": 16, "pg_hdd_pwr_3": 8, "disk_type_3": 2, "disk_prsnt_3": 1},
        "30": {"disk_active_3": 48, "disk_locate_3": 12, "disk_fault_3": 3},
        "31": {"disk_rst_4": 32, "bmc_set_disk_rst_4": 16, "pg_hdd_pwr_4": 8, "disk_type_4": 2, "disk_prsnt_4": 1},
        "32": {"disk_active_4": 48, "disk_locate_4": 12, "disk_fault_4": 3},
        "33": {"disk_rst_5": 32, "bmc_set_disk_rst_5": 16, "pg_hdd_pwr_5": 8, "disk_type_5": 2, "disk_prsnt_5": 1},
        "34": {"disk_active_5": 48, "disk_locate_5": 12, "disk_fault_5": 3},
        "35": {"disk_rst_6": 32, "bmc_set_disk_rst_6": 16, "pg_hdd_pwr_6": 8, "disk_type_6": 2, "disk_prsnt_6": 1},
        "36": {"disk_active_6": 48, "disk_locate_6": 12, "disk_fault_6": 3},
        "37": {"disk_rst_7": 32, "bmc_set_disk_rst_7": 16, "pg_hdd_pwr_7": 8, "disk_type_7": 2, "disk_prsnt_7": 1},
        "38": {"disk_active_7": 48, "disk_locate_7": 12, "disk_fault_7": 3},
        "39": {"disk_rst_8": 32, "bmc_set_disk_rst_8": 16, "pg_hdd_pwr_8": 8, "disk_type_8": 2, "disk_prsnt_8": 1},
        "40": {"disk_active_8": 48, "disk_locate_8": 12, "disk_fault_8": 3},
        "41": {"disk_rst_9": 32, "bmc_set_disk_rst_9": 16, "pg_hdd_pwr_9": 8, "disk_type_9": 2, "disk_prsnt_9": 1},
        "42": {"disk_active_9": 48, "disk_locate_9": 12, "disk_fault_9": 3},
        "43": {"disk_rst_10": 32, "bmc_set_disk_rst_10": 16, "pg_hdd_pwr_10": 8, "disk_type_10": 2, "disk_prsnt_10": 1},
        "44": {"disk_active_10": 48, "disk_locate_10": 12, "disk_fault_10": 3},
        "45": {"disk_rst_11": 32, "bmc_set_disk_rst_11": 16, "pg_hdd_pwr_11": 8, "disk_type_11": 2, "disk_prsnt_11": 1},
        "46": {"disk_active_11": 48, "disk_locate_11": 12, "disk_fault_11": 3},
        "47": {"disk_rst_12": 32, "bmc_set_disk_rst_12": 16, "pg_hdd_pwr_12": 8, "disk_type_12": 2, "disk_prsnt_12": 1},
        "48": {"disk_active_12": 48, "disk_locate_12": 12, "disk_fault_12": 3},
        "49": {"disk_rst_13": 32, "bmc_set_disk_rst_13": 16, "pg_hdd_pwr_13": 8, "disk_type_13": 2, "disk_prsnt_13": 1},
        "50": {"disk_active_13": 48, "disk_locate_13": 12, "disk_fault_13": 3},
        "51": {"disk_rst_14": 32, "bmc_set_disk_rst_14": 16, "pg_hdd_pwr_14": 8, "disk_type_14": 2, "disk_prsnt_14": 1},
        "52": {"disk_active_14": 48, "disk_locate_14": 12, "disk_fault_14": 3},
        "53": {"disk_rst_15": 32, "bmc_set_disk_rst_15": 16, "pg_hdd_pwr_15": 8, "disk_type_15": 2, "disk_prsnt_15": 1},
        "54": {"disk_active_15": 48, "disk_locate_15": 12, "disk_fault_15": 3},
        "55": {"affi_bp0_pcb_id": 240, "affi_bp0_prsnt": 1},
        "56": {"affi_bp0_cpld_id": 250},
        "57": {"affi_bp0_board_id": 255},
        "58": {"affi_bp1_pcb_id": 240, "affi_bp1_prsnt": 1},
        "59": {"affi_bp1_cpld_Id": 255},
        "60": {"affi_bp1_board_id": 255},
        "62": {"over_temp_12v_1": 1}
      },
      "Mapping": {                        // config中配置的信号与scanner的对应关系
        "Scanner_Drive0PresentAccessor": {"Value": "expr($disk_prsnt_0)"},
        "Scanner_Drive0LocateAccessor": {"Value": "expr($disk_locate_0)"},
        "Scanner_Drive0FalutAccessor": {"Value": "expr($disk_fault_0)"},
        "Scanner_Drive0ActivationAccessor": {"Value": "expr($disk_active_0)"},
        "Scanner_Drive1PresentAccessor": {"Value": "expr($disk_prsnt_1)"},
        "Scanner_Drive1LocateAccessor": {"Value": "expr($disk_locate_1)"},
        "Scanner_Drive1FalutAccessor": {"Value": "expr($disk_fault_1)"},
        "Scanner_Drive1ActivationAccessor": {"Value": "expr($disk_active_1)"},
        "Scanner_Drive2PresentAccessor": {"Value": "expr($disk_prsnt_2)"},
        "Scanner_Drive2LocateAccessor": {"Value": "expr($disk_locate_2)"},
        "Scanner_Drive2FalutAccessor": {"Value": "expr($disk_fault_2)"},
        "Scanner_Drive2ActivationAccessor": {"Value": "expr($disk_active_2)"},
        "Scanner_Drive3PresentAccessor": {"Value": "expr($disk_prsnt_3)"},
        "Scanner_Drive3LocateAccessor": {"Value": "expr($disk_locate_3)"},
        "Scanner_Drive3FalutAccessor": {"Value": "expr($disk_fault_3)"},
        "Scanner_Drive3ActivationAccessor": {"Value": "expr($disk_active_3)"},
        "Scanner_Drive4PresentAccessor": {"Value": "expr($disk_prsnt_4)"},
        "Scanner_Drive4LocateAccessor": {"Value": "expr($disk_locate_4)"},
        "Scanner_Drive4FalutAccessor": {"Value": "expr($disk_fault_4)"},
        "Scanner_Drive4ActivationAccessor": {"Value": "expr($disk_active_4)"},
        "Scanner_Drive5PresentAccessor": {"Value": "expr($disk_prsnt_5)"},
        "Scanner_Drive5LocateAccessor": {"Value": "expr($disk_locate_5)"},
        "Scanner_Drive5FalutAccessor": {"Value": "expr($disk_fault_5)"},
        "Scanner_Drive5ActivationAccessor": {"Value": "expr($disk_active_5)"},
        "Scanner_Drive6PresentAccessor": {"Value": "expr($disk_prsnt_6)"},
        "Scanner_Drive6LocateAccessor": {"Value": "expr($disk_locate_6)"},
        "Scanner_Drive6FalutAccessor": {"Value": "expr($disk_fault_6)"},
        "Scanner_Drive6ActivationAccessor": {"Value": "expr($disk_active_6)"},
        "Scanner_Drive7PresentAccessor": {"Value": "expr($disk_prsnt_7)"},
        "Scanner_Drive7LocateAccessor": {"Value": "expr($disk_locate_7)"},
        "Scanner_Drive7FalutAccessor": {"Value": "expr($disk_fault_7)"},
        "Scanner_Drive7ActivationAccessor": {"Value": "expr($disk_active_7)"},
        "Scanner_Drive8PresentAccessor": {"Value": "expr($disk_prsnt_8)"},
        "Scanner_Drive8LocateAccessor": {"Value": "expr($disk_locate_8)"},
        "Scanner_Drive8FalutAccessor": {"Value": "expr($disk_fault_8)"},
        "Scanner_Drive8ActivationAccessor": {"Value": "expr($disk_active_8)"},
        "Scanner_Drive9PresentAccessor": {"Value": "expr($disk_prsnt_9)"},
        "Scanner_Drive9LocateAccessor": {"Value": "expr($disk_locate_9)"},
        "Scanner_Drive9FalutAccessor": {"Value": "expr($disk_fault_9)"},
        "Scanner_Drive9ActivationAccessor": {"Value": "expr($disk_active_9)"},
        "Scanner_Drive10PresentAccessor": {"Value": "expr($disk_prsnt_10)"},
        "Scanner_Drive10LocateAccessor": {"Value": "expr($disk_locate_10)"},
        "Scanner_Drive10FalutAccessor": {"Value": "expr($disk_fault_10)"},
        "Scanner_Drive10ActivationAccessor": {"Value": "expr($disk_active_10)"},
        "Scanner_Drive11PresentAccessor": {"Value": "expr($disk_prsnt_11)"},
        "Scanner_Drive11LocateAccessor": {"Value": "expr($disk_locate_11)"},
        "Scanner_Drive11FalutAccessor": {"Value": "expr($disk_fault_11)"},
        "Scanner_Drive11ActivationAccessor": {"Value": "expr($disk_active_11)"},
        "Scanner_Drive1PCIePresence": {"Value": "expr($disk_prsnt_8)"},
        "Scanner_Drive1PCIeType": {"Value": "expr($disk_type_8)"},
        "Scanner_Drive2PCIePresence": {"Value": "expr($disk_prsnt_9)"},
        "Scanner_Drive2PCIeType": {"Value": "expr($disk_type_9)"},
        "Scanner_Drive3PCIePresence": {"Value": "expr($disk_prsnt_10)"},
        "Scanner_Drive3PCIeType": {"Value": "expr($disk_type_10)"},
        "Scanner_Drive4PCIePresence": {"Value": "expr($disk_prsnt_11)"},
        "Scanner_Drive4PCIeType": {"Value": "expr($disk_type_11)"},
        "Scanner_SEU_Inner_1": {"Value": "expr($affi_bp0_prsnt)"},
        "Scanner_SEU_Inner_2": {"Value": "expr($affi_bp1_prsnt)"},
        "Scanner_HddBPTemp": {"Value": "expr($lm75_data_high)"},
        "Scanner_DiskBPPwrOnTimeOut": {"Value": "expr($power_timeout_record)"},
        "Scanner_HddBackplaneMosTempHigh_1": {"Value": "expr($over_temp_12v_1)"},
        "Scanner_DiskBPPwrFault": {"Value": "expr($power_error_code)"}
      }
    },

3.2.4 SmcCmdList

该对象用于BMC获取全量SMC寄存器,在一键收集日志时根据配置发送SMC命令并收集返回数据存在日志中。

json
"SmcCmdList_SEU": {
  "Chip": "#/Smc_EnclSMC",//发送SMC命令的目标对象
  "Type": "SEU",            //对象类型,配置错误影响日志名称显示,不影响数据收集功能
  "Slot": 1,                //支持多个槽位号,影响日志名称显示,不影响数据收集功能
  "Config": {               //配置需要发送的SMC命令字,Function、Command、MS、RW、Parameter为SMC命令字格式内容,Length为收集的数据长度,Collected为是否需要收集这条SMC命令字数据,1表示启用收集,0表示禁用收集
    "1": {
      "Function": 0, "Command": 1, "MS": 0, "RW": 1, "Parameter": 0, "Length": 1, "Collected": 1
    },
    "2": {
      "Function": 1, "Command": 1, "MS": 0, "RW": 1, "Parameter": 0, "Length": 1, "Collected": 0
    }
  }
}

3.3 信号处理策略

读取物理寄存器数据时,不可避免会遇到因器件抖动而产生误报等现象,需要采取一些防抖措施来过滤误报场景。

在通过硬件代理Scanner对象读取硬件数据的时候,可以通过Debounce属性配置防抖对象,目前支持的防抖类型有中值滤波,均值防抖,持续一致,二值持续一致,无防抖等类型。

防抖策略在SR配置中非常重要,大量的误告警、FIT告警等问题,都与SR中配置的告警防抖策略息息相关。

CSR文件中定义的Debounce对象必须至少被一个Scanner对象引用

BMC推荐的CSR硬件监控防抖机制详见:官方链接

对硬盘背板而言,主要有以下SMC需要配置防抖:

1、中值滤波:ADC电压(5V)

2、持续一致滤波:两小盘背板在位

3、二值持续一致滤波:MOS过温、LM75状态、ADC电压状态、CPLD健康状态

4、均值滤波:背板板温

  • 中值滤波

json
"Median_ECUSys5VLowMntr": {
    "WindowSize": 36,        // 窗口大小
    "DefaultValue": 2740    // 默认值
}
  • 持续一致滤波

json
"Cont_num3": {
    "Num": 3,           // 防抖次数
    "DefaultValue": 1    // 默认值
}
  • 二值持续一致

json
"ContBin_HddBackplaneMosTempHigh": {
    "NumH": 3,          // 高电平防抖次数
    "NumL": 1,          // 低电平防抖次数
    "DefaultValue": 0      // 默认值
}
  • 均值防抖

json
"MidAvg_HddBpTemp": {
    "WindowSize": 4,    // 窗口大小
    "DefaultValue": 20,    // 默认值
    "IsSigned": true    // 是否为有符号数,对获取温度进行滤波时需填true
}
  • 无防抖

    对应Scanner下的"Debounce"属性配置为"None"

json
"Debounce": "None",

3.4 组件管理

3.4.1 升级管理

硬盘背板上有CPLD、CSR固件,需要配置固件的升级对象,用于BMC加载。

在遵守天池规范的板卡设计下,CPLD的升级是通过BMC实现的。板卡若需要支持固件的带外升级功能,需要在CSR中增加自描述信息(LogicFirmware_SEU_xx),通过CSR将配置下发到固件,再进行持久化和生效。硬盘背板上有几个CPLD,就需要配置几个CPLD的升级对象.

json
    "LogicFirmware_SEU_1": {
      "ComponentID": 24,                // 固件component id
      "ComponentIDEx": 2,               // 固件component id ex
      "UId": "00000001030302023936",    // 固件UID
      "Name": "SEU_CPLD",                // 视不同单板有不同的配置
      "Manufacturer": "XXX",            // 厂商
      "Version": "#/Accessor_LogicVerId.Value",    // 固件版本
      "Location": 17,                    // 器件位号(不带U)
      "UpgradeChip": "#/Cpld_1",        // 使用Jtag链路升级对应的芯片
      "ChipInfo": "#/Cpld_1",            // 获取cpld厂商和bypass使能对应的chip
      "Routes": "#/Accessor_JtagSwitch.Value",    // 升级对应链路
      "DefaultRoute": 0,
      "FirmwareRoute": 2,                // 与Routes关联的Smc对应,升级时后会设置对应值切到对应链路。0代表不需要切
      "ValidMode": 0,                    // 未使用
      "SoftwareId": "CPLD-BC83NHBC",    // CPLD编码信息
      "ValidAction": 0                    // 生效方式
    },

SRUpgrade_1为BMC v3定义专用的EEPROM升级对象,主要用于升级单板上的CSR组件,主要包括:

  • 单板UID
  • 板卡类型
  • CSR data版本
  • 关联的对象
  • 软件ID
  • 关联的EEPROM写保护事件
json
    "SRUpgrade_1": {
      "UID": "00000001030302023936",    // 固件UID
      "Type": "SEU",                    // 单板类型
      "Version": "${DataVersion}",        // CSR版本
      "StorageChip": "#/Eeprom_SEU",    // CSR升级对应EEPROM芯片
      "SoftwareId": "XXX-YYYYY",    // 编码信息,配置格式按‘固件类型-单板名称’
      "WriteProtect": "#/Accessor_SEUWP.Value"    // EEPROM写保护
    },

3.4.2 Pcie设备管理

SEU对接Pcie设备,需要描述上行和下行连接器信息,高速信号的带宽、速率等信息。

  • PcieAddrInfo

PcieAddrInfo是用来告知BIOS Pcie槽位和BDF信息的对应关系的对象,在硬盘背板CSR中主要分为PcieAddrInfo_SAS和PcieAddrInfo_Nvme两类。

1. 属性说明

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.Systems.PcieAddrInfoSegment多PCI Bridge场景的编号,每一个Segment对应一个PCI Bus空间
bmc.kepler.Systems.PcieAddrInfoGroupID逻辑组ID
bmc.kepler.Systems.PcieAddrInfoSlotID【PCIe设备的槽位号】
bmc.kepler.Systems.PcieAddrInfoSocketID【CPU ID】 1、0:CPU1; 2、1:CPU 2
bmc.kepler.Systems.PcieAddrInfoBusroot port Bus号
bmc.kepler.Systems.PcieAddrInfoDeviceroot port Device号
bmc.kepler.Systems.PcieAddrInfoFunctionroot port Function号
bmc.kepler.Systems.PcieAddrInfoComponentType部件类型与Component类的中的部件类型属性对应,根据Riser卡对接的下级单板来决定(标准定义,如:8:PCIe标卡、13:NCI卡、71:SAS、83:OCP卡)
bmc.kepler.Systems.PcieAddrInfoControllerIndexPCIe控制器索引,CPU内部同类型控制器的索引,从0开始编号
bmc.kepler.Systems.PcieAddrInfoControllerType【PCIe控制器类型】 0:PCIeCore; 1:NIC; 2:SAS; 3:SATA, 4:ZIP; 5:SEC
PrivateLocationPCIe槽位所在的位置,单板类型+槽位号
PrivateContainerUID【容器UID】
PrivateContainerUnitType【容器单板类型】
PrivateContainerSlot槽位信息,引用Slot属性
PrivateGroupPosition对象主键,同一个CSR里配置命名不能重复

2. SEU配置举例

json
    "PcieAddrInfo_SAS_1": {
      "Location": "HddBackplane${Slot}",    // PCIe槽位所在的位置,单板类型+槽位号
      "ComponentType": 71,                    // 部件类型与Component类的中的部件类型属性对应,根据Riser卡对接的下级单板来决定(标准定义,如:8:PCIe标卡、13:NCI卡、71:SAS、83:OCP卡)
      "ControllerIndex": 0,                    // PCIe控制器索引,CPU内部同类型控制器的索引,从0开始编号
      "ControllerType": 2,                    // PCIe控制器类型,0:PCIeCore;1:NIC;2:SAS;3:SATA,4:ZIP;5:SEC
      "ContainerSlot": "${Slot}",            // 槽位信息,引用Slot属性
      "GroupPosition": "PcieAddrInfo_SAS_1_${GroupPosition}",    // 对象主键,同一个CSR里配置命名不能重复
      "ContainerUID": "00000001030302023936",// 容器UID
      "ContainerUnitType": "SEU SAS"        // 容器单板类型
    },
  • BusinessConnector

上下行业务连接器,差异跟随基础板,描述了从CPU不同Serdes出的高速资源是如何分配到UBC端口的。

Interface/Private属性/方法描述是否由CSR配置
PrivateName连接器名称
PrivateDirection表示上行连接器。Upstream表示上行连接器,上行连接器与前级单板的UBC/UBCDD口对应
PrivateSlot上行连接器的Slot表示在当前组件里的槽位索引,业务拓扑建立后,下行连接器的Slot,用来确定全局槽位号
PrivateLinkWidth链路带宽
PrivateMaxLinkRate支持的最大速率
PrivateConnectorType连接器类型
PrivatePorts上行才需要端口配置Ports
PrivateUpstreamResources下行端口才需要配置
PrivateRefMgmtConnector下行连接器关联对应的管理连接器对象,后续加载对应卡的CSR
PrivateRefPCIeAddrInfo下行连接器关联对应的槽位PCIeAddrInfo对象

对于硬盘背板,上行连接器指的是基础板上用于Nvme直通连接的UBC/UBCDD接口,下行连接器指的是硬盘背板上对应Nvme盘的UBC接口,配置与Riser卡类似。

属性1属性2取值举例默认值是否必选属性描述
Name/"Up_1"""连接器名称
Direction/"Downstream"或"Upstream""""Downstream" "Upstream"分别表示下行连接器和上行连接器。下行连接器与槽位一一对应,上行连接器与前级单板的UBC/UBCDD口对应。
Slot/10下行连接器的Slot表示在当前组件里的槽位索引,业务拓扑建立后,下行连接器的Slot,用来确定全局槽位号。
LinkWidth/"X16"""连接器pcie链路宽度
MaxLinkRate/"PCIe4.0"""连接器支持的最大pcie规范
ConnectorType/"UBCDD"""连接器类型
UpstreamResourcesName"Up_1"[]下行连接器对应的上行连接器的名称,Direction配置为Downstream的对象才需要配置该属性。
ID2550不用做匹配。Direction配置为Downstream的对象才需要配置该属性。
Offset80下行连接器对应的上行连接器的资源的偏移,根据Offset字段匹配上行连接器的Port,Direction配置为Downstream的对象才需要配置该属性。
Width80下行连接器对应的上行连接器的资源,pcie链路宽度,Direction配置为Downstream的对象才需要配置该属性。
RefMgmtConnector/"#/Connector_PCIE_SLOT2"""下行连接器关联对应的管理连接器对象,后续加载对应卡的CSR。
RefPCIeAddrInfo/"#/PcieAddrInfo_2"""下行连接器关联对应的槽位PCIeAddrInfo对象

配置举例

json
   "BusinessConnector_1": {            // 上下行口均需进行配置,上行口一般是基础板的UBC/UBCDD
      "Name": "Up_1",
      "Direction": "Upstream",        // "Downstream" "Upstream"分别表示下行连接器和上行连接器。
      "Slot": 1,
      "LinkWidth": "X8",            // UBC对应X8,UBCDD对应X16
      "MaxLinkRate": "PCIe4.0",        // 连接器支持的最大pcie规范
      "ConnectorType": "UBC",
      "Ports": [
        {
          "Name": "Port1",
          "ID": 17,
          "Offset": 0,
          "Width": 4
        },
        {
          "Name": "Port2",
          "ID": 17,
          "Offset": 4,
          "Width": 4
        }
      ]
    },
    "BusinessConnector_2": {
      "Name": "Down_1",                // 连接器名称,此处为下行连接器
      "Direction": "Downstream",    // "Downstream" "Upstream"分别表示下行连接器和上行连接器。
      "Slot": 9,                    // 下行连接器的Slot表示在当前组件里的槽位索引,业务拓扑建立后,下行连接器的Slot,用来确定全局槽位号
      "LinkWidth": "X4",            // 连接器pcie链路宽度
      "MaxLinkRate": "PCIe 4.0",    // 连接器支持的最大pcie规范
      "ConnectorType": "NVMe CEM",    // 连接器类型
      "UpstreamResources": [
        {
          "Name": "Up_1",            // 下行连接器对应的上行连接器的名称,Direction配置为Downstream的对象才需要配置该属性
          "ID": 255,                // 不用做匹配
          "Offset": 0,                // 下行连接器对应的上行连接器的资源的偏移,根据Offset字段匹配上行连接器的Port,Direction配置为Downstream的对象才需要配置该属性。
          "Width": 4                // 下行连接器对应的上行连接器的资源,pcie链路宽度,Direction配置为Downstream的对象才需要配置该属性
        }
      ],
      "RefMgmtConnector": "#/Connector_ComVPDConnect_1",    // 下行连接器关联对应的管理连接器对象,后续加载对应卡的CSR。
      "RefPCIeAddrInfo": "#/PcieAddrInfo_NVMe_9"            // 下行连接器关联对应的槽位PCIeAddrInfo对象
    },
    "PcieAddrInfo_NVMe_9": {        // 硬盘背板兼容Nvme盘的Slot均需配置
      "Location": "HddBackplane${Slot}",
      "ComponentType": 2,
      "ControllerIndex": 0,
      "ControllerType": 0,
      "ContainerSlot": "${Slot}",
      "GroupPosition": "PcieAddrInfo_NVMe_9_${GroupPosition}",
      "ContainerUID": "00000001030302023936",
      "ContainerUnitType": "SEU"
    },

3.4.3 传感器管理

传感器包括门限传感器(也叫连续性传感器,表征传感器的值是连续变化的)和离散传感器(表征传感器的值是离散的,如:运行状态,隔离值等。)

  • 门限传感器(ThresholdSensor)

门限传感器,即连续性传感器,表征传感器的值是连续变化的,如:温度,电压,功耗,转速等。

对于硬盘背板而言,门限类传感器主要用于硬盘背板板温门限。

门限传感器,主要是配置对应的告警门限,需要与《软硬件接口文档》一起评审归档。

配置举例

json
    "ThresholdSensor_HddBpTemp": {
      "M": 100,                    // 决定传感器原始值转换到读值的转换公式参数
      "RBExp": 224,                // 传感器R/B计算表达式,决定传感器原始值转换到读值的转换公式参数
      "OwnerId": 32,            // ipmi规范定义,代表此Sensor归属于BMC哪一个控制器,0x20,固定不变,金样SR里明确要不要改动
      "OwnerLun": 0,            // 当涉及到一个机型两个BMC时,该属性决定此Sensor归属于哪个BMC
      "EntityId": "<=/Entity_InnerHddCard.Id",    // 传感器需要关联实体,关联对应实体的Id属性
      "EntityInstance": "<=/Entity_InnerHddCard.Instance",    // 传感器需要关联实体,关联对应实体的Instance属性
      "Initialization": 127,    // 传感器初始化选项,门限传感器 - 0x7F
      "Capabilities": 104,        // 传感器能力,具体含义见IPMI标准协议规范43.1章节。
//通用配置:①若传感器使能状态不受实体在位及上下电影响(一般对应关联的实体的Prsence和PowerState配固化为1),则配置为104;②若传感器使能状态受实体在位及上下电影响,则配置为232
      "SensorType": 1,            // 传感器类型,具体参照 Table 42-, Sensor Type Codes(P505)
      "ReadingType": 1,            // 传感器读值类型,ThresholdSensor则配置为0x01。具体参照 Table 42-, Event/Reading Type Code Ranges(P503)
      "SensorName": "Disk BP${Slot} Temp",    //     传感器名称
      "Unit": 128,                // 传感器单位配置,具体含义见IPMI标准协议规范43.1章节。通用配置:①传感器读值为有符号数,如温度:配置为128;②传感器读值为无符号数,如功率:配置为0
      "BaseUnit": 1,            // 传感器基本单位,如温度传感器配置为1(表示Degrees C);具体参照IPMI标准协议规范Table 43-, Sensor Unit Type Codes(P554)
      "Analog": 1,                // CSR字典已标注未完成
      "NominalReading": 25,        // 名义读值,无实际含义,在数据格式范围内即可
      "MaximumReading": 127,    // 实际最大值,与数据格式有关。①有符号数,配置为127;②无符号数,配置为255
      "MinimumReading": 128,    // 实际最大值,与数据格式有关。①有符号数,配置为128;②无符号数,配置为0
      "Reading": "<=/Scanner_HddBPTemp.Value",    // 传感器原始读值
      "ReadingStatus": "<=/Scanner_HddBPTemp.Status",    // 传感器读值状态:0:normal
      "SensorNumber": 255        // 无传感器编号定制需求,则不配置或固化为255,由sensor模块分配
    },

门限传感器SEL检测流程:

  • 离散传感器(DiscreteSensor)

离散传感器,表征传感器的值是离散的,如:运行状态,隔离值等。

对于硬盘背板而言,“DiscreteSensor_Disk”编号从“0”开始,与硬盘槽位数量相同。离散传感器的主要作用是:

json
    "DiscreteSensor_Disk0": {
      "AssertMask": 199,        // 传感器事件产生掩码,决定是否能产生事件
      "DeassertMask": 199,        // 传感器事件恢复掩码,决定是否能恢复事件
      "DiscreteMask": 199        // 传感器离散值掩码,决定离散状态能否通过传感器返回
    },
    "DiscreteSensor_Disk0": {
      "EntityId": "<=/Entity_Disk0.Id",        // 传感器需要关联实体,关联对应实体的Id属性
      "EntityInstance": "<=/Entity_Disk0.Instance",    // 传感器需要关联实体,关联对应实体的Instance属性
      "Initialization": 99,        // 传感器初始化选项,门限传感器 - 0x63
      "Capabilities": 192,        // 传感器能力,具体含义见IPMI标准协议规范43.1章节。
//通用配置:①若传感器使能状态不受实体在位及上下电影响(一般对应关联的实体的Prsence和PowerState固化为1),则配置为64;②若传感器使能状态受实体在位及上下电影响,则配置为192
      "SensorType": 13,            // 传感器类型,具体参照 Table 42-, Sensor Type Codes(P505)
      "ReadingType": 111,        // 传感器读值类型,ThresholdSensor则配置为0x01。具体参照 Table 42-, Event/Reading Type Code Ranges(P503)
      "SensorName": "DISK0",    // 传感器名称
      "DiscreteType": 0,        // 传感器离散类型,具体是什么类型参照 Table 42-, Sensor Type Codes(P505)。普通离散:0;数字离散:1(事件互斥)
      "Unit": 192,                // 传感器单位配置,离散传感器-0xc0
      "BaseUnit": 0,            // 离散传感器无单位,配置为0
      "ModifierUnit": 0,        // 字典已标注未完成
      "RecordSharing": 1,        // 字典已标注未完成
      "Reading": 0                // 传感器原始读值
    },

AssertMask、DeassertMask、DiscreteMask:三个掩码的配置规则相同,离散传感器中一般三个会配置为相同,其中bit15默认为0,bit0~bit14分别对应不同的离散事件,具体每个bit的含义详见IPMI规范42.2章节

离散传感器SEL检测流程:

  • 实体(Entity)

传感器实体资源,表征当前的传感器依赖或者所属的硬件的实体描述,该实体的 在位状态 或者 上下电状态 会影响当前传感器的值以及状态,还有对应传感器事件 IPMI SEL 的生成状态。

硬盘背板涉及两类实体,Entity_Disk与Entity_InnerHddCard,Disk需要与实际盘数量相同,InnerHddCard单个硬盘背板只配置一个

传感器配置实体:(参考IPMI规范)

配置属性

属性名称属性类型属性说明
Iduint8传感器对应的实体标识
Instanceuint8传感器对应的实体实例标识,通常以0x60开始配置
Slotuint8实体所在的槽位,默认0xFF。如果槽位不是默认,则会根据槽位生成唯一的Instance
Namestring实体的名称
Presenceuint8实体的在位状态,需要关联对应的在位信号来源 若不存在部件动态拔插,则配置为1
PowerStateuint8实体的上下电状态,需要关联对应的上下电信号来源 若与上下电状态无关,则配置为1

配置关键点

IPMI规范:

  1. Entity Id严格按照IPMI规范中的表格进行配置
  2. Entity Instance保证同一Entity Id下唯一

配置举例

json
    "Entity_Disk0": {    // Entity_Disk从0开始编号
      "Id": 4,            // 传感器对应的实体标识
      "Instance": 96,    // 传感器对应的实体实例标识,通常以`0x60`开始配置
      "Name": "Disk0",    // 实体的名称
      "PowerState": 1,    // 实体的上下电状态,需要关联对应的上下电信号来源  若与上下电状态无关,则配置为`1`
      "Presence": 1        // 实体的在位状态,需要关联对应的在位信号来源  若不存在部件动态拔插,则配置为`1`
    },
    ......                //    此处省略Entity_Disk1-Entity_Disk6
    "Entity_Disk7": {
      "Id": 4,
      "Instance": 103,
      "Name": "Disk7",
      "PowerState": 1,
      "Presence": 1
    },
    "Entity_InnerHddCard": {
      "Id": 11,
      "Name": "InnerHddCard${Slot}",
      "PowerState": "<=/Scanner_PowerGood.Value",
      "Presence": 1,
      "Instance": 112
    },

3.4.4 告警管理

  • 精细化告警(Event)

精细告警中的告警门限值需要与《软硬件接口文档》对应,且完成评审归档。

1. 属性说明

(不配置则使用数据类型的默认值,所以按需配置即可)

属性描述
对象名Event_xxxEvent是固定值,看做是Class,所有Event类都会分发到事件模块处理
xxx是名称,无功能意义单个文件不重复即可,完整名称自发现会根据SR文件拼接,比如拼接成Event_xxx_0101
EventKeyId(必配)事件标识,用于匹配事件静态配置,例如告警描述等信息, 要在BMC内部定义,才能产生告警,见第三小节的列表
Reading(必配)告警读数,普通的事件比如温度可以直接拿来当做读数,其他类型的比如证书过期,可以是0和1来代替
最终是结合运算符、门限判断是否符合告警条件,所以根据业务场景配置即可
Condition(必配)告警门限值
OperatorId判断符号 1:小于 2:小于等于 3:大于 4:大于等于 5:等于 6:不等于 7:上升沿0->1产生,1->0恢复 8:下降沿1->0产生,0->1恢复
注:上升沿下降沿时,值只有0/1/255,其中255表示无效值不会处理,且不要出现小数
Hysteresis迟滞量 在恢复告警时使用,产生告警时不会使用,迟滞量支持负数,所以根据正负数表征正向/负向迟滞量
Enabled事件使能状态,或者称为屏蔽状态,被屏蔽后不再会进行读值检测
DescArgx/SuggArgx(选配) 事件的描述/建议参数,用于格式化参数,即替换描述模板中的%1、%2等占位符,如DescArg1替换描述中的%1
仅支持字符串格式,最多10个
注:如果对于浮点数期望显示为3位小数,则需要通过SR表达式format进行转换
Component关联的Component对象,正常情况下Component部件需要与事件码高位匹配,用于显示告警主体
例如:查询环境有无对应的Component Type等于事件码高位例如0x02xxxxxx则需要查找Type为2的部件
AdditionalInfo(选配)事件的附加信息,即第X个动态参数,也可以是‘1,2’指向多个,用于FD上报时区分不同事件
比如完全相同的告警仅槽位不同,一般用槽位做区分,新增的告警需要特别注意是否需要配置
LedFaultCode(选配) Led错误码,可以是固定值也可以是动态值x$ (取Component中的Instance填充$部分)
InvalidReadingIgnore(选配)是否忽略无效值,1:开启 0 : 关闭,开启后读值如果等于InvalidReading则忽略
InvalidReading(选配) 需要忽略的无效值

2. 告警产生逻辑

根据OperatorId的判断方式,将Reading的值和Condition做比较,判断为真产生告警。即:

是否产生: Reading OperatorId Condition

是否恢复: (Reading + Hysteresis) OperatorId Condition

例如OperatorId为5时,则会判断 Reading == Contion 是否成立

3. EventKeyId列表

社区版本定义迁移到vpd中,详细参考社区告警文档

4. 业务简图

5. SEU配置举例

对于硬盘背板sr文件而言,Event类告警事件主要包括以下几类:

1、硬盘类事件/告警(硬盘丢失、硬盘链路异常、硬盘RAID组阵列失效、硬盘预故障、硬盘有外部配置、硬盘当前剩余磨损率低于门限、硬盘 RAID重构开始、硬盘 RAID重构停止、硬盘状态异常、硬盘故障、硬盘发生替换、硬盘 I/O 性能下降、硬盘当前有效冗余块比例低于门限、硬盘预估剩余寿命不足)

2、硬盘背板类事件/告警(硬盘插入、硬盘拔出、硬盘背板发生更换、硬盘背板CPLD自检结果异常、硬盘背板缓起电路温度过高强制系统下电)

3、系统类事件/告警(电源故障导致系统上电超时、硬盘背板电源异常)

  • 硬盘丢失告警
json
    "Event_Disk0Missing": {
      "EventKeyId": "Disk.DiskMissing",        // 事件标识,用于匹配事件静态配置。必要,并且要在BMC内部定义,才能产生告警
      "Condition": 2,                        // 告警门限值
      "Reading": "<=/Drive_1.Missing",        // 告警读数,普通的事件比如温度可以直接拿来当做读数,其他类型的比如证书过期,可以是0和1来代替
      "OperatorId": 5,                        // 判断符号:等于
      "Enabled": true,                        // 事件使能状态,或者称为屏蔽状态
      "DescArg2": "Disk0",                    // 事件的描述/建议参数,用于格式化参数,仅支持字符串格式
      "Component": "#/Component_Drive0",    // 关联的Component对象,Component部件需要与事件码高位匹配,用于显示告警主体
      "ComponentHealth": "#/Component_Drive0.Health"    // 字典未记录
    },
  • 硬件模块(Component)

硬盘背板包含两种Component,Component_HddBackplane与Component_Drive,此对象用于更换信息,与Event搭配使用。(按照CSR-DEG决策结论,这部分放到管理mgmt_model.sr里)

1. 属性说明

属性属性描述是否必选
FruId关联Fru的Fruid,如果仅用于告警则配置255
Instance组件设备Number,即器件在整个单板中的编号
Type部件类型,HddBackplane卡为5
Name部件名称,同一个position中需要保证唯一 补充告警和电子标签各自关注
Presence部件在位状态
Health关联告警时,如果告警则会根据告警严重程度进行更新
PowerState部件电源状态
BoardId组件单板BoardId
UniqueId组件唯一标识,Vendor + ComponentID
Manufacturer组件厂商信息
GroupId组件逻辑组Id
Location组件的容器
SerialNumber组件序列号
PartNumber组件号
SegmentId组件容器ID
Function部件功能信息,简要描述功能,仅用于告警则不用配置
PreviousSNSN号变更时自动更新为上一次的SN号
ReplaceFlagSN号变更时自动更新
NodeId节点的ID

2. SEU配置举例

json
    "Component_HddBackplane": {
      "FruId": "<=/Fru_SEU.FruId",                // 关联Fru的Fruid,如果仅用于告警则配置255
      "Instance": "${Slot}",                    // 组件设备Number,即器件在整个单板中的编号
      "Type": 5,                                // 部件类型,HddBackplane为5
      "Location": "<=/HddBackplane_1.Position",    // 组件的容器
      "Name": "<=/HddBackplane_1.DeviceName",    // 部件名称,同一个position中需要保证唯一 补充告警和电子标签各自关注
      "Presence": 1,                            // 部件在位状态
      "Health": 0,                                // 关联告警时,如果告警则会根据告警严重程度进行更新
      "PowerState": 1,                            // 部件电源状态
      "GroupId": 1,                                // 组件逻辑组Id
      "UniqueId": "00000001030302023936",        // 组件唯一标识,Vendor + ComponentID
      "ReplaceFlag": 0,                            // SN号变更时自动更新
      "PreviousSN": "",                            // SN号变更时自动更新为上一次的SN号
      "SerialNumber": "<=/FruData_SEU.BoardSerialNumber",    // 组件序列号
      "NodeId": "<=/HddBackplane_1.Position;<=/HddBackplane_1.DeviceName |> string.format('%s%s',$1,$2)",    // 节点的ID
      "BoardId": "<=/HddBackplane_1.BoardID"    // 组件单板BoardId
    },
    "Component_Drive0": {
      "FruId": 255,
      "Instance": 1,
      "Type": 2,
      "Name": "${Slot} |> expr($1 != 1? 24: 0) |> string.format('Disk%s', $1)",
      "Presence": 1,
      "Health": 0,
      "PowerState": 1,
      "NodeId": "Disk0",
      "ReplaceFlag": 0,
      "PreviousSN": "",
      "SerialNumber": "<=/Drive_1.SerialNumber",
      "Manufacturer": "<=/Drive_1.Manufacturer"
    },

3.4.5 能效管理

能效管理策略由热设计提供,CSR相关配置由BMC开发团队进行配置。

  • CoolingRequirement

CoolingRequirement用于描述整机调速中的目标调速策略,策略信息由CSR配置,如温度点读值、目标温度、温度点状态、温度点失效调速、目标调速生效条件等。软件通过加载CoolingRequirement CSR,对目标调速策略进行管理,输出PWM至散热器件,实现整机散热管理。

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.Systems.CoolingRequirementActiveInStandbyStandby下调速是否生效,true:生效;false:不生效
bmc.kepler.Systems.CoolingRequirementCustomSupported是否支持自定义目标温度值,true:支持,false:不支持
bmc.kepler.Systems.CoolingRequirementCustomTargetTemperatureCelsius用户自定义温度值,255为默认无效值, 当CustomSupported为True时,自定义调速模式下使用改属性作为调速点的目标调速值
bmc.kepler.Systems.CoolingRequirementFailedValue温度状态异常后的调速转速,不配代表该目标调速策略无异常调速;如果配置了值,温度点读取失败的时候,该策略输出PWM为该属性配置值
bmc.kepler.Systems.CoolingRequirementMaxAllowedTemperatureCelsius满转转速的温度值,当该策略管理温度值达到该属性配置值时,该策略输出PWM为100
bmc.kepler.Systems.CoolingRequirementMonitoringStatus温度点传感器状态,温度点状态 0:正常 1:异常,该属性非0时,调速策略使用FailedValue输出PWM
bmc.kepler.Systems.CoolingRequirementMonitoringValue调速策略对应的温度点温度值
bmc.kepler.Systems.CoolingRequirementRequirementId目标调速策略Id,Id必须全局唯一,当前Id支持有效16位,前8位baseid,后8位Slot
bmc.kepler.Systems.CoolingRequirementSensorName调速策略对应的温度点传感器名
bmc.kepler.Systems.CoolingRequirementSmartCoolingTargetTemperatureCelsius智能调速模式策略,即EnergySaving/HighPerformance/LowNoise 三种模式下的目标温度值
bmc.kepler.Systems.CoolingRequirementTargetTemperatureCelsius目标温度值,用于PID目标调速计算
bmc.kepler.Systems.CoolingRequirementTargetTemperatureRangeCelsius自定义模式温度允许范围,用于自定义目标值时的合法性判断,仅支持自定义模式策略配置生效
bmc.kepler.Systems.CoolingRequirementTemperatureType目标调速温度点类型
PrivateBackupRequirementIdx备用目标调速策略ID,当温度点异常时使用该属性对应目标调速策略温度值计算PWM
PrivateBaseId调速策略基础ID,RequirementId前8位
PrivateCoolingMedium调速策略对应散热介质
PrivateEnabled调速策略生效条件,true有效,false无效,可通过配置该属性自定义该调速策略的生效条件
PrivateIsBackupRequirement是否作为备份温度点
PrivateIsValid调速策略是否生效,软件结合CSR配置刷新
PrivateLiquidFailedValue温度点失效液冷调速值
PrivateObtainTempFaildToValid硬盘调速策略温度值获取失败时该调速策略生效
PrivateOriginFailedValue失效调速策略CSR原始值
PrivateOriginMaxAllowedTemperatureCelsius满转调速策略CSR原始值
PrivateOriginSmartCoolingTargetTemperature智能调速模式调速策略CSR原始值
PrivateSlot槽位号,RequirementId后8位
PrivateSmartCoolingTargetTemperature智能调速模式策略,即EnergySaving/HighPerformance/LowNoise 三种模式下的目标温度值
json
    "CoolingRequirement_1_61": {                            //说明:一个温度点对应一个CoolingRequirement对象,用于关联硬件温度和配置目标/告警调速
      "RequirementId": "${Slot} |> expr((61 << 8) | $1)",    //ID号,整机角度必需唯一,CoolingArea对象通过这个ID来绑定CoolingRequirement,BMC已在整理规范,后续会发布到社区,作为调试ID的配置约束。
      "MonitoringStatus": "<=/Scanner_HddBPTemp.Value |> expr($1 >= 255 ? 1 : 0)",    //当前温度传感器的状态,配置为0代表温度传感器一直正常,其他值都代表温度传感器异常
      "MonitoringValue": "<=/Scanner_HddBPTemp.Value",        //关联该调速对象的温度值,一般从单板温度传感器获取数值,这个属性不能引用传感器的Reading值。CoolingRequirement对象有些配置在其他单板上面,就是因为需要从其他单板上面获取温感的文档
      "FailedValue": 80,                                    //温度状态异常后的异常调速转速,不配代表温度点异常不触发异常调速,默认值为0。举例:当MonitoringStatus不为0时(即传感器异常),这个时候会把FailedValue的值赋值给TargetTemperatureCelsius属性
      "TargetTemperatureCelsius": 44,                        //当前调速目标值(EnergySaving(节能模式)模式目标值)。参考《整机系统风扇调速策略》进行配置,文件没有说明为哪种调试模式即EnergySaving(节能模式)
      "MaxAllowedTemperatureCelsius": 58,                    //目标调速满转/触发全速门限温度。参考《整机系统风扇调速策略》数值
      "TargetTemperatureRangeCelsius": [],                    //目标温度允许范围,用户自定义温度允许的范围值,在自定义调速模式下使用
      "ThresholdValue": [],                                    // 告警阈值,用于告警调速,不需要告警调速不配即可
      "AlarmSpeed": [],                                        // 告警调速对应的转速,不需要告警调速不配即可
      "Enabled": "<=/Drive_1.TemperatureCelsius;<=/Drive_2.TemperatureCelsius;<=/Drive_3.TemperatureCelsius;<=/Drive_4.TemperatureCelsius |> expr($1 + $2 + $3 + $4 >= 1020 ? 1 : 0)",            // 使能
      "SensorName": "#/ThresholdSensor_HddBpTemp.SensorName"// 传感器名称
    },
TemperatureType含义
1Cpu
2Outlet
3Disk
4Memory
5PCH
6VRD
7VDDQ
8NPUHbm
9NPUAiCore
10NPUBoard
  • TemperatureInfo

TemperatureInfo主要用于web界面整机温度海洋的显示,提供服务器机箱温度传感器前面板与后面板的三维热力图,以及对应传感器状态与告警信息,其中温度点横坐标、温度点纵坐标、告警状态、告警阈值下限、温度点名称、温度值、传感器状态、告警阈值上限皆由CSR配置定义。当正确配置相关属性后,web整机温度海洋界面将生成一个温度点信息。

Interface/Private属性/方法描述是否由CSR配置
PrivateName温度点名称,用于温度海洋界面对应温度点的传感器名称显示
PrivateReadingValue温度值
PrivateUpperThreshold告警阈值上限,高于该阈值会触发告警
PrivateLowerThreshold告警阈值下限,低于该阈值会触发告警
PrivateStatus传感器状态
PrivateHealth告警状态,与传感器Health属性一致
PrivateCoordinateX温度点横坐标
PrivateCoordinateY温度点纵坐标
json
    "TemperatureInfo_1_7": {
      "Name": "#/ThresholdSensor_HddBpTemp.SensorName",    // 温度传感器名称
      "ReadingValue": "<=/Scanner_HddBPTemp.Value",        // 温度值
      "Status": "<=/Scanner_HddBPTemp.Status",            // 链路状态
      "Health": "<=/ThresholdSensor_HddBpTemp.Health",    // 传感器健康状态,Ok-健康,Minjor-有一般告警,Major-有严重告警,Critical-有紧急告警
      "UpperThreshold": [                                // 告警值上限
        255, //与对应温度点的传感器的一般事件上限UpperNoncritical,轻微级别告警的门限Condition保持一致
        255, //与对应温度点的传感器的严重事件上限UpperCritical,严重级别告警的门限Condition保持一致
        255 //与对应温度点的传感器的紧急事件上限UpperNonrecoverable,紧急级别告警的门限Condition保持一致
      ],
      "LowerThreshold": [                                // 告警值下限
        255, //与对应温度点的传感器的一般事件下限LowerNonCritical,轻微级别告警的门限Condition保持一致
        255, //与对应温度点的传感器的严重事件下限LowerCritical,严重级别告警的门限Condition保持一致
        255 //与对应温度点的传感器的紧急事件下限LowerNonrecoverable,紧急级别告警的门限Condition保持一致
      ],
      "CoordinateX": 8,                                    // 温度点横坐标
      "CoordinateY": 4                                    // 温度点纵坐标
    }

3.5 装备测试策略

此类对象主要用于装备测试,在硬盘背板中用于PCB、CSR、CPLD版本校验,Eeprom测试项与JTAG、IO测试项。

配置举例

Interface/Private属性/方法描述是否由CSR配置
bmc.kepler.ManufactureType测试类型
bmc.kepler.ManufactureId装备测试项
bmc.kepler.ManufactureDeviceNum用来匹配唯一装备项
bmc.kepler.ManufactureSlot用来匹配唯一装备项
bmc.kepler.ManufactureItemName装备项名称
bmc.kepler.ManufacturePrompteReady当前未使用
bmc.kepler.ManufacturePrompteFinish当前未使用
bmc.kepler.ManufactureProcessPeriod当前未使用
PrivateInputChip检查bypass关联chip
PrivateChannel检查InputChip关联chip的bypass,对应channel号
json
    "DftJTAG_1": {
      "Type": 2,                  // 测试类型,详见下表
      "Id": 69,                   // 装备测试项
      "DeviceNum": 1,             // 用来匹配唯一装备项
      "Slot": "${GroupId}",       // 用来匹配唯一装备项
      "ItemName": "SEU JTAG Test",// 装备项名称
      "PrompteReady": "",         // 未使用
      "PrompteFinish": "",        // 未使用
      "ProcessPeriod": 65535,     // 未使用
      "InputChip": "#/Cpld_1",
      "Channel": 2                // 检查InputChip关联chip的bypass,对应channel号
    }
Type(测试类型)含义
1直接自检,由APP提供检验结果
2需要人工干预的前提条件,比如需要接环回头、需要设置屏幕等,由各APP提供测试结果
3拷机测试项
4需要人工检查结果,比如LED灯需要人工查看是否正常,需要由装备人员确定检测结果
5需要人工操作,如button 、LCD
6需要与装备进行交互,需要装备侧软件比对数据来确定测试结果
255无效的测试项,不进行注册