BusinessConnector的作用是什么

// 此模板仅供参考,如果不适用可以修改

问题描述

BusinessConnector的作用是什么,pcie swicth芯片扩展的槽位,如何去配置。不配置具体有什么影响

环境信息

  • 操作系统:[如 Ubuntu 24.04]

  • 软件版本:[如 OpenUBMC2509]

  • 硬件配置:[如 CPU、内存等]

重现步骤

  1. [第一步]

  2. [第二步]

  3. [第三步]

期望结果

知道pcie switch芯片下的槽位如何配置,或者是否可以不配置

实际结果

[实际发生了什么,包含错误信息]

尝试过的解决方案

[列出您已经尝试过的解决方案及结果]

答案内容由AI生成,仅供参考:

BusinessConnector 的作用及 PCIe Switch 芯片槽位配置说明

1. BusinessConnector 的作用

BusinessConnector 是 openUBMC 系统中用于定义和管理 PCIe 拓扑结构的关键配置对象,其主要功能如下:

  • PCIe 业务拓扑建立:通过定义上下行连接器(Upstream/Downstream),构建设备之间的物理与逻辑连接关系,支持多层级的 PCIe 拓扑结构。
  • 槽位映射与带宽管理
    • Slot:标识设备在系统中的物理槽位号。
    • LinkWidthMaxLinkRate:定义链路带宽(如 X16)和最大速率(如 PCIe4.0),用于性能管理和链路协商。
  • 资源关联机制
    • UpstreamResources:指定上行连接资源(如 SerDes 接口),实现与主板或 BCU 的连接。
    • RefPCIeAddrInfo:关联 PcieAddrInfo 对象,用于存储设备的 BDF(Bus, Device, Function)等地址信息。
    • RefMgmtConnector:关联管理连接器,用于设备的带外管理通信。
  • 连接类型识别
    • ConnectorType 支持 UBCUBCDDPCIe CEM 等类型,用以区分不同类型的连接结构(例如板载、扩展卡、转接板等)。

:white_check_mark: 总结BusinessConnector 是实现系统内 PCIe 设备自动发现、资源配置和链路建模的核心机制。


2. PCIe Switch 芯片扩展槽位的配置方法

当使用 PCIe Switch 芯片(如 PEX89104、PLX8749)进行链路扩展时,需通过以下方式完成配置:

(1)是否需要建模 PCIe Switch 对象?

根据当前 openUBMC 实现情况:

  • 默认未内置 PCIe Switch 类:系统目前不直接支持对 PCIe Switch 芯片的动态建模。
  • 需要人工干预建链:若未适配动态发现机制,则依赖 BIOS 或上层通过静态配置上报拓扑。
  • 建议路径:可通过 CSR 配置 + BusinessConnector 显式定义 来模拟 Switch 下挂设备的连接关系。

(2)配置流程示例(以 PEX89104 扩展5路为例)

步骤 1:添加下行 BusinessConnector 对象

{
  "BusinessConnector_Down1": {
    "Name": "Down_1",
    "Direction": "Downstream",
    "Slot": 1,
    "LinkWidth": "X8",
    "MaxLinkRate": "PCIe3.0",
    "ConnectorType": "UBCDD",
    "UpstreamResources": [
      {
        "Name": "Up_1",
        "ID": 255,
        "Offset": 8,
        "Width": 8
      }
    ],
    "RefPCIeAddrInfo": "#/PcieAddrInfo_1",
    "RefMgmtConnector": "#/Connector_PCIE_SLOT1"
  }
}

步骤 2:配置 PcieAddrInfo 实现地址映射

{
  "PcieAddrInfo_1": {
    "SlotID": 1,
    "Bus": 0x01,
    "Device": 0x00,
    "Function": 0,
    "Segment": 0,
    "VendorID": "0x10EE",
    "DeviceID": "0x903F"
  }
}

步骤 3:结合 UnitConfiguration 定义具体设备

sr 文件中通过 UnitConfigurationPCIeDevice_1NPUCard_1 等对象绑定到对应的 Slot,完成设备识别。


3. 不配置 BusinessConnector 的影响

如果未正确配置 BusinessConnector 或缺失相关对象,将导致以下问题:

问题类型 具体表现
:cross_mark: 设备无法识别 BMC 无法感知 PCIe 卡的存在,导致自发现失败。
:cross_mark: BDF 地址缺失 PcieAddrInfo 无法同步地址信息,影响驱动加载。
:cross_mark: 带外管理中断 无法通过 IPMI 或 Redfish 获取设备状态(如温度、健康、功耗)。
:cross_mark: 事件监控失效 Event_PCIeLinkSpeed 等链路异常事件无法触发或上报。
:cross_mark: 链路性能下降无告警 当发生 link speed reduce 时,系统无法检测并记录日志。
:warning: 依赖 BIOS 上报 系统会退化为依赖 BIOS “约定整机配置” 静态上报,失去动态灵活性。

:warning: 特别提示:在 v2 版本中,BusinessConnector 曾通过 BIOS 约定方式实现,但这属于 静态建链,无法支持热插拔或动态变更。


4. 建议与解决方案

:white_check_mark: 建议做法

  1. 暂不开发 PCIe Switch 类的前提下,可通过以下方式解决:

    • 使用 BusinessConnector 显式描述每个由 Switch 扩展出的 Slot。
    • 逐一对接 PcieAddrInfo 完成地址映射。
    • 在 CSR 或 PSR 中显式定义设备类型和能力。
  2. 长期方案

    • 提交 hardware-sig 议题,推动建立标准 PCIeSwitch 类模型。
    • 参考已有芯片数据(如 PLX8749)完成 Register 级建模,支持动态识别多个下游端口。

:wrench: 排查建议

  • 使用 lspci 命令查看 OS 层面是否识别设备的 BDF。
  • 检查 /var/log/bmc.log 是否有 PcieAddrInfo 同步失败日志。
  • 验证 GetPCIeCardNum() 方法返回值是否与实际一致。

5. 参考文档与资源


:white_check_mark: 总结

项目 内容
BusinessConnector 作用 构建 PCIe 拓扑、绑定地址、管理链路参数
Switch 扩展槽配置方法 显式配置多个 BusinessConnector + PcieAddrInfo
能否跳过不配? :cross_mark: 不能。否则设备无法识别,影响管理和监控
推荐方案 暂用 CSR 显式建模 → 后续推动标准化 PCIeSwitch 支持

如有进一步需求,建议 提交 hardware-sig 会议议题,联合专家共同设计兼容性更强的动态建链机制。

相关链接:

  1. pcie switch对象缺失
  2. 【教学培训篇】新增组件
  3. RAID扣卡适配求助
  4. V2的pcie switch 在openUBMC上是否有对应配置文件
  5. pcie_device | 文档中心 | openUBMC

BusinessConnector用来表示UBC/UBCDD上下行链接端口,在进行拓扑建立时,会以PCIeAddrInfo->IEU下行连接器->IEU上行连接器->PSR UnitConfig->BCU 下行连接器->Serdes的顺序把槽位和对应的PortId对应起来。

在带内程序运行时,只能感知到当前pcie信号是哪个lane出来的(对应PortId),但是站在BMC的角度上,PortId会受到接线方式的影响,因此不能在最开始就把这个东西配死,因此需要通过BusinessConnector和PSR配合进行拓扑建立,给每个具体的PCIeAddrInfo赋予一个SlotId和PortId,再报送给带内,带内会将SlotId和设备BDF的信息打包发给BMC,这样BMC就得到了SlotId和BDF的关系,知道具体插在IEU上的某一张卡对应的BDF。

对于PCIeSwitch,如果不配置BusinessConnector,它就不能生成槽位的丝印信息(上文提到的每个具体的PCIeAddrInfo的SlotId和PortId对照表),因此带内就不能上报SlotId和BDF的关系给BMC,这些卡就不会被加载(即在BMC中被管理)。

最终的PCIeSwitch支持方案尚需要评估。

1 个赞

你好,请教下,如果我的PCIe设备是直接接在CPU模组的控制器PCIe0和PCIe2上,是不是只需要配置

PCIeAddinfo→BCU下行连接器→SerDes 这3个对象就行呀。 其中PCIe0是一个X8, 被一分为二,分别接了两个X4设备

本质上来说只要有PCIeAddrInfo就能上报丝印,因此如果您确定了这个槽位的接法的PortId、SlotId和rootBDF(Bus, Device,Function)信息,直接配置PCIeAddrInfo即可,不用走拓扑建立。

再打扰下,这里的BDF和主CPU lcpci看到的值是一样的吧,那这个PortId和SlotId是从哪里确定的呀?

根据你主板侧的srcport找对对应的portid

我手上的硬件是通过SerDes复用为PCIe控制器,直接接的PCIe设备,还没有通过啥UBCDD/UBC连接器,就是PcieAddrInfo→SerDes

你好,范工,CPU侧的srcport怎么确定呢,我这边是将Hilink5(Serdes[24:31]) 配置为PCIe0(x8控制器),然后接的两个X4的设备。怎么确定Hilink5对应的是哪个srcportid呀,有啥文档描述这块的东西吗

对了,范工,这个cpu port是不是和BIOS中打印出来的PCIe port值是对应的呀?

一般对应哪个serdes配哪个portid就行

额,这个portid和Serdes有啥对应关系的吗?,我看我收集到的日志中,这个bdf信息是有问题的,这里会影响这个网卡的NCSI功能不

BCU中配置如下:

“SerDes_0_5”: {
“Name”: “SerDes_0_5”,
“ID”: 5,
“SocketID”: 0,
“LinkWidth”: 8,
“WorkMode”: 1,
“ModeConfigs”: [
{
“Mode”: 1,
“Device”: [
0,
0,
0,
0,
2,
2,
2,
2
],
“ControllerIndex”: [
0,
0,
0,
0,
0,
0,
0,
0
]
}
]
},

“BusinessConnector_1”: {
“Name”: “Down_1”,
“Direction”: “Downstream”,
“Slot”: 1,
“LinkWidth”: “X4”,
“MaxLinkRate”: “PCIe 4.0”,
“ConnectorType”: “PCIe CEM”,
“UpstreamResources”: [
{
“Name”: “SerDes_0_5”,
“ID”: 0,
“Offset”: 0,
“Width”: 4
}
],
“RefPCIeAddrInfo”: “#/PcieAddrInfo_M2_1”
},

“BusinessConnector_2”: {
“Name”: “Down_2”,
“Direction”: “Downstream”,
“Slot”: 2,
“LinkWidth”: “X4”,
“MaxLinkRate”: “PCIe 2.0”,
“ConnectorType”: “PCIe CEM”,
“UpstreamResources”: [
{
“Name”: “SerDes_0_5”,
“ID”: 1,
“Offset”: 4,
“Width”: 4
}
],
“RefMgmtConnector”: “#/Connector_NIC_1”,
“RefPCIeAddrInfo”: “#/PcieAddrInfo_NIC_1”
},

“PcieAddrInfo_NIC_1”: {
“Segment”: 0,
“GroupID”: 1,
“SocketID”: 0,
“SlotID”: 2,
“PortID”: 2,
“Bus”: 2,
“Device”: 0,
“Function”: 0,
“Location”: “BCU”,
“ComponentType”: 8,
“ContainerSlot”: “${Slot}”,
“ContainerUID”: “00000001020302071127”,
“ContainerUnitType”: “BCU”,
“GroupPosition”: “PcieAddrInfo_NIC_1_${GroupPosition}”
},

能否帮忙看下是哪块的配置有问题吗?

BIOS中设备打印的Port信息就是Port2对应我的网卡设备,lspci中显示的BDF地址是02:00.0

像这些我们的硬件都会提供给我们硬件图,比如switch板,在主板侧接那几个,对应的是那些SrcPortName,有了这些你再去serdes里面找就ok了

bios侧我不太清楚,但是我们发给bios的丝印文件,也是发的portid + sockerid = rootbdf,bios侧会根据这两个信息找到对应槽位的起始bdf,来确定准确的bdf号

好的,我们这边硬件啥也不知道,所以调起来比较困难 :sweat_smile:

另外,OS侧使用dmidecode –t 9的信息如下所示(确实是有两个X4,而且Bus Address也是实际的设备对应的上):

想请教下这块的配置还有啥问题吗?