raid卡适配指导

1. 基础设备对象

1.1 PCIe设备对象 (PCIeDevice_1)

{
    "PCIeDevice_1": {
        "DeviceName": "PCIe Card $ (设备型号)",
        "FunctionClass": 1,  // 功能类型
        "Position": "", // 设备位置(容器名称)
        "Container": "${Container}", // 载板对象
        "GroupPosition": "PCIeDevice_${GroupPosition}", // 板卡组位置
        "PCIeDeviceType": "SingleFunction",  // 设备类型
        "SlotType": "HalfLength",  // 插槽类型
        "FunctionProtocol": "PCIe",  // 协议类型
        "FunctionType": "Physical"  // 功能类型
    }
}
  • 用途:定义PCIe设备的基本属性和类型
  • 必须配置:是
  • 关键属性:设备名称、功能类型(1是raid卡)、设备类型、插槽类型

1.2 raid卡对象 (PCIeCard_1)

{
    "PCIeCard_1": {
        "Name": "设备型号",
        "Description": "设备描述",
        "VendorID": "厂商ID",
        "DeviceID": "设备ID",
        "SubVendorID": "子厂商ID",
        "SubDeviceID": "子设备ID",
        "Manufacturer": "制造商",
        "PartNumber": "部件号",
        "RefChip": "关联的芯片",
        "Model": "型号",
        "FirmwareVersion": "固件版本",
        "SerialNumber": "序列号"
    }
}

1.3 Riad适配器对象(Controller_1)

环境会先加载pcie对象,再加载controller对象

{
    "Controller_1": {
        "Name": "raid卡名称",
        "TypeId": "raid卡类型Id",
        "OOBSupport": "是否支持带外管理",
        "CtrlOption1": "raid控制器策略",
        "CtrlOption2": "raid控制器策略",
        "CtrlOption3": "raid控制器策略",
        "BOMNumber": "BOM编码",
        "ChipManufacturer": "raid卡芯片厂商"
    }
}
  • 定义raid卡的功能属性
  • 必须配置:是
  • 关键属性:
  1. TypeId:存储组件基于typeid判断raid卡的类型,根据判断出的类型会决定存储组件使用的回调函数库,以及判断raid卡支持的带外管理通道类型
  2. OOBSupport:表征raid卡是否支持带外管理,0表示不支持,1表示支持,支持带外管理的raid卡存储模块才能正常获取信息
  3. CtrlOption1:表明raid卡支持的相关功能,存储组件会基于该属性判断raid卡支持的读策略、写策略、IO策略、访问策略,具体参数含义见storage代码仓common_def.lua中option1_format定义
  4. CtrlOption2:表明raid卡支持的相关功能,存储组件会基于该属性判断raid卡支持的硬盘缓存策略、工作模式,具体参数含义见storage代码仓common_def.lua中option2_format定义
  5. CtrlOption3:表明raid卡支持的相关功能,存储组件会基于该属性判断raid卡支持的写缓存策略、raid级别,具体参数含义见storage代码仓common_def.lua中option3_format定义
  6. BOMNumber:raid卡硬件资产编号,也是raid卡四元组信息的一部分

1.4 电容对象(Battery_1)

{
    "Battery_1": {
       "@Parent": "关联的raid卡对象",
       "RefControllerDeviceName": "关联的raid资源名称",
       "RefControllerSlotId": "关联的raid卡槽位id",
       "RefControllerTypeId": "关联的raid卡类型id"
    },
}

电容对象非必须配置,raid支持bbu时可配置

2 raid卡功能对象

2.1 phy误码诊断(SASphy_)

{
        "SASPhy_1": {
            "@Parent": "关联的raid卡对象",
            "PhyId": 255,
            "InvalidDwordCount": 0,
            "LossDwordSyncCount": 0,
            "PhyResetProblemCount": 0,
            "RunningDisparityErrorCount": 0
        },
}

对应Raid卡的Phy误码诊断通道,相关功能在Storage组件的:phy_object.lua

2.2 raid卡告警对象

{
        "Component_PCIeCard": {
            "FruId": 255,
            "Type": 8,
            "Health": 0,
            "PowerState": 1,
            "GroupId": 1,
            "Instance": 1,
            "Name": "<=/PCIeDevice_1.DeviceName",
            "Presence": 1,
            "ReplaceFlag": 0,
            "PreviousSN": "N/A",
            "SerialNumber": "<=/PCIeCard_1.SerialNumber"
        },
}

在soft文件中配置,表征pcie对象,关联raid相关的告警,由fru模块管理,触发告警时会根据告警级别设置关联的raid卡的健康状态

3 raid卡加载流程

加载到CSR,加载了Controller对象会进入流程:

function c_controller:ctor(obj)

function c_controller:init()

日志打印:

log:notice(‘controller init obj.Id = %s, object_id = %s’, self.obj.Id, self.object_id)

然后会进入Raid卡的注册流程:

function c_controller:register()

日志打印:

log:notice(‘controller%s begin register’, self.Id)

log:notice(‘ctrl%s add_controller_to_link_topo successfully’, self.Id)

log:notice(‘ctrl%s add_controller_to_sml successfully’, self.Id)

log:notice(‘ctrl%s register_controller_to_sml successfully’, self.Id)

如果以上日志都打印出来了,那么注册流程就算是走完了,也就意味Raid卡识别到了。

下一步就是一些例测任务。

4 个赞

非天池模式加载,在pcie slot上接过9560-8i这张raid卡在bmc上是可以正常使用的。现在因需求变化,需要适配SAS 3152卡,修改为对应raid卡的sr文件后,发现在bmc web中存储管理页面无raid卡的详细信息。怀疑是和mctp相关通信有关,
经过调试 发现在下面的地方return了

function c_controller:register()
             ......
            if not mctp_service.get_instance().mctp_state then
                return
            end            
 ......

storage版本:storage/1.80.40@openUBMC.release/stable

1 个赞

你这个看上去像是mctp没有通,
有看mctp的资源树有没有对应的endpoint创建?

这是我们的资源树,请问一下这种情况,排查的思路方法是什么?

看一下/bmc/kepler/Systems/1/Mctp/MctpBinding里面的BmcPhyAddr和BmcEid两个属性,mctp_state是在storage组件mctp_service.lua文件的prepare函数设置的,前提条件是get_mctp_pcie_binding拿到对象,这个函数拿到对象需要上面的两个属性均不为0


看起来bmc.kepler.Systems.Mctp.MctpBinding.PCIe接口下的.BmcEid和.BmcPhyAddr均不为0,bmc.kepler.Systems.Mctp.MctpBinding.SMBus下的.BmcEid和.BmcPhyAddr均为0,有什么排查思路可以分享一下吗?在日志app.log storage组件打印中发现mctp 建立链路失败

可以着重看一下storage组件mctp_service.lua文件的prepare()函数,预期如果能获取mctp对象的话mctp_state会被置为true的,但是按照问题发的图来看明显没有,建议在函数中加打印判断没有置true。判断的BmcEid和BmcPhyAddr是bmc.kepler.Systems.Mctp.MctpBinding.PCIe接口下的,按逻辑来说是可以正常获取的

function mctp_service:prepare()
    log:notice('mctp_service:prepare')
    if not self.os_state then
        log:notice('not self.os_state')
        return
    end
    local obj = mctp_lib.get_mctp_pcie_binding(self.bus)
    if not obj then
        log:notice('[Storage] Get BMC Mctp info failed')
        return
    end
    -- 将BMC的mctp信息传递给C库的线程
    sml.mctp_infos.set_bmc_mctp_info(obj.BmcEid, obj.BmcPhyAddr)
    self.mctp_state = true
    log:notice('[Storage] mctp prepare finished. bmc_eid = %s bmc_phy = %s state = %s',
        obj.BmcEid, obj.BmcPhyAddr, self.mctp_state)
end

日志打印提示卡在了[Storage] Get BMC Mctp info failed

2 个赞

vpd仓有个提交,Controller下的Name属性改成ControllerName了呢,这里的指导文档是不是也要更新一下。