板卡类别
板卡组件分为天池组件和非天池组件,天池组件支持天池协议,具有接口标准化、软硬件解耦和前后演进及后向兼容等优点
天池组件的板卡管理基本集成在general_hardware组件仓。
天池协议是指通过SMC(天池管理控制)标准命令字来承载通用软硬件接口。SMC成为了对接CPU-BIOS与BMC的唯一通用接口命令字,根据SMC协议规定,为了达成望文知意的效果,命令字标准格式以【function(功能)】,【opcode(具体指令)】,【R/W(读写)】,param等多个字段划分。
在openUBMC中,天池组件和非天池组件的差别:
- CSR存储:天池组件的CSR存储于板卡的Eeprom中,非天池组件的CSR存放于BMC内置存储
- CSR升级:仅天池组件支持CSR升级
板卡加载
板卡的加载是采用逐级加载方式。当前BMC的插卡(硬件自发现)和扩展板(EXU)直接连接,再由EXU连接基础板(BCU)、风扇板(CLU)、硬盘背板(SEU)、板载网卡(NIC)等对象。其次,BCU会连接Riser卡,在Riser卡上插有各种PCIe卡。上述连接在CSR的表现形式是Connector连接器,框架通过Connector一级一级地进行对象的加载和分发。具体加载流程可参考《硬件自发现》。

每两份CSR间一定以Connector相关联,故一定可以在上一级的CSR中找到关联的Connector,具体参考Connector对象。
板卡加载的样例
在环境查询所有的Connector信息
~~# busctl --user tree bmc.kepler.hwdiscovery └─/bmc └─/bmc/kepler ├─/bmc/kepler/Connector │ ├─/bmc/kepler/Connector/Connector_EXU_1_01
从图1可以得知root.csr -> EXU,可以查看相关root.csr的Connector信息,从而找到EXU板卡的CSR文件
~~# busctl --user introspect bmc.kepler.hwdiscovery /bmc/kepler/Connector/Connector_EXU_1_01 NAME TYPE SIGNATURE RESULT/VALUE FLAGS bmc.kepler.Connector interface - - - .AuxId property s "01" emits-change writa> .Bom property s "14100513" emits-change .Buses property as 0 emits-change .ChassisId property s "" emits-change .GroupId property u 2 emits-change .GroupPosition property s "0101" emits-change .Id property s "EXU" emits-change writa> .IdentifyMode property y 2 emits-change .LoadStatus property y 0 emits-change .ManagerId property s "1" emits-change .Presence property y 1 emits-change writa> .SilkText property s "EXU" emits-change .Slot property y 1 emits-change writa> .SystemId property y 1 emits-change .Type property s "" emits-change bmc.kepler.Object.Properties interface - - - .GetAllWithContext method a{ss}s a{sv} - .GetOptions method a{ss}ss a{ss} - .GetPropertiesByNames method a{ss}sas a{sv}a{sv} - .GetPropertiesByOptions method a{ss}sa{ss} as - .GetWithContext method a{ss}ss v - .SetWithContext method a{ss}ssv - - .ClassName property s "Connector" emits-change .ObjectIdentifier property (ysss) 0 "1" "" "01" emits-change .ObjectName property s "Connector_EXU_1_01" emits-change
解析说明:
a. 从上面资源写作接口的信息可以得知:root.csr中连接下一级板卡14100513_EXU_01.csr的Connector对象是Connector_EXU_1 (具体见bmc.kepler.Object.Properties)
b. Connector_EXU_1的属性及其属性值挂载在bmc.kepler.Connector接口下,可以查询IdentifyMode的值,其决定加载下一级板卡是采用天池组件方式还是非天池组件方式
c. 若IdentifyMode = 2,则是非天池加载方式,拼接Bom、Id和AuxId来寻找下一级板卡Bom_Id_AuxId.csr
d. 若IdentifyMode = 3,则是天池加载方式,拼接Bom、Id来寻找下一级板卡Bom_Id.csr
Connector对象
Connector是一个逻辑概念。在CSR中,不同板卡是通过Connector连接的。因此,Connector对象的正确配置是板卡正常加载的前提。
Connector的通用配置
{
"Connector_xxx": {
"Bom": ,
"Slot": ,
"Position": ,
"Presence": ,
"Id": ,
"AuxId": ,
"Buses": [],
"SystemId": ,
"SilkText": ,
"IdentifyMode": ,
"Type": ,
"ManagerId": ,
"ChassisId": ,
"Chip": ,
"Container": ,
"IdChipAddr": ,
}
}
解析说明:
- Connector对象的命名前面的类名只能是Connector,后面的名称xxx可以是数字,也可以为其他,只要确保对象Connector_xxx的命名在整个CSR文件是全局唯一即可
- CSR文件配置Connector对象时可以配置上面属性
属性名 | 属性值类型 | 描述 | 必填or选填字段 |
---|---|---|---|
Bom | U8 | 描述下一级板卡的Bom Id | 选填字段 |
Slot | U8 | 描述下一级板卡的信号槽 | 必填字段 |
Position | U8 | 表示CSR对象的全局位置标识,在硬件自发现重命名对象时需要使用,同一个CSR文件中的任意两个连接器Position不能重复 | 必填字段 |
Presence | U8 | 表示Presence状态获取方式,可配置为静态值0或1,也可配置为动态引用、数据同步、计算结果为0或1的表达式;天池组件需要指定在位状态获取方式,一般通过同步属性语法通过硬件代理读取指定器件寄存器数据 | 必填字段 |
Id | String | 表示下一级板卡的UID,天池组件的UID通过Chip属性关联的器件对象,调用对应的读写接口获取Eeprom数据的UID信息 | 选填字段 |
AuxId | String | 表示下一级板卡的Aux id:天池组件不使用该属性,非天池组件在加载下一级板卡时会使用它,但可以配置为空 | 选填字段 |
Buses | String[] | 表示和下一级板卡连接的总线,字符串数组类型,包含0到多个总线,每个配置的总线名称需要和Anchor中的Buses名称保持一致或定义在Pca9544、Pca9555、Pca9548、Chip、Smc、JtagSwitch下的总线 | 必填字段 |
SystemId | U8 | SystemId只在root.sr中的Connector体现,代表下一级CSR对象所属的System,如果是单系统,则取默认值1,如果存在多系统,则配置多个Connector,SystemId取不同的值,从1开始递增 | 选填字段 |
SilkText | String | 描述下一级板卡的丝印信息 | 选填字段 |
IdentifyMode | U8 | 描述下一级板卡的识别方式:IdentifyMode = 1:BoardId可读,采用BoardId加载方式,直接关联某个Assensor,从硬件直接读取;IdentifyMode = 2:非天池组件的加载方式;IdentifyMode = 3:天池组件的加载方式 | 必填字段 |
Type | String | 描述Connector后端设备的类型,如PCIeSlot、PCIeRiser、SEU等 | 选填字段 |
ManagerId | String | ManagerId只在root.sr中的Connector定义,代表下一级CSR对象所属的Manager;软件属性 | 选填字段 |
ChassisId | String | ChassisId只在root.sr中的Connector定义,代表下一级CSR对象所属的Chassis;软件属性 | 选填字段 |
Chip | String | 关联的寄存器对象 | 选填字段 |
Container | String | 描述下一级板卡的硬件位置,表示这个组件的实际物理位置 | 选填字段 |
IdChipAddr | U8 | 通过该地址来获取Eeprom的id | 选填字段 |
CSRVersion | String | 表示硬件自发现设置Eeprom中的真实硬件自描述数据版本 | 选填字段 |
加载方式
板卡加载是通过Connector进行加载下一级组件,并通过Connector的IdentifyMode属性来判断下一级组件的识别方式,即IdentifyMode = 3对应的下级组件识别方式为天池标准类型组件,IdentifyMode = 2为非天池组件。
root.sr -> EXU(拓展板) -> BCU(基础板)/SEU(硬盘背板)/CLU(风扇板)/PSR-> IEU(IO拓展组件) -> PCIe
天池组件加载方式
以EXU上的BCU Connector为例(如图1所示):若检测到Connector_BCU的Presence属性为1,即连接的BCU在位,此时框架会自动读取下一级对象的寄存器(Eeprom),解析和校验Eeprom里header头数据中的UID(每种天池组件唯一的标识),更新Connector的Id,解析Eeprom的二进制数据和分发下一级对象;根据读取Connector的Bom属性、解析的Eeprom数据中的UID来获取下一级对象的Bom_Id.sr,框架直接加载Eeprom里的下一级对象文件。
非天池组件的加载方式
以Riser卡的PCIe Connector为例(如图1所示),PCIe Device组件在初始化的时候会向BIOS发送ipmi命令,通过带内拿到PCIe卡的四元组,更新Connector的id和AuxId。同样的,如果检测到Presence属性为1,表示连接器下一级的板卡对象在位,框架会查询有没有Bom_Id_AuxId.sr和Bom_Id_AuxId_soft.sr对象的文件,直接加载BMC内置的sr文件。
profile文件
在某机型上新增一个单板/一张卡的sr文件,需要在对应机型的profile.txt文件添加该对象的sr文件路径
csr_dir_path/Bom_Id.sr
csr_dir_path/Bom_Id_AuxId.sr
...
板卡配置
推荐开发者使用BMC Studio来配置CSR文件,其提供一系列辅导,帮助开发者快速和准确配置CSR文件
在这里,以配置一张Riser卡为例,讲述配置和适配板卡的步骤
Riser卡是用于扩展计算机主板插槽的适配器卡。它通常用于将主板上插槽方向从垂直变为水平,以便更容易地容纳其他内部组件,尤其是在小型或限制空间的计算机机箱中。Riser卡通常用于添加更多的拓展卡,如声卡、显卡和网卡等。
根据Riser卡的硬件图描述Riser卡的管理拓扑关系
json{ "FormatVersion": "3.00", "DataVersion": "1.00", "Unit": { "Type": "IEU", "Name": "RiserCard_1" }, "ManagementTopology": { "Anchor": { "Buses": [ "I2c_1" ] }, "I2c_1": { "Chips": [ "Eeprom_IEU", "Pca9545_IEU" ] }, "Pca9545_IEU": { "Buses": [ "I2cMux_9545Chan1", "I2cMux_9545Chan2", "I2cMux_9545Chan3" ] }, "I2cMux_9545Chan1": { "Connectors": [ "Connector_PCIe_1" ] }, "I2cMux_9545Chan2": { "Connectors": [ "Connector_PCIe_2" ] }, "I2cMux_9545Chan3": { "Chips": [ "PCA9555_IEU", "Chip_MCU" ] } } }
解析说明:根据图1.Riser卡的管理拓扑图配置Riser卡的"FormatVersion"、"DataVersion"、"Unit"和"ManagementTopology"关系
明确配置一张Riser卡需要具备哪些对象,以及这些对象具有哪些属性,其值来源哪里
- 在Riser卡的配置中,必须配置RiserCard对象,用于描述配置一张Riser板卡的信息
json{ "Objects": { "RiserCard_1": { "Slot": 1, "UID": "00000001040302023940", "Name": "BC83PRUI", "Manufacturer": "openUBMC", "Type": "IEU", "Description": "Riser(X8*2)", "PartNumber": "0302023940", "PcbID": "#/Accessor_PcbID.Value", "PcbVersion": "", "LogicVersion": "N/A", "SRVersion": "${DataVersion}", "MCUVersion": "", "BoardID": 65535, "BoardType": "RiserCard", "Number": 1, "DeviceName": "PCIeRiser${Slot}", "Position": "chassis", "NodeId": "chassisPCIeRiser${Slot}", "FruID": "<=/Fru_IEU.FruId", "RefMCUChip": "#/Chip_MCU" } } }
解析说明:
a. RiserCard_1对象描述这张Riser卡的信息:这张Riser卡位于BCU的第1槽位号,唯一标识这张Riser卡的UID是"00000001040302023940",板卡名称是"BC83PRUI"等等,将会在web界面显示部分Riser卡信息
b. RiserCard对象的每个属性的配置描述可以参考对象配置的RiserCard
2.2 从上面的RiserCard_1的对象描述可以得知这张RiserCard需要引用MCU寄存器,而MCU是逻辑芯片,需要对其进行升级等操作。因此,需要配置描述MCU升级的对象以及MCU寄存器信息
json{ "Objects": { "Chip_MCU": { "OffsetWidth": 1, "AddrWidth": 1, "Address": 200, "WriteTmout": 100, "ReadTmout": 100, "HealthStatus": 0, "WriteRetryTimes": 2, "ReadRetryTimes": 0, "DrvWriteDelay": "<=/RiserCard_1.MCUVersion |> string.sub($1, 1, 4) |> expr($1 >= '1.12' ? 0 : 1)" }, "MCUFirmware_1": { "UID": "00000001040302023940", "RefChip": "#/Chip_MCU", "Address": 200, "SoftwareId": "MCU-BC83PRUI", "BoardType": "IEU" } } }
解析说明:
a. 描述MCU所在的寄存器信息和MCU升级信息
b. Chip_MCU对象的每个属性的配置描述可以参考对象配置的Chip
c. MCUFirmware_1对象的每个属性的配置描述可以参考对象配置的MCU升级
2.3 因为Riser卡是天池组件,使用Eeprom来存放CSR数据,再者,因为CSR数据需要更新。因此,需要配置Eeprom对象和SR升级对象
json{ "Objects": { "Eeprom_IEU": { "OffsetWidth": 2, "AddrWidth": 1, "Address": 174, "WriteTmout": 100, "ReadTmout": 100, "RwBlockSize": 32, "WriteInterval": 20, "HealthStatus": 0 }, "SRUpgrade_1": { "UID": "00000001040302023940", "Type": "IEU", "Version": "${DataVersion}", "StorageChip": "#/Eeprom_IEU", "SoftwareId": "HWSR-BC83PRUI", "WriteProtect": "#/Accessor_IEUWP.Value" } } }
解析说明:
a. 描述IEU板卡的Eeprom信息,因为Eeprom用于存在Fru信息和CSR信息。因此,当存储在Eeprom的CSR信息需要升级时,需要配置SRUpgrade对象,该对象配置了升级的CSR文件包名称(UID.sr)、升级的CSR文件数据版本、存储CSR的Eeprom寄存器等信息
b. Eeprom_IEU对象的每个属性的配置描述可以参考对象配置的Eeprom
c. SRUpgrade_1对象的每个属性的配置描述可以参考对象配置的SR升级
2.4 因为Riser卡是一种用于拓展计算机主板插槽的适配卡,它存在很多插槽,可以插入PCIe卡或其他多路复用器等。在这张Riser卡上使用了Pca9545多路复用器,用于连接更多的设备。
json{ "Objects": { "Pca9545_IEU": { "OffsetWidth": 0, "AddrWidth": 1, "Address": 226, "WriteTmout": 100, "ReadTmout": 100, "HealthStatus": 0 }, "I2cMux_9545Chan1": { "ChannelId": 1 }, "I2cMux_9545Chan2": { "ChannelId": 2 }, "I2cMux_9545Chan3": { "ChannelId": 3 } } }
解析说明:
a. 这里描述Riser卡连接的Pca9545多路复用器信息,主要使用Pca9545中的三个通道来拓展线路。
b. Pca9545_IEU对象的每个属性的配置描述可以参考对象配置的Pca9545
2.5 由于使用Pca9545多路复用器来拓展设备数量。在这里,将会一一介绍挂载在Pca9545的三个通道的设备信息
json{ "Objects": { "Connector_PCIe_1": { "Bom": "14140130", "Slot": 1, "Position": 1, "Presence": 0, "Id": "", "AuxId": "", "Buses": [ "I2cMux_9545Chan1" ], "SystemId": "${SystemId}", "ManagerId": "${ManagerId}", "ChassisId": "${ChassisId}", "SilkText": "RiserCard${Slot}", "IdentifyMode": 2, "Container": "Component_RiserCard", "Type": "PCIe" } } }
解析说明:
a. Pca9545的I2cMux_9545Chan1通道挂载着PCIe设备。在这里,介绍寻找连接的下一级PCIe设备的信息。
b. Connector_PCIe_1对象的每个属性的配置描述可以参考Connector
json{ "Objects": { "Connector_PCIe_2": { "Bom": "14140130", "Slot": 2, "Position": 2, "Presence": 0, "Id": "", "AuxId": "", "Buses": [ "I2cMux_9545Chan2" ], "SystemId": "${SystemId}", "ManagerId": "${ManagerId}", "ChassisId": "${ChassisId}", "SilkText": "RiserCard${Slot}", "IdentifyMode": 2, "Container": "Component_RiserCard", "Type": "PCIe" } } }
解析说明:
a. Pca9545的I2cMux_9545Chan2通道挂载着另外一台PCIe设备。在这里,介绍寻找连接的下一级PCIe设备的信息。
b. Connector_PCIe_2对象的每个属性的配置描述可以参考Connector
json{ "Objects": { "Pca9555_IEU": { "OffsetWidth": 1, "AddrWidth": 1, "Address": 64, "WriteTmout": 100, "ReadTmout": 100, "HealthStatus": 0 }, "Scanner_Riser3V3Event": { "Chip": "#/Pca9555_IEU", "Offset": 1, "Size": 1, "Mask": 16, "Type": 0, "Period": 400, "Debounce": "#/Cont_num5", "Value": 0 }, "Accessor_PcbID": { "Chip": "#/Pca9555_IEU", "Offset": 1, "Size": 1, "Mask": 192, "Type": 0, "Value": 0 }, "Accessor_IEUWP": { "Chip": "#/Pca9555_IEU", "Size": 1, "Offset": 1, "Mask": 8, "Type": 0, "Value": 0 }, "Event_Riser3V3Event": { "EventKeyId": "Riser.PowerFailure", "Condition": 0, "Reading": "<=/Scanner_Riser3V3Event.Value", "@Default": { "Reading": 1 }, "OperatorId": 5, "Enabled": false, "AdditionalInfo": "1", "DescArg1": "#/RiserCard_1.Slot", "Component": "#/Component_RiserCard" }, "Cont_num5": { "Num": 5, "DefaultValue": 1 } } }
解析说明:
a. Pca9545的I2cMux_9545Chan3通道挂载着MCU所在的寄存器(介绍见上面)和Pca9555多路复用器。
b. 因为PcbID需要关联硬件,因此需要配置Accessor对象来PcbID所在的硬件进行读取操作
c. Riser卡上具有3V3电压,需要对3V3电压信息进行周期性扫描和配置相关告警事件,Event配置具体参考《事件定制》,Scanner配置具体参考对象配置的Scanner
d. 从寄存器中读取数据时,不可避免会遇到因器件抖动而产生误报的情况,此时需要配置滤波器来过滤异常场景,Cont配置具体参考对象配置的Cont
e. "Accessor_IEUWP"对象用于设置开关写保护,0关闭开保护,1打开(Eeprom的开关写保护)
2.6 Riser卡是现场可替换单元,需要配置Fru类对象来描述它
json{ "Objects": { "Fru_IEU": { "PcbId": 1, "FruId": 1, "FruName": "PCIe Riser${Slot}", "ConnectorGroupId": "${GroupId}", "BoardId": 65535, "UniqueId": "00000001040302023940", "PcbVersion": ".A", "PowerState": 1, "Health": 0, "EepStatus": "<=/Eeprom_IEU.HealthStatus", "Type": 195, "FruDataId": "#/FruData_IEU" }, "FruData_IEU": { "FruId": 1, "FruDev": "#/Eeprom_IEU", "EepromWp": "#/Accessor_IEUWP.Value", "StorageType": "TianChi" }, "Component_RiserCard": { "FruId": "<=/Fru_IEU.FruId", "Instance": 0, "Type": 15, "Location": "<=/RiserCard_1.Position", "Name": "<=/RiserCard_1.DeviceName", "Presence": 1, "Health": 0, "PowerState": 1, "GroupId": 1, "UniqueId": "<=/RiserCard_1.UID", "NodeId": "<=/RiserCard_1.Position;<=/RiserCard_1.DeviceName |> string.format('%s%s',$1,$2)", "BoardId": "<=/RiserCard_1.BoardID", "PartNumber": "<=/RiserCard_1.PartNumber" } } }
解析说明:
a. Riser卡是现场可替换单元,需要使用Fru对象来描述它的信息,并需要描述它的电子标签信息和部件信息。
b. Fru_IEU对象的每个属性的配置描述可以参考对象配置的Fru类的Fru
c. FruData_IEU对象的每个属性的配置描述可以参考对象配置的Fru类的FruData
d. Component_RiserCard对象的每个属性的配置描述可以参考对象配置的Fru类的Component
2.7 由于Riser卡挂载在I2c链路上,且其还挂载Pca9545和Pca9555多路复用器,需要对这些链路进行自验,主要为了装备测试阶段提供查询接口
json{ "Objects": { "DftPca9555_1": { "Type": 1, "Id": 3, "Slot": "${GroupId}", "DeviceNum": 0, "ItemName": "PCA9555 For IEU${Slot}", "PrompteReady": "", "PrompteFinish": "", "ProcessPeriod": 65535, "RefChip": "#/Pca9555_IEU" }, "DftPca9545_1": { "Type": 1, "Id": 4, "Slot": "${GroupId}", "DeviceNum": 0, "ItemName": "PCA9545 For IEU${Slot}", "PrompteReady": "", "PrompteFinish": "", "ProcessPeriod": 65535, "RefChip": "#/Pca9545_IEU" }, "DftI2c_1": { "Type": 1, "Id": 33, "DeviceNum": 0, "Slot": "${GroupId}", "ItemName": "I2C-${Slot} Test", "PrompteReady": "", "PrompteFinish": "", "ProcessPeriod": 65535, "RefChip": "#/Pca9545_IEU" } } }
解析说明:
a. DftPca9545_1对象用于支持Pca9545器件进行自检
b. DftPca9555_1对象用于支持Pca9555器件进行自检
c. DftI2c_1对象用于支持I2c链路进行自检,通过配置关联的任意一种简单器件类自检进行覆盖,在这里使用关联的Pca9545器件
json{ "Objects": { "DftEeprom_1": { "Id": 12, "Type": 1, "Slot": "${GroupId}", "DeviceNum": 0, "ItemName": "IEU Eeprom Self Test", "PrompteReady": "", "PrompteFinish": "", "ProcessPeriod": 65535, "FruData": "#/FruData_IEU" }, "DftEepromWp_1": { "Id": 47, "Type": 1, "Slot": "${GroupId}", "DeviceNum": 0, "ItemName": "IEU Eeprom Write Protect Self Test", "PrompteReady": "", "PrompteFinish": "", "ProcessPeriod": 65535, "FruData": "#/FruData_IEU" }, "DftVersion_RiserCardPcbVersion": { "FruId": "<=/Fru_IEU.FruId", "VersionType": 0, "Version": "<=/RiserCard_1.PcbVersion" }, "DftVersion_RiserCardCsrVersion": { "FruId": "<=/Fru_IEU.FruId", "VersionType": 25, "Version": "<=/RiserCard_1.SRVersion" }, "DftVersion_RiserCardMcuVersion": { "FruId": "<=/Fru_IEU.FruId", "VersionType": 27, "Version": "<=/RiserCard_1.MCUVersion" } } }
解析说明:DftEeprom和DftEepromWp用于支持Eeprom的写保护测试,DftVersion用于支持版本的测试
2.8 因为PCIe卡一般插在Riser卡上(通过上面配置的Connector对象来找到对应的PCIe卡),若配置的PCIe卡是非天池组件,需要通过带内获取该PCIe卡的四元组信息来拼接Id和AuxId,然后将其填入到Connector对象,待硬件自发现时完成下一级对象的加载。
通过带内获取四元组信息前,需要建立BCU端口和IEU端口的映射关系。在IEU侧是通过对BusinessConnector定义来完成和BCU侧相连的,由于它们端口存在一一对应关系。因此,在配置IEU需要找到上一级BCU的相关对象来进行配置。更加详细信息参考《PCIe配置》。
PSR.sr
json{ "Objects": { "UnitConfiguration_IEU2": { "SlotType": "IEU", "SlotNumber": 2, "SlotSilkText": "IEUSlot2", "Configurations": [ { "UID": "00000001040302023940", "Index": 2, "SrcPortName": [ "B2a", "B2c" ], "TargetPortID": [ 49, 50 ], "Slot": [ 5, 6 ], "Device": [] } ], "Port1LinkInfo": "" } } }
BCU.sr
json{ "Objects": { "BusinessConnector_CPU2UBCDD1": { "Direction": "Downstream", "BCUIndex": "${Slot}", "Slot": 6, "LinkWidth": "X16", "MaxLinkRate": "PCIe 4.0", "ConnectorType": "UBCDD", "SilkText": "CPU2 UBCDD1", "UpstreamResources": [ { "Name": "SerDes_1_5", "ID": 5, "Offset": 0, "Width": 8 }, { "Name": "SerDes_1_6", "ID": 6, "Offset": 0, "Width": 8 } ], "ActualResourceOrder": [ "SerDes_1_6", "SerDes_1_5" ], "Ports": [ { "Name": "B2a", "ID": 5, "Offset": 0, "Width": 8 }, { "Name": "B2c", "ID": 7, "Offset": 8, "Width": 8 } ], "Port1LinkInfo": "", "Port2LinkInfo": "" }, "SerDes_1_5": { "Name": "SerDes_1_5", "ID": 5, "SocketID": 1, "LinkWidth": 8, "WorkMode": 1, "ModeConfigs": [ { "Mode": 1, "Device": [0,0,1,1,2,2,3,3], "ControllerIndex": [0,0,0,0,0,0,0,0] }, { "Mode": 4, "Device": [4,4,4,4,4,4,4,4], "ControllerIndex": [1,1,1,1,1,1,1,1] } ] }, "SerDes_1_6": { "Name": "SerDes_1_6", "ID": 6, "SocketID": 1, "LinkWidth": 8, "WorkMode": 1, "ModeConfigs": [ { "Mode": 1, "Device": [4,4,5,5,6,6,7,7], "ControllerIndex": [0,0,0,0,0,0,0,0] }, { "Mode": 1, "Device": [2,2,2,2,2,2,2,2], "ControllerIndex": [0,0,0,0,0,0,0,0] } ] }, } }
RiserCard.sr
json{ "Objects": { "BusinessConnector_1": { "Name": "Up_1", "Direction": "Upstream", "Slot": 1, "LinkWidth": "X16", "MaxLinkRate": "PCIe 4.0", "ConnectorType": "UBCDD", "Ports": [ { "Name": "Down_1", "ID": 49, "Offset": 0, "Width": 8 }, { "Name": "Down_2", "ID": 50, "Offset": 8, "Width": 8 } ] }, "BusinessConnector_2": { "Name": "Down_1", "Direction": "Downstream", "Slot": 1, "LinkWidth": "X8", "MaxLinkRate": "PCIe 4.0", "ConnectorType": "PCIe CEM", "UpstreamResources": [ { "Name": "Up_1", "ID": 255, "Offset": 0, "Width": 8 } ], "RefMgmtConnector": "#/Connector_PCIe_1", "RefPCIeAddrInfo": "#/PcieAddrInfo_1" }, "BusinessConnector_3": { "Name": "Down_2", "Direction": "Downstream", "Slot": 2, "LinkWidth": "X8", "MaxLinkRate": "PCIe 4.0", "ConnectorType": "PCIe CEM", "UpstreamResources": [ { "Name": "Up_1", "ID": 255, "Offset": 8, "Width": 8 } ], "RefMgmtConnector": "#/Connector_PCIe_2", "RefPCIeAddrInfo": "#/PcieAddrInfo_2" } } }
解析说明:
a. IEU.sr的BusinessConnector对象需要分为两种:一种是和上一级BCU.sr相连接(即UpStream),另一种是和下一级PCIe设备相连接(即DownStream)
b. 和上一级BCU是通过UBCDD来连接的,需要在BusinessConnector对象的ConnectorType配置为"UBCDD",则该对象的某些属性配置,需要一一找到对应的PSR.sr和BCU.sr来进行配置:IEU.sr文件的"BusinessConnector_1"对象的Ports属性的"ID"(49和50)要和PSR.sr文件中的"UnitConfiguration_IEU2"对象的Configurations属性中的"TargetPortID"对应上,然后根据Configurations对象的"SrcPortName"属性("B2a"和"B2c")、"Slot"属性(5和6)和BCU.sr中"BusinessConnector_CPU2UBCDD1"对象的Ports属性中的"Name"和"ID"一致,然后还需要在BCU.sr文件中配置对应的"SerDes_1_5"和"SerDes_1_6"对象,SerDes对象的设备Device属性值需要和PCIeAddrInfo对象的PortId一致,其SocketID属性代表该SerDes连着的CPU型号。至此,已经建立BCU和IEU的映射关系,根据这个映射关系可以计算RootBDF。
c. 和下一级PCIe是通过PCIe CEM来连接的,需要在BusinessConnector对象的ConnectorType配置为"PCIe CEM"
d. BusinessConnector_1、BusinessConnector_2和BusinessConnector_3对象的每个属性的配置描述可以参考对象配置的BusinessConnector
2.9 通过BusinessConnector对象建立BCU和IEU、IEU和PCIe的映射关系,并根据BCU和IEU的映射关系来计算RootBDF,根据RootBDF来完成PCIeAddrInfo对象的配置,并根据其属性值向带内发送ipmi命令来获取PCIe的deviceBDF信息
json{ "Objects": { "PcieAddrInfo_1": { "Location": "RiserCard${Slot}", "ComponentType": 8, "ContainerSlot": "${Slot}", "ContainerUID": "00000001040302023940", "ContainerUnitType": "IEU", "GroupPosition": "PcieAddrInfo_1_${GroupPosition}" }, "PcieAddrInfo_2": { "Location": "RiserCard${Slot}", "ComponentType": 8, "ContainerSlot": "${Slot}", "ContainerUID": "00000001040302023940", "ContainerUnitType": "IEU", "GroupPosition": "PcieAddrInfo_2_${GroupPosition}" } } }
解析说明:
a. PcieAddrInfo_1对象配置是为了向带内发送SlotId、SocketId和DeviceId来获取PCIe的deviceBDF信息,根据deviceBDF信息查询到PCIeDevice的四元组信息,根据四元组拼接成Id和AuxId,填充到Connector_PCIe_1,在硬件自发现时完成下一级PCIe设备的加载,更加详细的信息见pcie配置。
b. PcieAddrInfo_2对象配置是为了向带内发送SlotId、SocketId和DeviceId来获取PCIe的deviceBDF信息,根据deviceBDF信息查询到PCIeDevice的四元组信息,根据四元组拼接成Id和AuxId,填充到Connector_PCIe_2,在硬件自发现时完成下一级PCIe设备的加载,更加详细的信息见pcie配置。
至此,一张Riser板卡的CSR文件已经配置完成,下一步我们将会进行板卡适配,看在环境中是否能够成功加载该Riser卡。
板卡适配
环境加载板卡
采用BMC内置方式
a. 在vpd组件仓配置上面Riser板卡bom_id.sr,例如riser_00000001040302023940.sr
b. 在BCU的CSR文件中配置或修改连接该Riser卡的Connector对象信息
json{ "Objects": { "Connector_IEU_1": { "Bom": "14100513", "Slot": 1, "Position": 1, "Presence": 1, "Id": "", "AuxId": "", "Buses": [], "SystemId": 1, "SilkText": "IEU", "IdentifyMode": 2, "Container": "Component_RiserCard" } } }
c. 在profile文件中添加Riser卡文件路径
/sr/riser_00000001040302023940.sr
d. 出包并在环境验证:具体出包流程参考《BMC Studio CLI (bingo)》和《BMC Studio用户指南》
采用Eeprom形式
a. 将配置好的Riser板卡uid.sr,例如riser_00000001040302023940.sr文件打包img包,具体参考《BMC Studio用户指南》
b. 在环境上升级Riser卡的img包
c. 环境验证
环境验证
- 在环境上找到这个文件
~ ~ $ find / -name riser_00000001040302023940.sr ../sr/riser_00000001040302023940.sr
- 在环境中使用busctl命令可以查看挂在资源写作接口的RiserCard信息
~ ~ $ busctl --user introspect bmc.kepler.general_hardware /bmc/kepler/Systems/1/Boards/RiserCard/RiserCard_1_01010101 NAME TYPE SIGNATURE RESULT/VALUE FLAGS bmc.kepler.Object.Properties interface - - - .GetAllWithContext method a{ss}s a{sv} - .GetOptions method a{ss}ss a{ss} - .GetPropertiesByNames method a{ss}sas a{sv}a{sv} - .GetPropertiesByOptions method a{ss}sa{ss} as - .GetWithContext method a{ss}ss v - .SetWithContext method a{ss}ssv - - .ClassName property s "RiserCard" emits-change .ObjectIdentifier property (ysss) 1 "1" "" "01010101" emits-change .ObjectName property s "RiserCard_1_01010101" emits-change bmc.kepler.Systems.Board interface - - - .BoardID property q 65535 emits-change .BoardType property s "RiserCard" emits-change .CpldStatus property y 255 emits-change .Description property s "Riser(X8*2)" emits-change .DeviceName property s "PCIeRiser1" emits-change .FruID property y 0 emits-change .LogicUnit property u 0 emits-change .LogicVersion property s "N/A" emits-change .MCUVersion property s "" emits-change .Manufacturer property s "openUBMC" emits-change .MultiLogicUnit property a{su} 0 emits-change .MultiLogicVersion property a{ss} 0 emits-change .Name property s "BC83PRUI" emits-change .NodeId property s "chassisPCIeRiser1" emits-change .Number property y 1 emits-change .PSIPVersion property s "" emits-change .PartNumber property s "0302023940" emits-change .PcbVersion property s ".A" emits-change .Position property s "chassis" emits-change .PowerWatts property u 0 - .ProductName property s "" emits-change .RefComponent property s "" emits-change .RefFru property s "" emits-change .RunningStatus property y 1 emits-change .SRVersion property s "1.00" emits-change .SerialNumber property s "" emits-change .SilkText property s "" emits-change .Slot property y 1 emits-change bmc.kepler.Systems.Board.Unit interface - - - .CurrentUpgradeStatus property y 0 emits-change .HWSRVersion property s "" emits-change .Type property s "IEU" emits-change .UID property s "00000001040302023940" emits-change
对象配置
RiserCard
在板卡加载和适配中,通过RiserCard对象来描述Riser板卡信息
RiserCard的通用属性结构
{
"RiserCard_xxx": {
"Slot": ,
"Number": ,
"Position": ,
"Name": ,
"ProductName": ,
"SilkText": ,
"Manufacturer": ,
"Description": ,
"BoardID": ,
"PartNumber": ,
"PcbVersion": ,
"LogicVersion": ,
"SRVersion": ,
"MCUVersion": ,
"LogicUnit": ,
"PowerWatts": ,
"RunningStatus": ,
"FruID": ,
"DeviceName": ,
"BoardType": ,
"NodeId": ,
"RefComponent": ,
"RefFru": ,
"SerialNumber": ,
"CpldStatus": ,
"UID": ,
"Type": ,
"PcbID": ,
"LogicVersionID": ,
"RefMCUChip": ,
"RefSMCChip": ,
"Container": ,
"CpldTestNum":
}
}
解析说明:
- RiserCard对象的命名前面的类名只能是RiserCard,后面的名称xxx可以是数字,也可以为其他名车,只要确保对象RiserCard_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置RiserCard对象时可以配置上面属性
主要参数说明:
属性名 | 属性值类型 | 描述 |
---|---|---|
Slot | U8 | 表示RiserCard所在的BCU板卡的物理槽位号,例如 Slot = 1,表明RiserCard所在的BCU板卡的槽位号是1 |
Number | U8 | 表示RiserCard的逻辑编号 |
Position | String | 表示RiserCard的容器信息,如chassis |
Name | String | 描述板卡名,例如"BC83PRUI" |
ProductName | String | 描述产品名 |
SilkText | String | 描述RiserCard的丝印信息 |
BoardID | U16 | 描述单板ID,它主要是在非天池组件中作用 |
PartNumber | String | 描述部件编号,会在web界面显示 |
PcbVersion | String | 描述PCB版本号,根据PcbId的值进行计算得出,当PcbId为1时, 显示.A , 为2时显示.B, 依次类推 |
LogicVersion | String | 描述RiserCard上的Cpld的逻辑版本号 |
SRVersion | String | 描述RiserCard上的Eeprom中的CSR数据的版本号,一般和CSR文件的DataVersion一致 |
MCUVersion | String | 描述RiserCard上的MCU的版本号 |
LogicUnit | U32 | 描述RiserCard上的逻辑位号 |
PowerWatts | U32 | 描述RiserCard上的电源功率 |
RunningStatus | U8 | 监控CPLD和MCU的运行状态:1表示正常运行,0表示异常 |
FruID | U8 | 描述关联Fru对象的FruID属性,每张可插拔对象都需要配置 |
DeviceName | String | 描述板卡的丝印信息,如PCIe Riser1 |
BoardType | String | 描述单板类型,属于枚举类型。例如RiserCard |
NodeId | String | 描述资源ID,由容器信息Position和设备丝印名称DeviceName拼接而成,例如容器信息Position为"chassis",DeviceName为"PCIeRiser1"时,此时NodeId为"chassisPCIeRiser1" |
RefComponent | String | 描述引用的Component对象 TDOO:Component、chip之间的区别:Component对象 |
RefFru | String | 描述引用到的Fru对象 |
SerialNumber | String | 描述序列号,电子标签相关的,通过RefFru获取,用于唯一表示这张卡,可以通过它来查询这张卡制造流程等等 |
CpldStatus | U8 | 描述Cpld的健康状态 |
UID | String | 表示组件的唯一标识,根据它能够找到组件的CSR文件 |
Type | String | 描述组件类型(枚举值:"EXU"、"BCU"、"SEU"、"CLU"、"SEU") |
PcbID | U8 | 描述Pcb版本ID,需要关联到硬件,从硬件中读取ID |
LogicVersionID | U8 | 描述Cpld的版本ID |
RefMCUChip | U8B[] | 描述引用的MCU的寄存器 |
RefSMCChip | U8[] | 描述引用的SMC的寄存器 |
Container | String | 描述容器信息 |
CpldTestNum | U8 | 描述Cpld测试序号 |
Manufacturer | String | 描述这张Riser卡的制造厂商 |
Description | String | 描述这张Riser卡的插槽信息。例如"Riser(X8*2)",其表示这张Riser卡上有两个物理宽度和信号带宽均为X8的插槽,这意味着该Riser卡可以支持插入两张X8规格的扩展卡,或者一张X16规格的扩展卡(如果扩展卡支持的话,因为X16的槽位可以兼容X8的卡) |
MCU升级
Micro Control Unit (MCU)是微控制单元,需要升级,然后在CSR文件中需要对其进行升级
MCU升级对象的通用属性结构
{
"MCUFirmware_xxx": {
"UID": ,
"RefChip": ,
"Address": ,
"Protocol": ,
"SoftwareId": ,
"BoardType": ,
"LockChip":
}
}
解析说明:
- MCUFirmware对象的命名前面的类名只能是MCUFirmware,后面的名称xxx可以是数字,也可以为其他,只要确保对象MCUFirmware_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置MCUFirmware对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
UID | String | 描述组件唯一标识,用于寻找对应的MCU固件的升级包 |
RefChip | U8[] | 描述MCU所在的寄存器 |
Address | U32 | 描述MCU在寄存器的地址信息 |
Protocol | String | 描述和MCU进行通信的协议,用于传输数据等,例如"Smc" |
BoardType | String | 描述MCU所在的板卡类型,例如"IEU" |
LockChip | U8[] | 当升级时,需要对寄存器进行锁定 |
SoftwareId | String | 描述MCU的软件ID,例如"MCU-BC83PRUI" |
Chip
Chip用来描述物理寄存器
Chip的通用属性结构
{
"Chip_xxx": {
"HealthStatus": ,
"PowerStatus": ,
"SelfTestResult": ,
"Supported": ,
"BaseOffset": ,
"Length": ,
"Period": ,
"Address": ,
"AddrWidth": ,
"OffsetWidth": ,
"WriteTmout": ,
"ReadTmout": ,
"WriteRetryTimes": ,
"ReadRetryTimes": ,
"DrvWriteDelay": ,
}
}
解析说明:
- Chip对象的命名前面的类名只能是Chip,后面的名称xxx可以是数字,也可以为其他,只要确保对象Chip_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Chip对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
HealthStatus | U8 | 描述xxx所在的寄存器的健康状态 |
PowerStatus | U8 | 描述xxx所在的寄存器的上电状态 |
SelfTestResult | U8 | 描述xxx所在的寄存器的自验结果 |
Address | U32 | 描述xxx所在的寄存器在总线的地址信息 |
AddrWidth | U8 | 位宽 |
OffsetWidth | U8 | 偏移宽度 |
WriteTmout | U32 | 描述写入寄存器的超时时间 |
ReadTmout | U32 | 描述读取寄存器的超时时间 |
Supported | Boolean | 描述Chip是否具备汇聚数据访问能力, true: 具备能力, false: 默认值, 不具备能力 |
BaseOffset | U32 | 汇聚资源起始偏移/汇聚命令字, Smc场景下为汇聚命令字; 其他块设备场景为起始偏移, 连续读取一段数据 |
Length | U32 | 汇聚资源总长度 |
Period | U32 | 汇聚资源扫描间隔(单位ms) |
WriteRetryTimes | U8 | 描述写入寄存器的重试次数 |
ReadRetryTimes | U8 | 描述读取寄存器的重试次数 |
DrvWriteDelay | U8 | - |
SR升级
当存放在Eeprom的CSR文件需要更新时,此时就需要在CSR文件中配置SR升级对象,用于通知Eeprom所在的寄存器
SR升级对象的通用属性结构
{
"SRUpgrade_xxx": {
"UID": ,
"Type": ,
"Version": ,
"StorageChip": ,
"SoftwareId": ,
"WriteProtect": ,
"StorageLockChip": ,
"WriteProtectChip": ,
"WriteProtectLockChip":
}
}
解析说明:
- SRUpgrade对象的命名前面的类名只能是SRUpgrade,后面的名称xxx可以是数字,也可以为其他,只要确保对象SRUpgrade_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置SRUpgrade对象时可以配置上面属性
主要参数说明:
属性名 | 属性值类型 | 描述 |
---|---|---|
UID | String | 描述组件唯一标识,用于寻找升级的CSR文件,该CSR文件命名UID.CSR |
Type | String | 描述SR升级对象所在的组件类型 |
Version | String | 描述升级的SR数据版本 |
StorageChip | U8[] | 描述存储CSR文件的Chip |
WriteProtect | String | 描述Eeprom的写保护信息,即在进行Eeprom的CSR升级时,需要先解除写保护,允许数据的写入或修改 |
StorageLockChip | U8[] | 描述当Eeprom升级CSR文件时,需要对存储CSR的Eeprom寄存器锁定 |
WriteProtectChip | U8[] | 描述写保护的寄存器 |
WriteProtectLockChip | U8[] | 描述写保护锁定的寄存器 |
Eeprom
天池架构规范规定每个组件上必须存在一个在I2C总线上地址为0xAE的存储器件,当前均为Eeprom器件,用于保存硬件自描述信息,包含头部、电子标签、组件自描述信息(CSR)以及扩展信息等。
Eeprom的通用属性结构
{
"Eeprom_xxx": {
"HealthStatus": ,
"PowerStatus": ,
"SelfTestResult": ,
"Address": ,
"AddrWidth": ,
"OffsetWidth": ,
"WriteTmout": ,
"ReadTmout": ,
"RwBlockSize": ,
"WriteInterval":
}
}
解析说明:
- Eeprom对象的命名前面的类名只能是Eeprom,后面的名称xxx可以是数字,也可以为其他,只要确保对象Eeprom_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Eeprom对象时可以配置上面属性
Eeprom对象最重要的是Address属性,需要由硬件开发者确认
属性名 | 属性值类型 | 描述 |
---|---|---|
HealthStatus | U8 | 描述Eeprom的健康状态 |
PowerStatus | U8 | 描述Eeprom的上电状态 |
SelfTestResult | U8 | 描述Eeprom的自验结果 |
Address | U32 | 描述Eeprom在总线的地址信息 |
AddrWidth | U8 | 描述Eeprom的地址位宽 |
OffsetWidth | U8 | 描述Eeprom的偏移位宽 |
WriteTmout | U32 | 描述Eeprom的写超时时间 |
ReadTmout | U32 | 描述Eeprom的读超时时间 |
RwBlockSize | U16 | 描述分段写Eeprom的数据大小 |
WriteInterval | U16 | 描述分段写Eeprom的延时时间 |
Pca9545
Pca9545是一种I2c多路复用器,用于扩展总线的通道。它能够将一个总线分成四个独立的通道,每个通道可以连接不同的从设备。通过写入Pca9545内部寄存器的特定位,可以启用其中一个通道,同时只能启用一个通道。Pca9545在硬件设计中常用于增加从设备的数量,特别是在需要多个设备但总线数量有限的情况下。
Pca9545的通用属性结构
{
"Pca9545_xxx": {
"HealthStatus": ,
"PowerStatus": ,
"SelfTestResult": ,
"Address": ,
"AddrWidth": ,
"OffsetWidth": ,
"WriteTmout": ,
"ReadTmout": ,
}
}
解析说明:
- Pca9545对象的命名前面的类名只能是Pca9545,后面的名称xxx可以是数字,也可以为其他,只要确保对象Pca9545_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Pca9545对象时可以配置上面属性
- Pca9545对象最重要的是Address属性,需要由硬件开发者确认,原因:当知道Pca9545地址时,就可以向Pca9545的寄存器写入特定的值,就可以选择开启第几通道,这样就能实现通过Pca9545来访问连接在特定通道的从设备了
- Pca9545也是寄存器,且只有一路通道可以工作,在切换通道时会涉及到读写超时问题,需要配置相关属性
属性名 | 属性值类型 | 描述 |
---|---|---|
HealthStatus | U8 | 描述Pca9545的健康状态 |
PowerStatus | U8 | 描述Pca9545的上电状态 |
SelfTestResult | U8 | 描述Pca9545的自验结果 |
Address | U32 | 描述Pca9545在总线的地址信息 |
AddrWidth | U8 | 描述Pca9545的地址位宽 |
OffsetWidth | U8 | 描述Pca9545的偏移位宽 |
WriteTmout | U32 | 描述写入Pca9545的超时时间 |
ReadTmout | U32 | 描述读取Pca9545的超时时间 |
Scanner
在CSR文件配置Scanner对象,它会对其引用的寄存器进行周期性扫描,将获取的属性值更新到资源协作接口中,仅用于只读场景。
Scanner的通用属性结构
{
"Scanner_xxx": {
"Chip": ,
"Offset": ,
"Size": ,
"Mask": ,
"Type": ,
"Period": ,
"Debounce": ,
"Value": ,
"AggregateOffset": ,
"ScanEnabled": ,
"NominalValue": ,
"FailureDebounceCount": ,
"SuccessDebounceCount":
}
}
解析说明:
- Scanner对象的命名前面的类名只能是Scanner,后面的名称xxx可以是数字,也可以为其他,只要确保对象Scanner_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Scanner对象时可以配置上面属性
注意
a. 在CSR文件中,属性值不能配置成动态引用Scanner对象,即不能写成#/Scanner_xxxb. Scanner对象必须被至少一个其他对象适用
c. Gpio总线下的Chip关联的Scanner只须配置Chip属性即可
主要参数说明:
属性名 | 属性值类型 | 描述 |
---|---|---|
Chip | String | 表示Scanner引用的chip,即对该chip进行周期性扫描和读取值;必填字段,而且Scanner引用的Chip对象必须在Objects中定义,可引用的Chip对象不包含Pca9544、Pca9545、Pca9548和JtagSwitch |
Offset | U32 | 表示读取的数据偏移,需要根据Smc命令来计算相关的偏移,json不支持16进制,需转换成10进制 |
Size | U8 | 描述读取的数据大小;必填字段 |
Mask | U32 | 描述读取的数据掩码,位读时有效,块读时无效可置0;当Type取值为0时必填 |
Type | U8 | 0:位读 1:块读;必填字段,取值只能0或1 |
Period | U32 | 扫描周期,单位ms |
Debounce | String | 描述防抖类型;选填字段,引用的防抖对象必须在Objects中定义,防抖对象分类包含MidAvg、Median、Cont和ContBin,该字段也可配置为常量字符串“None” |
Value | U64 | 表示Scanner读取值,默认0 |
AggregateOffset | U32 | 描述Scanner在汇聚数据中的相对偏移,取值范围为0-1023;选填字段,但若offset字段未填,则AggregateOffset必填 |
ScanEnabled | U8 | 描述是否可以周期性扫描 |
NominalValue | U64 | 描述正常值 |
FailureDebounceCount | U8 | 描述防抖失败次数 |
SuccessDebounceCount | U8 | 描述防抖成功次数 |
Accessor
Accessor适用于不需要循环周期性获取值或需要写入硬件值的场景,属性可读写。当获取值时,框架会监听只读信号,实时读取硬件的值并更新到资源协作接口,当写入值时,框架会监听改变信号,实时写入到硬件中。
Accessor配置样例
{
"Accessor_xxx": {
"Chip": ,
"Offset": ,
"Size": ,
"Mask": ,
"Type": ,
"Value": ,
"FailureDebounceCount": ,
"SuccessDebounceCount":
}
}
解析说明:
- Accessor对象的命名前面的类名只能是Accessor,后面的名称xxx可以是数字,也可以为其他,只要确保对象Accessor_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Accessor对象时可以配置上面属性
注意
CSR中定义的Accessor对象必须被其它至少一个对象使用
主要参数说明:
属性名 | 属性值类型 | 描述 |
---|---|---|
Chip | string | 描述Accessor引用的Chip,即对该Chip进行读写操作;必填字段 |
Offset | U32 | 描述数据的偏移,需要和Smc命令字的offset一致,需要和json不支持16进制,需转换成10进制;选填字段 |
Size | U8 | 描述Accessor读写数据的大小;必填字段 |
Mask | U32 | 掩码,位读时有效,块读时无效可置0;必填字段 |
Type | U8 | 0:位读 1:块读;必填字段 |
Value | U64 | 描述Accessor读取的值,默认0 |
FailureDebounceCount | U8 | 描述防抖失败次数 |
SuccessDebounceCount | U8 | 描述防抖成功次数 |
Debounce
读取物理寄存器数据时,不可避免会遇到因器件抖动而产生误报等现象,需要采取一些防抖措施来过滤误报场景,Debounce对象包含:MidAvg、Median、Cont、ContBin、None
CSR文件中定义的Debounce对象必须至少被一个Scanner对象引用
Cont
Cont对象用于持续一致防抖策略
Cont的通用属性结构
{
"Cont_xxx": {
"Num": ,
"DefaultValue":
}
}
解析说明:
- Cont对象的命名前面的类名只能是Cont,后面的名称xxx可以是数字,也可以为其他,只要确保对象Cont_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Cont对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
Num | U32 | 描述防抖次数 |
DefaultValue | U32 | 默认值 |
Fru类
CSR文件配置描述的对象是现场可替换单元(fru)时,例如主板、Raid卡、硬盘背板等,需要配置Fru对象,一个现场可替换单元只有一个Fru对象
Fru的通用属性结构
{
"Fru_xxx": {
"PcbId": ,
"PcbVersion": ,
"FruId": ,
"FruName": ,
"PowerState": ,
"Health": ,
"EepStatus": ,
"GroupPosition": ,
"Type": ,
"BoardId": ,
"UniqueId": ,
"FruDataId": ,
"ConnectorGroupId":
}
}
解析说明:
- Fru对象的命名前面的类名只能是Fru,后面的名称xxx可以是数字,也可以为其他,只要确保对象Fru_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Fru对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
PcbId | U8 | 需要关联到硬件, 从硬件读取Id |
PcbVersion | String | 描述PCB版本, 根据PcbId的值进行计算得出, PcbId为1时, 显示.A , 为2时显示.B, 依次类推 |
FruId | U8 | FruId会根据现有加载的Connector Position的大小来动态生成 |
FruName | String | 表示Fru名称,Fru类名字唯一,例如Fru_Fan_1 |
PowerState | U8 | 表示Fru的热插拔状态, 引用到对应Fru的ChassisPayload对象的PowerStatus属性 |
Health | U8 | 描述Fru的健康状态 |
EepStatus | U8 | 描述Eeprom状态, 当此属性关联到Accessor时, Frudata模块会启动任务进行Eeprom的监控,状态信息:0:健康1:告警,eeprom读取失败 |
GroupPosition | String | 根据硬件自发现生成的GroupPosition来填写,例如01,0101 |
Type | U8 | 描述FRU类型 |
BoardId | U16 | 描述非天池组件的单板BoardID,仅非天池组件起作用 |
UniqueId | String | 描述天池组件的唯一标识,由Vendor和ComponentID组成 |
FruDataId | String | 描述关联的Frudata对象名 |
ConnectorGroupId | U32 | 描述关联Anchor的GroupID |
电子标签数据(Frudata)描述的是Fru里面的Eeprom存储的信息,一个fru最多有一个Frudata对象。在CSR文件配置的FruData对象将会分发到框架,由框架将存储在Eeprom和file里面的数据按域和字段解析出来。
FruData的通用属性结构
{
"FruData_xxx": {
"FruId": ,
"FruType": ,
"FruName": ,
"BoardManufacturer": ,
"BoardProductName": ,
"BoardSerialNumber": ,
"BoardPartNumber": ,
"ProductSerialNumber": ,
"SystemProductName": ,
"SystemSerialNumber": ,
"FruDev": ,
"EepromWp": ,
"StorageType": ,
"StorageLoc":
}
}
解析说明:
- FruData对象的命名前面的类名只能是FruData,后面的名称xxx可以是数字,也可以为其他,只要确保对象FruData_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置FruData对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
FruId | U8 | 需要关联到硬件, 从硬件读取Id |
FruType | String | 描述PCB版本, 根据PcbId的值进行计算得出, PcbId为1时, 显示.A , 为2时显示.B, 依次类推 |
FruName | String | 描述Fru名称,如:mainboard/BMC;使用场景:(查询FruId为0的组件/Fru,若存在多个优先使用FruName为BMC的Fru);天池机型,FruName为BMC(组件类型为26)的组件,配置FruId为0;非天池机型,FruName为Mainboard(组件类型为16)的组件,配置FruId为0 |
BoardManufacturer | String | 产品自动写入 |
BoardProductName | String | 单板FT环节 |
BoardSerialNumber | String | 单板FT环节 |
BoardPartNumber | String | 单板组件号 |
ProductSerialNumber | String | 产品系列号 |
SystemProductName | String | 系统产品名 |
SystemSerialNumber | String | 系统系列号 |
FruDev | U8[] | - |
EepromWp | U8 | - |
StorageType | String | 描述存储类型,例如天池类型填"TianChi/EepromV2/",其他类型为非电子标签 |
StorageLoc | String | - |
Component类表示部件管理信息,如内存、硬盘、风扇等,一个fru里可以有多个部件,配置告警也会配一个Component对象,供Event管理。
Component的通用属性结构
{
"Component_xxx": {
"FruId": ,
"Instance": ,
"Type": ,
"Name": ,
"Presence": ,
"Health": ,
"PowerState": ,
"BoardId": ,
"UniqueId": ,
"Manufacturer": ,
"GroupId": ,
"Location": ,
"SerialNumber": ,
"PartNumber": ,
"SegmentId": ,
"Function": ,
"PreviousSN": ,
"ReplaceFlag": ,
"NodeId":
}
}
解析说明:
- Component对象的命名前面的类名只能是Component,后面的名称xxx可以是数字,也可以为其他,只要确保对象Component_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置Component对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
FruId | U8 | 描述关联所在的Fru的Fruid |
Instance | U8 | 组件设备Number。该器件在整个单板中的编号,与Path中Id不同 |
Type | U8 | 描述部件类型。代码枚举在COMPONENT_DEVICE_TYPE_E(cpu、硬盘、led等) |
Name | String | 描述部件设备名称(fan、memory、disk等) |
Presence | U8 | 描述部件在位情况。按照各个部件的情况,恒在位则配成1,或需要引用其他属性 |
Health | U8 | 描述部件健康状态 |
PowerState | U8 | 描述部件上电状态 |
BoardId | U16 | 描述非天池组件的单板BoardID,仅非天池组件起作用 |
UniqueId | String | 描述天池组件的唯一标识 |
Manufacturer | String | 描述部件的厂商信息 |
GroupId | U8 | 组件逻辑组ID |
Location | String | 组件的容器 |
SerialNumber | String | 组件序列号 |
PartNumber | String | 组件号 |
SegmentId | U8 | - |
Function | String | 描述部件功能信息(memory、cooling、hard disk controller、storage) |
PreviousSN | String | 描述更换前SN,SerialNumber,来自board区域掉电持久化,根据GroupPosition来区分是否为同一个槽位 |
ReplaceFlag | U8 | 描述部件是否发生了更换,用于产生SEL日志 |
NodeId | String | 描述资源ID,由容器信息Position和设备丝印名称DeviceName拼接而成,例如容器信息Position为"chassis",DeviceName为"PCIeRiser1"时,此时NodeId为"chassisPCIeRiser1" |
BusinessConnector
BusinessConnector对象具有上行和下行之分,下行BusinessConnector的UpstreamResource配置了上行对象的Name,BusinessConnector对象更加详细的描述见pcie配置。
BusinessConnector的通用属性结构
{
"BusinessConnector_xxx": {
"Port1LinkInfo": ,
"Port1Status": ,
"Port2LinkInfo": ,
"Port2Status": ,
"Name": ,
"Direction": ,
"Slot": ,
"LinkWidth": ,
"MaxLinkRate": ,
"ConnectorType": ,
"SilkText": ,
"UpstreamResources": ,
"ActualResourceOrder": ,
"Ports": ,
"RefMgmtConnector": ,
"RefMgmtConnectorTianChi": ,
"RefPCIeAddrInfo": ,
"BCUIndex": ,
}
}
解析说明:
- BusinessConnector对象的命名前面的类名只能是BusinessConnector,后面的名称xxx可以是数字,也可以为其他,只要确保对象BusinessConnector_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置BusinessConnector对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
Port1LinkInfo | String | 描述端口1连接信息,用于告警显示(如:"00000001040302023940(IEUSlot1)") |
Port1Status | U8 | 描述端口1状态(0:正常、1:组件配置错误) |
Port2LinkInfo | String | 描述端口2连接信息,用于告警显示(如:"00000001040302023940(IEUSlot2)") |
Port2Status | U8 | 描述端口2状态(0:正常、1:组件配置错误) |
Name | String | 命名,例如"Up_1" |
Direction | String | 描述BusinessConnector是上行还是下行的,例如DownStream |
Slot | U8 | 槽位号 |
LinkWidth | String | 链路带宽 |
MaxLinkRate | String | 最大链路速率 |
ConnectorType | String | 描述连接器的类型,当前有三种:UBC、UBCDD、PCIe CEM |
SilkText | String | 描述连接器丝印信息,如CPU2 UBCDD2 |
UpstreamResources | array | 描述BCU和IEU间的映射关系,例如{"Name": "SerDes_1_8","ID": 8,"Offset": 0,"Width": 8} :BCU的SerDes_1_8接口对应着BCU的UBCDD中B4c端口,其对应的BCU的槽位是8,带宽是x8,更加详细描述可以参考《PCIe配置》 |
ActualResourceOrder | String[] | 描述和BCU端相连接的SerDes接口顺序,例如["SerDes_1_10","SerDes_1_7","SerDes_1_8"],需要注意ActualResourceOrder和下面Ports需要建立一一对应关系 |
Ports | array | 描述和BCU中的UBCDD连接器的端口信息,例如{"Name": "B4a","ID": 13,"Offset": 0,"Width": 8} |
RefMgmtConnector | String | 描述关联的管理连接器 |
RefMgmtConnectorTianChi | String | 描述关联的天池组件的管理链接 |
RefPCIeAddrInfo | String | 关联的PCIeAddrInfo对象 |
BCUIndex | U8 | 描述Riser与哪个BCU的UBCDD口相连 |
补充说明:
- UBCDD:一种连接器,有BusinessConnector对象(上行和下行)
- SerDes-x:也叫HiLink,CPU出的几个接口,几个接口都连到UBCDD上,SerDes_xxx对象在BCU.sr文件会进行配置说明
PcieAddrInfo
当PCIe卡为非天池组件时,其一般是采用Bom_Id_AuxId形式来寻找其对应的sr文件,Id和AuxId是通过从带内获取得到。
PcieAddrInfo对象承载PCIe设备槽位信息,PCIeDevice的加载是先加载它的上一级配置PCIeAddrInfo对象,然后再来加载对应的PCIeDevice,PCIeDevice中槽位号和BDF由PCIeAddrInfo同步而来
PcieAddrInfo的通用属性结构
{
"PcieAddrInfo_xxx": {
"GroupID": ,
"SlotID": ,
"ComponentType": ,
"ControllerIndex": ,
"ControllerType": ,
"SocketID": ,
"Segment": ,
"Bus": ,
"Device": ,
"Function": ,
"VendorID": ,
"DeviceID": ,
"PortID": ,
"ContainerUID": ,
"ContainerUnitType": ,
"Location": ,
"ContainerSlot": ,
"DevBus": ,
"DevDevice": ,
"DevFunction": ,
"GroupPosition":
}
}
解析说明:
- PcieAddrInfo对象的命名前面的类名只能是PcieAddrInfo,后面的名称xxx可以是数字,也可以为其他,只要确保对象PcieAddrInfo_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置PcieAddrInfo对象时可以配置上面属性
属性名 | 属性值类型 | 描述 |
---|---|---|
GroupID | U8 | 表示PCIe的逻辑组ID,与Component类的GroupID对应,用于针对丝印相同的情况做区分 |
SlotID | U8 | 描述PCIe的槽位号 |
ComponentType | U8 | 描述部件类型,与Component类中的部件类型属性对应。(标准定义,如:8:PCIe标卡、13:NCI卡、83:OCP卡) |
ControllerIndex | U8 | 描述PCIe控制器索引,CPU内部同类型控制器的索引,从0开始编号 |
ControllerType | U8 | 描述PCIe控制器类型(0:PCIeCore,1:NIC,2:SAS,3:SATA,4:ZIP,5:SEC) |
SocketID | U8 | 描述CPU ID |
Segment | U8 | 描述用于多PCI Bridge场景的编号,每一个Segment对应一个PCI Bus空间 |
Bus | U8 | 描述root port Bus号 |
Device | U8 | 描述root port Device号 |
Function | U8 | 描述root port Function号 |
VendorID | U16 | 厂商Id,属于四元组信息 |
DeviceID | U16 | 设备Id,属于四元组信息 |
PortID | U8 | 描述PCIe槽位对应的PortID,用于上报BIOS槽位与PortID对应的关系,计算对应槽位的rootBDF |
ContainerUID | String | 描述当前容器的UID |
ContainerUnitType | String | 描述当前容器的类型 |
Location | String | 描述当前容器的位置 |
ContainerSlot | U8 | 描述当前容器的槽位号 |
DevBus | U8 | PCIe设备的总线 |
DevDevice | U8 | PCIe设备的设备号 |
DevFunction | U8 | PCIe设备的功能号 |
GroupPosition | String | - |
天池组件的对象配置
在这里,介绍天池组件的Board对象以及三种天池逻辑对象升级的配置
Board
以CpuBoard对象为例介绍Board的配置
CpuBoard用于描述Cpu所在的Board的信息,包括设备名称、厂商等
CpuBoard配置样例
{
"CpuBoard_xxx": {
"Slot": ,
"Number": ,
"Position": ,
"Name": ,
"ProductName": ,
"SilkText": ,
"Manufacturer": ,
"Description": ,
"BoardID": ,
"PartNumber": ,
"PcbVersion": ,
"LogicVersion": ,
"SRVersion": ,
"MCUVersion": ,
"PSIPVersion": ,
"LogicUnit": ,
"PowerWatts": ,
"RunningStatus": ,
"FruID": ,
"DeviceName": ,
"BoardType": ,
"NodeId": ,
"RefComponent": ,
"RefFru": ,
"CpldStatus": ,
"MultiLogicVersion": ,
"MultiLogicUnit": ,
"UID": ,
"Type": ,
"Platform": ,
"BIOSVersion": ,
"PcbID": ,
"LogicVersionID": ,
"CPLD2VersionID":
}
}
解析说明:
- CpuBoard对象的命名前面的类名只能是CpuBoard,后面的名称xxx可以是数字,也可以为其他,只要确保对象CpuBoard_xxx的命名在整个CSR文件中是全局唯一即可
- 在CSR文件配置CpuBoard对象时可以配置上面属性
主要参数说明:
属性名 | 属性值类型 | 描述 |
---|---|---|
UID | String | 描述组件唯一标识 |
Type | String | 描述组件类型,如“BCU” |
Slot | U8 | 描述槽位号 |
Position | String | 描述容器信息 |
Name | String | 描述板名 |
PartNumber | String | 描述部件编码 |
SRVersion | String | 描述SR版本号 |
BoardID | U8 | 描述单板ID |
PcbVersion | String | 描述Pcb版本号 |
MCUVersion | String | 描述MCU版本号 |
LogicVersionID | U8 | 描述逻辑版本号 |
LogicUnit | U32 | 描述逻辑位号 |
PowerWatts | U32 | 描述功率 |
SilkText | String | 描述丝印信息 |
RunningStatus | U8 | 监控Cpld和MCU的运行状态 |
FruID | U8 | 描述关联Fru对象的FruID属性 |
DeviceName | String | 描述板卡丝印信息 |
BoardType | String | 描述单板类型 |
NodeId | String | 描述资源ID |
RefComponent | String | 描述引用到Component对象 |
RefFru | String | 描述引用到Fru对象 |
CpldStatus | U8 | 描述Cpld的状态 |
MultiLogicVersion | Dictionary | 描述单板所有逻辑版本号 |
MultiLogicUnit | Dictionary | 描述单板所有版本号 |