2016年12月问题记录与总结--PCIE调试心得

来源:互联网 发布:shell 数组函数 编辑:程序博客网 时间:2024/06/05 10:35

1.TMS320C6678 PCIE模块调试总结

1.所谓outbound一般来说是RC发起的向EP的写操作。InboundEP接收来自RC的写操作。

 

2.PCIERCEP的初始化在PCIEdatasheet中有详细的步骤,但是实际使用的时候,需要按照如下的过程去配置:

第一步:配置RC端和EP端的时钟,电源使能,serdespll,以及模式(RC或者EP)等,这些配置好了,才能linkup上,在调试通信的时候,使得你的两个端点能够Linkup是第一步。

第二步:EP设置自己的ob_size,然后对自己的BAR_MASK寄存器的初始化,这里BAR_MASK寄存器最大的作用是告诉RC我需要申请多大的窗口,RC根据这个申请从本端0x60000000开始的256M大小的地址窗口中分配一段给EP。这里需要用几个BAR,每个BAR的属性需要具体设置。

第三步:EP设置自己的msi_cap寄存器,表明需要申请的中断向量个数。

第四步:这时候EP开始link training,并开始poll自己的bar寄存器,等待RC对其设置了有效的BAR的值的时候,才开始进行下一步。

第五步:RC端在linkup后,首先需要配置自己的baselimit寄存器,这个作用主要是type类型的RC用来判断地址类型,从而决定是否对进来的TLP进行过滤。

第六步:RC开始Link training,并且等待link up

第七步:如果是多个设备的话,有pcie交换机,RC需要枚举,判断系统中有多少个EP,这里以两端直连为例,RC先往EPBAR寄存器写,然后再读出来,进行对比,就可以知道EP申请的窗口有多大。

第八步:RC根据EP申请的窗口大小,来配置本端的outbound相关的寄存器,这里需要制定一个pcie空间的地址,这个地址一般卸载ob_offset_index中,这个地址需要跟接着写到EP端的BAR寄存器里面的base addr一致。

第九步:前面第四步EP link up之后,一直在poll自己的bar寄存器,等待RC来配置自己,一旦读到有效的BAR之后,EP开始根据RC设置的BAR来设置自己的inbound相关的寄存器。

第十步:RC读取EPmsi_cap寄存器,分配中断向量,并且把写事物的地址和dataEP

至此,完成。

 

3.为什么EP端的BAR寄存器是由RC来配置的?这是因为,RC下面有多个EP,如果每一个都自己配置地址空间,在RC端就会形成地址冲突。

 

4.有几个地址概念:内部总线地址,inbound地址,outbound地址,pcie地址

内部总线地址:即DSP内部访问寄存器和内存的地址,这个地址是来自内部CPU32位总线地址。

Inbound地址:这个地址是经过PCIESSoutbound转换过的地址,该地址需要和BAR寄存器的一个地址匹配才会被接收。

Outbound地址:这个地址是送往PCIE空间的地址,需要和对端的BAR寄存器中的一个匹配。

PCIE地址:可以理解为两端地址转换的中间桥梁地址,PCIE有自己的地址空间约束。

 

5.关于cfg_setup寄存器的作用

当你需要访问远端的设备,这个寄存器是必须要设置的,假设你的枚举结束,你在交换机的下面有一个EP,假设在RC段需要bus=2,dev=0,fun=0才能访问到它,那在你RC读写该EP设备的时候,需要把这三个号设置到cfg_setup寄存器。当直连的时候,这个寄存器不用管,默认0,0,0就是可以访问的,这是因为RC相当于一个主桥,cpu出来以后,会虚拟一个bus号为0。当接交换机的时候,最为重要的就是type类型,手册上说访问type1类型的,需要设置为1,访问type0类型的需要设置为0.根据实际测试结果,从第二个bus开始,访问远端设备需要使用type1,当使用第一个bus号的时候,type0.比如,bus0开始,则访问bus>=1的时候,就需要用type1了。

 

6.PCIE交换机的枚举过程

这是一个深度递归的过程,从bus:device:func0:0:0开始,每过一个桥都要更新一下已经有的设备的这三个号,一般的交换机的端口视为一个虚拟桥。要区别每一个桥下面是否挂有EP设备,有些交换机的端口是作特殊用途的。 在枚举过程中,需要分配设置交换的memory accesssmem base limit寄存器,以分配PCIE空间的地址。将枚举结果存放到一个结构体链表中,方便查询使用。

0 0
原创粉丝点击