pcie_ltssm

简介

PCIe LTSSM ,全名为Link Training and Status State Machine,主要是用在PCIe中Physical Layer Link的初始化与设置,让device之间建立起沟通桥梁。整个LTSSM状态机总共有11个state,每个state又可以分为多个substates,所以整个状态机的跳转可以说是非常的错综且复杂且完善。

image-20240228141706297

训练顺序

Traning Sequences Order Sets主要有两种,分别为TS1和TS2,主要目的是为了建立Bitlock和S ymbol Lock和交换Physical Layer的参数。当Link运作在2.5 GT/s(Gen 1)或5 GT/s(Gen 2)时,TS1/TS2使用8b/10b编码,8 GT/s则使用128b/130b编码。

链路训练速率

主要为三个Data Rates,分别为2.5GT/s,5GT/s 和 8GT/s。每个link开始必须以2.5GT/s的速率开始initial。

在negotiation的过程中,LTSSM会决定PCIe Port的link number和lane number。

LTSSM简介
  • Detect:主要是为了检测对端是否有device存在,分为detect.quiet和detect.active状态。

    • Detect.Quiet: Quiet的状态下,Tx会处于Electrical Idle的状态,且起始会以2.5 GT/S的速度开始,也就是Gen1 Link Speed。

    • Detect.Active: 在这个state,会perform一个叫做Receiver Detection Sequence。Receiver Detection Sequence首先会让Transmitter处于一个稳定的电压状态,然后持续的对D+与D-增加电压直到符合V TX-RCV-DETECT,另一放面持续的去侦测Receiver的高阻抗,然后用充电的曲线(rate)来判断是否有device的存在。

  • Polling:通过传送TS Order Set,回应所接收到的TS Order Set,在这个阶段建立Bit block和Symbol Lock。分为polling.active,polling.compliance和polling.configuration状态。

    • Polling.Active: 在这个状态下,Transmitter会开始传送TS1 Order Set,并且将” Link Number “ & “ Lane number within Link “设置为0,而且所有传送的TS1中的Data Rate Identifier栏位必须将所有support的date rate设为1。
    • Polling.Compliance: 这个state主要透过示波器、封包产生器或位元错误率测试仪用来做interoperability testing,只有EE想要量测讯号才会需要进入此state,一般的link training是可以跳过这个状态的。
    • Polling.Configuration: 在上面有提到Polling.Active会传送Lane/Link number为PAD/PAD的TS1,Polling.Configuration则是传送Lane/Link number为PAD/PAD的TS2,所以Polling.Configuration的TS2有点像是TS1的Double Confirm 的概念。
  • configuration:主要任务是分配port上所有的lanes,且分组成个别独立的Links,主要是透过TS1,TS2中的Link Number & Lane number within Link来达成,区别于polling state,这里已经被填充为实际的值。

    image-20240228170627139

    • 配置.链接宽度.开始:

      • DownStream: 由于Downstream不知道现在port的连接如何,所以会以试探性的方式,在所传送出的TS1中的Link number栏位选择任意号码做为初始值,然后Lane number维持PAD。
      • UpStream: 传送TS1,且Link/Lane number栏位保持PAD,并且在收到一定数量和条件的TS1后,比DownStream较早进入Linkwidth.Accept。
    • 配置.链接宽度.接受:

      • DownStream: 当DownStream接收一定数量的TS1中,Link Number栏位符合Linkwidth.Start state所传出的号码,那就可以形成一个Link Group。
      • UpStream: 会根据在DownStream在Linkwidth.Start阶段所发出的Link Number中,选定一个号码作为此port的Link Number,因此会在传送TS1中将Link Number栏位填入这个号码,所以顾名思义,UpStream接受了(Accept)了这个Link Number。
    • 配置.Lanenum.等待:

      • DownStream: 由于在Linkwidth.Accept的阶段某些Lanes已经组成一个Link Group,因此DownStream会开始在这个阶段传送独立的Lane Number值到每个Lane上。
      • UpStream: 会根据接收到的Lane number,直接回传相同的号码或者不同( Lane Reversal ),这里spec有提到相同或不相同,都还是可以进入下一个state。
    • Configuration.Lanenum.Accept:

      • 当接收到TS1 Link/Lane number都与自己所传送的相符合,则会进入Configuration.Complete state。
    • 配置。完成:

      • 接续Lanenum.Accept state,Complete阶段会开始传送相同的Link/Lane number,只是与Lanenum.Accept的差异在于Complete传送的是TS2。
    • 配置.空闲:

      • 在这个state,双方会开始传送Idle Symbols,当接收到连续8个Idle Symbols后,则会进入L0。