0

PCIE 使用Producer/Consumer 排序模型,但 AXI4 使用不同的排序模型。AXI4 的读写通道是独立的。

例如,像这样的系统,

CPU <-> PCIE Con​​troller <-> PCIE AXI Bridge <-> AXI4 with DEC and DDR slaves(DEC模块连接到AXI4从数据端口0和APB寄存器端口,DDR内存模块连接到AXI4从数据端口1)

CPU 执行以下两个操作,

1.CPU writes data to DDR
2.CPU writes DEC APB register to start DEC

由于 PCIE 内存写入(可预取和不可预取)已发布,即没有响应,因此 PCIE AXI Bridge 将使用相同的 ID 连续执行上述两个操作,但无需等待BRESP。在数据到达 DDR 之前,DEC 可能已经看到 APB 寄存器写入并开始读取数据,因此数据可能是旧的和无效的。

这个排序问题可以通过写入数据然后读回来解决,如下所示,

1.CPU writes data to DDR
2.CPU read the same data back
3.CPU writes DEC APB register to start DEC

但它效率低下。

那么当 PCIE 和 AXI4 连接时,我们如何解决这个排序问题呢?是在 PCIE 端还是 AXI 互连端解决这个排序问题更好?

4

1 回答 1

1

当我查看 Linux Kennel 代码设备驱动程序时,我看到了同样的问题,先写入这个寄存器,然后写入这个,但我怎么知道第一个已经完成?在很多情况下,驱动程序将简单地读取相同的寄存器或应该显示副作用的寄存器。例如,可以通过一次寄存器写入来重置 nvme 设备,但在另一个寄存器读取返回特定值之前,您不知道操作已完成。注意 nvme_enable_ctrl 函数,它写入 32 reg,然后立即停止,直到读取返回特定值。因此,我建议遵循过去开发的决定,而不是包装自己的解决方案。

https://elixir.bootlin.com/linux/latest/source/drivers/nvme/host/core.c#L2169

于 2020-06-17T13:18:44.103 回答