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.

[参考译文] TMS320C6678:64位 PCIe 寻址引导问题

Guru**** 2591240 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/629649/tms320c6678-64-bit-pcie-addressing-boot-problem

器件型号:TMS320C6678

我正在 PCIe 64位寻址模式下启动 C6678。  DEVSTAT 寄存器配置为:

PACLKSEL:    0b0
PCIESSEN:    0b1  (启用 PCIe)
PCIESSMODE[1:0]:0b00 (PCIe 端点)
BOOTMODE[12:0]: 0x11E4 (指示条2和4为2GB、PCIe 引导模式)
LENDIAN:     0b1  (小端字节序)


正如预期的那样、BAR0为4KB、而条2和4配置为2GB 孔径。 我 能够访问 DSP 上的各种寄存器和存储器、并将 Linux PCIe 引导加载程序示例移植到 Windows OS、并对其进行了调整、使其适用于64位(而不是32位)条形图。  

使用 Blackhawk 调试器、我已确认我正在将代码写入 core0的 L2SRAM、并且还在0x0087FFFC 写入 mago_ADDR。  我已经尝试发出传统中断以及 MSI 中断来唤醒 ROM 引导加载程序、但 PC 似乎位于0x20b01290处的 IDLE 指令:

#拆卸
20b01290:0001E000空闲
20b01294:0187E828 MVK.S1 0x0fd0、A3
20b01298:01905868 MVKH.S1 0x20b00000、A3
20b0129c:E1200001 .fphead n、l、W、BU、nobr>、 Nosat、0001001b
20b012a0:02181FDA MV.L2X A6、B4
20b012a4:000C1362 B.S2X A3
20b012a8:0200A358 MVK.L1 0、A4
20b012ac:01846162 ADDBO.S2 0x20b012b0、B3、3
20b012b0:000403E2 MVC.S2 CSR、B0
20b012b4:000000CA CLR.S2、B0、0、B0
20b012b8:008003A2 MVC.S2 B0、CSR
20b012bc:00000000 NOP
20b012c0:029403A2 MVC.S2 B5、ISTP
20b012c4:053C22E4 LDW/D2T1 *+ B15[1]、A10
20b012c8:71F7 LDW/D2T2 *+ B15[2]、B3
20b012ca:6C6E NOP 4.
20b012cc:008CA362 BNOP.S2 B3、5
20b012d0:01BC54F6 STW/D2T2 B3、* B15-[2]
20b012d4:026E1A2A MVK.S2 0xFFdc34、B4
20b012d8:0210586A MVKH.S2 0x20b00000、B4
20b012dc:E0800000 .fphead n、l、W、BU、nobr>、 Nosat、0000100b
20b012e0:00100362 B.S2 B4
20b012e4:026EA028 MVK.S1 0xffdd40、A4

引导日志为:

0x00873200 00000000 0000000A 00000001 5CA8ADFE 95BF81F1 43C5BB6F DDC431 DCDD7559
0x00873220 78EDFFEF EFF8BF7D 7975FBD5 B68DA98E 66CEC969 E9FBA8AC 7DDFD56C C5AB3342
0x00873240 DE7D985F 7317D62B 9CB2F7C0 297AF3FF 20755B7F 5D572A7B DF2DC98A DBB2EAC7
0x00873260 AEEAF646 8CA128F9 DF3EEFB8 1AEC9D9F 7277AC53 EE4F9A0F 52EFD435 5F833A79
0x00873280 2A3C6843 C982ACC4 11600A71 04AA8362 F2654E44 09457462 0117D4A0 F21F5A0C
0x008732A0 B52260D4 21358D09 784D965A 0062DE26 94900A81 094065D1 33B34162 E15CB645
0x008732C0 C3241CA2 3A011A7A 20814804 76195CE0 067049C1 93D10A2A 6B06B0E9 967B6C85

引导进程寄存器堆栈为:

0x008732E0 00000001 00000004 0000000A 67EA5572 C53DF566 055EB6CD 04370E04 0C819EB0

Boot Internal (引导内部)状态为:

0x00873300  20000000 6AAF37FF 0CDFD7D2 3B3FFD4F 00000000 00000000 00000000 00000000
0x00873320  00000001 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0x00873340  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0x00873360  00000000 00000000 00000000 00000000 B588EA1D 1B96BCCC BE3AEB5B D139C6F5
0x00873380  27121466 2C847D0B 4829A026 600E189A AA6F0EBC 5E0083E0 0E01A842 30AC859A
0x008733a0  744B0EC8 92F4108A 8DB3AA98 E457A68E D1474CE7 564083F1 CB41A51C 0C04B26A
0x008733c0  21C8281E D1B94082 D69A2C30 210808CA 1CEC0C10 4290241B 5D1C5285 32EC0820
0x008733e0  D2910D7B DB4C0CA9 D84F0E4D 58142A21 749401F0 44004668 76AB450C 09009992

Boot Table 参数为:

0x00873400  5171EFA7 D3DEFE7E 2F79DECE 0C05CFE FC28CF67 BD7FF21A 679B7EFB 019E59E1

Boot 参数表为:

0x00873680  00000030 0000001E 05024040 00400000 271009C4 08000800 00000000 B005104C
0x008736A0  00010480 01C90000 23200006 23200002 00000000 00000000 00000000 00000000 00000000
0x008736C0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
0x008736E0  00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

有人可以帮助我了解 PCIe 引导为何无法正常工作吗?  

例如、
1) 1)如何对引导日志进行解码?
2) 2) PC 位于0x20b01290。  
  a) ROM 引导加载程序中对应的源位置是什么?
  b)内核等待什么?

非常感谢您的帮助!

谢谢、
Brad

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

    我已通知软件团队。 反馈将发布在此处。

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

    谢谢、Yordan。  我期待他们的回应

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

     在线程 https://e2e.ti.com/support/dsp/c6000_multi-core_dsps/f/639/t/623636中 


    Brad、


    我们不会为引导 ROM 释放.out 和.map 文件。 我们仅提供参考源、因此您无法通过加载符号和设置断点来调试 ROM 代码。  

    我们提供了引导示例和引导实用程序、用于将应用程序转换为可引导二进制文件。 如果遇到任何问题、您可以报告程序计数器值并运行我们提供的调试 GEL 文件、并检查引导参数表以查看引导过程。

    此致、
    Rahul

    是否有人可以提供有关 ROM 引导加载程序代码中程序计数器为0x20b01290的引导加载程序上下文的信息?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    您能否澄清一下您是使用 TI 6678 EVM 还是自己的电路板与6678进行 PCIe 引导测试? 它看起来是后者、请确认。

    此外、您似乎通过设置 DEVSTAT 寄存器使用了 PCIe 引导模式、并且已经修改了代码、因此 C6678和主机 PC 之间存在稳定的 PCIe 链路、您可以将引导映像写入 DSP L2地址、并将_c_int00写入 magic_address。

    根据引导加载程序用户指南:
    在引导过程中、RBL 在次级上执行 IDLE 命令
    CorePacs 并使二级 CorePacs 等待中断。 之后
    要加载到这些辅助 CorePac 中的应用程序代码将被加载、并且将被加载
    将填充各个 CorePac 中的 BOOT_魔术_ADDRESS 值、
    CorePac0中的应用程序代码可以触发 IPC 中断来唤醒
    辅助内核并分支到中指定的地址
    BOOT_魔术_ADDRESS。

    可以尝试一下吗?

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

    尊敬的 Eric:

    感谢您的回复!  请在下面查找我对您问题的回答。

    您能否澄清一下您是使用 TI 6678 EVM 还是自己的电路板与6678进行 PCIe 引导测试? 它看起来是后者、请确认。  

    是的、我们使用的是定制板。  报告的所有结果均适用于定制板。

    此外、您似乎通过设置 DEVSTAT 寄存器使用了 PCIe 引导模式、并且已经修改了代码、因此 C6678和主机 PC 之间存在稳定的 PCIe 链路、您可以将引导映像写入 DSP L2地址、并将_c_int00写入 magic_address。  

    是的、没错。  主机和 C6678之间的链路看起来稳定、我能够读取/写入各种存储器/寄存器。  为了加载软件、我将所有程序数据写入 DSP L2、并将_c_int00地址写入 magic_address。

    我已经尝试发出传统中断、MSI 中断和 IPC。  以下是用于触发 MSI 和 IPC 的方法:

    /*
    发出 MSI 中断
    *
    NTSTATUS 触发器 MsiInterrupt (PDSP_INFO pDspInfo)

    #define ADDR_MSI_IRQ 0x21800054
    #define ADDR_MSI0_STATUS_RAW 0x21800100
    #define ADDR_EP_IRQ_SET 0x21800064

    uint32 rval;
    uint32缓冲器;

    缓冲区= 0;
    rval = writeDSPMemory (pDspInfo、NDX_PCIe_CFG、ADDR_MSI_IRQ、&buffer、(uint32) sizeof (uint32));

    缓冲区= 1;
    rval = writeDSPMemory (pDspInfo、NDX_PCIe_CFG、ADDR_MSI0_STATUS_RAW、&buffer、(uint32) sizeof (uint32));

    缓冲区= 1;
    rval = writeDSPMemory (pDspInfo、NDX_PCIe_CFG、ADDR_EP_IRQ_SET、&buffer、(uint32) sizeof (uint32));

    KdPrintEx (((DPFLTR_IHVDRIVER_ID、4、"MSI 中断触发。 %d 字节写入\n"、rval);

    返回值;

    NTSTATUS unlockBootConfigMMRs (PDSP_INFO pDspInfo)

    uint32 rval;
    uint32缓冲器;

    缓冲区= KICK0_UNLOCK;
    rval = writeDSPMemory (pDspInfo、NDX_CHIP_LEVEL_registers、chip_level_base_address+KICK0、&buffer、(uint32) sizeof (uint32));

    缓冲区= KICK1_UNLOCK;
    rval = writeDSPMemory (pDspInfo、NDX_CHIP_LEVEL_registers、chip_level_base_address+KICK1、&buffer、(uint32) sizeof (uint32));

    返回值;

    NTSTATUS 触发器 IPC (PDSP_INFO pDspInfo、UINT8 coreNum)

    uint32 rval;
    uint32缓冲器;

    缓冲区= 1;
    rval = writeDSPMemory (pDspInfo、ndx_chip_level_registers、chip_level_base_address+IPCGR (coreNum)、&buffer、(uint32) sizeof (uint32));

    返回值;

    在引导过程中、RBL 在次级上执行 IDLE 命令
    CorePacs 并使二级 CorePacs 等待中断。 之后
    要加载到这些辅助 CorePac 中的应用程序代码将被加载、并且将被加载
    将填充各个 CorePac 中的 BOOT_魔术_ADDRESS 值、
    CorePac0中的应用程序代码可以触发 IPC 中断来唤醒
    辅助内核并分支到中指定的地址
    BOOT_魔术_ADDRESS。

    可以尝试一下吗?

    那么、您建议将程序数据写入每个 CorePacs、然后将 IPC 发送到每个内核吗?  是否也应将 IPC 发送到 core0? 是否应该使用 core0执行任何不同的操作?

    注意:我要加载的代码是随 Linux 引导加载程序示例提供的 ddrInitCode (来自 PCIe_DDR_init_678.h)。  

    谢谢!
    Brad

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

    您的问题似乎与此处讨论的问题类似:
    e2e.ti.com/.../900106

    您可以参考 Advantech 链接提供的代码以供参考。
    Advantech support.advantech.com.tw/.../DownloadSRDetail_New.aspx 上提供了一些 MSI 中断示例

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

    谢谢、Rahul。  这个问题看起来很像我。 让我修改我的代码、然后报告状态(我现在正在处理另一个问题、因此可能需要一两天的时间才能返回)

    谢谢、
    Brad

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

    您好、Rahul、

    我终于回到了这个项目! 在将代码加载到所有内核时、我已将代码调整为:

    1. 为每个内核将起始地址写入 magic_address (0x1085_FFFC |(内核<< 24))
    2. 向 EP_IRQ_SET (0x2180_0064)写入0x1、在 C6678 PCIe 端点上发出 MSI 中断

    在将0x1写入 EP_IRQ_SET 时、这将触发我的 Windows 主机上的 MSI 中断。  

    C6678EvtInterruptIsr:MessageID:0中断:消息#:0矢量:182 IRQL:11
    C6678EvtInterruptIsr:DSP-1与 IRQ 向量匹配
    C6678EvtInterruptIsr:DSP-1 EP_IRQ_STATUS [0x00000001]

    C6678EvtInterruptIsr:MessageID:0中断:消息#:0矢量:101 IRQL:6.
    C6678EvtInterruptIsr:DSP-02与 IRQ 向量匹配
    C6678EvtInterruptIsr:DSP-0 EP_IRQ_STATUS [0x00000001]


    因此、在 Windows 驱动程序中、MSI 中断处理程序:

    1. 将0x1写入 EP_IRQ_CLR (0x2180_0068)
    2. 将0x4写入 IRQ_EOI (0x2180_0050)

    但是、使用 Blackhawk JTAG 调试器时、内核仍处于空闲指令- core0仍处于0x20b0_1290、内核1-7处于0x20b0_02c8

    我已确认、从调试器中、向中断设置寄存器(ISR)写入0x4确实会将内核从空闲状态唤醒。

    这是唤醒 PCIe 端点的正确步骤吗?

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

    我发现向 MSI_IRQ (0x54)写入矢量0 (0x0)会将 MSI 发送到 C6678端点、并将内核从其空闲状态唤醒。

    我正在解决此问题、因为它可以正常工作。