上篇我们对PCIe的一些基础概念做了一个宏观的介绍,了解了PCIe是一种封装分层协议(packet-nased layered protocol),主要包括事务层(Transcation layer),数据链路层(Data link layer)和物理层(physical layer)
一:TLP事务处理方式
看过前面TLP的前世今生精彩大结局后,相比大家应该都知道TLP(Transaction Layer Packet)在事务层的角色,如果不知道,就默默翻看一下前面的文章;
TLP很重要,也有很多种类型,我们先来个全局的认识,看看PCIe到底定义了多少种TLP种类呢?
这么多TLP,每个都是什么含义,到底是干什么的呢?不急,我们慢慢的揭开他们神秘的面纱~
之前的介绍中,我们提到过PCIe中总线事务有两大类:Non-Posted和Posted:
-
Non-Posted: 需要completion返回响应包;
-
Posted:不需要comletion返回响应包;
注:Memory Read Lock只适用在兼容PCI/PCI-X的陈旧设备中,在这里就先忽略了。
我们线从Non-posted和posted阵营中的各挑选一些代表介绍一下TLP事务的具体作用;
Non_Posted Memory Read:
步骤:
1:PCIe初始化Memory Read请求;
2:经过Switch到达Root Complex;
3:Root收到Memory Read之后就在系统缓存中抓取数据并回传完成报告(Completion)
4:同样经过Switch到达设备端,设备端收到完成报告后结束此次事务请求;
Non-posted IO and Configuration Write:
步骤:
1: Root初始化IO Write请求;
2:请求和数据经过Switch到达设备端;
3:设备端收到IO Write的请求以及数据之后,开始将数据写入到PCIe设备中,并回传完成报告(Completion);
4:同样经过Switch到达Root,Root收到完成报告后结束此次事务;
注意:Non_posted 写请求只能由处理器(也可以理解为Root端)发出!
Posted Memory Write:
步骤:
1:Root 初始化Memory Write请求;
由于Memory write的请求是posted方式,不要求有完成回报(Completion)所以在memory write请求发送之后,Root不用等任何回应,就可以继续做其他事情;
2:PCIe设备端收到Memory Write请求之后就开始专心写入动作,也不必准备完成回报(Completion);
不需要完成回报(completion)虽然可以加速事务处理的速度,从而提高系统性能,但是,如果在设备端出现error,具体内容也不会回报给Root,而是回给Root发送一条信息让其告诉软件有error需要处理;