[PCIe]LTSSM与电源管理

2023-11-02

1. LTSSM

LTSSM全称是Link Training and Status State Machine,有以下11个状态:

Detect, Polling, Configuration, Recovery, L0, L0s, L1, L2, Hot Reset, Loopback, Disable

这些状态分为5大类:

1、链路训练状态(Link Training State):Detect->Polling->Configuration->L0.

2、重训练状态(Re-Training(Recovery) State):Recovery.

3、软件驱动功耗管理状态(Software Driven Power Management State):L0->L1/L2/L0s

4、活动状态功耗管理状态(Active-State Power Management State,ASPM State):L1/L0s

5、其他状态(Other State):Hot Reset, Loopback, Disable

blob.png

与电源管理相关的状态为:L0 ,L1, L2, L0s

L0:

这是链路(Link)的正常状态(Normal and Full-Active State),所有的TLP、DLLP和Ordered Sets都可以被正常的收发。该状态下,速率可以是2.5GT/s或者是5GT/s或更高(如果链路两端设备都支持的话,且经过了Re-Trainning)。

L0s:

该ASPM状态主要用于降低功耗,在总线空闲的时候可以进入该状态,且从该状态可以迅速地重新切换回L0状态。当在L0状态是,链路上出现EIOS时,则表明即将进入L0s状态。当在L0s状态时,链路上出现FTS时,链路会迅速地完成位锁定和符号锁定,并进入L0状态。

L1:

相对于L0s状态,L1状态下的功耗更低。进入L1状态需要链路两端的PCIe进行“沟通”,只有双方都“同意”进入该状态,链路才会进入该状态。一般有以下两种方式:

1、第一种是由ASPM引导,硬件自动完成的。发送端发现链路上长时间没有TLP或者DLLP时,便通过ASPM建议接收端进入L1状态。如果接收端“同意”了,则链路进入L1状态;如果接收端“不同意”,则链路进入L0s状态。

2、第二种是有软件引导的,软件发送一系列的命令让链路进入低功耗状态(D1,D2,or D3 Hot)。随后,链路的上端设备会通知下端设备进入L1状态,收到来自下端设备的应答后,链路进入L1状态。

L2:

L2状态下的链路功耗更低,因为其只保留了Vaux,关闭了链路的其他功能。此时,需要Beacon信号或者WAKE#边带信号来唤醒系统。其中Beacon信号是一种低频信号(30KHz~500MHz)

这几个状态的切换关系如下:

对应的电源状态的区别如下:

2. Power Management states

Power Management states 按照Function 和 Link两个层面分为D states 和L states (就是上一节的L0,L1,L0s)

具体地说,D states是指Device的电源状态,L states是指Link的状态,是上下游之间连接的状态。

2.1 D states

D states 就是 Device Power Management States (D-States) of a Function,分为以下4个状态:

image.png

D0状态,又被称为Full-On状态。其有两个子状态——D0(未初始化,Uninitialized)和D0(活动,Active)。

当PCIe设备刚完成Fundamental Reset(前面的文章详细介绍过)时,或者刚从D3 Hot状态进入D0状态时,该PCIe设备的Function默认进入的是D0未初始化状态。在D0未初始化状态下,所有的寄存器(除了Sticky位)都恢复为其默认的状态。此时,只能响应配置请求(Configuration Transaction),且不能发起事务,也不能处理接收到的Memory或者IO事务。

当处于D0未初始化状态的Function完成配置后,便会进入D0活动状态。在D0活动状态下,Function的所有功能都是可操作的,即正常工作的状态。

D1状态,又称为轻睡眠状态(Light Sleep)。该状态是可选的。
D2状态,又称为深睡眠状态(Deep Sleep)。该状态也是可选的。

D3状态,又称为Full-Off状态。其也有两个子状态D3 Hot状态和D3 Cold状态。当设备进入D3 Hot状态,表明该设备的电源尚未切断;而进入D3Cold状态,则表明设备的电源已被切断,如有Vaux存在,则链路进入L2状态,否则进入L3状态。

软件层可以通过向PMCSR(Power Mgt Control and Status Register)的PowerState位置写相关值,使得设备的某个Function进入D3 Hot状态。在D3 Hot状态下,该Function只能发送PME消息和PME_TO_ACK消息或者应答配置请求和PME_Turn_Off消息。

PCIe设备PM的各个状态之间的切换关系,如下图所示:

3.D states和L states的关系

D states和L states的关系其实就是上下游端口的电源状态与他们之间link的状态关系,如下表:

4.ASPM

Active State Power Management (ASPM) is an autonomous hardware-based, active state mechanism that enables power savings even when the connected components are in the D0 state. After a period of idle Link time, an ASPM Physical-Layer protocol places the idle Link into a lower power state. Once in the lower-power state, transitions to the fully operative L0 state are triggered by traffic appearing on either side of the Link. ASPM may be disabled by software.
主动状态电源管理(Active State Power Management, ASPM)是一种基于自主硬件的主动状态机制,即使连接的组件处于D0状态,也可以节省电源。经过一段空闲链路时间后,ASPM物理层协议将空闲链路置为低功耗状态。一旦进入低功率状态,连接两端出现的流量将触发向完全运行的L0状态的转换。ASPM可能被软件禁用。

Components in the D0 state (i.e., fully active state) normally keep their Upstream Link in the active L0 state, as defined in Section 5.3.2 . ASPM defines a protocol for components in the D0 state to reduce Link power by placing their Links into a low power state and instructing the other end of the Link to do likewise. This capability allows hardware-autonomous,dynamic Link power reduction beyond what is achievable by software-only controlled (i.e., PCI-PM software driven)power management.

D0状态的组件(即如第5.3.2节所定义,通常使其上游链路处于活动的L0状态。ASPM为处于D0状态的组件定义了一个协议,通过将它们的链接置于低功率状态并指示链接的另一端也这样做来降低链接功率。这种能力允许硬件自主的,动态的链路功耗降低,超出了软件(PCI-PM软件驱动)控制的能力的电源管理。

通俗点讲:一般的设备(不支持ASPM)处于D0状态时对应的link状态为L0(参考上面一张图)。而支持并使能ASPM的组件,在D0状态可由硬件自主检测链路是否空闲,然后在空闲时自动让link状态进入L1(L0s)低功耗状态(并指示对端)。

BTW:据SSD的供应商宣传,支持ASPM的SSD和主板配合可以明显改善SSD的发热(高性能的SSD发热还是很猛的)。

ASMP在linux下的支持与软件介绍:The ASPM issues on Linux 3.2 kernel_存储之厨的技术博客_51CTO博客_Linux ASPM

4.1ASPM 相关的Capabilities

PCI Express Capability Structure:

bit22:ASPM Optionality Compliance

这一位用于指示组件是否兼容ASPM,软件需要判断这一位是否为1来决定是否可以使你ASPM。(可能是用于早期ASPM还未定义完全的版本)

5. L1 PM Substates

每个component必须上报它支持ASPM的程度,以及L0s和L1的退出latency(从L0s/L1到L0所需的时间)。endpoint必须报告它能承受的最差latency,例如因为L0s/L1到L0的转换时延导致的内部FIFO 溢出(overrun)。 Power management软件可以利用各component提供的信息来进行合适的aspm。

PM L1ss:

首先得enable PM L1.1或者PM L1.2,在进入L1之后,通过拉高CLKREQ#来进入L1.1或L1.2, CLKREQ#也用来退出L1ss。注意CLKREQ#是个open-drain三态双向端口,当有一端将其拉低,则CLKREQ#为低。如果两端都不drive CLKREQ#,则为高,表明可以关断REFCLK。注意进入L1的请求是由upstream端口发起。(CLKREQ# 低有效,拉低请求外部时钟打开)

当link处在PCI-PM L1.0,且PCI_PM L1.2 enable位已被设置,如果CLKREQ#被拉高,则必须进入L1.2;

当link处在PCI-PM L1.0,且PCI_PM L1.1 enable位已被设置,如果CLKREQ#被拉高且PCI_PM L1.2没被enable,则必须进入L1.1;

支持ASPM L1.2的端口必须支持Latency Tolerance Reporting (LTR)。

当link处在ASPM L1.0,且ASPM L1.2 enable位已被设置,当CLKREQ#被拉高后,如果下面两个条件都满足,就会进入ASPM L1.2:

1. 上报的snooped LTR值大于或等于LTR_L1.2_THRESHOLD中的value和scale确定的值,或者没有snoop service latency的需求;

2. 上报的non-snooped LTR值大于或等于LTR_L1.2_THRESHOLD中的value和scale确定的值,或者没有non-snoop service latency的需求。

当link处在ASPM L1.0,且ASPM L1.1 enable位已被设置,当CLKREQ#被拉高后,如果不满足进入L1.2的条件,就会进入ASPM L1.1.

当进入L1.2的条件已经满足,则:

1.upstream和downstream端口都必须监测CLKREQ#的逻辑状态;

2. upstream端口在进入L1.0前不能拉高CLKREQ#;

3. 允许任何端口将CLKREQ#拉低来阻止link进入L1.2;

4. 当CLKREQ#被拉高,端口进入L1.2.Entry.

L1 PM Substates Extended Capability

L1 PM子状态扩展Capability是一个可选的Capability,如果L1 Substates 是在一个端口上实现的,则需要这个Capability。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

[PCIe]LTSSM与电源管理 的相关文章

  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • 如何在 Linux shell 中将十六进制转换为 ASCII 字符?

    假设我有一个字符串5a 这是 ASCII 字母的十六进制表示Z 我需要找到一个 Linux shell 命令 它将接受一个十六进制字符串并输出该十六进制字符串代表的 ASCII 字符 所以如果我这样做 echo 5a command im
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • 如何在apache 2.4.6上安装apxs模块

    我刚刚用过apt get update我的 apache 已更新为2 4 6 我想安装 apxs 来编译模块 但收到此错误 The following packages have unmet dependencies apache2 pre
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 为什么我可以直接从 bash 执行 JAR?

    我是一个长期从事 Java 工作的人 并且知道运行带有主类的 JAR 的方法MANIFEST MFJar 中的文件很简单 java jar theJar jar 我用它来启动 Fabric3 服务器 包含在bin server jar在其标
  • PHP 无法打开流:是一个目录

    非常简单的 PHP 脚本 我在我亲自设置的 Ubuntu Web 服务器上的 EE 模板中运行 我知道这与权限有关 并且我已经将我尝试写入的目录的所有者更改为 Apache 用户 我得到的错误是 遇到 PHP 错误 严重性 警告 消息 fi
  • jq中如何分组?

    这是 json 文档 name bucket1 clusterName cluster1 name bucket2 clusterName cluster1 name bucket3 clusterName cluster2 name bu
  • 如何确保应用程序在 Linux 上持续运行

    我试图确保脚本在开发服务器上保持运行 它会整理统计数据并提供网络服务 因此它应该会持续存在 但一天中有几次 它会因未知原因而消失 当我们注意到时 我们只需再次启动它 但这很麻烦 并且某些用户没有权限 或专有技术 来启动它 作为一名程序员 我
  • 如何更改 Apache 服务器的根目录? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 如何更改 Apache 服务器的文档根目录 我基本上想要localhost从 来 users spencer projects目录而不是
  • 内核模式下的线程(和进程)与用户模式下的线程(和进程)有什么区别?

    我的问题 1 书中现代操作系统 它说线程和进程可以处于内核模式或用户模式 但没有明确说明它们之间有什么区别 2 为什么内核态线程和进程的切换比用户态线程和进程的切换花费更多 3 现在 我正在学习Linux 我想知道如何在LINUX系统中分别
  • 如何在 Bash 中给定超时后终止子进程?

    我有一个 bash 脚本 它启动一个子进程 该进程时不时地崩溃 实际上是挂起 而且没有明显的原因 闭源 所以我对此无能为力 因此 我希望能够在给定的时间内启动此进程 如果在给定的时间内没有成功返回 则将其终止 有没有simple and r
  • 是否可以创建一个脚本来保存和恢复权限?

    我正在使用 Linux 系统 需要对一组嵌套文件和目录进行一些权限实验 我想知道是否没有某种方法可以保存文件和目录的权限 而不保存文件本身 换句话说 我想保存权限 编辑一些文件 调整一些权限 然后将权限恢复到目录结构中 将更改的文件保留在适
  • 删除 Git 存储库,但保留所有文件

    在我使用 Linux 的过程中的某个时刻 我决定将我的主目录中的所有内容都放入源代码管理中是个好主意 我不是在问这是否是一个好主意 我是在问如何撤销它 删除存储库的原因是我最近安装了 Oh My Zsh 而且我非常喜欢它 问题是我的主目录有
  • 当 grep "\\" XXFile 我得到“尾随反斜杠”

    现在我想查找是否有包含 字符的行 我试过grep XXFile但它暗示 尾随反斜杠 但当我尝试时grep XXFile没关系 谁能解释一下为什么第一个案例无法运行 谢谢 区别在于 shell 处理反斜杠的方式 当你写的时候 在双引号中 sh
  • C++ Boost ASIO 简单的周期性定时器?

    我想要一个非常简单的周期性计时器每 50 毫秒调用我的代码 我可以创建一个始终休眠 50 毫秒的线程 但这很痛苦 我可以开始研究用于制作计时器的 Linux API 但它不可移植 I d like使用升压 我只是不确定这是否可能 boost
  • Urwid:使光标不可见

    我正在使用 urwid 它是一个用于在 ncurses 中设计终端用户界面的 Python 框架 但有一件事我在 urwid 中无法做到 而这在 Curses 中很容易做到 使光标不可见 现在 选择按钮时光标是可见的 而且看起来很丑 有办法
  • 在 Mac OSX 上交叉编译 x86_64-unknown-linux-gnu 失败

    我尝试将我的 Rust 项目之一编译到 x86 64 unknown linux gnu 目标 cargo build target x86 64 unknown linux gnu Compiling deployer v0 1 0 fi
  • PyQt5 - 无法使用 QVideoWidget 播放视频

    from PyQt5 QtWidgets import from PyQt5 QtMultimedia import from PyQt5 QtMultimediaWidgets import from PyQt5 QtCore impor

随机推荐

  • 实例分割新思路之SOLO v1&v2深度解析

    前言 实例分割一般有两种做法 一种是top down 既先检测 bbox 后在每个bbox中进行mask的分割 例如Mask R CNN 第二种为bottom up做法 先分割出每一个像素 再进行归类 本文介绍的两篇论文另辟蹊径 直接分割实
  • 彻底卸载Keil4和Keil5

    一 卸载 在keil安装目录下找到uninstall exe文件 点击卸载 卸载完后将该文件下的所有文件删除 二 清除注册表 按下windows R打开运行 输入regedit打开注册表 将HKEY CLASSES ROOT目录下的 所有U
  • 2020初步总结

    一晃来这快两年了 今年写的博客也还算比较勤快吧 最忙的应该是上半年 经历了忙成狗的阶段 下半年还算稍微好点 对今年的总结是 1 每个月保证出博客量在12篇以上 这点还是有保证的 最忙的5月的时候 也是能保证12篇 2 对相关的学习进行了深入
  • 深度学习模型参数量计算

    若你的模型parameters为7327930 则 7327930 4 Byte 1024 1024 27 95 MB
  • 【Git详解大全】

    文章目录 1 Git 概述 1 1 版本控制 2 Git常用命令 2 1 初始化本地库 2 3 添加到暂存区 2 4 提交本地库 2 5 修改文件 2 7 历史版本 3 分支操作 3 1 什么是分支 3 2 分支的操作 4 Git团队协作
  • theos linux环境,MAC OS X下的Linux环境

    关键字 HomeBrew 好比Windows下的Cygwin 安装Homebrew 该si胜过macport ruby e curl fsSL https raw githubusercontent com Homebrew install
  • 【知识分享】C语言应用-易错篇

    一 C语言简介 C语言结构简洁 具有高效性和可移植性 因此被广泛应用 但究其历史的标准定义 C语言为了兼容性在使用便利性作出很大牺牲 在 C陷阱与缺陷 一书中 整理出大部分应用过程中容易出错的点 本文为 C陷阱与缺陷 的浓缩版本 想要更详细
  • 009 5道例题讲解函数递归——“C”

    函数递归是什么 程序调用自身的编程技巧称为递归 recursion 递归做为一种算法在程序设计语言中广泛应用 一个过程或函数在其定义或说明中有直接或间接 调用自身的一种方法 它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问
  • Leetcode2486-追加字符以获得子序列

    双指针遍历即可 class Solution public int appendCharacters string s string t int n s size m t size int l 0 r 0 while l
  • 连接游戏服务器网络延迟高,网络延迟_连wifi玩游戏网络延迟高-太平洋IT百科

    网络延迟是游戏玩家最不能忍的 为了解决网络延迟的问题 玩家们装了光纤 换了路由 然而 为你我用了半年的积蓄 玩个农药还跳ping 开局两分钟 延迟400ms 网络延迟在王者荣耀中卡得连鲁班七号都表示 我想静静 连WIFI玩游戏网络延迟高怎么
  • 为什么动态库不能被其他动态或静态库包含

    如果静态库包含了动态库 则动态库失去了它的意思 因为动态库是在运行时调用的 如果包含在静态库里 意味着在编译时把动态库编译进去了 gcc不会做这么荒唐的事的 如果动态库包含了动态库 这也没必要 因为运行时可以直接调用了 为什么还要包含到另一
  • 腾讯云服务器搭建小皮面板phpstudy教程

    腾讯云控制台设置 找到自己服务器所在的实例 这里可以获得远程登录的账号密码 域名解析在下面添加自己ip解析到购买的域名就好了 搭建云服务器及php环境搭建教程如下 方包用的是windows server 服务器 适合新手 不像linux那样
  • GDI+ 中路径渐变画刷的使用

    背景 路径是一系列相互连接的直线和曲线 由许多不同类型的点所构成 用于表示复杂的不规则图形 GraphicsPath 类表示 路径渐变画刷允许设置颜色从中心向边界渐变的画刷 可以设置中心点颜色和边界点的颜色 构建路径渐变画刷 使用路径构建
  • Linux命令集锦-持续更新

    centos版本 CentOS Linux release 7 6 1810 Core 一 查看端口占用 lsof Linux安装 sudo yum install lsof Mac安装 brew install lsof lsof i p
  • 2020年排名前10的前端框架

    Ant Design 网站链接 https ant design index cn 蚂蚁金服出品 非常著名的框架 就算你不了解前端 也会在公司的项目中多少听到程序员说起过 目前很多公司都在用 已经很成熟 而且提供了对设计师友好的 Sketc
  • tensorflow目标检测api使用过程中的问题

    tensorflow目标检测api使用过程中的问题 使用环境 win10 pycharm开发平台 所有的依赖包都是用pip安装的 按照官方要求把api的依赖库装完之后在测试的时候提示no module named object detect
  • xshell卸载不干净导致无法安装

    卸载xshell 删除两个地方的注册表 Windows 文件夹下 C Program Files x86 InstallShield Installation Information 这个目录下 删了这个文件夹 F3FDFD5A A201
  • 【译】Hard Forks, Soft Forks, Defaults and Coercion

    区块链领域的一个重要论据是硬叉或软叉是否是首选的协议升级机制 两者之间的基本区别在于 软叉通过严格减少有效的交易集来改变协议的规则 所以遵循旧规则的节点仍然会进入新链 假设大多数矿工 验证者实施叉 而硬叉允许以前无效的交易和块变得有效 所以
  • centos7部署tomcat

    1 下载tomcat和jdk的tar gz包 并放在 root目录下 链接 https pan baidu com s 1fsJh8f6 rQxFzA5SIzUSfw 提取码 6zmg 2 解压文件 tar xf apache tomcat
  • [PCIe]LTSSM与电源管理

    1 LTSSM LTSSM全称是Link Training and Status State Machine 有以下11个状态 Detect Polling Configuration Recovery L0 L0s L1 L2 Hot R