声明:此文章为原创,转载请注明 转自https://mp.csdn.net/editor/html/115790068
针对同一TC,PCIe有一套Ordering rules.
Ordering rule的作用:
- 兼容传统的总线(PCI,PCI-X,AGP)
- 确保Completion是确定的,顺序是可控的
- 避免deadlock死锁
- 通过最小化read latency和管理read write ordering以此来最大化性能和吞吐率
有三种模型:
- Strong Ordering: 同一TC,需要采用强序(Producer/Consumer模型的前提下)。
- Weak Ordering: 如果没有依赖关系(非Producer/Consumer模型),不需要采用强序,可以safely reorder.
- Relaxed Ordering: 某些transactions可以通过软件控制,优点是可以像weak ordering一样提供性能,但是是由软件指定没有依赖关系.
同一TC采用一套PCIe Ordering rule, 但是为了设计简单,不同TC但是映射到同一VC时规则也采用同一套规则。
以下介绍PCIe Ordering Rule
注意:Y/N表示两种情况都不会违反PCIe Ordering Rule
Posted Request : Memory Write Request or a Message Request.
Read Request: Configuration Read Request, an I/O Read Request, or a Memory Read Request.
NPR (Non-Posted Request) with Data: Configuration Write Request, an I/O Write Request, or an AtomicOp Request.
正常条件下(无RO,无IDO)
A2a---P不能超越之前发起的P
B2a, C2a---NP不能超越之前发起的P
D2a---CPL不能超越之前发起的P
B3,B4,C3,C4---NP允许超越之前的NP
A5a---P允许超越之前的CPL
B5,C5---NP允许超越CPL
D5a---CPL允许超越CPL(不同的Transaction ID)
D5b---CPL不允许超越CPL(同一Transaction ID)
RO情况下:(与P相关)
A2b---RO,P可以超越之前的P
D2b---RO, CPL可以超越之前的P
C2b---RO, NPR with data可以超越之前的P
IDO情况下:(与P相关)
A2b---IDO,P可以超越之前的P
B2b,C2b---IDO,NP可以超越之前的P
D2b---IDO,CPL可以超越之前的P
可以避免死锁的情况:(与NP相关)
A3,A4---P可以超越之前NP;
D3,D4--CPL可以超越之前的NP;
A5b--P可以超越之前的CPL(只存在于PCI Express to PCI/PCI-X Bridge)
以下介绍Producer/Consumer模型
1. Producer发起Posted Request给Memory;
2 and 3. Processor发起NP轮询Flag=0,表示Producer没有写完;
4. Producer写完之后发起Posted Request, Flag=1
5 and 6. Processor发起NP轮询Flag=1,表示Producer写完;
7. Consume发起MWr清除Flag;
8 and 9.Producer想继续传输数据,NP检查Status
10 and 11. Processer读Memory中的数据;
12. Processer读完之后MWr 把Status置为1;
13 and 14. Processor读到Status为1;
15. Producer发起MWr清除Status.
总结上述过程:Producer把数据都搬运到Mem后Consumer开始读数,Consumer读完所有数据后Producer才会继续搬数。
可能存在的问题:
如果Switch中的CPL超越了P,这种情况下Processor读到Flag=1,但是此时数据可能还没有搬完
所以PCIe Ordering rule“CPL must not pass P”这条规则保证了CPL和P之间的Ordering,避免了上述问题。
以下介绍提高性能的方式之一:Relaxed Ordering(RO)
设置RO的包允许在Switch或RC中,对Requester和Completer的通路上进行reorder,来改善性能。
比如如果没有设置RO,Posted buffer满了导致Posted包block,会block其他所有类型的包,如果软件知道后面的包与前面的包没有顺序上的依赖关系,可以设置RO,这样就不会block其他包了。
可以使用RO的包类型
除了上述表中,还有NPR with data可以超越Memory Write/Message Request
以下介绍提高性能的方式之一:ID based Ordering(IDO)
来自不同requester,顺序上不太可能有依赖关系。但是如果是PCIe Ordering rule也会block没有依赖关系的TLP Stream.
如果不同的TLP Stream, 即Requester ID(or Completion ID of CPL)不同的情况下, 可以允许packet re-ordering.
通过Device Control 2 register和TLP中的Attr[2]实现IDO
什么时候用到IDO?
Spec强烈建议safely的情况下同时使用RO和IDO。
- 例如EP“directly Communicating”with only one other entity, most commonly the RC(directly Communicatiing”是指DMA traffic, PIO traffic, and interrupt traffic),所有TLP都可以使用IDO,是安全的。
- 如果EP与多个Agent通信(例如communicating with RCiEPs or communicating using P2P Root Port traffic)IDO不是安全的,
在上文的例子中,EP DMA写memory, 之后在Peer to Peer写Flag,如果Flag这个device也发起一个同样地址的DMA写,通常情况下两个DMA写是in order的,但是如果使能了IDO后,顺序不能保证。
RO也是同理,包含控制traffic用RO是不安全的。
对于Completer,如果使能IDO,建议所有的CPL都使能。