DMA/Bridge Subsystem for PCI Express® 使用已链接的描述符列表来指定 DMA 传输的源、目标和长度。描述符列表是由驱动程序创建的,存储在主机存储器内。DMA 通道由含数个控制寄存器的驱动程序进行初始化,以开始提取描述符列表并执行 DMA 操作。
描述符用于描述 DMA/Bridge Subsystem for PCIe 应执行的存储器传输。每个通道都有其自己的描述符列表。每个通道的描述符列表的起始地址均在硬件寄存器中由驱动程序进行初始化。启用通道后,描述符通道就会开始从初始地址提取描述符。随后,它会从已提取的最后一个描述符的 Nxt_adr[63:0]
字段中执行提取。描述符必须对齐到 32 字节的边界处。
相邻描述符的初始块的大小是使用 Dsc_Adj 寄存器来指定的。初始提取后,描述符通道使用最后一个提取的描述符的 Nxt_adj
字段来判定下一个描述符地址的描述符数量。相邻描述符块不得跨 4K 地址边界。描述符通道会在单一请求内提取尽可能多的描述符,可提取的数量受 MRRS、相邻描述符数量以及通道的描述符缓冲器内的可用空间所限。
描述符列表中的每个描述符都必须准确描述紧随其后的描述符或描述符块。在相邻描述符构成的块中,Nxt_adj
值从第一个描述符开始递减直至倒数第二个描述符(值为 0)。同样,块中的每个描述符指向块中的下一个描述符,最后一个描述符除外,它可能指向新的块或者可能使列表终止。
描述符列表终止以停止 (Stop) 控制位来表示。观测到含 Stop 控制位的描述符后,针对该列表将不再发出描述符提取请求。Stop 控制位只能在块的最后一个描述符上置位。
使用 AXI4 接口时,不会对卡的 DMA 地址执行转换。如果主机不知道卡的地址映射,则必须在用户逻辑中汇编描述符,并使用描述符旁路接口将其提交至 DMA。
偏移 | 字段 | |||
---|---|---|---|---|
0x0 | Magic[15:0] | Rsv[1:0] | Nxt_adj[5:0] | Control[7:0] |
0x04 | 4'h0, Len[27:0] | |||
0x08 | Src_adr[31:0] | |||
0x0C | Src_adr[63:32] | |||
0x10 | Dst_adr[31:0] | |||
0x14 | Dst_adr[63:32] | |||
0x18 | Nxt_adr[31:0] | |||
0x1C | Nxt_adr[63:32] |
偏移 | 字段 | 位索引 | 子字段 | 描述 |
---|---|---|---|---|
0x0 | Magic | 15:0 | 16'had4b。此代码用于验证驱动程序生成的描述符是否有效。 | |
0x0 | 1:0 | 保留,置位为 0 | ||
0x0 | Nxt_adj | 5:0 | 位于下一个描述符地址字段所在处的描述符之后的额外相邻描述符的数量。 相邻描述符块不得跨 4k 边界。 |
|
0x0 | Control | 5、6、7 | 保留 | |
0x0 | 4 | EOP | 针对 Stream 接口的包结束。 | |
0x0 | 2 和 3 | 保留 | ||
0x0 | 1 | Completed | 设为 1 即可在引擎完成此描述符后中断。这需要 在 H2C/C2H 通道控制寄存器中设置 IE_DESCRIPTOR_COMPLETED 控制标志。 |
|
0x0 | 0 | Stop | 设为 1 即可为此描述符列表停止提取描述符。Stop 位只能在相邻描述符块的最后一个描述符上置位。 | |
0x04 | Length | 31:28 | 保留,置位为 0 | |
0x04 | 27:0 | 数据长度(以字节为单位)。 | ||
0x0C-0x8 | Src_adr | 63:0 | H2C 和存储器映射传输的源地址。 C2H 传输的元数据写回地址。 |
|
0x14-0x10 | Dst_adr | 63:0 | C2H 和存储器映射传输的目标地址。不可用于 H2C 串流。 | |
0x1C-0x18 | Nxt_adr | 63:0 | 列表中下一个描述符的地址。 |
Bit_width
* 512
的 FIFO,用于保存描述符引擎中的所有描述符。此描述符 FIFO 与所有选定的通道共享。- 对于含 2H2C 和 2C2H 的 Gen3x8 设计,AXI 位宽为 256 位。FIFO 深度为 256 bit * 512 = 32 B * 512 = 16 KB(512 个描述符)。此 FIFO 供 4 个 DMA 引擎共享。