飞腾2000+/64核 PCIE扫描异常问题排查

1、背景介绍

近期项目中采用全国产飞腾计算模块搭配一块FPGA模块(FPGA为复旦微的VU9P),实现业务数据的收发。FPGA中采用了Xilinx的XDMA IP核,飞腾计算模块中的FT2000+/64核处理器通过PEU1的一路 PCIE3.0x8与VU9P相连接,发现在飞腾上加载xilinx的xdma驱动时提示xdma驱动正常加载,但no device found。等于没有找到设备。

2、问题排查

首先确认硬件设备能否找到,输入lspci能看到设备

输入lspci -s 12:00.0 -vvv查看详细设备信息时输出如下:

[系统未激活][root@node12-0 tests]# lspci -s 11:00.0 -vvv
11:00.0 Serial controller: Xilinx Corporation Device 9018 (prog-if 01 [16450])Subsystem: Xilinx Corporation Device 0007Control: I/O- Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx-Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx-Interrupt: pin A routed to IRQ 14Region 0: Memory at <unassigned> (64-bit, non-prefetchable) [virtual] [size=64K]Capabilities: [40] Power Management version 3Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-)Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME-Capabilities: [48] MSI: Enable- Count=1/1 Maskable- 64bit+Address: 0000000000000000  Data: 0000Capabilities: [70] Express (v2) Endpoint, MSI 00DevCap: MaxPayload 1024 bytes, PhantFunc 0, Latency L0s <64ns, L1 <1usExtTag+ AttnBtn- AttnInd- PwrInd- RBE+ FLReset- SlotPowerLimit 0.000WDevCtl: CorrErr- NonFatalErr- FatalErr- UnsupReq-RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+MaxPayload 512 bytes, MaxReadReq 1024 bytesDevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend-LnkCap: Port #0, Speed 8GT/s, Width x8, ASPM not supportedClockPM- Surprise- LLActRep- BwNot- ASPMOptComp+LnkCtl: ASPM Disabled; RCB 64 bytes Disabled- CommClk-ExtSynch- ClockPM- AutWidDis- BWInt- AutBWInt-LnkSta: Speed 8GT/s (ok), Width x8 (ok)TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt-DevCap2: Completion Timeout: Range BC, TimeoutDis+, NROPrPrP-, LTR-10BitTagComp-, 10BitTagReq-, OBFF Not Supported, ExtFmt-, EETLPPrefix-EmergencyPowerReduction Not Supported, EmergencyPowerReductionInit-FRS-, TPHComp-, ExtTPHComp-AtomicOpsCap: 32bit- 64bit- 128bitCAS-DevCtl2: Completion Timeout: 50us to 50ms, TimeoutDis+, LTR-, OBFF DisabledAtomicOpsCtl: ReqEn-LnkCtl2: Target Link Speed: 8GT/s, EnterCompliance- SpeedDis-Transmit Margin: Normal Operating Range, EnterModifiedCompliance- ComplianceSOS-Compliance De-emphasis: -6dBLnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete-, EqualizationPhase1-EqualizationPhase2-, EqualizationPhase3-, LinkEqualizationRequest-Capabilities: [100 v1] Advanced Error ReportingUESta:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-UEMsk:  DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-UESvrt: DLP+ SDES+ TLP- FCP+ CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-CESta:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-CEMsk:  RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+AERCap: First Error Pointer: 00, ECRCGenCap- ECRCGenEn- ECRCChkCap- ECRCChkEn-MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap-HeaderLog: 00000000 00000000 00000000 00000000

上面显示

Region 0: Memory at <unassigned> (64-bit, non-prefetchable) [virtual] [size=64K]

也就是bar空间无法分配,此时输入dmesg 查看驱动加载异常日志,显示

[ 1203.426451] xdma v2017.0.45
[ 1203.426560] xdma 0000:11:00.0: can't enable device: BAR 0 [mem size 0x00010000 64bit] not assigned
[ 1203.426572] xdma: probe of 0000:11:00.0 failed with error -1
[ 1203.426597] xdma 0000:12:00.0: can't enable device: BAR 0 [mem size 0x00010000 64bit] not assigned
[ 1203.426603] xdma: probe of 0000:12:00.0 failed with error -1
[ 1255.253522] xdma v2017.0.45
[ 1255.253629] xdma 0000:11:00.0: can't enable device: BAR 0 [mem size 0x00010000 64bit] not assigned
[ 1255.253640] xdma: probe of 0000:11:00.0 failed with error -1
[ 1255.253665] xdma 0000:12:00.0: can't enable device: BAR 0 [mem size 0x00010000 64bit] not assigned
[ 1255.253671] xdma: probe of 0000:12:00.0 failed with error -1

也提示找不到设备的原因为bar空间probe失败了。

可以判断直接原因是 BAR0 根本没有被分配物理地址。

在chatgpt上把日志信息贴出后,建议解决思路如下:

结合情况分析

  1. 硬件侧 (FPGA/bitstream)

    • 这个设备是 Xilinx XDMA IP 导出的 PCIe Endpoint。

    • 如果 bitstream 没有正确启用 BAR0(或者 BAR 大小配置和驱动不一致),内核扫描 PCIe 配置空间时不会分配内存资源。

    • 你可以用 setpci -s 11:00.0 BASE_ADDRESS_0 查看 BAR0 的原始值,确认是不是 0x00000000

  2. BIOS/UEFI 设置

    • 如果 BAR 是 64-bit,需要 BIOS 支持并开启 Above 4G Decoding / Large BAR support,否则 BIOS 不会给它分配地址。

    • 典型症状就是 lspci 里显示 <unassigned>

  3. 内核资源分配

    • Linux 看到 BAR0 需要内存,但 BIOS 没分配,就不会启用设备。

    • 内核有时候能“重新分配”资源,可以尝试在 grub 加参数:

      pci=realloc pci=assign-busses 
    • 然后 update-grub && reboot

其实针对2和3点,因为使用同一个模块与另一个FPGA模块(复旦微的V7)测试xdma没有问题,可以排除。第1点在FPGA工程师检查和确认下也进行了排除。

最后排查发现,当FPGA 的XDMA IP核启动慢时,将导致BAR0空间无法分配,chatgpt也给出了解释:

短答:会的。
如果 FPGA(含 XDMA IP)在主机进行 PCIe 枚举/资源分配时还没就绪,BIOS/固件无法读取有效的 BAR 配置,就不会给 BAR 分配 MMIO 地址;等你后面 bitstream 才起来时,设备已经“错过了”最初的分配时机,于是出现你看到的 BAR 0 ... not assigned,驱动 probe 失败。

为什么会这样

PCIe 上电后主机流程是:释放 PERST# → 链路训练到 L0 → 读配置空间(BAR size) → 分配 MMIO
若 XDMA 在这些步骤发生时还没配置好(如 bitstream 还没完成、user_lnk_up 还没到 L0、BAR 寄存器还未有效),主机会认为“没有/不需要内存资源”,于是不会给 BAR 地址。后面即使链路正常了,除非固件/OS重新分配,否则 lspci 里就会一直是 <unassigned>,驱动就启用不了设备。

你可以怎么解决(两条路线)

A. 从硬件/时序上根治

  1. 保证“配置先于枚举”

    • 把 bitstream 存在板载 SPI-Flash,随上电完成 FPGA 配置;

    • 或者用 CPLD/MCU 延迟释放 PERST#,直到 DONE=1MMCM/PLL lockeduser_lnk_up=1(或 LTSSM=L0)再放开。

  2. 检查 XDMA 配置

    • PF0 BAR0 启用且大小与驱动期望一致(常见 64 KB AXI-Lite 控制空间)。

    • 不要改动到导致 BAR 为 0 的设置。

  3. 主板 BIOS 设置

    • 打开 Above 4G Decoding / Large BAR,避免 64-bit BAR 分配失败。

    • 若插槽支持热插拔/下行端口复位,确保启用。

B. 运行时的补救(设备已“错过”枚举)

成功与否取决于上游 Root Port/桥是否支持热插拔/热复位以及系统是否允许 OS 侧重新分配资源。

  1. 尝试 OS 侧重新分配资源

    • 临时一次性:

      echo 1 | sudo tee /sys/bus/pci/rescan 
    • 若仍不分配,先“移除再扫描”:

      echo 1 | sudo tee /sys/bus/pci/devices/0000:11:00.0/remove echo 1 | sudo tee /sys/bus/pci/rescan 
    • 仍失败,给内核加参数让其强制重新分配(下次重启生效):

      pci=realloc 
  2. 对上游端口做热复位(可选、谨慎)

    • 如果内核导出了 reset 接口:

      echo 1 | sudo tee /sys/bus/pci/devices/0000:<UPSTREAM_PORT>/reset 
    • 或通过 Secondary Bus Reset(依平台而定,可能影响同总线其他设备)。

如果这些补救都不行,基本就只能回到 A 路线:保证 FPGA 在 BIOS/OS 枚举时已经就绪。

不过由于飞腾2000+ 64核不支持PCIE热插拔,于是重新reset或先移除再扫描无法解决该问题

飞腾 2000+ 这种处理器平台上,PCIe 确实没有热插拔(Hot-Plug)能力,所以不能像服务器那样靠 Root Port 做 Slot Reset,让设备重新枚举。但 remove/rescan 这类软件操作,本质上只是让内核释放并重新探测配置空间,并不是真的“热插拔”,因此是否可行要看 设备枚举时 BAR 是否已经有效

最终解决办法是让FPGA 逻辑在飞腾计算模块枚举前加载完毕,否则只能让飞腾计算模块上电后执行reboot了。

chatgpt也产生了一个自动检测PCIE设备的脚本,供参考

#!/bin/bash
# quick_pcie_rescan_auto.sh
# 自动检测并测试 Xilinx XDMA (10ee:9018) 设备是否能在 bitstream 加载后重新分配 BAR
# 打印 BAR0 地址和大小,并检查是否有效VENDOR="10ee"
DEVICE="9018"echo ">>> 扫描 PCIe 总线,查找 Xilinx XDMA 设备 ($VENDOR:$DEVICE) ..."
DEVICES=$(lspci -Dnnd ${VENDOR}:${DEVICE} | awk '{print $1}')if [ -z "$DEVICES" ]; thenecho "未发现 Xilinx XDMA 设备 ($VENDOR:$DEVICE)。"exit 1
fifor DEV in $DEVICES; doecho "------------------------------------------"echo ">>> 处理设备: $DEV"SYSFS_DEV="/sys/bus/pci/devices/0000:$DEV"if [ ! -d "$SYSFS_DEV" ]; thenecho "设备 $DEV 的 sysfs 路径不存在,跳过。"continuefiecho ">>> 移除设备 $DEV ..."echo 1 > "$SYSFS_DEV/remove"echo ">>> 重新扫描 PCIe 总线 ..."echo 1 > /sys/bus/pci/rescanecho ">>> 查看 BAR0 分配情况:"REGION_INFO=$(lspci -s $DEV -vvv | grep -A5 "Region 0")echo "$REGION_INFO"# 解析 BAR0 大小 (size=字段)BAR0_SIZE=$(echo "$REGION_INFO" | grep -oP "size=\K\S+")if [ -n "$BAR0_SIZE" ]; thenecho "BAR0 大小: $BAR0_SIZE"elseecho "BAR0 大小: 未检测到"fiecho ">>> 读取 BAR0 原始寄存器值:"BAR0_HEX=$(setpci -s $DEV BASE_ADDRESS_0)echo "BAR0 raw value = 0x$BAR0_HEX"# 检查 BAR0 是否有效if [[ "$BAR0_HEX" == "00000000" || "$BAR0_HEX" == "ffffffff" ]]; thenecho "!!! 警告: FPGA BAR0 未导出 (值=$BAR0_HEX)"echo ">>> 可能原因: FPGA bitstream 未配置 BAR0 或启动时序太慢,需检查硬件侧。"elseecho ">>> FPGA BAR0 看起来有效 (值=$BAR0_HEX)"fi
done

输出示例如下:

>>> 查看 BAR0 分配情况:
Region 0: Memory at 91c00000 (64-bit, non-prefetchable) [size=64K]
BAR0 大小: 64K
>>> 读取 BAR0 原始寄存器值:
BAR0 raw value = 0x91c00004
>>> FPGA BAR0 看起来有效 (值=0x91c00004)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/diannao/97572.shtml
繁体地址,请注明出处:http://hk.pswp.cn/diannao/97572.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

证明与激励:Walrus 可编程数据如何通过激励可用性证明获得安全性

Walrus 的可用性证明&#xff08;Proof of Availability&#xff0c;PoA&#xff09; 是部署在 Sui 上的链上凭证&#xff0c;它为数据托管创建了一个可验证的公开记录&#xff0c;并作为存储服务正式启动的标志。PoA 中的“激励”来自一个健全的经济框架&#xff1a;存储节点需…

云存储(参考自腾讯云计算工程师认证)

目录 存储基础知识&#xff1a; RAID&#xff1a; 云存储概述&#xff1a; 云存储产品&#xff1a; CBS&#xff1a; CFS文件存储&#xff1a; COS对象存储&#xff1a; 云存储安全&#xff1a; 存储基础知识&#xff1a; 机械硬盘&#xff1a;HDD&#xff0c;即传统硬…

面试tips--JVM(2)--对象创建的过程

一、创建对象的完整过程1. 类加载检查JVM 遇到 new 指令时&#xff0c;首先去检查这个类 User 是否已经被加载、解析和初始化过。如果没有&#xff0c;就先执行 类加载过程&#xff08;加载 .class 文件到方法区/元空间、创建 Class 对象等&#xff09;。【这个过程就是加载、验…

【Web安全】CRLF注入攻击深度解析:原理、场景与安全测试防御指南

文章目录前言&#xff1a;为什么CRLF注入是安全测试不可忽视的威胁&#xff1f;1. CRLF注入核心原理&#xff1a;从字符定义到协议依赖1.1 什么是CRLF&#xff1f;1.2 CRLF在HTTP协议中的关键作用1.3 CRLF注入的本质&#xff1a;格式混淆攻击2. CRLF注入典型利用场景与安全测试…

【安全学习】DVWA 靶场 SQL 注入漏洞原理分析与防御策略(教育用途)

注意&#xff1a;本文内容仅用于合法授权的安全研究、教学演示及漏洞复现&#xff0c;严禁用于任何未授权的系统或网络环境。 所有操作需在本地沙箱或个人可控靶场中执行&#xff0c;切勿对生产环境、他人系统进行测试&#xff0c;非法使用后果自负。&#x1f4cc; 法律与道德双…

Langflow Memory 技术深度分析

Langflow Memory 技术深度分析 1. Memory 技术概述和设计理念 1.1 技术概述 Langflow 的 Memory 系统是一个多层次的记忆管理框架&#xff0c;专门设计用于处理对话历史、上下文状态和会话数据的存储与检索。该系统采用了分层架构设计&#xff0c;支持多种记忆类型和存储后端&a…

从0开始搭建一个前端项目(vue + vite + less + typescript)

版本 node&#xff1a;v22.17.1 pnpm&#xff1a;v10.13.1 vue&#xff1a;^3.5.18 vite&#xff1a;^7.0.6 typescipt&#xff1a;~5.8.0脚手架初始化vue pnpm create vuelatest只选择&#xff1a; TypeScript, JSX 3. 用vscode打开创建的项目&#xff0c;并删除多余的代码esl…

(十)ps识别:Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型训练过程解析

Swin Transformer-T 与 ResNet50 结合的 PS 痕迹识别模型 思路分析模型融合思路&#xff1a; 利用ResNet50提取图像的局部纹理和边缘特征&#xff0c;这对检测篡改区域的细微变化非常重要利用Swin Transformer-T捕捉全局上下文信息和长距离依赖关系&#xff0c;有助于理解图像整…

[ICCV25]TRACE:用3D高斯直接学习物理参数,让AI“推演”未来场景

导读在复杂的动态世界中&#xff0c;让机器人既能看懂场景&#xff0c;又能预测未来变化&#xff0c;是一项极具挑战性的任务。过去的方法往往依赖人工标注或简化的物理模型&#xff0c;却难以真正捕捉物体运动的规律。TRACE 提出了一个全新的思路&#xff1a;把三维场景中的每…

电商数据开发实践:深度剖析1688商品详情 API 的技术与应用

在电商行业数字化转型的进程中&#xff0c;数据获取与处理的效率和准确性&#xff0c;直接影响着企业的竞争力。作为开发者&#xff0c;相信大家都遇到过这类棘手问题&#xff1a;在构建时&#xff0c;因数据不一致导致采购决策失误&#xff1b;使用传统&#xff0c;又常遭遇电…

Docker 详解+示例(部署Kafka镜像容器)

介 绍Docker 是一个开源的容器化平台&#xff0c;它的核心目标是解决 “软件在不同环境下运行不一致” 的问题&#xff0c;实现 “一次构建&#xff0c;到处运行” 。它基于 Linux 内核的底层技术&#xff0c;将应用程序及其依赖&#xff08;如库文件、配置、运行环境等&#x…

SciPy科学计算与应用:SciPy应用实战-数据分析与工程计算

SciPy案例研究&#xff1a;从理论到实践 学习目标 通过本课程&#xff0c;学员将了解一系列实际案例&#xff0c;深入探讨SciPy库在数据分析、物理模拟和工程计算中的应用。同时学员将学习如何利用SciPy解决实际问题&#xff0c;加深对SciPy各个模块的理解和应用能力。 相关知识…

React学习教程,从入门到精通, ReactJS - 架构(6)

ReactJS - 架构 React应用的架构 React的架构就像一个井然有序的厨房&#xff0c;每个工具都有其特定的位置和用途。在其核心&#xff0c;React遵循一个基于组件的架构&#xff0c;这意味着我们使用可重用的组件构建应用程序。 组件&#xff1a;构建块 可以把组件想象成乐高积木…

Bias / variance and neural networks|偏差/方差和神经网络

----------------------------------------------------------------------------------------------- 这是我在我的网站中截取的文章&#xff0c;有更多的文章欢迎来访问我自己的博客网站rn.berlinlian.cn&#xff0c;这里还有很多有关计算机的知识&#xff0c;欢迎进行留言或…

Linux HMM(Heterogeneous Memory Management)的应用

原理篇见【https://blog.csdn.net/shenjunpeng/article/details/150931847?spm1011.2415.3001.5331】 1. HMM 的优势与挑战 1.1 优势 统一虚拟地址空间&#xff1a;简化异构计算平台的数据共享和访问。 高效页表同步&#xff1a;支持设备端的 page fault 和页表同步&#x…

鸿蒙创新赛活动——Mac提交压缩失败后续

Mac提交压缩失败后续来了… 传送带【上一篇】 背景 华为2025HarmonyOS创新赛 上传作品的时候&#xff0c;遇到了一个提示 ZIP包中的Office文件含有嵌入文件&#xff0c;就去这个Office文件找&#xff0c;怎么也找不到嵌入的文件。 解决方法1 上次推荐的解决方式是&#xff0…

Ubuntu操作系统下使用mysql、mongodb、redis

目录 一、核心步骤概览 二. MySQL &#xff08;下面以其他用户为例&#xff09; 1,、安装 2、管理服务 3、连接与使用 4、配置文件位置 5、下面来演示一下安装好之后如何在Linux操作系统中远程登录和window互连Linux 远程登录 window连Linux&#xff08;连不上的&…

springboot java开发的rocketmq 顺序消息保证

首先要明确一个关键点&#xff1a;RocketMQ 保证的是一种局部顺序&#xff08;Partially Ordered&#xff09;​&#xff0c;而非全局顺序&#xff08;Globally Ordered&#xff09;。这意味着消息的顺序性只在某个特定维度&#xff08;比如同一个订单ID&#xff09;下保证&…

【机器学习】 14 Kernels

本章目录 14 Kernels 479 14.1 Introduction 479 14.2 Kernel functions 479 14.2.1 RBF kernels 480 14.2.2 Kernels for comparing documents 480 14.2.3 Mercer (positive definite) kernels 481 14.2.4 Linear kernels 482 14.2.5 Matern kernels 482 14.2.6 String kerne…

Android开发-工程结构

一、项目视图模式在开始之前&#xff0c;确保你的 Project 面板使用的是 【Android】 视图&#xff08;默认&#xff09;。这是最常用的视图&#xff0c;它将相关文件按功能逻辑分组展示。&#x1f4a1; 你也可以切换到 【Project】 视图查看完整的文件系统结构。二、顶级项目结…