Altas 300v PRO显卡无法读取数据

问题描述

920L模组,载板上有三个PCIe槽,没有riser卡,I2c7通过切换0XE0的PCA9546可以切换PCIe槽。现在BMC正确加载Altas 300v PRO sr文件,但是读不到温度,功率等具体数据。

OS下NPU信息

[root@localhost ~]# npu-smi info -t board -i 1
        NPU ID                         : 1
        Product Name                   : IT21PDDA012
        Model                          : NA
        Manufacturer                   : Huawei
        Serial Number                  : 2106030729ZERB007612
        Software Version               : 25.2.0
        Firmware Version               : 1.82.22.8.220
        Compatibility                  : NOK
        Board ID                       : 0xaf
        PCB ID                         : B
        BOM ID                         : 1
        PCIe Bus Info                  : 0000:05:00.0
        Slot ID                        : 1
        Class ID                       : NA
        PCI Vendor ID                  : 0x19E5
        PCI Device ID                  : 0xD500
        Subsystem Vendor ID            : 0x0200
        Subsystem Device ID            : 0x0100
        Chip Count                     : 1
        Chip Fault                     : 0

BCU关于pcie的配置如下:

"ManagementTopology": {
    "I2c_7": {
        "Chips": [
            "Pca9545_PCA9545"
        ]
    },
    "Pca9545_PCA9545": {
        "Buses": [
            "I2cMux_Pca9545_PCA9545_3",
            "I2cMux_Pca9545_PCA9545_2",
            "I2cMux_Pca9545_PCA9545_1"
        ]
    },
    "I2cMux_Pca9545_PCA9545_1": {
        "Connectors": [
            "Connector_PCIE_SLOT_1"
        ]
    },
    "I2cMux_Pca9545_PCA9545_2": {
        "Connectors": [
            "Connector_PCIE_SLOT_2"
        ]
    },
    "I2cMux_Pca9545_PCA9545_3": {
        "Connectors": [
            "Connector_PCIE_SLOT_3"
        ]
    },
},
"Objects": {
    "Pca9545_PCA9545": {
       "OffsetWidth": 0,
        "AddrWidth": 1,
        "Address": 224,
        "WriteTmout": 100,
        "ReadTmout": 100,
        "HealthStatus": 0
     },
}

tracechip log如下:

1970-01-02 03:14:56.589715, bmc.kepler.compute, block_write, Chip_Dmini_01010101, addr: 216, offset: 32, write_data: 30 43 20 38 30 20 30 30 20 30 32 20 30 30 20 30  30 20 30 30 20 30 30 20 30 30 20 31 34 20 30 30  20 30 30 20 30 30 20 45 33 20 , write_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c write fail, ret: 5, input:{"len":14,"drv_write_delay":0,"rw_type":0,"bus_type":0,"type":1,"buffer":"0C 80 00 02 00 00 00 00 00 14 00 00 00 E3 ","offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":32,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}
1970-01-02 03:14:56.590996, bmc.kepler.compute, block_read, Chip_Dmini_01010101, addr: 216, offset: 33, read_length: 34, read_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c read fail, ret: 5, input:{"len":34,"drv_write_delay":0,"rw_type":1,"bus_type":0,"type":1,"offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":33,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}
1970-01-02 03:14:56.592905, bmc.kepler.compute, block_write, Chip_Dmini_01010101, addr: 216, offset: 32, write_data: 30 43 20 38 30 20 30 30 20 30 34 20 30 30 20 30  30 20 30 30 20 30 30 20 30 30 20 30 32 20 30 30  20 30 30 20 30 30 20 38 37 20 , write_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c write fail, ret: 5, input:{"len":14,"drv_write_delay":0,"rw_type":0,"bus_type":0,"type":1,"buffer":"0C 80 00 04 00 00 00 00 00 02 00 00 00 87 ","offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":32,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}
1970-01-02 03:14:56.593982, bmc.kepler.compute, block_read, Chip_Dmini_01010101, addr: 216, offset: 33, read_length: 16, read_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c read fail, ret: 5, input:{"len":16,"drv_write_delay":0,"rw_type":1,"bus_type":0,"type":1,"offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":33,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}
1970-01-02 03:14:56.782414, bmc.kepler.compute, block_write, Chip_Dmini_01010101, addr: 216, offset: 32, write_data: 30 43 20 38 30 20 30 30 20 30 32 20 30 30 20 30  30 20 30 30 20 30 30 20 30 30 20 31 34 20 30 30  20 30 30 20 30 30 20 45 33 20 , write_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c write fail, ret: 5, input:{"len":14,"drv_write_delay":0,"rw_type":0,"bus_type":0,"type":1,"buffer":"0C 80 00 02 00 00 00 00 00 14 00 00 00 E3 ","offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":32,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}
1970-01-02 03:14:56.783693, bmc.kepler.compute, block_read, Chip_Dmini_01010101, addr: 216, offset: 33, read_length: 34, read_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c read fail, ret: 5, input:{"len":34,"drv_write_delay":0,"rw_type":1,"bus_type":0,"type":1,"offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":33,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}
1970-01-02 03:14:56.785040, bmc.kepler.compute, block_write, Chip_Dmini_01010101, addr: 216, offset: 32, write_data: 30 43 20 38 30 20 30 30 20 30 34 20 30 30 20 30  30 20 30 30 20 30 30 20 30 30 20 30 32 20 30 30  20 30 30 20 30 30 20 38 37 20 , write_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c write fail, ret: 5, input:{"len":14,"drv_write_delay":0,"rw_type":0,"bus_type":0,"type":1,"buffer":"0C 80 00 04 00 00 00 00 00 02 00 00 00 87 ","offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":32,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}
1970-01-02 03:14:56.786336, bmc.kepler.compute, block_read, Chip_Dmini_01010101, addr: 216, offset: 33, read_length: 16, read_result: ./opt/bmc/apps/hwproxy/lualib/stream/i2c.lua:117: response error, i2c read fail, ret: 5, input:{"len":16,"drv_write_delay":0,"rw_type":1,"bus_type":0,"type":1,"offsetWidth":1,"addrWidth":1,"addr":216,"has_error":false,"name":"Chip_Dmini_01010101","offset":33,"is_trace":true,"mask":4294967295,"requestor":"bmc.kepler.compute"}

是否要将I2c7换成hisport?我查到920L模组是有一组hisport的,但是我不知道要用hisport几,BCU目前传入了hisport0~hisport21,也不知道hisport如何跟i2c7关联起来。

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

四、总结与建议

项目 状态 建议
I2C7 是否可用 :white_check_mark: 继续使用,无需切换 Hisport
Hisport 是否替代 I2C :cross_mark: Hisport 用于 CPLD 通信,不承载传感器数据
PCA9545 vs PCA9546 :warning: 注意 确认芯片型号,避免驱动不匹配
I2C 地址 :warning: 易错点 7位地址左移一位再配置
解决方案 :white_check_mark: 可行 修正 MUX 配置 + 使用调试工具验证通路

最终结论不应改用 Hisport。问题根源在于 I2C 通信链路未成功建立,重点应放在 PCA9546 配置、地址格式、设备识别 上。建议优先使用 i2cdetecti2ctransfer 工具进行底层验证。

点击此处查看详细分析解答

Atlas 300V PRO 显卡无法读取数据问题分析与解决方案

根据您提供的详细信息,当前问题是:在 920L 模组、未使用 Riser 卡的硬件架构下,BMC 已正确加载 Atlas 300V PRO 的 SR 配置文件,但 无法读取其温度、功率等监控数据,且 tracechip 日志中频繁出现 I2C 通信失败(ret: 5)


一、问题核心分析

1. 错误现象定位

tracechip 日志中可提取关键错误:

i2c write fail, ret: 5
i2c read fail, ret: 5

这是典型的 I2C 通信失败,返回码 5 对应操作系统中的 EIO(输入/输出错误),表明:

  • BMC 虽然发出了 I2C 请求,但目标设备未正确响应
  • 数据链路层面存在阻断。
2. 目标设备与通信路径

问题中涉及的关键设备是:

  • Atlas 300V PRO NPU卡,其带外管理通过 Chip_Dmini_01010101 芯片实现。
  • 该芯片位于 PCIe 插槽上,由 BMC 通过 I2C7 总线经 PCA9546 多路复用器选通至对应槽位进行访问。

BCU 配置显示:

"I2c_7": {
  "Chips": ["Pca9545_PCA9545"]
},
"Pca9545_PCA9545": {
  "Buses": [
    "I2cMux_Pca9545_PCA9545_1", // → Slot 1
    "I2cMux_Pca9545_PCA9545_2", // → Slot 2
    "I2cMux_Pca9545_PCA9545_3"  // → Slot 3
  ]
}

说明 I2C7 是主总线,通过 PCA9546(地址 0xE0)切换通道以访问不同插槽。


二、可能原因排查

根据知识库和日志信息,从硬件拓扑和协议两方面分析可能原因:

:white_check_mark: 1. PCA9546 地址或模式配置错误
  • PCA9545 是标准 I2C 多路复用器,通常地址为 0xE0(7位地址 0x70)。
  • 若配置中未正确设置 MUX 地址或通道映射,BMC 将无法正确切换总线链路。
  • 建议验证
    • SR 配置中 Pca9545_PCA9545 是否正确指定了 Address: 0xE0
    • 确认 I2C MUX 的 BusType 是否为 I2C
    • 使用 i2cdetect 工具扫描 I2C7 总线(见后文工具使用建议)。
:white_check_mark: 2. I2C 地址位宽问题:7位 vs 8位
  • Linux 内核和 I2C 工具通常以 7位地址 存储(如 0x70)。
  • 但在底层协议中,实际传输的是 8位地址(读写位作为最低位)。
  • 常见错误:配置为 0xE0(8位地址)而非 0x70(7位地址),导致地址偏移。
  • 建议
    • 在 CSR 中检查 Chip_Dmini_01010101 的 I2C 地址是否应为 0x70 而非 0xE0(仅针对 MUX)。
    • 对于 Chip_Dmini 设备本身,应确认其 I2C 地址是否正确(一般为 0x500x52)。

:white_check_mark: 参考知识库中用户建议:“地址看着是7位的,应该左移一位,配成8位地址”。

:white_check_mark: 3. PCA9546 与 Atlas 300V PRO 卡兼容性问题
  • 您提到使用的是 PCA9546,但 SR 配置写为 Pca9545
  • PCA9545 是 4通道 MUX,PCA9546 是 8通道 MUX,其寄存器行为有所不同。
  • 若驱动或配置仍按 PCA9545 处理 PCA9546,可能导致选路失败。
  • 建议
    • 确认实际使用的芯片型号。
    • 在 BCU/CSR 中使用正确的 MUX 类型定义(如 Pca9546)。
:cross_mark: 4. 是否应改用 Hisport?
  • 不需要。
  • Hisport 是一种 高速串行接口,通常用于:
    • CPLD 与 BMC 之间的固件通信。
    • VPD、FRU 等低延迟控制信号传输。
  • Atlas 300V PRO 的温度、功率等传感器数据是通过 I2C 带外管理接口(如 VPD/I²C)获取的,不通过 Hisport
  • 920L 模组的 Hisport(Hisport0~21)用于模组内 CPLD 连接,不替代 I2C 总线功能
  • 结论:应继续使用 I2C7,优化配置而非更换物理接口。

三、解决方案建议

:white_check_mark: 1. 检查并修正 I2C MUX 配置
  • 确保 BCU 配置中 MUX 地址正确:
    "Pca9545_PCA9545": {
      "Address": 224,        // 0xE0 的十进制表示(8位地址)
      "BusType": "I2C",
      "ChannelCount": 4
    }
    
  • 若实为 PCA9546,应定义为 Pca9546 并确保驱动支持。
:white_check_mark: 2. 验证 I2C 通信通路

使用 i2ctransferi2cdetect(参考知识库 Search Result #10)测试:

# 列出所有 I2C 总线
i2cdetect -l

# 扫描 I2C7 上的设备
i2cdetect 7

# 示例:向 PCA9546(0xE0)写入通道选择命令(选择通道0)
i2ctransfer 7 w2@0x70 0x00 0x01

i2cdetect 无法看到任何设备,则说明 I2C7 物理链路或 MUX 初始化失败。

:white_check_mark: 3. 检查 Atlas 300V PRO 的 I2C 设备地址
  • Chip_Dmini_01010101 应代表 Atlas 300V PRO 的管理芯片。
  • 确认其 Address 字段是否为 0x500x52(典型 VPD EEPROM 地址)。
  • 可通过以下命令尝试读取:
    i2ctransfer 7 r6@0x50
    
:white_check_mark: 4. 增加重试与防抖配置

参考知识库中 CSR 配置字典(Search Result #8),为 Chip_Dmini 添加重试机制:

"Chip_Dmini_01010101": {
  "ReadRetryTimes": 3,
  "WriteRetryTimes": 3,
  "ReadTmout": 1000,
  "WriteTmout": 1000
}

四、总结与建议

项目 状态 建议
I2C7 是否可用 :white_check_mark: 继续使用,无需切换 Hisport
Hisport 是否替代 I2C :cross_mark: Hisport 用于 CPLD 通信,不承载传感器数据
PCA9545 vs PCA9546 :warning: 注意 确认芯片型号,避免驱动不匹配
I2C 地址 :warning: 易错点 7位地址左移一位再配置
解决方案 :white_check_mark: 可行 修正 MUX 配置 + 使用调试工具验证通路

最终结论不应改用 Hisport。问题根源在于 I2C 通信链路未成功建立,重点应放在 PCA9546 配置、地址格式、设备识别 上。建议优先使用 i2cdetecti2ctransfer 工具进行底层验证。

硬件链路问题,建议找硬件侧的同学询问一下

  • ChannelId问题,channel0(既第一个channel)ChannelId:0,依次类推
  • I2c通了即可,Connector_PCIE不一定需要传入hisport