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.

[参考译文] AM6442:无法启用 PCIe 的通用时钟。 (续)

Guru**** 2466550 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1458527/am6442-the-common-clock-for-pcie-cannot-be-enabled-continued

器件型号:AM6442

工具与软件:

我没有意识到你已经回答了。 我很抱歉。

刘三说:  

>请确认 Dominic 所说的内容是否是您需要的。

有。 我想检查"lspci"命令中的参考时钟类型。

目前、我已应用以下 URL 指示的设置、但"lspci"命令未输出使用外部参考时钟的设置。 (LnkCtl -> CommClk 和 LnkSta -> SlotClk 为"-")

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1046015/am6442-pcie-external-reference-clock

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1290642/am6442-pcie-external-reference-clcokk3-am64-main.dtsi

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

    尊敬的 Masanobu-San:

    lspci 命令似乎从 PCI 配置空间获取 slotclk 信息。 但是、我看了内核 PCIe 驱动程序、AM64x PCI REFCLK 类型似乎没有填充到 PCI 配置空间中。

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

    尊敬的 Liu-San:

    感谢您的答复。

    lspci 命令似乎从 PCI 配置空间获取 slotclk 信息。 但是、我看了内核 PCIe 驱动程序、AM64x PCI REFCLK 类型似乎没有填充到 PCI 配置空间中。

    这是否是 TI 提供的 Linux 的当前规格限制?

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

    尊敬的 Masanobu-San:

    我搜索了 Linux 内核中的所有 PCI 控制器驱动程序、只有两个驱动程序操作 PCI 配置空间中的"SlotClk"位、大多数 PCI 控制器驱动程序根本不接触此位、因此我对 lspci 命令报告中的 SlotClk 信息没有进一步的评论。

    但我的问题是、为什么需要使用 lspci 命令检查此信息? 您是否已经知道系统硬件/软件设计完成且未更改时的 PCI 通用时钟配置?

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

    您好 Bin、

    [报价 userid="7730" url="~/support/processors-group/processors/f/processors-forum/1458527/am6442-the-common-clock-for-pcie-cannot-be-enabled-continued/5608618 #5608618"]但我的问题是为什么需要使用 lspci 命令检查此信息? 您是否已经知道系统硬件/软件设计完成且没有更改时的 PCI 通用时钟配置?[/QUOT]

    我想等待 Masanobu-san 的回应是有道理的,但一般来说,主机可以(从我的经验来看)根据这个位的行为不同。 PCIe 规范规定、系统固件应该位来确定如何设置通用时钟配置(链路控制中的位6)。

    我在 MSI 主板上使用 Intel CPU 和使用 AM64x 作为 EP 的设置中发现通信错误、具体取决于时隙时钟配置位中报告的值。 IIRC 这与展频时钟有关。 为使问题复杂化、这些通信错误可能不会立即可见、因为它们通常是可纠正的(但当然会影响吞吐量和延迟)。

    PCIe 规范还提到、机电外形规格可能需要使用通用时钟。 PCIe Express 卡机电规范(即通常认为 PCIe 卡插入 PCIe 插槽的规范)具有该要求。

    此致、

    Dominic

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

    尊敬的 Liu-San、Rath-San:

    感谢您的重播。

    刘三说:  

    但我的问题是、为什么需要使用 lspci 命令检查此信息? 您是否已经知道系统硬件/软件设计完成且未更改时的 PCI 通用时钟配置?

    我想检查是否应用了器件树中的 PCIe 时钟设置、但是除了直接读取 PCIe 寄存器或对其进行物理测量之外没有其他方法?
    此外、正如 Rath-san 所说、lspci 结果中显示的信息是否会影响其他内核模块和应用程序的操作? 我认为 lspci 用于获取信息的接口返回的结果不使用公共时钟、但这样可以吗?

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

    尊敬的 Masanobu-San:

    [报价 userid="575454" url="~/support/processors-group/processors/f/processors-forum/1458527/am6442-the-common-clock-for-pcie-cannot-be-enabled-continued/5621549 #5621549"]我想检查是否应用了器件树中的 PCIe 时钟设置、但是除了直接读取 PCIe 寄存器或对它们进行物理测量之外、没有其他办法?

    如果我确实想知道时钟设置、我会读取寄存器、检查 devicetree 设置、或通过物理方式测量它们。

    但是、Dominic 提出了一个很好的问题-如果 PCIe RC 需要 EP 时钟设置进行相应操作。 我不知道答案、但我会与我们的开发团队核实并与您联系。

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

    尊敬的 Masanobu-San:

    以下内核补丁将在根复合体配置空间中设置时隙时钟配置。 使用此补丁时、lspci 命令应该显示"SlotClk+"。

    diff --git a/drivers/pci/controller/cadence/pcie-cadence-host.c b/drivers/pci/controller/cadence/pcie-cadence-host.c
    index 3ab5ffc76167..08585fa488c2 100644
    --- a/drivers/pci/controller/cadence/pcie-cadence-host.c
    +++ b/drivers/pci/controller/cadence/pcie-cadence-host.c
    @@ -191,6 +191,7 @@ static int cdns_pcie_host_init_root_port(struct cdns_pcie_rc *rc)
            struct cdns_pcie *pcie = &rc->pcie;
            u32 value, ctrl;
            u32 id;
    +       u16 lnk_stat;
     
            /*
             * Set the root complex BAR configuration register:
    @@ -223,6 +224,12 @@ static int cdns_pcie_host_init_root_port(struct cdns_pcie_rc *rc)
            cdns_pcie_rp_writeb(pcie, PCI_CLASS_PROG, 0);
            cdns_pcie_rp_writew(pcie, PCI_CLASS_DEVICE, PCI_CLASS_BRIDGE_PCI);
     
    +       /* set Slot Clock Configuration */
    +       lnk_stat = cdns_pcie_rp_readw(pcie, CDNS_PCIE_RP_CAP_OFFSET + PCI_EXP_LNKSTA);
    +       lnk_stat |= PCI_EXP_LNKSTA_SLC;
    +       cdns_pcie_rp_writew(pcie, CDNS_PCIE_RP_CAP_OFFSET + PCI_EXP_LNKSTA, lnk_stat);
    +
    +
            return 0;
     }

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

    大家好、刘三

    感谢您的答复。

    我来试试这个补丁。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、如 Rath-san 所说、lspci 结果中显示的信息是否会影响其他内核模块和应用程序的运行? 我认为 lspci 用于获取信息的接口返回的结果不使用通用时钟、但这样可以吗?[/QUOT]

    我想说的是、根据 PCIe 规范、RC 可能会使用这些信息并调整其行为。 在通常已发生在 UEFI BIOS 中的 x86上。 不确定 Linux 内核是否会根据该位而采取不同的做法。

    我的重点是:规范描述了这个位、我从 BIOS 源代码中知道他们正在评估这个位、如果没有正确设置这个位、就需要麻烦。

    关于您的意图:

    我想检查是否应用了设备树中的 PCIe 时钟设置

    据我所知、Bin 的补丁无条件地设置了该位。 这意味着您仍然无法使用该位来检查器件树是否配置了通用基准时钟。

    我会在 SERDES_RST 寄存器位[24]中查找差异。 该寄存器的偏移量应为0x40c (https://github.com/TexasInstruments/linux-kernel/blob/ti-mainline/drivers/phy/ti/phy-j721e-wiz.c#L38)、SerDes 的偏移量为0x0F000000、因此地址为0x0f00040c。 遗憾的是、AM64x 未记录串行器/解串器寄存器。 或许 Bin 可以帮助您解决该问题。

    此致、

    Dominic

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

    您好、Dominic:

    我必须深入研究串行器/解串器内部文档以了解寄存器详细信息、但此处的问题是解决方案涉及两个"不相关"内核驱动程序- REFCLK 配置在串行器/解串器驱动程序中、但 PCI Config Space 在 PCIe 驱动程序中进行了修改。 这两个驱动器不直接相互通信。 原因有很多解决方案、例如、在 devicetre 中定义 PCIe 驱动程序可以查询 SerDes 寄存器的链接、但由于我没有找到任何其他内核 PCI 控制器驱动程序会针对"SlotClk"信息修改 PCI Config Space、我想只使用我上面发布的解决方案、因为我们已经知道 SerDes 器件已更改为使用外部 REFCLK、因此不会在 Linux 运行时更改。