作者:AMD 工程师 Iris Yang & Deepesh Man Shakya
本篇文章提供了解决 ATS 失效请求报文问题的故障排除步骤,主要聚焦在 CQ 接口上未显示主机发送的报文的情况。
ATS 失效使用 对于在支持地址转换服务 (ATS) 的 PCIe 系统中保持地址转换表的准确性而言,ATS 失效请求报文至关重要。 只要系统中包含执行地址转换的器件(如使用 I/O 存储器管理单元 (IOMMU) 的器件),那么这类系统就与 ATS 失效请求报文密不可分。AT 失效请求报文旨在通知 PCIe 器件,其地址转换高速缓存(包含器件地址与系统地址之间的映射)中的特定条目已过时,应使其失效。如果您遇到主机发送 ATS 失效请求报文但 CQ 侧未接收到该报文的情况,请按照以下步骤对问题进行调试。 确保 CQ 接口接收到 ATS 失效请求报文
检查 CQ 接口,验证是否存在 ATS 失效请求报文。
使用 CQ_tvalid 作为 ILA (Integrated Logic Analyzer) 捕获的触发器,在传输事务中仅有 ATS 失效报文或 TLP(传输事务层包)数量有限的情况下尤其如此。
ATS 报文格式如下:
以上截图来自《Versal Adaptive SoC CPM Mode for PCI Express 产品指南》(PG346) 中的“完成器请求描述符格式”:
https://docs.amd.com/r/3.1-English/pg346-cpm-pcie/Completer-Request-Descriptor-Formats
验证是否已从主机发送该报文 使用协议分析器检查是否已从主机发射了含“ATS_Invalidation_request”代码的报文。 协议分析器应明确显示正在发送此报文。建议您在观察到此报文缺失时对其进行验证。 如果您没有协议分析器,请跳过这一部分。以下截图显示的是出现 ATS 失效请求报文时,在协议分析器中应显示的内容。
确保已启用 ATS 功能
在 AMD Vivado™ Design Suite 中,导航至 IP 核配置 GUI。在“Advanced”选项下,验证 ATS 功能是否已启用。
确认 ATS 已启用
确保在 lspci 中已经显示 ATS 功能被启用并且在控制寄存器中 Host 已经将 ATS 使能位置位。
您可使用 lspci 命令完成此项检查,该命令会列出 PCI 器件及其配置。
验证 CPM 中的 ATS 支持寄存器
验证 ATS_cap_glbl_inv_ support_x 寄存器是否已启用。您可在 .cdo 文件中或通过 XSDB 进行此项检查,如下所示:
基于寄存器对 Versal Adaptive SoC CPM Mode for PCI Express 设计进行调试:
https://adaptivesupport.amd.com/s/article/1221922?language=zh_CN
在以下 CDO 截图中,对地址 0xfce89bcc 写入 1。此设置用于启用 ATS 全局失效。
确保报文路由寄存器配置正确
确保已正确设置报文路由寄存器,以便路由 ATS 报文。
通过设置 AXISTEN_IF_ENABLE_MSG_ROUTE 寄存器来启用 MSG_ROUTE。
为便于调试,请将 0xFFFFFFFF 写入该寄存器。如需了解每个位的定义,请参阅相关寄存器文档:
https://docs.amd.com/r/en-US/am012-versal-register-reference
在以下截图中,对地址 0xfce88060 写入 0x0020000,这样仅启用 MSG_ROUTE 寄存器的第 17 位(失效请求)。
总结
本文演示了验证 ATS 报文是否正确传播的调试步骤。以下是上述步骤的摘要。
确认 CQ 接口:使用 CQ_tvalid 确认正在接收 ATS 报文。
验证主机发射:使用协议分析器确保主机已发送“ATS_Invalidation_request”报文。
启用 ATS 功能:通过检查 lspci 日志,确认 ATS 已启用。
检查 ATS 寄存器:确保已通过 .cdo 或 XSDB 激活 ATS_cap_glbl_inv 寄存器。
配置报文路由:为调试目的,将 AXISTEN_IF_ENABLE_MSG_ROUTE 寄存器设置为 0xFFFFFFFF。