PCIe物理层链路训练和初始化(详细)总结附图文解析-PCIe专题知识(三)

news2024/11/24 20:40:52

目录

  • 前言
  • 一、简介
    • 1.1 链路过程总结
  • 二、基本概念
    • 2.1 常用字符序列
      • 2.1.1 TS1 TS2序列
      • 2.1.2 Idle序列
      • 2.1.3 FTS(Fast training sequence)序列
      • 2.1.4 SKIP序列
    • 2.2 链路训练相关知识
  • 三、具体过程
    • 3.1 detect状态
    • 3.2 polling状态
    • 3.3 config状态
    • 3.4 L0状态
    • 3.5 Recovery状态
      • 3.5.1 Recovery状态总流程介绍
      • 3.5.2 Recovery状态各状态转换介绍
  • 四、其他相关链接
    • 1、PCI总线及发展历程总结
    • 2、PCIe物理层总结-PCIE专题知识(一)
    • 3、PCIe数据链路层图文总结-PCIe专题知识(二)
    • 4、8b/10b编码方式详细总结

前言

本文主要介绍PCIe物理层链路训练和链路初始化的详细过程。

一、简介

物理层实现了链路训练(Link Training)和链路初始化(Link Initialization)的功能,这一般是通过链路训练状态机(Link Training and Status State Machine,LTSSM)来完成的
主要流程为上电后两侧根据PCIe总线协议进入LTSSM流程;该过程是一套硬件自动化的流程,链路双方自动协商速率和宽度,调节发送和接收参数,从而达到最佳信号质量。

1.1 链路过程总结

1、初始状态,探测对方是否存在
2、互发Training Sequence,实现位锁定(Bit Lock)、字符锁定(Symbol Lock,Gen1 & Gen2 Only)、块锁定(Block Lock,Gen3 Only)
3、互发TS,确定链路宽度、速度,通道位置翻转(Lane Reversal)、信号极性翻转(Polarity Inversion)、确定链路的数据率(Data Rate),确定lane-to-lane Deskew
4、进行链路重新训练
5、正常工作状态
流程图如下:

在这里插入图片描述

二、基本概念

2.1 常用字符序列

PCIe进行链路训练时要发送一些特殊的字符序列,这些序列也被称为PLP,物理层报文。这些字符序列主要有如下:

2.1.1 TS1 TS2序列

TS1(training sequence 1)主要用于检测PCIe链路的配置信息,TS2用来确认TS1的检测结果。TS序列gen1、gen2和gen3的格式有所不同,为了简化说明,我们以gen1、gen2格式来描述。 它们由16个symbol组成。第1个字符为COM控制字符表示序列的开始。第二个字符在链路初始阶段为PAD(空字符),在配置阶段为该端口使用的Link number。第二个字符在初始阶段为PAD,在配置阶段为Lane number。第三个字符为FTS序列的个数。第四个字符为当前PCIe设备支持的数据传输速率。第五个字符存放命令。
在这里插入图片描述

2.1.2 Idle序列

当发送端进入Electrical Idle之前要向对端发送EIOS序列。出于Idle状态时PCIe链路使用的功耗最低。

2.1.3 FTS(Fast training sequence)序列

由1个COM字符加上3个FTS字符组成,主要目的是协助PCIe的链路获取bit lock和symbol lock。

2.1.4 SKIP序列

1个COM加上3个SKP字符组成。主要用于时钟补偿,处理各个lane上面的skew。

2.2 链路训练相关知识

1、位锁定(bit lock):因为PCIe总线在进行数据传递时需要使用时钟进行同步,但是PCIe链路中并没有提供这个时钟信号,因此进行链路训练时接收端需要从发送端的数据报文中提取接收时钟,这个过程被称为位锁定。
2、字符锁定(symbol lock):在链路训练过程中,PCIe链路要首先确定COM字符,它标志着链路训练开始或者重新训练的开始,确定COM字符的标志被称为字符锁定。
3、链路宽度:一条PCIe总线提供的链路带宽可以是x1,x2,x4,x8等等,但是这个总线上的所挂接的设备并不完全使用这些链路。如一个x4的设备可能会接到x8的链路上,这时在链路训练时就必须通知对方实际的链路状态。
4、通道翻转:PCIe链路两端的设备所使用的的Lane可以错序进行连接,这个就是通道翻转。
5、信号翻转:在相同的通道上,差分信号的极性也可以错序连接,这个就是信号翻转。
6、链路数据率:最初链路的训练和初始化都是基于2.5G T/S 也就是GEN1的速度的,如果链路两端都支持更高的速度则会自动retrain到更高的速度。
7、通道对齐:链路上的通道可能会不是同时到达的,有的可能早到有的可能晚到,链路就需要进行调整和补偿,这个就叫做通道对齐。

三、具体过程

3.1 detect状态

此部分主要的作用是用来确认PCIe链路上可以正常工作的lane资源
1、detect.quiet
2、detect.active
3、polling

1、上电后PCIe两端设备同时进入detect.quiet状态,首先host先将linkup 以及upconfig capblity 置0,同时PCIe链路处于静默状态,当其中一个或多个lane退出静默状态,或者经过12ms后,进入detect active状态。
2、host向对端“未经过配置的lane”发送receive Detect 序列(通过DC共模电压来识别对方是否存在,对应的lane是否正常工作)。若没有一个存在则退回Detect.quiet状态重新进行detect流程。否则经过12ms后再次发送receive Detect序列来确认与上次正常工作的lane数目是否一致。若不一致则退回Detect.quiet状态重新进行detect流程。若一致则进入下一个状态polling状态

3.2 polling状态

该状态主要功能为获取bit/symbol lock 以及同步链路两端使其进入下一个config状态。 有基本有一下三个子状态机组成,其实还有一个polling.compliance状态机负责对pcie链路进行检测是否存在故障。
总过程如下:
1、polling.active
2、polling.config
3、exit to config状态
在这里插入图片描述

1、进入polling.active 状态后TX等待DC共模电压恢复到正常水平后首先PCIe两端的TX会向对端发送1024个TS1序列,用于获取bit/symbol lock,其中TS1序列的Lane/Link number必须为PAD(即不设置Lane/Link number),由于pcie两端设备进入polling.active状态的时机可能不同步因此只要满足一下几种情况就能进入polling.config状态
2、同时RX会接收8个TS1序列(对端通过loopback传过来),或者TS2序列(对端先进入polling.config状态,从而生成TS2序列),
3、如果没有接收到则经过20ms判断RX是否接收8个TS1序列,或者从进入polling.active状态时有至少一个lane是可以正常工作的。
4、满足以上条件则进入polling.config状态。否则进入polling.compliance状态对链路进行修复,修复成功重新进入polling.active,修复不成功退回detect状态。
5、进入polling.active状态后,首先设置link control 2寄存器的transmit margin为0, 其次向对端发送8个TS2序列表示已经成功进入polling.config状态。最后要收到8个TS2序列(,若在48ms之内完成以上操作则进入config状态,否则退回到detect状态重新训练。

3.3 config状态

该功能是pcie link 训练中最重要的状态,主要的作用为完成pcie链路的主要配置工作主要包括,link number 和 lane number,以及对各个lane通过设置FTS来进行deskew。然后进入L0状态使PCIe链路正常工作 主要有以下几个子状态组成分别为:
1、cfg.linkwidth.start
2、cfg.linkwidth.accept
3、cfg.linknum.start
4、cfg.linknum.accept
5、cfg.complete
6、cfg.idle
7、L0
在这里插入图片描述
1、cfg.linkwidth.start和cfg.linkwidth.accept 主要的作用是确定linknum(通过互相发送TS1来确定PCIe下游端口的linknum拓扑结构)。
2、cfg.linknum.start和cfg.linknum.accept 主要的作用是确定lanenum 。
3、cfg.complete 状态主要是确定完link/lane num后,再通过互发TS2序列来同步pcie链路两端使其同步进入cfg.idle状态 另一个作用是通过TS2序列来确定设置多少个FTS,来消除lane之间的skew。
4、cfg.idle 该状态主要为pcie两端会向对端发送16个idle序列,同时接受端收到16个idle序列后,将自己的link_up寄存器设置为1,同时pcie链路的状态有DL-inactive转变为DL_init,进入L0状态,PCIe链路可以正常工作。

3.4 L0状态

该状态为PCIe链路正常工作的状态,host可以访问device的配置空间以及与之进行数据交互。

3.5 Recovery状态

3.5.1 Recovery状态总流程介绍

当链路需要重新训练时需要进入L0状态,通常是当改变数据传输速度或者是链路宽度以及从L0s, L1等低功耗状态中回复的时候都需要进入该状态(L0s可以直接回到L0状态,只有在切回L0状态时不能重新获取bit/symbol lock时才进过recovery状态)。在该状态中位锁定,符号锁定操作都会被重新进行,该状态一共分为以下几个子状态:recovery.rcvlock、recovery.rcvcfg、recovery.speed、recovery.idle。
1、PCIe需要更改链路速率
pcie设备中存在两个状态位,dircted_speed_change == 1表示pcie设备希望更改传输速率,changed_speed_recovery == 1,表示pcie链路更改速率完成。软件可以将dircted_speed_change == 1同时 changed_speed_recovery == 0 触发设备进入recovery状态,注意pcie 链路两边需要同时进行该操作;
2、PCIe需要更改链路宽度;
3、已经配置完成的lane又重新受到TS1或者TS2序列;
4,、发现对端进入idle状态(只有当对端进入idle是没有发送EIO序列,认为pcie链路出了故障)。
具体关系如下图所示:
在这里插入图片描述

3.5.2 Recovery状态各状态转换介绍

1、recovery.rcvlock:该状态重新获取bit/symbol lock 并处理lane之间的skew;
比如,switch 与 EP两端都处于L0 状态,EP想改变速率,
(1)则软件将dircted_speed_change 置1,同时将changed_speed_recovery 置0,进入recovery.rcvlock状态,同时向switch发送TS1 序列(该序列中的speed change 位为1),
(2)当switch接收到TS1时直接进入recovery.rcvlock状态并向对端发送若干TS1序列(此时还没有检查接收TS1的speed change状态位,所以发送的TS1序列,speed change 仍然为0),当switch收到8个连续的TS1(speed change 位为1),将改变switch本地的dircted_speed_change 置1,此时再向EP发送若干TS1序列(speed change 为1)。
(3)当EP设备收到8个 TS1序列中speed change 状态和EP本地dircted_speed_change状态一样,则进入recovery.rcvcfg状态。并向switch发送TS2序列(其speed change 也为1).
(4)当switch 接收到8个TS2序列中speed change 状态和switch本地dircted_speed_change状态一样。则进入recovery.rcvcfg状态。同时向EP发送TS2 序列。

2、recovery.rcvcfg switch和ep 根据TS2序列中的speed change 状态位来决定进入下个状态机:
(1)当TS2序列中speed change状态位1 跳转到recovery.rcvspeed状态,同时向对端发送32个TS2序列
(2)当TS2序列中speed change状态位0 跳转到recovery.rcvidle状态,同时向对端发送16个TS2序列

3、recovery.rcvspeed 状态:
(1)进入该状态后根据TS2序列中的速率,向对方发出不同的EIO序列,同时两端进入electrical idle状态(TX和RX都进入idle状态)。
(2)pcie两端都进入electrical idle 状态后,需要判断pcie链路两端是否成功完成速率协商,等待800ns ~ 1ms 后判端 successful_speed_negotiation是否为1,然后将本地dircted_speed_change 置位0,跳转到recovery.rcvlock用新的速率重新获取bit/symbol lock 并处理lane之间的skew。若不能获得symbol/bit lock 还得退回recovery.rcvspeed 进行降速,再次进入recovery.rcvlock状态获取bit/symbol lock 并处理lane之间的skew。

4,recovery.rcvsidle 链路两端设备TX向对端发送16个idle序列,并且RX端接受到8个idle序列,则该设备进入L0状态。

四、其他相关链接

1、PCI总线及发展历程总结

2、PCIe物理层总结-PCIE专题知识(一)

3、PCIe数据链路层图文总结-PCIe专题知识(二)

4、8b/10b编码方式详细总结

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/490620.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Git】全面详细了解开发者必备工具Git(2.0)

✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 文章目录 学习目标起步——关于版本的控制  文件的版本  版本控制软件  使用版本控制软件的好…

Ubuntu 23.04 安装 Conda

Ubuntu 23.04 安装 Conda 1. 下载 Conda 安装脚本2. 运行安装脚本3. 安装完成后,关闭当前终端并打开新终端,这将激活 Conda4. 更新 Conda 至最新版本5. 添加必要的 Conda 通道以获取更多软件包6. 测试是否安装成功 1. 下载 Conda 安装脚本 wget https:/…

[Gitops--10]微服务项目部署流水线编写

微服务项目部署流水线编写 1. 部署环境说明 序号管理地址作用1192.168.31.199GitLab2192.168.31.104Harbor3192.168.31.131kubesphere 1.1 GitLab 1.2 流水线 1.2.1 创建流水线 1.2.2 创建凭证 1.2.3 创建kubeconfig凭证 这里需要注意的是,config中如果使用的是域名,那么需…

JavaWeb ( 三 ) Web Server 服务器

1.5.Web Server服务器 Web Server 服务器是一种安装在服务器主机上的应用程序, 用于处理客户端(Web浏览器)的请求,并返回响应内容。服务器使用HTTP(超文本传输协议)与客户机浏览器进行信息交流。 简单说就是将http协议的信息翻译成对应开发语言可以处理的对象信息。…

lombok常用的注解及使用方法

lombok是⼀种简化源码提⾼编程效率的⼯具&#xff0c;⽤于⽣成常⽤的代码。 如何使用lombok 引⼊依赖 <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</ver…

【ChatGPT】吴恩达『提示工程』课程完全笔记下载

版权说明&#xff1a;『ChatGPT Prompt Engineering for Developers』是DeepLearning.AI出品的免费课程&#xff0c;版权属于DeepLearning.AI(https://www.deeplearning.ai/)。 本文是对该课程内容的翻译整理&#xff0c;只作为教育用途&#xff0c;不作为任何商业用途。 吴恩达…

Activiti7流程操作详解

一、Activiti流程操作步骤 定义流程&#xff0c;按照BPMN的规范&#xff0c;使用流程定义工具&#xff0c;用流程符号把整个流程描述出来 部署流程&#xff0c;把画好的流程定义文件&#xff0c;加载到数据库中&#xff0c;生成表的数据 启动流程&#xff0c;使用java代码来操…

4D成像雷达风口,谁在快速崛起?

4D成像雷达正进入规模量产落地的关键窗口期。 高工智能汽车注意到&#xff0c;毫米波雷达的发展某种程度上可以分为两个阶段&#xff1a;第一个阶段&#xff0c;传统毫米波雷达时代&#xff0c;市场基本被博世、大陆、安波福等国际Tier1巨头把持&#xff0c;市场格局长期稳固&…

树形结构的三级分类如何实现?

概述&#xff1a; 本三级联动分类服务端使用的是: Springboot MyBatis-plus&#xff0c;前端使用的是&#xff1a;VueElementUI&#xff0c;树形控件使用的是el-tree。本三级联动分类可以把任一拖拽子项到其它目录&#xff0c;可以添加、编辑、删除分类。 效果图&#xff1a…

编译原理笔记(一)引论

文章目录 1.什么是编译程序2.编译过程和编译程序的结构2.1.编译过程概述2.2.编译程序的结构2.3.编译阶段的组合 3.解释程序和一些软件工具3.1.解释程序3.2.处理源程序的软件工具 4.PL/0语言编译系统 学习总结&#xff1a;这一部分是编译原理的绪论部分内容&#xff0c;对编译程…

Tokenizer分词

分词的一般流程 在使用神经网络处理自然语言处理任务时&#xff0c;我们首先需要对数据进行预处理&#xff0c;将数据从字符串转换为神经网络可以接受的格式&#xff0c;一般会分为如下几步&#xff1a; &#xff08;1&#xff09;分词&#xff1a;使用分词器对文本数据进行分…

STM32CUBEMX 待机模式最简单的RTC定时唤醒(低功耗电池产品必备)

文章意义&#xff1a; 看到很多技术帖子讲述RTC定时唤醒功能的时候&#xff0c;老是需要去读取当前时间&#xff0c;再设定下一个闹钟唤醒时间&#xff0c;无形中多了很多变量和操作。所以我决定分享一种简单的RTC定时唤醒方法&#xff0c;适合于不需要实现具体时间获取的场合…

企业遇到知识管理困境该怎么办?这里有解决方案!寻找Baklib

随着企业业务不断扩大&#xff0c;员工数量的增加&#xff0c;知识管理成为了企业面临的一个重要问题。企业需要管理大量的知识&#xff0c;如产品手册、流程规范、客户信息等&#xff0c;这些知识对企业的生产和经营至关重要。但是&#xff0c;如何高效地管理这些知识&#xf…

LeetCode_双指针_中等_24.两两交换链表中的节点

目录 1.题目2.思路3.代码实现&#xff08;Java&#xff09; 1.题目 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 示例 1&a…

第40讲:Python for-in循环语句使用索引遍历序列

文章目录 方法一&#xff1a;遍历的是序列的元素方法二&#xff1a;遍历的是序列的索引方法三&#xff1a;while循环遍历实现方法四&#xff1a;调用内置函数enumerate实现1.什么是enumerate函数2.调用内置函数enumerate实现索引遍历序列 如果在遍历序列的过程中&#xff0c;需…

国产高端GPU,国产替代加速(附国产厂家汇总)

前言 2022年8月9日&#xff0c;壁仞科技在上海发布首款通用GPU芯片BR100&#xff0c;标志着中国企业第一次打破了此前一直由国际巨头保持的通用GPU全球算力纪录&#xff1b; 8月31日&#xff0c;美国政府命令芯片厂商英伟达&#xff08;NVIDIA&#xff09;以及超威半导体&…

借助 Google Play 游戏电脑版 Com2uS 为用户打造多平台无缝体验

作者 / Google Play 游戏总监 Arjun Dayal 吸引潜在用户在 PC 端畅享游戏 《魔灵召唤&#xff1a;克罗尼柯战记》是韩国游戏开发商 Com2uS 于 2023 年 3 月面向全球发布的一款移动端大型多人在线角色扮演游戏。迄今为止&#xff0c;《魔灵召唤》在全球的下载量超过 1.8 亿&…

Aztec:混合zkRollup,而非zkEVM

1. 引言 Aztec zkRollup为混合zkRollup&#xff1a; 支持通用私有计算的加密zkRollup&#xff08;命名为Aztec&#xff09;&#xff1a;构建trustless、可扩展的、去中心化的Layer2 zkRollup&#xff0c;同时支持private smart contract execution。同时支持public state和pr…

C++ Primer阅读笔记--参数传递

目录 1--三种基本传递方式 2--数组形参 3--main函数传递参数 4--传递可变形参 1--三种基本传递方式 ① 值传递&#xff1a; 使用值传递时&#xff0c;初始值会拷贝给变量&#xff0c;对变量的改动不会改变初始值的值&#xff1b; ② 指针传递&#xff1a; 使用指针传递时&…

Mysql 查询性能优化

查看数据库用户连接数量 show processlist;分析表结构 索引 show index from conference;查询锁状态 show status like %lock%;是否开启慢查询 show variables like %slow_query_log%;日志查询默认情况下&#xff1a;slow_query_log的Value为OFF 如要开启慢查询日志&#…