转载:(13 封私信 / 81 条消息) PCIe协议学习-TC和VC概念 - 知乎
Traffic Class(TC)
TLP header中有一个3bit的域段,叫做TC,用以指示对应TLP报文的traffic class(共8种),TC要和Virtual channel(VC)配合使用以区分不同TLP报文的服务等级(可以理解为PCIe的 Qos,quality of service)。

TLP 报文在发送及传输过程中,每个port都会根据配置进行TC->VC的映射,并根据VC来决定报文处理的优先级。
TC 的lableling规则以及TC/VC mapping都是软件可以配置的。
Virtual channel(VC)
virtual channel(VC)和trffic class(TC)配合使用,实现PCIe报文的不同优先级处理,VCs的基础是独立的电路资源(independent fabric resource,queues/buffer and associated control logic),因为独立的资源才可以避免出现头阻塞而降低整个系统的性能,甚至是出现系统死锁。
不同的TC的报文会被映射到不同的VC上进行处理,1个或者多个TC可以映射到一个VC上(所谓的multi-function virtual channel(MFVC)mechanisms),软件可以通过配置PCIe设备的配置空间来分配VC和TC的映射关系。
virtual channel capability structure or multi-function virtual channel capability structure是否支持是可选的(即拥有多个VC,并将TC和VC进行映射的能力),但是TC0和VC0的映射关系是固定的(hardwired),并且所有设备都必须支持,如果PCIe系统不支持virtual channel capability structure or multi-function virtual channel capability structure,报文需要遵循以下原则避免异常。
A:发送端只能发送TC0的报文;
B:接收端/完成端需要能够接收TC labels的报文,并返回对应label的完成报文(completion which preserve the label);
C:switch 需要将所有的TC labels转换成TC0,并转发报文
下图可以进一步帮助理解VC的概念,物理设备可以拥有不同的VCs(资源独立),但所有VC都需要通过同一个link传输(multiplexed),报文发送到接收端之后,报文需要被de-multiplexed,然后送到不同的VCs去进一步处理。

这个multiplexed和de-multiplexed的过程,在switch内部也是类似的:

每个PCIe端口支持1-8个VCs,这也就是说,每个端口都要独立管理自己的VC资源(per port),所有支持超过1个VC的port,都需要有对应的VC capability structure来让软件进行配置。
注意,因为每个VC的物理资源独立,每个VC都有独立的DL层的flow control,VC机制还有一个重点就是barbitration,这里留一个hook,以后有时间再展开。
TC to VC mapping
所有的TC都必须mapped到一个VC,TC0和VC0的mapping是固定的,TC和VC的mapping还需要遵循以下规则:
A:一个或者多个TCs可以mapped到一个VC
B:一个TC只能mapped到一个VC
C:TC/VC的mapping必须在一个link的两端保持一致
VC/TC机制可以总结如下:

