TI中文支持网
TI专业的中文技术问题搜集分享网站

两片6678的PCIE通信问题

我跑的是K1_STK这个文件夹里面的PCIE例程,来实现两片DSP之间的通信。一开始是用的是6678的评估板跑的PCIE_PHY_LOOPBACK模式。可以跑通。然后将这个模式改为LOOPBACK_DISABLE模式,将一个片子的0核作为RC,另一个片子的1核作为EP进行通信。现象是:两个6678的片子都可以LINK成功,但是接下来在RC远端配置EP时候,程序在KeyStone_PCIE_allocate(入参)这个位置跑飞。但是跑PCIE_PHY_LOOPBACK这个模式就不会飞,而且msi_regs->MSI_CAP这个结构体里面的元素也被函数的入参赋予了新值。但是唯独跑EP的时候会遇到问题。而且问题现象是跑飞了,不管运行哪一句,在debug窗口里显示的都是RC端出现no source available for …我的猜想是远端配置出现了问题。但是我也不知道如何修改,希望高人指点

Shuxin Zhao:

而且我在理解您的工程的基础上,发现了两个问题。一个是当RC调用了void KeyStone_PCIE_remote_CFG_setup(PCIE_Remote_CFG_SETUP * cfg_setup)这个函数来配置远端的时候,对typedef struct{ Uint8 config_type; //type 0 is EP; type 1 is RC Uint8 config_bus; Uint8 config_device; Uint8 config_function;}PCIE_Remote_CFG_SETUP;、

这个结构体是不是要赋值一下啊,来让它指向EP端。如果我用另一片的1核跑EP。那是不是type配置成0,bus配置成1.device配置成1.function配置成什么?

第二个问题是(PCIE_MSI_Regs *)&gpPCIE_remote_EP_regs->MSI_CAP这里面的gpPCIE_remote_EP_regs->MSI_CAP远端EP的地址是不是写错了,看您写的是0x21803000,但是看文档感觉是0x21802000.还望您回复

Thomas Yang1:

回复 Shuxin Zhao:

你好

不清楚你是用什么版本进行测试的

请用附件中的版本 

在BOC板上测试时,需要注意,拨码开关为RC的EVM板必须插到BOC板的A槽, 而拨码开关为EP的EVM板必须插到BOC板的B槽

测试完成后,你将看到如下log打印

[C66xx_0] Initialize DSP main clock = 122.88MHzx236/29 = 999MHz

DDR3 initialization

Initialize DDR data rate = 100.000×40/3= 1333.3 MTS

Enable Exception handling…

PCIE normal and RC mode at 5.0GHz, should be running on core0.

PCIE start link training.

PCIE link training is finished.

RC starts to transfer data to EP!

RC starts to transfer data to EP!

PCIE MSI8 interrupt generated!

#########RC starts sent data to EP!#########

RC has received echo data from EP!

#########RC is verifying the received data!#########

All the data are correct, Rc->EP->RC echo test passed!

#########RC starts core access performance test!#########

     noncacheable, nonprefetchable memory copy

 238 MB/s, copy 65536 bytes from 0x810000 to 0x54920000 consumes 274554 cycles

  20 MB/s, copy 65536 bytes from 0x54920000 to 0x810000 consumes 3203498 cycles

。。。。。。

K1 EVM(EP) log output

 

[C66xx_1] Initialize DSP main clock = 122.88MHzx236/29 = 999MHz

DDR3 initialization

Initialize DDR data rate = 100.000×40/3= 1333.3 MTS

Enable Exception handling…

PCIE normal and EP mode at 5.0GHz, should be running on core1.

PCIE start link training.

PCIE link training is finished.

#########EP starts MSI interrupt to RC!#########

    EP is waiting for receiving data from RC!

    EP has received data from RC!

    #########EP starts to do RC memory base and limit range test!#########

    EP is sending received data back to RC….

    EP has sent data to RC, completed the loopback test on EP!

Thomas Yang1:

回复 Thomas Yang1:

+附件

Shuxin Zhao:

回复 Thomas Yang1:

感谢您的回答,我不是在评估板上测得。就是在两片TMS320C6678之间测得。我们有这样的硬件环境。之前用在PDK里面找到的带BIOS那个例程跑两片6678可以跑通。最大传输256M数据。但是换了一版不带BIOS德 例程,跟您给我提供的附件差不多。首先跑第一编是死在了RC配置EP远端的位置,后来我给修改了一下可以跑过去。但是现在数据没有传过去。没有传到EP端的那个数组里面。我用的是 Brighton Feng 这个作者的 例程。昨天把他的远端配置地址由CSL_Pcie_cfg_space_endpointRegs  *gpPCIE_remote_EP_regs = (CSL_Pcie_cfg_space_endpointRegs*)(CSL_PCIE_CONFIG_REGS+0x3000);

这个地址改成了CSL_Pcie_cfg_space_endpointRegs  *gpPCIE_remote_EP_regs = (CSL_Pcie_cfg_space_endpointRegs*)(CSL_PCIE_CONFIG_REGS+0x2000);这个是文档里面说的,成功实现了远端的配置,但是问题是现在程序死在了RC和EP分别等待最后一位标记位是否被置位,我发现数据好像都没送到EP去.我觉得可能是地址映射出了问题。为什么跑BIOS例程那个地址映射就很简洁,而这个例程的地址setup好像出了好多函数啊。而且我现在迫切想知道就是这个两片DSP的例程RC发送数据的源地址和数据量大小。EP端收到数据的接收地址还有它发送数据的地址。

Thomas Yang1:

回复 Shuxin Zhao:

这个例子工程的测试场景比BIOS工程更加丰富,一个重要的特点是增加了RC对EP的配置,而在真实PCIE网络中,这样也是更有意义的做法。初始化的顺序如下:

EP initializes BAR mask and properties, which indicates the PCI address space request to RC. In the STK, one BAR is initialized for prefetchable space, one BAR is initialized for non-prefetchable space.

EP initializes MSI Capabilities Register, which indicates the number of interrupt vectors request to RC.

EP starts physical link training, and waits for link training completion…

RC initializes the base and limit of PCIE address space.

RC starts physical link training, and waits for link training completion …

RC reads BAR mask and properties from EP, allocates PCI address space accordingly, writes the PCI start address to the BAR register of EP, and then RC configures its own outbound memory regions to map the PCI address space to its own local access window.

EP polls the BAR register value, once it gets valid PCIE address set by RC, EP configures its own inbound memory regions to map the PCI address space to its own local address space.

RC reads the MSI capabilities register of EP, allocates interrupt vectors accordingly, writes start index and number of the allocated interrupt vectors to EP MSI registers.

关于地址映射,请参考附件中的框图。能否把你出问题时的RC 和EP的application register and configuration register的截图发上来看看,建议用数组的视野比较方便检查

kevin_wang:

回复 Thomas Yang1:

您好, 管理 我使用您这个帖子里面的PCIE例程运行在6657开发板上, 编译不通过, 是否需要做些修改

"../common/KeyStone_common.c", line 66: error #20: identifier "CSL_EDMA0CC_REGS" is undefined"../common/KeyStone_common.c", line 66: error #42: expression must have arithmetic or pointer type"../common/KeyStone_common.c", line 67: error #20: identifier "CSL_EDMA1CC_REGS" is undefined"../common/KeyStone_common.c", line 67: error #42: expression must have arithmetic or

赞(0)
未经允许不得转载:TI中文支持网 » 两片6678的PCIE通信问题
分享到: 更多 (0)