对,你说的对,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); \
}
这两处都是直接写偏移,没有进行计算。
谢谢~~