HI , 各位管理好
我的DSP 6657 作为 RC端, EP连接的是FPGA, 现在想通过 EP访问DSP 6657的DDR3区域, 我的配置过程如下, 请帮忙看下是否正确。
6657 的 DDR3 memory 地址从0x8000_0000 开始, 我准备将 DDR3开始的64M空间让 EP端访问
1, 设置 6657的 bar[0] mask 为 0x00000000000FFFFF , bar[0] 地址为 0x100_0000 (定义的地方如下)
#define PCIE_RC_BAR0_ADDRESS 0x01000000 //should >=0x400000???
RC端的Bar[0] 为 RC pcie application寄存器区域的映射
2, 设置6657的 bar[1] 长度为64M, bar[1] 的地址为 0x8000_0000 (pcie 总线地址)
3, 设置 6657的 inboundTranslationRegs[0] 寄存器,
IB_BAR 为 1
IB_START_LO 为 _loll(0x8000_0000)
IB_START_HIGH 为 0
IB_OFFSET = 0x8000_0000
4, EP端访问 PCIE地址 0x8000_0000 则可以访问到 RC端的 0x8000_0000 memory 地址 ( EP端的 outbound 地址翻译 EP自己做, 我这里假设使用已经翻译过的 PCIE 地址)
IB_OFFSET 应该为此bar对应的memory 地址的起始值, IB_START_LO 为PCIE地址, 如果EP端发起对 IB_START_LO 范围内的地址访问, 则通过IB翻译为 0x8000_0000 + 偏移 的memory 地址访问。
不知道我的这个理解是否正确。
另外关于为 rc端它自己 bar[1] 分配 pcie地址的问题, 是否有规定这个地址要从什么地方开始,
例如
RC端为 EP端分配的 non-prefetch 地址从 0x1000_0000 开始
RC端为 EP 端分配的 prefetch 地址从0x8000_0000 开始
在此情况下 RC端再为自己的 bar[1] 分配PCIE地址 0x8000_0000 会不会与之前给 EP分配的 prefetch地址有冲突, 这里有疑问。
在 KeyStone_1_PCIE_STK_User%26%2339%3bs_Guide.doc 这个文档中有介绍 EP访问 RC端的memory, 图示如下:
这里 EP端通过0x9000_0000 的地址访问 RC端的 DDR3, 为啥在左图中 有 By pass inbound address translation
这里不用设置RC端的 inbound 寄存器吗, 为啥可以直接by pass 访问, 有疑问
kevin_wang:
顶一下
我的理解 inbound 方向和 outbound方向的 PCIE地址域应该是两个独立的, 可以有重合地址, 不知道是否正确
kevin_wang:
回复 kevin_wang:
顶一下 呼叫管理
kevin_wang:
回复 kevin_wang:
顶一下 呼叫管理,
虽然现在我按照以上的步骤可以实现EP到RC的访问, 但是前面几个问题还是想请版主回复下你们的理解
Thomas Yang1:
回复 kevin_wang:
根据协议,在RC分配给EP的空间外的区域,是可以通过EP直接访问RC的,不一定必须要经过RC的 inbound BAR做地址转换
Thomas Yang1:
回复 Thomas Yang1:
关于inbound 地址翻译,参见如下公式
Extracted offset = PCIe address – (IB_STARTn_HI : IB_STARTn_LO)
Internal address = IB_OFFSET + extracted offset
下面是一个典型例子
For this example, further assume that application software has programmed the set ofregisters corresponding to Region 1 as follows:• IB_BAR1 = 2. This assignment associates Region 1 with BAR2, BAR3 for 64-bitaddressing. The programmed value 2 here associate the match between Region 1(IB_BAR1) and configuration register BAR2.• IB_START1_HI = 0x12345678• IB_START1_LO = 0xABC00000• IB_OFFSET1 = 0x33400000The internal bus address is computed by extracting the offset from the PCIe address(address within the TLP header) and add the resultant to the start address of theinternal address.• Extract the offset from the PCIe address:Extracted offset = PCIe address – (IB_STARTn_HI : IB_STARTn_LO)= 0x12345678_ABC50000 – 0x12345678_ABC00000= 0x00050000• Compute internal device address:Internal address = IB_OFFSET + extracted offset= 0x33400000 + 0x00050000= 0x33450000
kevin_wang:
回复 Thomas Yang1:
感谢 Thomas 的回复
根据协议,在RC分配给EP的空间外的区域,是可以通过EP直接访问RC的
按照这个说明, 除了RC分配给EP端的 PCIE地址区域外,其他的PCIE地址空间, EP端可以直接访问, 那这部分直接访问的地址空间是怎么与 RC端的memory空间进行隐射的呢, 如果不用inbound , 是直接线性映射吗?
比如 EP端访问 0x8000_0000 的PCIE地址, 会直接线性映射到 RC端的 Memory 空间 0x8000_0000地址吗
这样的话, EP端是不是可以直接线性映射 访问 RC端的所有memory地址
另外 还有一个问题 outbound 方向的 PCIE 地址 和 inbound 方向的 PCIE 地址是一个空间吗
比如 RC把 outbound 方向的 0x1000_0000 固定大小的一块 PCIE地址分配给 EP 的bar, 那如果通过 EP 端 访问 PCIE 地址 0x1000_0000 这个是会访问到 RC端 还是 EP端自己? RC已经把这块pcie地址区域分配给了 EP
还得麻烦您给看下, 非常感谢