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.

请问下,6670/6678中pcie对端的远端地址是如何配置的,详细见内



你好,环境简单描述下:6670的pcie模块配置成RC,直连对端EP。

现在想访问对端配置空间,这个地址应当如何定。

按照道理来说,应该是pcie在6670内分配的io基地址加一个偏移,同时如果需要使用emunation来遍历对端的拓扑结构,也是需要这个偏移的算法的。

io基地址为0x21800000,偏移应该如何算,因为在不同的处理器会有不同的算法,但基本都是bus偏移+dev偏移+func偏移。但这个偏移量在6670/6678的相关手册都没有找到,请管理员帮忙看下,谢谢~

另外,在stk1里的pcie例程,remote地址是local+0x3000,而pdk里的例程,remote地址变成了0x2000,没有任何的说明,让人看了一头包。。。

  • PCIE的地址配置是先配置到PCIE线上地址空间,对端地址是不可见的,对端会把PCIE线上地址通过BAR来进行匹配;

    这些不是TI的特殊设置,而是PCIE的协议要求,你可以先看看PCIE协议了解这些地址的转换。

  • 对,你说的对,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); \
    }

    这两处都是直接写偏移,没有进行计算。

    谢谢~~

  • 底层CSL和STK只提供接口,并不提供扫描的策略;

    你提到的bus,dev这些都是需要在驱动层面实现的。