首页 理论教育PCIExpress报文序列

PCIExpress报文序列

【摘要】:PCIe设备使用MSI机制时,通过向中断控制器发送MSI报文以提交中断请求。然而对于PCIe体系结构而言,这个MSI报文与普通的存储器写报文并没有本质的区别,这个报文也可以使用不同的TC。如果设备的数据传送使用TC0,而MSI报文使用TC1时,将可能引发数据完整性的问题。PCIe总线规范并没有约定如何处理传递MSI报文而产生的数据完整性问题。当该读操作结束后,即PCIe设备收到存储器读完成TLP后,再发送MSI报文。

在PCIe总线中,还有一种序引发的数据完整性问题需要特别注意,即由MSI报文引发的数据完整性问题。PCIe设备使用MSI机制时,通过向中断控制器发送MSI报文以提交中断请求。然而对于PCIe体系结构而言,这个MSI报文与普通的存储器写报文并没有本质的区别,这个报文也可以使用不同的TC。如果设备的数据传送使用TC0,而MSI报文使用TC1时,将可能引发数据完整性的问题。

假设一个PCIe设备正在使用DMA写操作,将一组数据传递到主存储器,此时该设备将使用存储器写TLP进行数据传送,当数据传送完成后,使用MSI报文通知处理器DMA写操作已经结束。

如果进行数据传递的TLP使用TC0,而MSI报文使用TC1时,这两种TC可能使用的VC并不相同,而不同VC间的数据传递并没有序的要求。因此该PCIe设备虽然从设计逻辑上保证,将传递数据的存储器写TLP发送完毕后再发送MSI报文,但是RC仍然会首先收到MSI报文,然后再收到传递数据的存储器写TLP。

此时如果处理器在收到MSI报文后,立即在中断处理服务例程中使用该PCIe设备写入的数据,将可能引发数据完整性问题。

PCIe总线规范并没有约定如何处理传递MSI报文而产生的数据完整性问题。在上述实例中,如果MSI报文使用的TC与数据传递使用的TC相同,将不会出现这个数据完整性问题。如果在设计中MSI报文使用的TC与数据传递使用的TC不一致,需要注意该问题。(www.chuimin.cn)

一个可行的方法是在数据传递结束后,使用“zero-length存储器读请求TLP”对目标设备进行读操作,这个读操作可以将数据写入最终目的地。当该读操作结束后,即PCIe设备收到存储器读完成TLP后,再发送MSI报文。

如一个PCIe设备完成DMA写操作之后,再向目标地址(某个存储器地址)发送一个“zero-length存储器读请求”报文,该报文可以保证之前的存储器写报文都被刷新到主存储器后,才能从主存储器获得应答信息,因为存储器读请求TLP不能超越存储器写报文。当PCIe设备收到与这个存储器读请求对应的存储器读完成TLP后,再发送MSI报文进行中断请求。

使用上述方法虽然可以避免因为传送MSI报文带来的数据完整性问题,但是将带来较大的中断延时。因为在PCIe体系结构中,一个设备从“发送存储器读请求TLP”到“获得存储器读完成TLP”的延时较长。而且使用这种方法也增加了硬件逻辑设计的难度。

目前支持多个VC的PCIe设备,通常将MSI报文和数据传送报文使用的TC设置为相同的值,以避免数据完整性问题。如在Intel的高精度声卡控制器中,数据传送使用的报文和MSI报文都只能使用TC0。