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.

[参考译文] TMDSEVM6678:64位 ARM 主机的 PCIe 引导加载程序问题

Guru**** 2558250 points
Other Parts Discussed in Thread: 66AK2H12

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/575654/tmdsevm6678-pcie-boot-loader-issue-with-64-bit-arm-host

器件型号:TMDSEVM6678
主题中讨论的其他器件:66AK2H12

大家好、

我在 TMDSEVM6678L (修订版3B)上遇到 PCIe 引导加载程序问题。

引导加载程序基于 PDK v2.2.4中的 PCIe 驱动程序示例、该示例位于 packages/ti/drv/PCIe/example/sample/src/中。
我删除了不适用于我们的应用的内容(如出站映射)、并添加了 DDR 的初始化。

在主机端、有一个内核驱动程序、该内核驱动程序基于来自同一 PDK 的 PCIe 演示 Linux 主机加载程序、位于 packages/ti/boot/examples/PCIe/linux_host_loader/中。
我已将代码重新计入位、并删除了一些我们不需要的器件(例如 DMA 传输)。

还有一个加载器工具、用于通过内核驱动程序的器件文件将引导表二进制文件写入器件。

我随源代码附上了一个 ZIP 文件。


这在台式计算机上都可以正常工作、这意味着我可以访问各种存储器并引导各个内核。
当我尝试将其与64位 ARM 主机(更具体地说是 NXP LS1043A-RDB)配合使用时、会出现问题。

C6678的串行输出显示它完成了 PCIe 初始化。
但是、我没有访问我所期望的存储器、而且到目前为止我还不能弄清楚为什么。
我很确定我正在访问内存_ase_,因为写入和读取它实际上是有效的。


此时、我不知道问题是在引导加载程序、内核驱动程序还是加载程序工具中。
我能够使用64位 ARM 主机运行常规 PCIe 引导演示、因此我倾向于将其作为引导加载程序的问题。

首先、我想知道 RBL 如何针对 PCIe 引导模式初始化器件。
这将使我能够比较和查看我是否缺少任何步骤。
在哪里可以找到有关此信息?

任何其他提示也将不胜感激。
是否有其他人遇到过 PCIe 跨平台问题?


此致、
Martin Etnestad

e2e.ti.com/.../dsp-bundle.zip

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

    引导加载程序在器件上配置5条不可预取存储器:
    -用于"应用寄存器"(PCIe 配置)的硬接线 BAR0 (32位、4KB)
    -用于访问器件/外设寄存器的 BAR1 (32位、32KB)
    - bar2 (32位、512 KB)、用于访问八个内核中每个内核的 LL2存储器
    -用于访问 MSM 内存的 bar3 (32位,4 MB)
    -用于访问 DDR 存储器的 BAR4:5 (64位,256 MB)

    内核驱动程序会创建11个字符器件、加载程序工具希望在"/dev/atvdsp 中为这些器件找到器件文件:
    访问器件/外设寄存器的"控制"-- IOCTL 被用来改变基址
    -"ll2_core<0-7>"、用于八个 LL2存储器中的每一个
    - MSM 存储器的"msm"
    - DDR 存储器的"DDR"

    我注意到,在台式计算机上,`lspci -vv`报告 PCI 设备有一个64字节的高速缓存行。
    但在64位 ARM 主机上、它报告 PCI 设备具有32字节的高速缓存行。
    我不知道这种方法的重要性、但我觉得它是固定的器件功能、这对我来说似乎很奇怪。

    如果我读取64位 ARM 主机上的任何存储器、我会收到垃圾内容。

    如果我重新启动系统、垃圾内容会发生变化、但在读取之间不会发生变化。
    如果我写入存储器、内容会相应地发生变化、我可以将其读回。
    因此、我显然正在访问某个位置的存储器、但我不明白其中的位置。

    很明显,垃圾也有某种模式。
    如果我将字节组合为8和8、则偶数组往往为0xff、而奇数组往往具有更高的随机性。
    但我发现奇数组并非完全随机、因为我可以找到每64KB 重复一次的字节序列。

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

    我已将此内容转发给软件专家。 他们的反馈应发布在此处。

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

    我想了解一些细节:

    1) 1)引导加载程序基于 PDK v2.2.4中的 PCIe 驱动程序示例、该示例位于 packages/ti/drv/PCIe/example/sample/src/中。 =>您是否在 PCIe 引导模式下使用6678 EVM? 在 EVM 中、对 FPGA 进行编程、以强制在 PCIe 引导模式下从 I2C 地址0x51 (EEPROM)启动 DSP。 在 EEPROM 中、我们在那里刷写了 IBL 代码、该代码对 PCIe 外设进行了初始化。 那么、我想知道您如何将 PCIe 示例代码用作 PCIe 引导加载程序代码?

    2) 2)我能够使用64位 ARM 主机===运行常规 PCIe 引导演示 >这是64位 Linux PC 吗? 您是否使用32位条形图或64条形图? 如果您使用64位条形图、演示工作意味着您在 R/W DSP 存储器中没有问题? 那么、为什么在移植到另一个64位主机 NXP LS1043A-RDB 时会出现问题呢?

    3) 3)从您的说明中、您枚举了 PCIe、但没有正确的映射。 如果我读取64位 ARM 主机上的任何存储器,我会得到垃圾内容。=== >如果您使用32位条形码的 BAR1、2、3、您是否会得到垃圾 R/W?

    4) 4)使用64位 BAR4/5时、您是否能够通过搜索整个 DDR 范围来查找垃圾数据? 我认为 EVM 只有512MB DDR。

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

    [引用 user="lding"]
    1) 1)引导加载程序基于 PDK v2.2.4中的 PCIe 驱动程序示例、该示例位于 packages/ti/drv/PCIe/example/sample/src/中。 =>您是否在 PCIe 引导模式下使用6678 EVM? 在 EVM 中、对 FPGA 进行编程、以强制在 PCIe 引导模式下从 I2C 地址0x51 (EEPROM)启动 DSP。 在 EEPROM 中、我们在那里刷写了 IBL 代码、该代码对 PCIe 外设进行了初始化。 那么、我想知道您如何将 PCIe 示例代码用作 PCIe 引导加载程序代码?
    [/报价]

    我们在 ROM SPI 引导模式下引导6678 EVM。 已使用 NOR 写入器应用程序将连接的 ZIP 中的`spiboot_pcieinit/`编程到闪存。

    FPGA 是否会在从 NOR 闪存引导之前强制 DSP 运行其他代码?
    然后、我假设 PCIe 引导模式的 IBL 和/或 RBL 可能在初始化过程中执行某些操作、我也需要执行这些操作。


    [引用 user="lding"]
    2) 2)我能够使用64位 ARM 主机===运行常规 PCIe 引导演示 >这是64位 Linux PC 吗? 您是否使用32位条形图或64条形图? 如果您使用64位条形图、演示工作意味着您在 R/W DSP 存储器中没有问题? 那么、为什么在移植到另一个64位主机 NXP LS1043A-RDB 时会出现问题呢?
    [/报价]

    是的、64位 ARM 主机是 Linux 系统、我只需交叉编译 ARM 平台的内核模块和加载程序工具。
    顺便说一下、它在小端模式下运行、与台式计算机相同。

    抱歉、我应该更具体地说一下"常规 PCIe 演示"、因为这不使用我们的引导加载程序、内核模块或加载程序工具。
    我打算在 ROM PCIe 引导模式下引导 EVM、并使用`pdk_c667x_2_0_4/packages/ti/boot/examples/PCIe/`中的 Linux 主机加载程序加载 helloworld 应用。 我认为 ROM PCIe 引导模式仅设置32位条形。

    我们的引导加载程序将最大的条形图设置为64位、将 DDR 的条形图设置为32位。
    顺便说一下、ARM 主机配置为分配32位 PCI 地址。


    [引用 user="lding"]
    3) 3)从您的说明中、您枚举了 PCIe、但没有正确的映射。 如果我读取64位 ARM 主机上的任何存储器,我会得到垃圾内容。=== >如果您使用32位条形码的 BAR1、2、3、您是否会得到垃圾 R/W?
    [/报价]

    嗯、我还没有很好的结论认为问题是入站映射。 我不是 PCIe 方面的专家、因此我知道、由于缺少初始化步骤、可能会出现某种类型的时钟/时序或信号问题、从而导致这种情况。

    我将尝试修改引导加载程序、以定期打印入站映射以及一些其他数据。 希望这将有助于缩小问题的范围。
    感谢您的想法!

    是的、将1、2和3映射栏显示为垃圾的存储器。 但对它们的写入不会成为垃圾。
    如果我写入其中一个存储器、我可以回读我所写入的内容、并且在读取之间垃圾邮件不会改变。


    [引用 user="lding"]
    4) 4)使用64位 BAR4/5时、您是否能够通过搜索整个 DDR 范围来查找垃圾数据? 我认为 EVM 只有512MB DDR。
    [/报价]

    我没有尝试过这种方法、但我可以尝试。

    顺便说一下、我注意到的另一件事是、垃圾看起来很相似(但不完全相同!) 所有存储器中。
    就好像有一些常见的垃圾数据、大小为64KB、增加了噪声、噪声取决于您正在读取的存储器。
    例外情况是 LL2存储器、它们显然具有相同的噪声。

    感谢您的意见!

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

    您好!

    记录了 IB_START_LO 和 IB_START_HI 设置为什么后、我找到原因并修复了它。
    现在一切都正常、您可以考虑关闭此案例! :-)

    问题实际上源于德州仪器的 Linux_host_loader 代码。
    更具体地说、它位于入站转换设置代码中:

    对于(i = 0;i < 4;i++){
      iowrite32 (i、ptrReg + IB_bar (i)/4);
      iowrite32 (PCIe_dev->resources[i].start、ptrReg + IB_START_LO (i)/4);
      iowrite32 (0、ptrReg + IB_START_HI (I)/4);

    这不是一种安全的方法,因为 PCIe_dev->resources[i]。start 不返回 PCI 地址,但(可能)是物理地址。
    这意味着它只能用于物理地址范围和映射到的 PCI 地址范围相同的主机、例如0x4000_0000物理映射到0x4000_0000 PCI。
    它不适用于存在任何差异的主机,例如0x5_4000_0000物理映射到0x4000_0000 PCI。
    当然、我们的 NXP 主机处理器就是这种情况。

    我最终要做的是从 PCI 设备读取条形值。
    应用于上述代码的修复程序如下所示:

    #include

    uint32_t temp;

    对于(i = 0;i < 4;i++){
      iowrite32 (i、ptrReg + IB_bar (i)/4);

      PCI_READ_CONFIG_DWORD (PCI_DEV、PCI_BASE_ADDRESS_0 + 4*I、&temp);
      iowrite32 (temp、ptrReg + IB_START_LO (I)/4);

      iowrite32 (0、ptrReg + IB_START_HI (I)/4);

    这种方法对于所有平台都是安全的。

    我还想指出 、readDSPMemory 和 writeDSPMemory 不能以安全的方式访问内存。

    他们应将 oread32和 iowrite32与 ptr 一起使用,而不是直接取消引用 ptr。

    此致
      Martin Etnestad

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴知道问题已解决、并感谢分享反馈!

    此致、Eric
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 Martin:
    是否可以共享代码(更正后)。 我们还尝试从66AK2H12 (K2)处理器 thro PCIe 启动 C6678。
    我的邮件 ID 是 sivanantham.subramoniam@gmail.com

    提前感谢。

    此致、
    S.Sivanantam