NXP MCU 技术论坛
直播中

李华瑞

8年用户 1019经验值
私信 关注
[问答]

在RC测试中执行pcitest-S-r-s 1024后ep系统崩溃了怎么解决?

您好,我正在使用 S32G3 基于 BSP39 进行开发,我想将 PCIE 配置为 ep 模式。修改 pci-epf-test 驱动程序和 pcitest 后,数据传输正常,但 DMA 模式出现错误。ep 配置如下

--- a/arch/arm64/configs/s32cc_defconfig
b/arch/arm64/configs/s32cc_defconfig
@@ -87,6 87,11 @@ CONFIG_PCI_S32CC=y
config_pcie_dw_plat_host=y
config_pcie_dw_plat_ep=y
config_pci_endpoint=y
config_pci_s32cc_debug=y
config_pci_endpoint_configfs=y
config_pci_epf_test=y
config_pci_s32cc_ep_msi=y
config_pci_dw_dma=y
config_devtmpfs=y
config_devtmpfs_mount=y

系统将运行以下命令
cd /sys/kernel/config/pci_ep/
mkdir 函数/pci_epf_test/func1
echo 0x1957 > functions/pci_epf_test/func1/vendorid
echo 0x4300 > functions/pci_epf_test/func1/deviceid
echo 8 > functions/pci_epf_test/func1/msi_interrupts  
echo 16 > functions/pci_epf_test/func1/msix_interrupts
ln -s 函数/pci_epf_test/func1/ 控制器/40400000.pcie/
echo 1 > controllers/40400000.pcie/start
DMESG |尾巴 -20
dmesg 错误如下
[ 34.738272] pci_epf_test pci_epf_test.0:设置测试 BAR0
[ 34.738293] s32cc-pcie 40400000.pcie: func:0: 配置 BAR0: size=1048576F
[ 34.738317] s32cc-pcie 40400000.pcie: func:0: 配置 BAR2: size=4194304F
[ 34.738334] s32cc-pcie 40400000.pcie: func:0: 配置 BAR3: size=65536 bF
[ 34.738351] s32cc-pcie 40400000.pcie: func:0: 配置 BAR4: size=256 bytF
[ 34.738368] pci_epf_test pci_epf_test.0:配置 MSI-Xs
[ 34.738385] pci_epf_test pci_epf_test.0:无法获取 DMA 通道


在 RC 测试中执行 pcitest-S-r-s 1024 后 ep 系统崩溃
        

回帖(1)

淡淡的爱

2025-3-27 18:10:56

针对在S32G3平台配置PCIe EP模式时遇到的DMA错误和系统崩溃问题,以下是逐步解决方案:




1. 基础配置验证




  • 内核配置检查


    # 确保以下配置已启用(参考用户提供的补丁):
    CONFIG_PCI_S32CC=y
    CONFIG_PCIE_DW_PLAT_EP=y
    CONFIG_PCI_ENDPOINT_CONFIGFS=y
    CONFIG_PCI_EPF_TEST=y
    CONFIG_PCI_DW_DMA=y         # DMA支持必须显式开启

    若使用MSI/MSI-X中断,需确认:


    CONFIG_PCI_MSI=y
    CONFIG_PCI_S32CC_EP_MSI=y



  • 设备树配置
    检查EP模式设备树节点是否包含DMA相关属性,例如:


    pcie_ep: pcie@40400000 {
      compatible = "nxp,s32g3-pcie-ep";
      dma-ranges = <0x02000000 0x0 0x00000000 0x0 0x00000000 0x0 0x80000000>;
      #dma-cells = <2>;
      ...
    };





2. DMA相关调试




  • DMA地址映射检查



    • 使用dma_alloc_coherent()分配DMA缓冲区(而非kmalloc),确保物理地址对齐:
      buf = dma_alloc_coherent(dev, size, &dma_handle, GFP_KERNEL);

    • 验证DMA方向参数(如DMA_TO_DEVICEDMA_FROM_DEVICE)是否正确。




  • 缓存一致性处理



    • 在DMA传输前后调用dma_sync_single_for_device()/dma_sync_single_for_cpu()




  • 传输大小限制



    • 检查S32G3 PCIe控制器的DMA最大传输长度(如1024是否超限),调整测试命令参数:
      pcitest -r -s 512   # 尝试更小数据块






3. 中断配置排查




  • MSI/MSI-X状态检查


    lspci -vvv   # 查看Endpoint的Capabilities中MSI使能状态

    确保RC端已正确配置MSI支持。




  • 中断处理函数注册
    在驱动代码中确认中断处理函数是否注册,且无共享中断冲突:


    ret = request_irq(pci_irq_vector(pdev, 0), irq_handler, 0, "pcie-ep-dma", ctx);





4. 系统崩溃分析




  • 收集崩溃日志



    • 触发崩溃后通过串口或网络捕获内核日志(dmesg)。

    • 使用CONFIG_DEBUG_INFO=y编译内核,结合crash工具分析vmcore。




  • 常见崩溃场景



    • DMA访问越界:检查dma-ranges是否覆盖分配的缓冲区。

    • 空指针或竞态条件:在DMA启动前确认所有结构体(如struct pci_epf)已初始化。






5. 硬件与BSP兼容性




  • 勘误表查询
    查阅S32G3芯片勘误表,确认是否存在PCIe EP模式下的DMA硬件限制(如Errata eXXXX)。




  • BSP版本升级
    尝试升级到BSP39的最新补丁或NXP提供的PCIe EP补丁包:


    git fetch https://github.com/nxp-auto-linux/linux
    git checkout BSP39_update_pcie_ep





6. 简化测试验证



  • 分步测试命令
    # 1. 仅测试寄存器读写(排除DMA)
    pcitest -i
    # 2. 测试非DMA数据传输
    pcitest -r -s 64
    # 3. 启用DMA但关闭中断
    echo 0 > /sys/kernel/debug/pci_epf_test/irq_type
    pcitest -d -r -s 1024




7. 社区资源参考




  • NXP官方支持
    提交服务请求(Service Request)至NXP Support,附上崩溃日志和设备树配置。




  • 补丁应用
    若社区已有类似问题修复(如Linux PCI EP Framework Patch),尝试反向移植到BSP39。






总结步骤



  1. 启用完整DMA配置,验证设备树地址映射。

  2. 缩小DMA测试规模,逐步排除硬件限制。

  3. 捕获和分析崩溃日志,定位内存或中断问题。

  4. 升级BSP或应用补丁,修复已知兼容性问题。


通过以上步骤应能定位DMA错误根源,若仍无法解决,建议提供完整的dmesg日志和硬件寄存器状态(如pcie-regs dump)进一步分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分