Arm PCIe总线上的写入是原子的吗?

Arm PCIe总线上的写入是原子的吗?,arm,shared-memory,atomic,atomicity,pci-e,Arm,Shared Memory,Atomic,Atomicity,Pci E,我是PCIe的新手,所以这可能是个愚蠢的问题。这似乎是询问PCIe接口的基本信息,但我很难找到答案,因此我猜我遗漏了一些信息,这使得答案显而易见 我有一个系统,其中有一个ARM处理器(主机),通过PCIe(设备)与Xilinx SoC通信。SoC中的端点也是ARM处理器 外部ARM处理器(主机)将通过PCIe写入SoC的ARM处理器(设备)的寄存器空间。这将命令SoC执行各种操作。该寄存器空间相对于SoC(设备)为只读。外部ARM处理器(主机)将写入该寄存器空间,然后发出中断信号,向SoC指示

我是PCIe的新手,所以这可能是个愚蠢的问题。这似乎是询问PCIe接口的基本信息,但我很难找到答案,因此我猜我遗漏了一些信息,这使得答案显而易见

我有一个系统,其中有一个ARM处理器(主机),通过PCIe(设备)与Xilinx SoC通信。SoC中的端点也是ARM处理器

外部ARM处理器(主机)将通过PCIe写入SoC的ARM处理器(设备)的寄存器空间。这将命令SoC执行各种操作。该寄存器空间相对于SoC(设备)为只读。外部ARM处理器(主机)将写入该寄存器空间,然后发出中断信号,向SoC指示已写入新参数,并应进行处理

我的问题是:对于SoC(设备)的读取,外部ARM(主机)的写入是否保证是原子的?在传统的共享内存情况下,对单个字节的写入保证是一个原子操作(即,在读卡器读取字节的前2位之前,但在读卡器读取最后6位之前,读卡器会将其替换为新值,从而导致垃圾数据)。PCIe中也是这样吗?如果是这样,原子性的“单位”是什么?单个事务中的所有字节都是相对于整个事务的原子字节,还是每个字节都是相对于自身的原子字节

这个问题有意义吗


基本上,我想知道在我的情况下,内存保护在多大程度上是必要的。如果可能的话,我希望避免锁定内存区域,因为两个处理器都在运行RTOS,避免内存锁定将使设计更简单

关于原子性问题,PCIe 3.0规范(我只有一个)被提到过几次

首先,您有第6.5节“锁定交易”这可能不是您所需要的,但我还是想记录它。基本上这是你之前描述的最糟糕的情况

在使用旧软件的系统中,需要锁定事务支持来防止死锁 这会导致对I/O设备的访问

但是,正如它所指出的,无论如何,您都需要正确地使用它进行检查

如果与锁定序列关联的任何读取未成功完成,请求者必须 假设锁的原子性不再得到保证,并且 请求者和完成者不再被锁定

有鉴于此,第6.15节原子操作(原子操作)更像您感兴趣的内容。使用AtomicOps指令可以执行3种类型的操作

FetchAdd(fetchandadd):请求包含一个操作数,即“Add”值

交换(无条件交换):请求包含一个操作数,即“交换”值

CAS(比较和交换):请求包含两个操作数,“比较”值和“交换”值

阅读第6.15.1节我们注意到,这些说明主要针对单一总线上存在多个生产者/消费者的情况实施

原子操作支持高级同步机制,当存在 需要以非阻塞方式同步的多个生产者和/或多个消费者。例如,多个生产者可以安全地排队到一个公共队列,而无需任何显式锁定

搜索规范的其余部分,我发现除了与这些原子操作相关的部分之外,很少提到原子性。这对我来说意味着,规范仅在使用这些操作时确保此类行为,但实施这些操作的背景表明,它们仅在存在多生产者/消费者环境时才会出现此类问题,而您的环境显然不存在

<> P>最后一个我想回答你的问题的地方是<强>第2.4节事务排序<强>注意到我很确定事务“通过”别人的想法只有中间的开关才有意义,因为这些开关可以做出这样的决定,一旦你在你的情况下在你的总线上放置的比特就没有回去了。因此,这可能只适用于在其中放置开关的情况。

你关心的是写可以绕过读。写是张贴的,读是非张贴的

A3, A4 A Posted Request must be able to pass Non-Posted Requests to avoid deadlocks.
因此,通常允许写操作绕过读操作,以避免死锁


有了这个问题,我不认为写操作可以绕过系统上的读操作,因为总线上没有设备可以执行此事务重新排序。由于您有RTOS,我高度怀疑他们是否在发送PCIe事务之前对其进行加密和重新排序,尽管我个人并未对此进行调查

部分取决于写与中断是如何实现的,中断可能通过写操作并首先到达那里。但这不是pcie的事情,而是soc的事情和芯片供应商使用的IP、总线实现、地址解码等。您提到,在操作完成时,您将使用中断来发送信号。什么样的?您会使用传统的PCI中断、MSI、MSI-X还是一些个人的东西?我猜“主机”是根端口,但我想确认这是一个直接连接,还是您要通过PCIe交换机?@arduic,我将在这里使用MSI中断。是的,主机是根端口,没有PCIe交换机。如果涉及PCIe交换机,这个问题的答案会改变吗?@dykeag不应该。我只是想更好地了解设置。据我所知,交换机只需使用指定的BAR地址将数据包路由到正确的设备,在这种情况下,它们总是发送到正确的设备。我相信我有你的答案我会的