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.

TMS320C6657: Endpoint bar空间读写问题

Part Number: TMS320C6657


我们目前是在调试c6657 PCIE 接口,用TI自带的pcie的例子调试,例子如下图:

这段时间使用我上面用的pcie的例子工程,调试PCIE EP端的读写,碰到问题如下:

c6657工作在rc模式下,连接1个EP设备;

初始化时,可以看到EP有1个64位的bar空间,长度为16KB,使用bar0和bar1,然后软件给bar0 和bar1 分配了pcie空间地址;

分配的地址空间从 #define PCIE_NONFETCH_BASE_ADDRESS 0x10000000 开始的地址分配;

对应的region为 outbound region0,相关的3个寄存器也都做了配置,都是按照例子程序的流程走的,没有做改动。

配置完成后,在最后的PCIE_Test函数中,将ep端的bar0 bar1通过remote 寄存器读出打印出来,region 0的3个寄存器值也读出来打印出来:

ulData = *(volatile uint32_t *)(CSL_PCIE_CONFIG_REGS + 0x2010); // bar0
uart_printf ("EP configuration register bar0 = %x\n\n",ulData);
ulData = *(volatile uint32_t *)(CSL_PCIE_CONFIG_REGS + 0x2014); // bar1
uart_printf ("EP configuration register bar1 = %x\n\n",ulData);

//outbound region 相关寄存器
ulData = gpPCIE_app_regs->OB_SIZE;
uart_printf ("rc app register OB_SIZE = %x\n\n",ulData);

ulData = gpPCIE_app_regs->OUTBOUND_TRANSLATION[0].OB_OFFSET_HI;
uart_printf ("rc app register OB_OFFSET_HI 0 = %x\n\n",ulData);

ulData = gpPCIE_app_regs->OUTBOUND_TRANSLATION[0].OB_OFFSET_INDEX;
uart_printf ("rc app register OB_OFFSET_INDEX 0 = %x\n\n",ulData);

打印结果如下,感觉值都是对的:

EP configuration register bar0 = 10000004

EP configuration register bar1 = 0

rc app register OB_SIZE = 3

rc app register OB_OFFSET_HI 0 = 0

rc app register OB_OFFSET_INDEX 0 = 10000001

此时,软件再通过访问0x60000000,测试是否可以读这个ep的bar空间,

// 测试bar mem空间读写
unsigned int value = *((volatile Uint32 *)0x60000008);

执行到这一句时,软件会触发异常,执行到pcie_vector.asm中的 NMI/Exception 这一句,感觉是

interrupt vector table
.sect "vecs"
.align 1024

vectors:
VEC_RESET _c_int00 ;RESET
VEC_ENTRY NMI_ISR ;NMI/Exception
VEC_DUMMY ;RSVD
VEC_DUMMY ;RSVD
VEC_ENTRY PCIE_MSI_ISR ;interrupt 4
VEC_ENTRY PCIE_ERR_PMRST_ISR ;interrupt 5

对端的EP设备,这一段bar空间,是nvme设备自身的配置寄存器,是可以读的,不知是不是我的方法有问题,请帮忙看一下,谢谢。