你好,环境简单描述下:6670的pcie模块配置成RC,直连对端EP。
现在想访问对端配置空间,这个地址应当如何定。
按照道理来说,应该是pcie在6670内分配的io基地址加一个偏移,同时如果需要使用emunation来遍历对端的拓扑结构,也是需要这个偏移的算法的。
io基地址为0x21800000,偏移应该如何算,因为在不同的处理器会有不同的算法,但基本都是bus偏移+dev偏移+func偏移。但这个偏移量在6670/6678的相关手册都没有找到,请管理员帮忙看下,谢谢~
另外,在stk1里的pcie例程,remote地址是local+0x3000,而pdk里的例程,remote地址变成了0x2000,没有任何的说明,让人看了一头包。。。
Allen35065:
PCIE的地址配置是先配置到PCIE线上地址空间,对端地址是不可见的,对端会把PCIE线上地址通过BAR来进行匹配;
这些不是TI的特殊设置,而是PCIE的协议要求,你可以先看看PCIE协议了解这些地址的转换。
Jian Li18:
回复 Allen35065:
对,你说的对,RC端是先将开放给所有ep或者桥的线上地址空间进行配置,对端会把PCIE线上地址通过BAR来进行匹配。
我的疑惑是这之后的事情,现在以最简单的方式举例,RC端与EP直连。
RC需要知道EP把哪些前述中开放出来的线上地址与自己的BAR空间进行了匹配,在EP是黑盒的情况下,下一步需要做的就是访问EP端的配置空间,从配置空间读取各个BAR匹配的线上地址,对吧。
我现在的问题是如何访问EP的配置空间。如果外挂拓扑比较复杂,RC会扫描所有设备,如何去扫描呢,其实就是通过远端访问所有可能的ep配置空间,读取vender id,device id ,去判断这个配置空间是不是有真实的外挂设备。
我的问题就是,扫描所需要访问的远端配置空间的地址在6670里是如何分配的,这种分配方式每个处理器实现都不一样,但基本都是通过bus,dev,func这几个的值进行一定的偏移再加上rc端pcie在处理器中分配的io地址 来进行计算。
这一点在stk1代码和pdk代码中都有体现的:
stk1:
CSL_Pcie_cfg_space_endpointRegs *gpPCIE_remote_EP_regs = (CSL_Pcie_cfg_space_endpointRegs*)(CSL_PCIE_CONFIG_REGS+0x3000);
pdk
/* Get base address for Remote Configuration Space */#define pcie_get_rem_cfg_base(handle, ep_rem_base, rc_rem_base) \ { \ ep_rem_base = (CSL_Pcie_cfg_space_endpointRegs *) ((unsigned int)handle + 0x2000); \ rc_rem_base = (CSL_Pcie_cfg_space_rootcomplexRegs *) ((unsigned int)handle + 0x2000); \ }
这两处都是直接写偏移,没有进行计算。
谢谢~~
Allen35065:
回复 Jian Li18:
底层CSL和STK只提供接口,并不提供扫描的策略;
你提到的bus,dev这些都是需要在驱动层面实现的。