pcie应用记录 - pcie中断

项目场景:

(1)fpga与国产龙芯3A3000 cpu主板通过pcie总线进行通信;
(2)主板采用rework国产实时嵌入式操作系统,fpga部分为xlinx a7系列及 xilinx 7x pcie ip核;
(3)fpga板卡负责接收主板控制指令完成数据采集、dma数据传输等功能。


问题描述

项目中遇到的问题:

在调试pcie中断时,出现龙芯未识别到pcie设备发来的中断请求,因此对中断问题进行排查。
这里吐槽下龙芯适配的reworks操作系统,不支持msi中断,只能支持传统中断inta,不过pcie对传统中断和msi中断都是支持的,用法都差不多。

原因分析:

原因主要有两种:
(1)fpga部分发出了中断请求,主板中断控制器未识别到;
(2)fpga部分根本未发出中断请求。
从上面两个原因去分析问题,问题定位过程:
(1)根据主板pcie接口电路设计,与fpga板卡对接的pcie为cpu的f0 pcie通道,根据龙芯3a3000 cpu手册,主机分配的中断line为32 - 35之间;
(2)主板根据硬件设计,定位pcie设备中断line是哪个值,根据软件人员排查,32-35没有一个中断产生。。。。
(3)那么问题可能出在fpga板卡部分,那么就查阅pg054 ip核手册,分析xilinx 7x pcie ip中断应用时序图,此时序图如下:
传统中断时序图
关于时序图的说明看下图:
在这里插入图片描述
(4)其中关键信号:cfg_interrup

### 关于 nwl-pcie 设备在地址 `fd0e0000` 上报 Non-Fatal Error 的解决方案和原因 #### 错误背景 Non-Fatal Error 是 PCIe 总线中的错误类型之一,通常表示某些传输失败或协议违规的情况,但并不会导致整个系统的崩溃。这种类型的错误可能源于硬件配置不当、固件问题或者软件驱动的不兼容性[^1]。 对于 Xilinx NWL-PCIE 控制器(位于设备树节点 `pcie@fd0e0000`),其具体行为可以通过设备树属性以及 Linux 内核日志进一步分析。以下是可能导致该错误的原因及其解决方法: --- #### 可能原因及解决方案 ##### 1. **中断映射配置错误** 中断映射表 (`interrupt-map`) 和掩码 (`interrupt-map-mask`) 定义了如何将 PCIe 功能号 (Function Number) 映射到 CPU 的中断控制器。如果这些字段设置不正确,则可能会触发 AER (Advanced Error Reporting) 报告中的 Non-Fatal Errors。 - 检查设备树中定义的 `interrupt-map` 是否与实际硬件一致[^2]。 ```dts interrupt-map = <0x0 0x0 0x0 0x1 0x14 0x1 ...>; ``` - 如果存在多个功能号 (Functions),需逐一验证每个功能号的中断路由是否正确。 ##### 2. **内存区域冲突** 地址空间分配不合理也可能引发此类错误。例如,`ranges` 属性指定了 PCIe 子系统内部 BAR 空间与主机物理地址之间的转换关系。如果范围重叠或超出可用资源,则可能出现访问异常。 - 查看 `ranges` 参数是否有重复或越界情况: ```dts ranges = <0x2000000 0x0 0xe1000000 0x0 0xe1000000 0x0 0xf000000>; ``` - 使用工具如 `lspci -vvv` 或者内核调试选项确认当前 PCIe 资源分配状态。 ##### 3. **AER 配置未禁用** Advanced Error Reporting (AER) 默认启用时会对所有潜在错误敏感。即使是一些轻微的问题也会被记录为 Non-Fatal Events。因此,在特定场景下可以选择关闭此特性以减少干扰。 - 修改设备树文件并重新编译加载新版本 DTS 文件: ```dts pcie@fd0e0000 { aer-enable = <0>; /* Disable AER */ }; ``` - 注意:仅适用于不需要严格监控低级别错误的应用环境。 ##### 4. **驱动初始化不足** 根据描述,“Linux PCI 驱动框架”说明文档指出,PCIe 主机端驱动依赖 platform_bus 架构完成绑定流程。一旦某个阶段缺失必要的参数传递,便有可能造成后续运行期间不稳定现象发生。 - 对应代码片段如下所示: ```c static int __init pci_host_init(void) { struct platform_device *pdev; pdev = platform_device_register_simple("nwl_pcie", -1, NULL, 0); if (!pdev || IS_ERR(pdev)) return PTR_ERR(pdev); return 0; } module_init(pci_host_init); ``` - 确认模块加载过程中是否存在警告信息,并依据提示调整调用逻辑。 ##### 5. **外部因素影响** 物理链路质量下降同样会间接引起数据包丢失等问题从而激活相应的纠错机制。比如电缆过长、连接松动等情况均属于常见诱因之一。 - 测试更换不同规格转接卡适配器; - 尝试降低速率模式至 Gen1/Gen2 进行对比测试。 --- ### 结论 综上所述,针对 `nwl-pcie fd0e0000.pcie Non-Fatal Error Detected` 的处理可以从以下几个方面入手:校验设备树配置项准确性;优化资源配置策略;合理控制高级别报告开关状态;完善底层支持库接口设计;排除外界噪声干扰可能性等多维度综合考量最终达到解决问题的目的。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值