板卡适配
更新时间:2024/12/19
在Gitcode上查看源码

板卡类别

板卡组件分为天池组件和非天池组件,天池组件支持天池协议,具有接口标准化、软硬件解耦和前后演进及后向兼容等优点

天池组件的板卡管理基本集成在general_hardware组件仓。

天池协议是指通过SMC(天池管理控制)标准命令字来承载通用软硬件接口。SMC成为了对接CPU-BIOS与BMC的唯一通用接口命令字,根据SMC协议规定,为了达成望文知意的效果,命令字标准格式以【function(功能)】,【opcode(具体指令)】,【R/W(读写)】,param等多个字段划分。

在openUBMC中,天池组件和非天池组件的差别:

  1. CSR存储:天池组件的CSR存储于板卡的Eeprom中,非天池组件的CSR存放于BMC内置存储
  2. CSR升级:仅天池组件支持CSR升级

板卡加载

板卡的加载是采用逐级加载方式。当前BMC的插卡(硬件自发现)和扩展板(EXU)直接连接,再由EXU连接基础板(BCU)、风扇板(CLU)、硬盘背板(SEU)、板载网卡(NIC)等对象。其次,BCU会连接Riser卡,在Riser卡上插有各种PCIe卡。上述连接在CSR的表现形式是Connector连接器,框架通过Connector一级一级地进行对象的加载和分发。具体加载流程可参考《硬件自发现》

每两份CSR间一定以Connector相关联,故一定可以在上一级的CSR中找到关联的Connector,具体参考Connector对象

板卡加载的样例

  1. 在环境查询所有的Connector信息

    ~~# busctl --user tree bmc.kepler.hwdiscovery
    └─/bmc
    └─/bmc/kepler
        ├─/bmc/kepler/Connector
        │ ├─/bmc/kepler/Connector/Connector_EXU_1_01
  2. 从图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的通用配置

json
{
    "Connector_xxx": {
        "Bom": ,
        "Slot": ,
        "Position": ,
        "Presence": ,
        "Id": ,
        "AuxId": ,
        "Buses": [],
        "SystemId": ,
        "SilkText": ,
        "IdentifyMode": ,
        "Type": ,
        "ManagerId": ,
        "ChassisId": ,
        "Chip": ,
        "Container": ,
        "IdChipAddr": ,
    } 
}

解析说明:

  1. Connector对象的命名前面的类名只能是Connector,后面的名称xxx可以是数字,也可以为其他,只要确保对象Connector_xxx的命名在整个CSR文件是全局唯一即可
  2. CSR文件配置Connector对象时可以配置上面属性
属性名属性值类型描述必填or选填字段
BomU8描述下一级板卡的Bom Id选填字段
SlotU8描述下一级板卡的信号槽必填字段
PositionU8表示CSR对象的全局位置标识,在硬件自发现重命名对象时需要使用,同一个CSR文件中的任意两个连接器Position不能重复必填字段
PresenceU8表示Presence状态获取方式,可配置为静态值0或1,也可配置为动态引用、数据同步、计算结果为0或1的表达式;天池组件需要指定在位状态获取方式,一般通过同步属性语法通过硬件代理读取指定器件寄存器数据必填字段
IdString表示下一级板卡的UID,天池组件的UID通过Chip属性关联的器件对象,调用对应的读写接口获取Eeprom数据的UID信息选填字段
AuxIdString表示下一级板卡的Aux id:天池组件不使用该属性,非天池组件在加载下一级板卡时会使用它,但可以配置为空选填字段
BusesString[]表示和下一级板卡连接的总线,字符串数组类型,包含0到多个总线,每个配置的总线名称需要和Anchor中的Buses名称保持一致或定义在Pca9544、Pca9555、Pca9548、Chip、Smc、JtagSwitch下的总线必填字段
SystemIdU8SystemId只在root.sr中的Connector体现,代表下一级CSR对象所属的System,如果是单系统,则取默认值1,如果存在多系统,则配置多个Connector,SystemId取不同的值,从1开始递增选填字段
SilkTextString描述下一级板卡的丝印信息选填字段
IdentifyModeU8描述下一级板卡的识别方式:IdentifyMode = 1:BoardId可读,采用BoardId加载方式,直接关联某个Assensor,从硬件直接读取;IdentifyMode = 2:非天池组件的加载方式;IdentifyMode = 3:天池组件的加载方式必填字段
TypeString描述Connector后端设备的类型,如PCIeSlot、PCIeRiser、SEU等选填字段
ManagerIdStringManagerId只在root.sr中的Connector定义,代表下一级CSR对象所属的Manager;软件属性选填字段
ChassisIdStringChassisId只在root.sr中的Connector定义,代表下一级CSR对象所属的Chassis;软件属性选填字段
ChipString关联的寄存器对象选填字段
ContainerString描述下一级板卡的硬件位置,表示这个组件的实际物理位置选填字段
IdChipAddrU8通过该地址来获取Eeprom的id选填字段
CSRVersionString表示硬件自发现设置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卡通常用于添加更多的拓展卡,如声卡、显卡和网卡等。

  1. 根据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"关系

  2. 明确配置一张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卡。

板卡适配

环境加载板卡

  1. 采用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用户指南》

  2. 采用Eeprom形式

    a. 将配置好的Riser板卡uid.sr,例如riser_00000001040302023940.sr文件打包img包,具体参考《BMC Studio用户指南》

    b. 在环境上升级Riser卡的img包

    c. 环境验证

环境验证

  1. 在环境上找到这个文件
    ~ ~ $ find / -name riser_00000001040302023940.sr
    ../sr/riser_00000001040302023940.sr
  2. 在环境中使用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的通用属性结构

json
{
    "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":
    }
}

解析说明:

  1. RiserCard对象的命名前面的类名只能是RiserCard,后面的名称xxx可以是数字,也可以为其他名车,只要确保对象RiserCard_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置RiserCard对象时可以配置上面属性

主要参数说明:

属性名属性值类型描述
SlotU8表示RiserCard所在的BCU板卡的物理槽位号,例如 Slot = 1,表明RiserCard所在的BCU板卡的槽位号是1
NumberU8表示RiserCard的逻辑编号
PositionString表示RiserCard的容器信息,如chassis
NameString描述板卡名,例如"BC83PRUI"
ProductNameString描述产品名
SilkTextString描述RiserCard的丝印信息
BoardIDU16描述单板ID,它主要是在非天池组件中作用
PartNumberString描述部件编号,会在web界面显示
PcbVersionString描述PCB版本号,根据PcbId的值进行计算得出,当PcbId为1时, 显示.A , 为2时显示.B, 依次类推
LogicVersionString描述RiserCard上的Cpld的逻辑版本号
SRVersionString描述RiserCard上的Eeprom中的CSR数据的版本号,一般和CSR文件的DataVersion一致
MCUVersionString描述RiserCard上的MCU的版本号
LogicUnitU32描述RiserCard上的逻辑位号
PowerWattsU32描述RiserCard上的电源功率
RunningStatusU8监控CPLD和MCU的运行状态:1表示正常运行,0表示异常
FruIDU8描述关联Fru对象的FruID属性,每张可插拔对象都需要配置
DeviceNameString描述板卡的丝印信息,如PCIe Riser1
BoardTypeString描述单板类型,属于枚举类型。例如RiserCard
NodeIdString描述资源ID,由容器信息Position和设备丝印名称DeviceName拼接而成,例如容器信息Position为"chassis",DeviceName为"PCIeRiser1"时,此时NodeId为"chassisPCIeRiser1"
RefComponentString描述引用的Component对象 TDOO:Component、chip之间的区别:Component对象
RefFruString描述引用到的Fru对象
SerialNumberString描述序列号,电子标签相关的,通过RefFru获取,用于唯一表示这张卡,可以通过它来查询这张卡制造流程等等
CpldStatusU8描述Cpld的健康状态
UIDString表示组件的唯一标识,根据它能够找到组件的CSR文件
TypeString描述组件类型(枚举值:"EXU"、"BCU"、"SEU"、"CLU"、"SEU")
PcbIDU8描述Pcb版本ID,需要关联到硬件,从硬件中读取ID
LogicVersionIDU8描述Cpld的版本ID
RefMCUChipU8B[]描述引用的MCU的寄存器
RefSMCChipU8[]描述引用的SMC的寄存器
ContainerString描述容器信息
CpldTestNumU8描述Cpld测试序号
ManufacturerString描述这张Riser卡的制造厂商
DescriptionString描述这张Riser卡的插槽信息。例如"Riser(X8*2)",其表示这张Riser卡上有两个物理宽度和信号带宽均为X8的插槽,这意味着该Riser卡可以支持插入两张X8规格的扩展卡,或者一张X16规格的扩展卡(如果扩展卡支持的话,因为X16的槽位可以兼容X8的卡)

MCU升级

Micro Control Unit (MCU)是微控制单元,需要升级,然后在CSR文件中需要对其进行升级

MCU升级对象的通用属性结构

json
{
    "MCUFirmware_xxx": {
        "UID": ,
        "RefChip": ,
        "Address": ,
        "Protocol": ,
        "SoftwareId": ,
        "BoardType": ,
        "LockChip": 
    }
}

解析说明:

  1. MCUFirmware对象的命名前面的类名只能是MCUFirmware,后面的名称xxx可以是数字,也可以为其他,只要确保对象MCUFirmware_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置MCUFirmware对象时可以配置上面属性
属性名属性值类型描述
UIDString描述组件唯一标识,用于寻找对应的MCU固件的升级包
RefChipU8[]描述MCU所在的寄存器
AddressU32描述MCU在寄存器的地址信息
ProtocolString描述和MCU进行通信的协议,用于传输数据等,例如"Smc"
BoardTypeString描述MCU所在的板卡类型,例如"IEU"
LockChipU8[]当升级时,需要对寄存器进行锁定
SoftwareIdString描述MCU的软件ID,例如"MCU-BC83PRUI"

Chip

Chip用来描述物理寄存器

Chip的通用属性结构

json
{
    "Chip_xxx": {
        "HealthStatus": ,
        "PowerStatus": ,
        "SelfTestResult": ,
        "Supported": ,
        "BaseOffset": ,
        "Length": ,
        "Period": ,
        "Address": ,
        "AddrWidth": ,
        "OffsetWidth": ,
        "WriteTmout": ,
        "ReadTmout": ,
        "WriteRetryTimes": ,
        "ReadRetryTimes": ,
        "DrvWriteDelay": ,
    }
}

解析说明:

  1. Chip对象的命名前面的类名只能是Chip,后面的名称xxx可以是数字,也可以为其他,只要确保对象Chip_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Chip对象时可以配置上面属性
属性名属性值类型描述
HealthStatusU8描述xxx所在的寄存器的健康状态
PowerStatusU8描述xxx所在的寄存器的上电状态
SelfTestResultU8描述xxx所在的寄存器的自验结果
AddressU32描述xxx所在的寄存器在总线的地址信息
AddrWidthU8位宽
OffsetWidthU8偏移宽度
WriteTmoutU32描述写入寄存器的超时时间
ReadTmoutU32描述读取寄存器的超时时间
SupportedBoolean描述Chip是否具备汇聚数据访问能力, true: 具备能力, false: 默认值, 不具备能力
BaseOffsetU32汇聚资源起始偏移/汇聚命令字, Smc场景下为汇聚命令字; 其他块设备场景为起始偏移, 连续读取一段数据
LengthU32汇聚资源总长度
PeriodU32汇聚资源扫描间隔(单位ms)
WriteRetryTimesU8描述写入寄存器的重试次数
ReadRetryTimesU8描述读取寄存器的重试次数
DrvWriteDelayU8-

SR升级

当存放在Eeprom的CSR文件需要更新时,此时就需要在CSR文件中配置SR升级对象,用于通知Eeprom所在的寄存器

SR升级对象的通用属性结构

json
{
    "SRUpgrade_xxx": {
        "UID": ,
        "Type": ,
        "Version": ,
        "StorageChip": ,
        "SoftwareId": ,
        "WriteProtect": ,
        "StorageLockChip": ,
        "WriteProtectChip": ,
        "WriteProtectLockChip": 
    }
}

解析说明:

  1. SRUpgrade对象的命名前面的类名只能是SRUpgrade,后面的名称xxx可以是数字,也可以为其他,只要确保对象SRUpgrade_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置SRUpgrade对象时可以配置上面属性

主要参数说明:

属性名属性值类型描述
UIDString描述组件唯一标识,用于寻找升级的CSR文件,该CSR文件命名UID.CSR
TypeString描述SR升级对象所在的组件类型
VersionString描述升级的SR数据版本
StorageChipU8[]描述存储CSR文件的Chip
WriteProtectString描述Eeprom的写保护信息,即在进行Eeprom的CSR升级时,需要先解除写保护,允许数据的写入或修改
StorageLockChipU8[]描述当Eeprom升级CSR文件时,需要对存储CSR的Eeprom寄存器锁定
WriteProtectChipU8[]描述写保护的寄存器
WriteProtectLockChipU8[]描述写保护锁定的寄存器

Eeprom

天池架构规范规定每个组件上必须存在一个在I2C总线上地址为0xAE的存储器件,当前均为Eeprom器件,用于保存硬件自描述信息,包含头部、电子标签、组件自描述信息(CSR)以及扩展信息等。

Eeprom的通用属性结构

json
{
    "Eeprom_xxx": {
        "HealthStatus": ,
        "PowerStatus": ,
        "SelfTestResult": ,
        "Address": ,
        "AddrWidth": ,
        "OffsetWidth": ,
        "WriteTmout": ,
        "ReadTmout": ,
        "RwBlockSize": ,
        "WriteInterval": 
    }
}

解析说明:

  1. Eeprom对象的命名前面的类名只能是Eeprom,后面的名称xxx可以是数字,也可以为其他,只要确保对象Eeprom_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Eeprom对象时可以配置上面属性

Eeprom对象最重要的是Address属性,需要由硬件开发者确认

属性名属性值类型描述
HealthStatusU8描述Eeprom的健康状态
PowerStatusU8描述Eeprom的上电状态
SelfTestResultU8描述Eeprom的自验结果
AddressU32描述Eeprom在总线的地址信息
AddrWidthU8描述Eeprom的地址位宽
OffsetWidthU8描述Eeprom的偏移位宽
WriteTmoutU32描述Eeprom的写超时时间
ReadTmoutU32描述Eeprom的读超时时间
RwBlockSizeU16描述分段写Eeprom的数据大小
WriteIntervalU16描述分段写Eeprom的延时时间

Pca9545

Pca9545是一种I2c多路复用器,用于扩展总线的通道。它能够将一个总线分成四个独立的通道,每个通道可以连接不同的从设备。通过写入Pca9545内部寄存器的特定位,可以启用其中一个通道,同时只能启用一个通道。Pca9545在硬件设计中常用于增加从设备的数量,特别是在需要多个设备但总线数量有限的情况下。

Pca9545的通用属性结构

json
{
    "Pca9545_xxx": {
        "HealthStatus": ,
        "PowerStatus": ,
        "SelfTestResult": ,
        "Address": ,
        "AddrWidth": ,
        "OffsetWidth": ,
        "WriteTmout": ,
        "ReadTmout": ,
    }
}

解析说明:

  1. Pca9545对象的命名前面的类名只能是Pca9545,后面的名称xxx可以是数字,也可以为其他,只要确保对象Pca9545_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Pca9545对象时可以配置上面属性
  3. Pca9545对象最重要的是Address属性,需要由硬件开发者确认,原因:当知道Pca9545地址时,就可以向Pca9545的寄存器写入特定的值,就可以选择开启第几通道,这样就能实现通过Pca9545来访问连接在特定通道的从设备了
  4. Pca9545也是寄存器,且只有一路通道可以工作,在切换通道时会涉及到读写超时问题,需要配置相关属性
属性名属性值类型描述
HealthStatusU8描述Pca9545的健康状态
PowerStatusU8描述Pca9545的上电状态
SelfTestResultU8描述Pca9545的自验结果
AddressU32描述Pca9545在总线的地址信息
AddrWidthU8描述Pca9545的地址位宽
OffsetWidthU8描述Pca9545的偏移位宽
WriteTmoutU32描述写入Pca9545的超时时间
ReadTmoutU32描述读取Pca9545的超时时间

Scanner

在CSR文件配置Scanner对象,它会对其引用的寄存器进行周期性扫描,将获取的属性值更新到资源协作接口中,仅用于只读场景。

Scanner的通用属性结构

json
{
	"Scanner_xxx": {
	    "Chip": ,
	    "Offset": ,
	    "Size": ,
	    "Mask": ,
	    "Type": ,
	    "Period": ,
	    "Debounce": ,
	    "Value": ,
        "AggregateOffset": ,
        "ScanEnabled": ,
        "NominalValue": ,
        "FailureDebounceCount": ,
        "SuccessDebounceCount": 
	}
}

解析说明:

  1. Scanner对象的命名前面的类名只能是Scanner,后面的名称xxx可以是数字,也可以为其他,只要确保对象Scanner_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Scanner对象时可以配置上面属性

注意
a. 在CSR文件中,属性值不能配置成动态引用Scanner对象,即不能写成#/Scanner_xxx

b. Scanner对象必须被至少一个其他对象适用

c. Gpio总线下的Chip关联的Scanner只须配置Chip属性即可

主要参数说明:

属性名属性值类型描述
ChipString表示Scanner引用的chip,即对该chip进行周期性扫描和读取值;必填字段,而且Scanner引用的Chip对象必须在Objects中定义,可引用的Chip对象不包含Pca9544、Pca9545、Pca9548和JtagSwitch
OffsetU32表示读取的数据偏移,需要根据Smc命令来计算相关的偏移,json不支持16进制,需转换成10进制
SizeU8描述读取的数据大小;必填字段
MaskU32描述读取的数据掩码,位读时有效,块读时无效可置0;当Type取值为0时必填
TypeU80:位读 1:块读;必填字段,取值只能0或1
PeriodU32扫描周期,单位ms
DebounceString描述防抖类型;选填字段,引用的防抖对象必须在Objects中定义,防抖对象分类包含MidAvg、Median、Cont和ContBin,该字段也可配置为常量字符串“None”
ValueU64表示Scanner读取值,默认0
AggregateOffsetU32描述Scanner在汇聚数据中的相对偏移,取值范围为0-1023;选填字段,但若offset字段未填,则AggregateOffset必填
ScanEnabledU8描述是否可以周期性扫描
NominalValueU64描述正常值
FailureDebounceCountU8描述防抖失败次数
SuccessDebounceCountU8描述防抖成功次数

Accessor

Accessor适用于不需要循环周期性获取值或需要写入硬件值的场景,属性可读写。当获取值时,框架会监听只读信号,实时读取硬件的值并更新到资源协作接口,当写入值时,框架会监听改变信号,实时写入到硬件中。

Accessor配置样例

json
{
    "Accessor_xxx": {
        "Chip": ,
        "Offset": ,
        "Size": ,
        "Mask": ,
        "Type": ,
        "Value": ,
        "FailureDebounceCount": ,
        "SuccessDebounceCount": 
    }
}

解析说明:

  1. Accessor对象的命名前面的类名只能是Accessor,后面的名称xxx可以是数字,也可以为其他,只要确保对象Accessor_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Accessor对象时可以配置上面属性

注意
CSR中定义的Accessor对象必须被其它至少一个对象使用

主要参数说明:

属性名属性值类型描述
Chipstring描述Accessor引用的Chip,即对该Chip进行读写操作;必填字段
OffsetU32描述数据的偏移,需要和Smc命令字的offset一致,需要和json不支持16进制,需转换成10进制;选填字段
SizeU8描述Accessor读写数据的大小;必填字段
MaskU32掩码,位读时有效,块读时无效可置0;必填字段
TypeU80:位读 1:块读;必填字段
ValueU64描述Accessor读取的值,默认0
FailureDebounceCountU8描述防抖失败次数
SuccessDebounceCountU8描述防抖成功次数

Debounce

读取物理寄存器数据时,不可避免会遇到因器件抖动而产生误报等现象,需要采取一些防抖措施来过滤误报场景,Debounce对象包含:MidAvg、Median、Cont、ContBin、None

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

Cont

Cont对象用于持续一致防抖策略

Cont的通用属性结构

json
{
    "Cont_xxx": {
        "Num": ,
        "DefaultValue": 
    }
}

解析说明:

  1. Cont对象的命名前面的类名只能是Cont,后面的名称xxx可以是数字,也可以为其他,只要确保对象Cont_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Cont对象时可以配置上面属性
属性名属性值类型描述
NumU32描述防抖次数
DefaultValueU32默认值

Fru类

CSR文件配置描述的对象是现场可替换单元(fru)时,例如主板、Raid卡、硬盘背板等,需要配置Fru对象,一个现场可替换单元只有一个Fru对象

Fru的通用属性结构

json
{
	"Fru_xxx": {
        "PcbId": ,
        "PcbVersion": ,
        "FruId": ,
        "FruName": ,
        "PowerState": ,
        "Health": ,
        "EepStatus": ,
        "GroupPosition": ,
        "Type": ,
        "BoardId": ,
        "UniqueId": ,
        "FruDataId": ,
        "ConnectorGroupId": 
    }
}

解析说明:

  1. Fru对象的命名前面的类名只能是Fru,后面的名称xxx可以是数字,也可以为其他,只要确保对象Fru_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Fru对象时可以配置上面属性
属性名属性值类型描述
PcbIdU8需要关联到硬件, 从硬件读取Id
PcbVersionString描述PCB版本, 根据PcbId的值进行计算得出, PcbId为1时, 显示.A , 为2时显示.B, 依次类推
FruIdU8FruId会根据现有加载的Connector Position的大小来动态生成
FruNameString表示Fru名称,Fru类名字唯一,例如Fru_Fan_1
PowerStateU8表示Fru的热插拔状态, 引用到对应Fru的ChassisPayload对象的PowerStatus属性
HealthU8描述Fru的健康状态
EepStatusU8描述Eeprom状态, 当此属性关联到Accessor时, Frudata模块会启动任务进行Eeprom的监控,状态信息:0:健康1:告警,eeprom读取失败
GroupPositionString根据硬件自发现生成的GroupPosition来填写,例如01,0101
TypeU8描述FRU类型
BoardIdU16描述非天池组件的单板BoardID,仅非天池组件起作用
UniqueIdString描述天池组件的唯一标识,由Vendor和ComponentID组成
FruDataIdString描述关联的Frudata对象名
ConnectorGroupIdU32描述关联Anchor的GroupID

电子标签数据(Frudata)描述的是Fru里面的Eeprom存储的信息,一个fru最多有一个Frudata对象。在CSR文件配置的FruData对象将会分发到框架,由框架将存储在Eeprom和file里面的数据按域和字段解析出来。

FruData的通用属性结构

json
{
	"FruData_xxx": {
        "FruId": ,
        "FruType": ,
        "FruName": ,
        "BoardManufacturer": ,
        "BoardProductName": ,
        "BoardSerialNumber": ,
        "BoardPartNumber": ,
        "ProductSerialNumber": ,
        "SystemProductName": ,
        "SystemSerialNumber": ,
        "FruDev": ,
        "EepromWp": ,
        "StorageType": ,
        "StorageLoc":
    }
}

解析说明:

  1. FruData对象的命名前面的类名只能是FruData,后面的名称xxx可以是数字,也可以为其他,只要确保对象FruData_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置FruData对象时可以配置上面属性
属性名属性值类型描述
FruIdU8需要关联到硬件, 从硬件读取Id
FruTypeString描述PCB版本, 根据PcbId的值进行计算得出, PcbId为1时, 显示.A , 为2时显示.B, 依次类推
FruNameString描述Fru名称,如:mainboard/BMC;使用场景:(查询FruId为0的组件/Fru,若存在多个优先使用FruName为BMC的Fru);天池机型,FruName为BMC(组件类型为26)的组件,配置FruId为0;非天池机型,FruName为Mainboard(组件类型为16)的组件,配置FruId为0
BoardManufacturerString产品自动写入
BoardProductNameString单板FT环节
BoardSerialNumberString单板FT环节
BoardPartNumberString单板组件号
ProductSerialNumberString产品系列号
SystemProductNameString系统产品名
SystemSerialNumberString系统系列号
FruDevU8[]-
EepromWpU8-
StorageTypeString描述存储类型,例如天池类型填"TianChi/EepromV2/",其他类型为非电子标签
StorageLocString-

Component类表示部件管理信息,如内存、硬盘、风扇等,一个fru里可以有多个部件,配置告警也会配一个Component对象,供Event管理。

Component的通用属性结构

json
{
	"Component_xxx": {
        "FruId": ,
        "Instance": ,
        "Type": ,
        "Name": ,
        "Presence": ,
        "Health": ,
        "PowerState": ,
        "BoardId": ,
        "UniqueId": ,
        "Manufacturer": ,
        "GroupId": ,
        "Location": ,
        "SerialNumber": ,
        "PartNumber": ,
        "SegmentId": ,
        "Function": ,
        "PreviousSN": ,
        "ReplaceFlag": ,
        "NodeId":
    }
}

解析说明:

  1. Component对象的命名前面的类名只能是Component,后面的名称xxx可以是数字,也可以为其他,只要确保对象Component_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置Component对象时可以配置上面属性
属性名属性值类型描述
FruIdU8描述关联所在的Fru的Fruid
InstanceU8组件设备Number。该器件在整个单板中的编号,与Path中Id不同
TypeU8描述部件类型。代码枚举在COMPONENT_DEVICE_TYPE_E(cpu、硬盘、led等)
NameString描述部件设备名称(fan、memory、disk等)
PresenceU8描述部件在位情况。按照各个部件的情况,恒在位则配成1,或需要引用其他属性
HealthU8描述部件健康状态
PowerStateU8描述部件上电状态
BoardIdU16描述非天池组件的单板BoardID,仅非天池组件起作用
UniqueIdString描述天池组件的唯一标识
ManufacturerString描述部件的厂商信息
GroupIdU8组件逻辑组ID
LocationString组件的容器
SerialNumberString组件序列号
PartNumberString组件号
SegmentIdU8-
FunctionString描述部件功能信息(memory、cooling、hard disk controller、storage)
PreviousSNString描述更换前SN,SerialNumber,来自board区域掉电持久化,根据GroupPosition来区分是否为同一个槽位
ReplaceFlagU8描述部件是否发生了更换,用于产生SEL日志
NodeIdString描述资源ID,由容器信息Position和设备丝印名称DeviceName拼接而成,例如容器信息Position为"chassis",DeviceName为"PCIeRiser1"时,此时NodeId为"chassisPCIeRiser1"

BusinessConnector

BusinessConnector对象具有上行和下行之分,下行BusinessConnector的UpstreamResource配置了上行对象的Name,BusinessConnector对象更加详细的描述见pcie配置

BusinessConnector的通用属性结构

json
{
    "BusinessConnector_xxx": {
        "Port1LinkInfo": ,
        "Port1Status": ,
        "Port2LinkInfo": ,
        "Port2Status": ,
        "Name": ,
        "Direction": ,
        "Slot": ,
        "LinkWidth": ,
        "MaxLinkRate": ,
        "ConnectorType": ,
        "SilkText": ,
        "UpstreamResources": ,
        "ActualResourceOrder": ,
        "Ports": ,
        "RefMgmtConnector": ,
        "RefMgmtConnectorTianChi": ,
        "RefPCIeAddrInfo": ,
        "BCUIndex": ,
    }
}

解析说明:

  1. BusinessConnector对象的命名前面的类名只能是BusinessConnector,后面的名称xxx可以是数字,也可以为其他,只要确保对象BusinessConnector_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置BusinessConnector对象时可以配置上面属性
属性名属性值类型描述
Port1LinkInfoString描述端口1连接信息,用于告警显示(如:"00000001040302023940(IEUSlot1)")
Port1StatusU8描述端口1状态(0:正常、1:组件配置错误)
Port2LinkInfoString描述端口2连接信息,用于告警显示(如:"00000001040302023940(IEUSlot2)")
Port2StatusU8描述端口2状态(0:正常、1:组件配置错误)
NameString命名,例如"Up_1"
DirectionString描述BusinessConnector是上行还是下行的,例如DownStream
SlotU8槽位号
LinkWidthString链路带宽
MaxLinkRateString最大链路速率
ConnectorTypeString描述连接器的类型,当前有三种:UBC、UBCDD、PCIe CEM
SilkTextString描述连接器丝印信息,如CPU2 UBCDD2
UpstreamResourcesarray描述BCU和IEU间的映射关系,例如{"Name": "SerDes_1_8","ID": 8,"Offset": 0,"Width": 8}:BCU的SerDes_1_8接口对应着BCU的UBCDD中B4c端口,其对应的BCU的槽位是8,带宽是x8,更加详细描述可以参考《PCIe配置》
ActualResourceOrderString[]描述和BCU端相连接的SerDes接口顺序,例如["SerDes_1_10","SerDes_1_7","SerDes_1_8"],需要注意ActualResourceOrder和下面Ports需要建立一一对应关系
Portsarray描述和BCU中的UBCDD连接器的端口信息,例如{"Name": "B4a","ID": 13,"Offset": 0,"Width": 8}
RefMgmtConnectorString描述关联的管理连接器
RefMgmtConnectorTianChiString描述关联的天池组件的管理链接
RefPCIeAddrInfoString关联的PCIeAddrInfo对象
BCUIndexU8描述Riser与哪个BCU的UBCDD口相连

补充说明:

  1. UBCDD:一种连接器,有BusinessConnector对象(上行和下行)
  2. 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的通用属性结构

json
{
    "PcieAddrInfo_xxx": {
        "GroupID": ,
        "SlotID": ,
        "ComponentType": ,
        "ControllerIndex": ,
        "ControllerType": ,
        "SocketID": ,
        "Segment": ,
        "Bus": ,
        "Device": ,
        "Function": ,
        "VendorID": ,
        "DeviceID": ,
        "PortID": ,
        "ContainerUID": ,
        "ContainerUnitType": ,
        "Location": ,
        "ContainerSlot": ,
        "DevBus": ,
        "DevDevice": ,
        "DevFunction": ,
        "GroupPosition": 
    }
}

解析说明:

  1. PcieAddrInfo对象的命名前面的类名只能是PcieAddrInfo,后面的名称xxx可以是数字,也可以为其他,只要确保对象PcieAddrInfo_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置PcieAddrInfo对象时可以配置上面属性
属性名属性值类型描述
GroupIDU8表示PCIe的逻辑组ID,与Component类的GroupID对应,用于针对丝印相同的情况做区分
SlotIDU8描述PCIe的槽位号
ComponentTypeU8描述部件类型,与Component类中的部件类型属性对应。(标准定义,如:8:PCIe标卡、13:NCI卡、83:OCP卡)
ControllerIndexU8描述PCIe控制器索引,CPU内部同类型控制器的索引,从0开始编号
ControllerTypeU8描述PCIe控制器类型(0:PCIeCore,1:NIC,2:SAS,3:SATA,4:ZIP,5:SEC)
SocketIDU8描述CPU ID
SegmentU8描述用于多PCI Bridge场景的编号,每一个Segment对应一个PCI Bus空间
BusU8描述root port Bus号
DeviceU8描述root port Device号
FunctionU8描述root port Function号
VendorIDU16厂商Id,属于四元组信息
DeviceIDU16设备Id,属于四元组信息
PortIDU8描述PCIe槽位对应的PortID,用于上报BIOS槽位与PortID对应的关系,计算对应槽位的rootBDF
ContainerUIDString描述当前容器的UID
ContainerUnitTypeString描述当前容器的类型
LocationString描述当前容器的位置
ContainerSlotU8描述当前容器的槽位号
DevBusU8PCIe设备的总线
DevDeviceU8PCIe设备的设备号
DevFunctionU8PCIe设备的功能号
GroupPositionString-

天池组件的对象配置

在这里,介绍天池组件的Board对象以及三种天池逻辑对象升级的配置

Board

以CpuBoard对象为例介绍Board的配置

CpuBoard用于描述Cpu所在的Board的信息,包括设备名称、厂商等

CpuBoard配置样例

json
{
    "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":
    }
}

解析说明:

  1. CpuBoard对象的命名前面的类名只能是CpuBoard,后面的名称xxx可以是数字,也可以为其他,只要确保对象CpuBoard_xxx的命名在整个CSR文件中是全局唯一即可
  2. 在CSR文件配置CpuBoard对象时可以配置上面属性

主要参数说明:

属性名属性值类型描述
UIDString描述组件唯一标识
TypeString描述组件类型,如“BCU”
SlotU8描述槽位号
PositionString描述容器信息
NameString描述板名
PartNumberString描述部件编码
SRVersionString描述SR版本号
BoardIDU8描述单板ID
PcbVersionString描述Pcb版本号
MCUVersionString描述MCU版本号
LogicVersionIDU8描述逻辑版本号
LogicUnitU32描述逻辑位号
PowerWattsU32描述功率
SilkTextString描述丝印信息
RunningStatusU8监控Cpld和MCU的运行状态
FruIDU8描述关联Fru对象的FruID属性
DeviceNameString描述板卡丝印信息
BoardTypeString描述单板类型
NodeIdString描述资源ID
RefComponentString描述引用到Component对象
RefFruString描述引用到Fru对象
CpldStatusU8描述Cpld的状态
MultiLogicVersionDictionary描述单板所有逻辑版本号
MultiLogicUnitDictionary描述单板所有版本号