This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] DRA829V:在进行 pice 枚举时遇到问题

Guru**** 2828655 points

Other Parts Discussed in Thread: DRA829V

请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1622767/dra829v-facing-issues-while-enumeration-of-pice

器件型号: DRA829V
Thread 中讨论的其他器件: DRA829

您好、

我在 EVM 中成功检测到 PCIe0、无法在定制板中检测到、当我比较这两个器件的寄存器时、我观察到了以下寄存器差异

1) 链路控制状态寄存器

在 EVM 中、负链路宽度为 0x1、但在我的板中、即使我在两者中加载了相同的 BSP 映像、该宽度为 0x2、

我的通道 1 硬件连接未连接、通道 0 已连接、我的端点是 RTL8111。

2) 链路控制状态 2 寄存器

TLS 字段在 EVM 中为 0x1、在我的板中为 0x4

Hasd 字段在 EVM 中为 1、在我的板中为 0x0

谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charan:

    很高兴再次在论坛上见到您。  

    对于 EVM 和定制硬件、他们是否都运行 QNX、或者是否运行 Linux 操作系统等不同的操作系统?

    此致、

    Takuma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Takuma:

    我将在下面的主题中解释相同的问题、

    https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1302064/sk-tda4vm-wrong-configuration-of-pcie-in-tda4vm-sk-board-qnx-bsp/4944192?tisearch=e2e-sitesearch&keymatch=qnx%20pcie#4944192

    我的电源时序也是正确的。

    问题可能是什么?

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charan:

    两个问题:

    1.您的定制硬件是否使用内部基准时钟(也称为 DRA829 是否为定制电路板上的 PCIe 插槽/器件提供 100MHz 基准时钟)? 或者、定制电路板是否采用与 TI EVM 相同的设计?它有一个独立于电路板中设计的 SoC 的时钟发生器器件、该时钟发生器器件为 SoC 和 PCIe 插槽提供参考时钟?

    2.在 PCIe 枚举期间、链路是否出现? 例如、在 TI 的 Linux 驱动程序中、有一个“Link Up“日志、一旦设置 LINKSTATUS 位、就会打印出来。  

    在任何情况下、如果定制电路板正在使用内部基准时钟并使用 QNX、则可能未启用基准时钟、或者如果已启用基准时钟、则会出现一些不稳定的情况。 我提出这些问题、因为这些问题也与您参考的 E2E 主题相关。

    此致、

    Takuma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Takuma:


    1) 我的定制电路板采用与 TI EVM 相同的设计、因为它具有一个独立于电路板中设计的 SoC 的时钟发生器器件、该时钟发生器器件为 SoC 和 PCIe 插槽提供参考时钟。

    2) 当检测到设备时、我在 PCI-tool -v 中看到该设备。

    3) 我观察到时钟发生器生成的时钟中存在抖动。 问题可能是什么?

    4) 如何确定问题是由于时钟不稳定,如何解决这一问题,以便成功检测 PCI 设备。

    谢谢。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charan:

    让我在硬件团队中循环、看看他们是否可以提供建议。  

    此致、

    Takuma

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Charan:

    感谢进行寄存器比较—这会很有帮助。 在开始后续步骤之前、简要说明这些值的作用:

    RTL8111 是一个 x1 器件、因此成功训练的链接将始终显示协商的链路宽度= x1。 您看到的 x2 值是 DRA829V 配置的宽度,而不是协商的结果 — 训练从未完成。 对于 TLS 字段、请注意链路控制 2 寄存器使用单热编码:0x1 = 2.5 TLS/s、0x2 = 5.0 TLS/s GT、0x4 = 8.0 GT GT (Gen3)。 显示 TLS = 0x4 的定制板实际上是第 3 代复位默认值、这是 DRA829V 的正确起始值。 EVM 显示 TLS = 0x1 (Gen1)、因为驱动程序成功地训练了与 RTL8111(Gen1 器件)的链路、并将 TLS 写下来以匹配。 HASD = 0 也是复位默认值—EVM 显示 hasd = 1、因为驱动程序在链路建立后会设置它。

    所有三个寄存器差异都告诉我们相同的情况:PCIe 驱动程序已在 EVM 上完成初始化、但从未在您的定制电路板上完成。

    以下是两项建议:

    1.读取 LTSSM 状态寄存器

    这将准确告诉我们培训的分解位置。 要查找的关键状态(根据 TRM 表 12-125):
    - 0x00–0x01(检测):SERDES 无法检测接收器—时钟或物理层问题
    - 0x02–0x03(轮询):检测到接收器但无法锁定—边缘时钟或信号完整性
    - 0x05–0x08(配置):轮询通过、但通道/宽度协商失败
    - 0x10 (L0):链路接通

    请分享此值—它将告诉我们下一步要去哪一个方向。

    2.将 CTRL_MMR0 SERDES 和 ACSPCIe 寄存器值与 EVM 进行比较(根据 TRM 第 12.2.4.3.1 节)

    即使使用相同的外部时钟发生器硬件、也必须在复位后配置 CTRL_MMR0 寄存器、以将 SERDES 通道路由到 PCIe 控制器并禁用 ACSPCIe 时钟输出缓冲器。 具体来说:

    -`CTRLMMR_SERDES0_LNX_CTRL`—对于活动通道上的 PCIe、`LANE_FUNC_SEL`必须设置为 0x1。 如果没有、SERDES 通道根本不会路由到 PCIe 控制器。
    - ACSPCIe `CLK_SEL`-由于您的电路板使用外部时钟发生器,这应该设置为 0x3(禁用),所以 DRA829V 不尝试驱动参考时钟输出,而外部发生器也驱动这些线路。

    如果定制电路板使用与 EVM 不同的器件树或电路板配置文件、则可能无法写入这些寄存器。

    此致、

    Jeff

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jeff:

    我将使用地址、寄存器名称、寄存器值粘贴定制电路板和 EVM 中读取的一些寄存器。

    为了您的建议、 我有  

    1) LTSSM 状态作为轮询配置 (0x03)。

    2)  LANE_FUNC_SEL 作为 0x1、关于 ACSPCIE、请参阅下面的寄存器转储。  

    谢谢。

    ******************* 定制板寄存器转储**********************

    /tmp/PCPCIe2 转储 Ie_Test_ WS_R4 转储

    x J721E PCIe 调试工具 x
    x 实例:PCIe2(定制板/SERDES_16G2)x
    x CFG base:0x0E000000 x
    X LM BASE:0x0E100000 x
    x 串行器/解串器:0x05020000 (SERDES_16G2) x

    x PCIe2(定制板/SERDES_16G2)
    X 寄存器转储【当前状态】


    ****** CTRL_MMR ******

    [0x001040E8] SERDES_CTRL = 0x00000000
    通道 func [1:0]= 0(PCIe 模式正常)
    [0x001040A0] CTRLMMR_SERDES_LN0_CTRL = 0x00000001
    [0x001040A4] CTRLMMR_SERDES_LN1_CTRL = 0x00000001
    [0x00118090] CTRLMMR_ACSPCIE0_CTRL = 0x01000000
    [0x00118094] CTRLMMR_ACSPCIE1_CTRL = 0x0100003
    [0x00108078] CTRLMMR_PCIE_REFCLK_CLKSEL = 0x00000100
    [0x00108088] CTRLMMR_PCIE_CLKSEL = 0x00000000
    PLL LOCK [1]= 0(未锁定)
    [0x00104078] PCIe_CTRL = 0x00000183
    启用[0]= 1(启用)

    **** SERDES_16G2 wiz [BASE=0x05020000]******

    [0x05020404] SERDES_CTRL = 0x00000000
    POR_EN [31 ]= 0(正常)
    [0x05020408] SERDES_TOP_CTRL = 0x1A000000
    REFCLK_MODE [31:30]= 0((PCIe+ 100MHz 校正)
    REFCLK_DIG_DIV[27:26]=2((100MHz 为 div4(正确))
    [0x0502040C] SERDES_RST = 0xB1000000
    PHY_RESET_N [31]= 1(已释放(正在运行))
    PLL0_REFCLK_SEL[28]= 1(内部)
    REFCLK_DIG_SEL-25:24]=1(检查)
    [0x05020414] SERDES_CORE_STATUS = 0x80000000
    MACRO PWR_EN_ACK[31]= 1(上电完成)
    [0x0502048C] LANESTS0 = 0x00000003
    P0_RPWR_EN_ACK [0]= 1(通道就绪)

    ****** SERDES_16G2 Cadence PHY 内核*****

    [0x05020080] CMN_PLLLC_STATUS_A = 0x00000095
    已锁定[7]= 1(PLL 锁定)
    DCOCAL_DONE [6]= 0
    [0x0502E000] PHY_PMA_CMN_CTRL = 0x00002435
    cmn_plllc_locked[2]= 1
    CMN_READY [0]= 1(CMN 就绪)
    [0x0502C01C] PHY_PLL_CFG = 0x00000011(复位= 0x11)
    SINGLE_LINK_PCIE[0]= 1(正确)

    ****** PCIe2(定制板/SERDES_16G2)PCIe LM ***

    [0x0E000000] VendorID/DevID = 0x010017CD(RC 可访问)
    [0x0E10000] PL_CONFIG_0 = 0x03000022
    LTSSM [29:24]= 0x03 Polling.Configuration
    RFC [15:8]= 0((EP 从不响应)
    MLE [31]= 0
    [0x0E100004] PL_CONFIG_1 = 0x40808000
    [0x0E0000D0] LINK_CTRL_STS = 0x00210000
    DLLA [29]= 0(未上电)
    NLW [25:20]= x2(不是 x1 --与 RTL8111 不匹配!)
    NLS [19:16]= Gen1 2.5GT/s
    ASPM [1:0]= 0x0(正常禁用)
    [0x0E0000F0] LINK_CTRL_STS2 = 0x00010004
    TLS [3:0]= 0x4(自动)
    Hasd [5]= 0
    [0x0E100238] PHY_STATUS_1 = 0x00000000(无错误)
    [0x0E10020C] LOCAL_ERR_STS = 0x00000000
    [0x0E100D00] LOCAL_ERR_STS2 = 0x00000000
    [0x0E100200] LANE_MAP = 0x00000000
    [0x0E100204] FTS_COUNT = 0x00000000 (EP FTS=0)

    *** 根本原因摘要***
    CTRL_MMR 配置=是
    串行器/解串器 POR_EN=0 =是
    串行器/解串器 PHY_RESET_N=1 =是
    串行器/解串器宏 PWR_EN_ACK =是
    SERDES PLL 已锁定=是
    串行器/解串器通道就绪=是
    PCIe RC 可访问=是
    LTSSM 左侧检测.quiet =是
    链路宽度 x1 (RTL8111)=无<-- NLW=x%u 不匹配!

    #
    #
    #/VATC/PCPCIe2 轮询 Ie_Test_ WS_R4 PCIe2 轮询

    x J721E PCIe 调试工具 x
    x 实例:PCIe2(定制板/SERDES_16G2)x
    x CFG base:0x0E000000 x
    X LM BASE:0x0E100000 x
    x 串行器/解串器:0x05020000 (SERDES_16G2) x

    x PCIe2(定制板/SERDES_16G2)
    X LTSSM 实时轮询 (1000ms)

    [ 0ms] 0x03 Polling.Configuration
    已完成。 1 个转换。 最终 LTSSM=0x03 Polling.Configuration

    #

    ***   EVM  寄存器转储  **************

    #/tmp/PCIe_Test_ pcie0 dump
    ╔══════════════════════════════════════════════╗μ s
    ║J721E PCIe Debug Tool║
    ║实例:PCIE0 (EVM/SERDES_16G0)║
    ║CFG base:0x0D000000║
    ║LM BASE:0x0D100000║
    ║SERDES:0x05000000 (SERDES_16G0)║
    ╚══════════════════════════════════════════════╝μ s

    ╔══════════════════════════════════════════════╗μ s
    ║PCIE0 (EVM/SERDES_16G0)
    ║寄存器转储【当前状态】
    ╚══════════════════════════════════════════════╝μ s

    ────CTRL_MMR─────────────────────────────────────────
    [0x001040E0] SERDES_CTRL = 0x00000000
    通道 func [1:0]= 0(PCIe 模式正常)
    [0x00104080] CTRLMMR_SERDES_LN0_CTRL = 0x00000001
    [0x00104084] CTRLMMR_SERDES_LN1_CTRL = 0x00000001
    [0x00118090] CTRLMMR_ACSPCIE0_CTRL = 0x01000000
    [0x00118094] CTRLMMR_ACSPCIE1_CTRL = 0x0100003
    [0x00108070] CTRLMMR_PCIE_REFCLK_CLKSEL = 0x00000100
    [0x00108080] CTRLMMR_PCIE_CLKSEL = 0x00000000
    PLL LOCK [1]= 0(未锁定)
    [0x00104070] PCIe_CTRL = 0x00000183
    启用[0]= 1(启用)

    ────SERDES_16G0 wiz [base=0x05000000]──────────────────────
    [0x05000404] SERDES_CTRL = 0x00000000
    POR_EN [31 ]= 0(正常)
    [0x05000408] SERDES_TOP_CTRL = 0x1A000000
    REFCLK_MODE [31:30]= 0((PCIe+ 100MHz 校正)
    REFCLK_DIG_DIV[27:26]=2((100MHz 为 div4(正确))
    [0x0500040C] SERDES_RST = 0xB1000000
    PHY_RESET_N [31]= 1(已释放(正在运行))
    PLL0_REFCLK_SEL[28]= 1(内部)
    REFCLK_DIG_SEL-25:24]=1(检查)
    [0x05000414] SERDES_CORE_STATUS = 0x80000000
    MACRO PWR_EN_ACK[31]= 1(上电完成)
    [0x0500048C] LANESTS0 = 0x00000003
    P0_RPWR_EN_ACK [0]= 1(通道就绪)

    ────SERDES_16G0 Cadence PHY Core───────────────────────
    [0x05000080] CMN_PLLLC_STATUS_A = 0x00000094
    已锁定[7]= 1(PLL 锁定)
    DCOCAL_DONE [6]= 0
    [0x0500E000] PHY_PMA_CMN_CTRL = 0x00002435
    cmn_plllc_locked[2]= 1
    CMN_READY [0]= 1(CMN 就绪)
    [0x0500C01C] PHY_PLL_CFG = 0x00000011(复位= 0x11)
    SINGLE_LINK_PCIE[0]= 1(正确)

    ────PCIE0 (EVM/SERDES_16G0) PCIe LM────────────────────────────────
    [0x0D000000] VendorID/DevID = 0x010017CD(RC 可访问)
    [0x0D10000] PL_CONFIG_0 = 0x1000FF21
    LTSSM [29:24]= 0x10 L0 L0 ***链路建立***
    RFC [15:8]= 255 (EP 传输 TS)
    MLE [31]= 0
    [0x0D100004] PL_CONFIG_1 = 0x40808000
    [0x0D0000D0] LINK_CTRL_STS = 0x00110000
    DLLA [29]= 0(未上电)
    NLW [25:20]= x1(对于 RTL8111、x1 正确)
    NLS [19:16]= Gen1 2.5GT/s
    ASPM [1:0]= 0x0(正常禁用)
    [0x0D0000F0] LINK_CTRL_STS2 = 0x00010004
    TLS [3:0]= 0x4(自动)
    Hasd [5]= 0
    [0x0D100238] PHY_STATUS_1 = 0x00000000(无错误)
    [0x0D10020C] LOCAL_ERR_STS = 0x00000000
    [0x0D100D00] LOCAL_ERR_STS2 = 0x00000000
    [0x0D100200] LANE_MAP = 0x00000001
    [0x0D100204] FTS_COUNT = 0x00000000 (EP FTS=0)

    ────根本原因摘要───────────────────────────────────
    CTRL_MMR 配置=是
    串行器/解串器 POR_EN=0 =是
    串行器/解串器 PHY_RESET_N=1 =是
    串行器/解串器宏 PWR_EN_ACK =是
    SERDES PLL 已锁定=是
    串行器/解串器通道就绪=是
    PCIe RC 可访问=是
    LTSSM 左侧检测.quiet =是
    链路宽度 x1 (RTL8111)=是

    #
    #/tmp/PCIe_Test_ pcie0 polling
    ╔══════════════════════════════════════════════╗μ s
    ║J721E PCIe Debug Tool║
    ║实例:PCIE0 (EVM/SERDES_16G0)║
    ║CFG base:0x0D000000║
    ║LM BASE:0x0D100000║
    ║SERDES:0x05000000 (SERDES_16G0)║
    ╚══════════════════════════════════════════════╝μ s

    ╔══════════════════════════════════════════════╗μ s
    ║PCIE0 (EVM/SERDES_16G0)
    ║LTSSM 实时轮询 (1000ms)
    ╚══════════════════════════════════════════════╝μ s
    [0ms] 0x10 L0 ***链路接通***
    已完成。 1 个转换。 最终 LTSSM=0x10 L0 L2***链路接通***

    #

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Charan:

    感谢您提供详细的寄存器转储。 您的 CTRL_MMR 配置正确 — 所有值都与 EVM 匹配。 SERDES 已完全初始化(PLL 锁定、通道就绪、CMN 就绪)。 问题似乎不是软件配置。

    查看 PL_CONFIG_0、您的定制电路板和 EVM 之间有一个明显的差异:

    -定制板:`0x03000022`→LTSSM = 0x03 (Polling.Configuration“), NLC = x2. 、LS = 0(培训未完成)
    - EVM:`0x1000FF21`→LTSSM = 0x10(L0,链路建立)、NLC = x1 、LS = 1(培训完成)

    您的 PCIe 控制器正在尝试 X2 链路 、同时将 EVM 配置为 x1 。 RTL8111 是一个 x1 器件、仅连接了通道 0、因此 x2 不正确。 这很重要、因为 PCIe 规范要求所有检测到接收器的通道先完成训练序列交换、然后 LTSSM 才能立即退出轮询。激活(PCIe 基础规范第 4.2.6.2.1 节)。 在使用 x2 时、如果训练中包含未连接的通道 1、则永远不会满足此条件—迫使控制器进入较慢的超时路径、从而可能导致链路无法成功训练。

    请按顺序尝试以下操作:

    1.在 BSP 或设备树中为 x1 链路宽度配置 PCIe2

    这是我们可以在您的电路板和 EVM 之间看到的唯一配置差异。 检查您的设备树中是否存在此 PCIe 实例的`num-lanes`属性(或 QNX 中的等效项)、并将其设置为 1。

    2.如果链路在 x1 处仍然失败,请在上电期间捕获示波器测量值

    我们需要将所有三个信号都置于同一时基上:
    - PERST#  在 RTL8111 引脚上(在上电期间应为低电平,然后变为高电平 — 根据 PCIe CEM 规范 T_PVPERL、电源轨稳定后必须至少保持低电平 100ms)
    - 3.3V 电源轨  RTL8111
    - REFCLK  在 RTL8111 输入端(在 PERST#置为无效之前必须运行并保持稳定—您提到了观察时钟发生器上的抖动,因此量化这一点很重要)

    注意:DRA829V 的 SERDES PLL 已锁定 (CMN_PLLLC_STATUS_A 已锁定= 1)、因此 DRA829V 侧的时钟足以进行 PLL 锁定。 如果存在时钟问题、则会出现在 RTL8111 的路径中。

    请先尝试 x1 更改、并告知我们结果。

    此致、
    Jeff
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    尊敬的 Jeff:

    我更改为 x1、但 LTSSM 状态仍处于轮询配置。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Charan:

    感谢您尝试使用 x1 更改。 您能 分享一个更新后的寄存器转储吗?  我想 确认 PL_CONFIG_0 中实际反映的 x1 更改 (NLC [2:1]现在的读数应为 00、而不是 01)。 我还想了解 RFC [15:8]是否已更改。 上一次运行的转储格式很好。 您还可以查看以下内容吗?
    ——
    1.示波器捕获:RTL8111(最高优先级)处的 REFCLK 和 PERST#

    您提到了观察时钟发生器上的抖动。 DRA829V 自己的 SERDES PLL 经确认已锁定、任何剩余的时钟质量问题几乎可以肯定地出现在 RTL8111 路径中。 RTL8111 输入端的糟糕 REFCLK 会阻止其进入 Polling.Active—它不会将 TS1 发送回 DRA829V、并且 Polling.Configuration 中的 TS2 握手永远不会完成。

    在上电/复位循环期间、请在同一示波器时基上捕获以下内容:

    - RTL8111 CLKP/CLKN 输入引脚处的 REFCLK 应是稳定的 100MHz±300ppm 差分信号、存在并在 PERST#置为无效之前稳定下来。
    - 在 RTL8111 PERST#引脚上的 PERST#—应在上电时干净地置位,没有干扰或反弹,然后在电源稳定后置为无效。
    - RTL8111 VCC3.3 电源上的 3.3V 电源轨 — 在 PERST#置为无效之前应保持稳定至少 100ms(PCIe CEM 规格 T_PVPERL 要求)。

    该序列必须为:3.3V 稳定→REFCLK 稳定→PERST#置为无效。 如果在 PERST#置为无效之前 REFCLK 不存在并保持稳定、RTL8111 无法初始化。
    ——
    2.验证通道 0 信号路径路由

    请从原理图中确认以下内容:

    - DRA829V SERDES 通道 0 TX+/TX- →RTL8111 RX+/RX-- 正确的通道、正确的极性(不与通道 1 交换,不是极性反转)
    - RTL8111 TX+/TX-→ DRA829V SERDES Lane 0 RX+/RX-- 正确的通道、正确的极性
    - 在所有四个差分对( TX 和 RX 方向)上都有交流耦合电容器。 根据 PCIe 基本规范表 8-8、CTX 必须为 176nF–265nF。
    无论软件配置如何、此处的单个错误连接都会阻止训练。

    ——
    此致、
    Jeff