0
点赞
收藏
分享

微信扫一扫

pcie 软件与D0/1/2/3

大雁f 2022-04-25 阅读 65
硬件工程

from pcie 4.0 spec:PCI-PM Software Compatible Mechanisms 直翻记录

before here to know:

两种 PCIe PM

PCIe的Power Management(PM)分为两种:

  • PCI-Compatible PM
    • 符合PCI协议的电源管理,由软件通过Configuration Requests发起;
  • Active State Power Management(ASPM)
    • 定义基于硬件控制的电源管理,同时定义了唤醒系统的机制,PME message机制

简介:

PCI-PM 软件兼容机制
设备电源管理状态 (D-States) 的功能

虽然这些电源状态的概念对于系统中的所有功能都是通用的,但转换到给定电源管理状态时的含义或预期的功能行为取决于功能的类型(或类)。(电源状态之间的转换是不同的)

D0 电源管理状态是 Function 的正常运行状态。其他状态是各种级别的降低功率,其中功能要么不运行,要么支持有限的一组操作。

D1 和 D2 是中间状态,旨在为系统设计人员提供更大的灵活性,以平衡给定设备类别的节能、恢复时间和低功耗功能可用性权衡。例如,可以将 D1 状态支持为比 D2 稍微耗电的状态,但是这种状态会产生比 D2 更快的恢复时间。 D3 电源管理状态构成了一种特殊类别的电源管理状态,其中一个功能可以通过软件(关机按键 ?!)或通过物理移除其电源来转换为 D3。从这个意义上说,这两个 D3 变体被指定为 D3 hot 和 D3 cold 其中下标分别表示主电源的存在或不存在。
通过软件写入功能的 PMCSR 寄存器,允许 D3 热中的功能转换到 D0 状态。
通过重新应用主电源和断言基本复位,允许处于 D3 冷状态的功能转换到 D0 未初始化状态。

所有函数必须支持 D0 和 D3 状态 (D3 热和 D3 冷)。 D1 和 D2 状态是可选的。

(D0相当于设备正常工作状态,D3 hot相当于关机但未下电状态,D3 code相当于下电状态;

D1和D2为pcie硬件自定义的两种基于自身内部一些运行状态二定义的一些低功耗状态,D1称为浅睡眠,D2称为深睡眠(lower power,longer recovery time);

D0和D3为所有pcie必须要支持的两种设备状态,这归因于OS的系统控制(如下图),D1/2属于OS G1系统控制状态。

(OSPM对系统功耗状态定义如下:(可以参考系统低功耗的一些实际的应用操作:百度睡眠到内存???)

)

需要注意的是:

非 D0 状态下的交换机和根端口虚拟网桥行为
当与交换机/根端口(“虚拟桥”)关联的类型 1 功能处于非 D0 电源状态时,它将在处理内存、I/O 和配置时模拟传统 PCI 桥的行为请求和完成。流向下游的所有内存和 I/O 请求都作为不支持的请求终止。所有类型 1 配置请求都作为不支持的请求终止,但是类型 0 配置请求处理不受虚拟桥 D 状态的影响。流过虚拟桥的任一方向的完成是不受虚拟网桥 D 状态的影响。
请注意,消息的处理不受虚拟网桥的 PM 状态的影响。

(当switch/up处于非D0状态时:不支持type1(即对其他组件)的功能,对于type1型的所有mem/io请求全部看作UR来终止,TYPE0型的请求和cpl不受virtual-bridge D状态的影响;msg的处理也不受PM状态的影响)

D0:

所有函数都必须支持 D0 状态。 D0 分为两个不同的子状态,“未初始化”子状态和“活动”子状态。 当一个组件退出常规复位时,该组件的所有功能都进入 D0 未初始化状态。
当一个 Function 完成 FLR 时,它进入未初始化的 D0状态。 配置完成后,Function 进入 D0 active状态,PCI Express 功能的完全运行状态。当 the Function’s Memory Space Enable, I/O Space Enable, or Bus Master  Enable bits已设置,功能就会进入 D0 活动状态。

(D0状态分为:未初始化和活动态。当一个功能完成FLR(功能级别的复位)或者当一个组件退出常规复位时,其都进入D0未初始化状态。当初始化配置完成,并且function中的mem/io/bus enable的一个或几个使能之后,该功能就会进入D0活动态)

 

在D0状态下,设备又可以被分为32个功耗子状态,依次从0到max power,其中自状态0为默认状态,且代表该设备最大可以消耗的功耗。
在这里插入图片描述

 

D1:

D1 支持是可选的。 当处于 D1 状态时,函数不得在链路上发起任何请求 TLP,但第 1.1.1 节中定义的 PME 消息除外。 配置和 消息请求是 D1 状态中的函数接受的唯一 TLP。 所有其他收到的请求必须作为不支持的请求处理,并且所有收到的完成都可以选择 作为意外完成处理。 如果在 D1 中检测到由接收到的 TLP(例如,不支持的请求)引起的错误,并且启用了报告,则如果链路尚未在 L0 中,则必须将其返回到 L0,并且必须发送错误消息。 如果在 D1 中检测到由接收到的 TLP 以外的事件(例如,完成超时)引起的错误,则必须在将功能编程回 D0 状态时发送错误消息。

请注意,函数的软件驱动程序参与了函数从 D0 到 D1 的转换过程。
它通过保存任何功能状态(如有必要)以及为转换到 D1 准备功能来为该过程做出贡献。
作为此静止过程的一部分,Function 的软件驱动程序必须确保在将控制权交给系统配置软件之前终止任何中间事务 TLP(即具有未完成完成的请求),然后系统配置软件将完成向 D1 的转换。

(D1态仅支持配置请求和pme-msg的接收,其它请求均不支持(看作UR),其他cpl均可选择性地看作unexpected completion来处理,如果这个pcie启用了报告,链路必须回到L0中发送对应的错误消息,组件不用回到D0;如果D1状态中检测到接收到TLP除以上错误之外的错误(例如,完成超时),则将组件返回D0发送错误消息。从D1->D0的过程是需要软件参与的,硬件功能则通过记录功能状态与进行D1->D0的准备工作来为软件的处理提供“支持”。

D0->D1状态的转化需要软件的参与,硬件保存功能的D状态并且终止任何中间事务的处理,软件在确认后(设备进入该状态之前需要polling Device Status寄存器中的Transactions Pending bit为0,保证现在所有outstanding在链路上的Non-Posted传输都收到完成报文)软件将控制权交给系统配置软件,由系统配置软件完成pcie组件D0->D1的转化)

在D0状态下,设备又可以被分为32个功耗子状态,依次从0到max power,其中自状态0为默认状态,且代表该设备最大可以消耗的功耗。
在这里插入图片描述

 

D2:

D2 支持是可选的。当一个函数当前没有被使用并且可能在一段时间内不会被使用时,它可能会被放入 D2。此状态要求功能显着节省电力,同时仍保留完全恢复到之前状态的能力。
当处于 D2 状态时,函数不得在链路上发起任何请求 TLP,但第 1.1.1 节中定义的 PME 消息除外。配置和消息请求是 D2 状态中的功能接受的唯一 TLP。所有其他收到的请求必须作为不支持的请求处理,并且所有收到的完成都可以选择作为意外完成处理。如果在 D2 中检测到由接收到的 TLP(例如,不支持的请求)引起的错误,并且启用了报告,则如果链接尚未在 L0 中,则必须将其返回到 L0,并且必须发送错误消息。
如果在 D2 中检测到由接收到的 TLP 以外的事件(例如,完成超时)引起的错误,则必须在将功能编程回 D0 状态时发送错误消息。

(D2和D0的区别:只有当一个功能长时间没有被使用它才能进入D2状态,LINK为L1)

链路状态 (Link state)

PCIe包含几种链路状态——L0,L0s,L1,L2 (L1包含子状态,后续再介绍)

1. L0是Fully Active状态;

2. L0s,低功耗模式,仅支持ASPM方式,是硬件自动发起的,软件无法控制,是单向的,比如upstream有大量数据,downstream没有数据的时候downstream可以独立的进入L0s;

3. L1,低功耗模式,支持两种方式PCI-PM,ASPM;L1子状态可以关闭参考时钟、Tx common mode电路,Rx electric idle detect电路更加省电;

4. L2,低功耗模式,仅支持PCI-PM方式,关闭参考时钟、关闭PLL、关闭Main Power, 但是需要保留Aux Power;

5. L3,低功耗模式,仅支持PCI-PM方式,处于所有power都off的状态;

6. 按照省电的顺序L0<L0s<L1<L2<L3,越省电的状态recovery到L0正常工作状态的时间就会越长。)

在将功能从 D2 编程到 D0 到向功能发出下一个请求之间,至少需要 200 µs 的恢复时间。 在此恢复时间窗口中收到的请求的行为未定义(D2转换到D0后,至少需要200us的恢复时间)

D3:

如果 PMCSR 中的 No_Soft_Reset 字段已设置,则功能上下文需要由处于 D3hot 状态的功能维护。在这种情况下,系统软件不需要在从 D3 热转换到 D0 后重新初始化函数(函数将处于 D0 活动状态)。如果 No_Soft_Reset 位为 Clear,则功能上下文不需要由处于 D3hot 状态的 Function 维护,但是,不能保证功能上下文将被清除,并且软件不得依赖于此类行为。
因此,在这种情况下,系统软件需要在转换到 D0 后完全重新初始化函数,因为函数将处于 D0 未初始化状态。无论 No_Soft_Reset 位的值如何,如果链路状态已转换为 L2/L3 就绪状态,该功能将被复位。

(No_Soft_Reset=0,则由function自己处理;否则不需要function自己处理,系统软件在功能转换到 D0 后完全重新初始化函数。如果链路为l2/3 ready状态,则将执行复位)

IMPLEMENTATION NOTE
Transitioning to L2/L3 Ready:(由平台电源管理软件启动以便开始从设备中移除主电源和时钟)

如第 5.2 节所述,向 L2/L3 就绪状态的转换由平台电源管理软件启动,以便开始从设备中移除主电源和时钟的过程。因此,预计设备将在其链路转换为 L2/L3 ready后(设备处于D3 hot)不久转换为 D3 冷态(常规操作:先关机后断电???)(和No_Soft_Reset无关,No_Soft_Reset使仅适用于从 D3 热状态转化到D0)。虽然不能保证 L2/L3 Ready 和 D3cold 之间的这种相关性,但系统软件应确保仅在意图移除设备主电源时进入 L2/L3 就绪状态。(链路为L2/L3 Ready状态设备处于D3-hot状态,L2/L3 Ready状态时设备准备关机(移除主电源和时钟))

设备功能,包括那些能够在 D3 热时保持功能上下文(相关功能的正常运行)的那些( D3 hot 会设置 No_Soft_Reset 位),当由DL_Down 指示退出 L2/L3 ready状态时(已经撤掉主电源等),需要按照第 2.9.1 节所述重新初始化内部状态。(设备由关机到掉电后需要重新初始化)

除非 PCI-PM 电源管理功能寄存器中的 Immediate_Readiness_on_Return_to_D0 位被置位,否则系统软件必须在 D3hot→ D0 转换之后允许至少 10 ms 的最短恢复时间(参见第 7.9.17 节),然后才能访问该功能。(若没有Immediate_Readiness_on_Return_to_D0,则设备在关机到正常使用后至少需要10ms时间才能执行正常功能访问任务)

D3 HOT:

配置和消息请求是 D3 热状态中的函数接受的唯一 TLP。 所有其他收到的请求必须作为不支持的请求处理,并且所有收到的完成可以选择作为意外完成处理。 如果在 D3hot 中检测到由接收到的 TLP(例如,不支持的请求)引起的错误,并且启用了报告,则如果链接尚未在 L0 中,则必须将其返回到 L0,并且必须发送错误消息。 如果在 D3 hot 中检测到由接收到的 TLP 以外的事件(例如,完成超时)引起的错误,则可以选择在函数被编程回 D0 状态时发送错误消息。 一旦在 D3 hot 中,Function 可以稍后转换为 D3cold(通过从其主机组件中移除电源)。

请注意,函数的软件驱动程序参与了将函数从 D0 转换为 D3hot 的过程。它通过保存任何功能状态来促进该过程,否则这些功能状态会随着主电源的移除而丢失,并以其他方式准备功能以过渡到 D3 hot 。作为此静止过程的一部分,Function 的软件驱动程序必须确保在将控制权交给系统配置软件之前终止任何未完成的事务(即具有未完成完成的请求),然后系统配置软件将完成向 D3hot 的转换。(软件控制的D0->D3,必须提前保存功能的状态否则会通过硬件其他方式进入D3hot)

D3hot 中的功能允许通过软件(写入其 PMCSR PowerState 字段)转换到 D0活动状态或 D0uninitializedstate。只要提供电源和时钟,处于 D3 热状态的函数必须响应配置空间访问,以便软件可以将它们返回到 D0。请注意,从 D3 hot 到 D0,函数不需要在其转换期间或之后立即生成内部硬件复位(参见 PMCSR 中 No_Soft_Reset 位的用法)。

如果不需要内部复位,在 D3 热到 D0 完成初始化状态后,除了写入 PowerState 字段外,不需要额外的操作系统干预。
如果需要内部复位,设备将返回未初始化的 D0,并且需要对设备进行完全重新初始化。
完整的重新初始化序列将设备返回到已初始化的 D0。

(D3 hot可以返回D0-initialized(不需要初始化)或可以返回D0-uninitialized(需要初始化))

如果设备支持 PME 事件,并且 PME_En 已设置,则必须在 D3 hot 中保留 PME 上下文。
PME 上下文也必须在 PowerState 命令转换回 D0 时保留。(由D3 热到 D0过程中必须保留PME事件如果PME使能了的话)

IMPLEMENTATION NOTE
Devices Not Performing an Internal Reset

(原文:总线控制器到非 PCIe 总线并从 D3 热恢复
用作非 PCIe 总线(例如 CardBus、USB 和 IEEE 1394)接口的 PCIe 总线上的总线控制器是总线的示例从 D3 hot 恢复时不需要内部复位的控制器。
如果不需要此内部复位,则总线控制器将不需要在从其辅助(非 PCIe)总线上的 D3 hot 恢复时执行下游总线复位。)

到非 PCIe 总线的总线控制器和从 PCIe 总线上的 D3 热总线控制器恢复是总线控制器的示例,它们将受益于从 D3 热恢复时不需要内部复位。(pcie热恢复不需要总线控制器进行内部复位(这将避免复位与pcie总线相连的其他非pcie总线))

D3 cold

当一个函数的主电源被移除时,它会转换到 D3cold 状态。 上电序列及其相关的冷复位将功能从 D3cold 状态转换为 D0 未初始化状态,并且将由硬件恢复该功能的通电默认值(初始上电值),。 此时,软件必须对 Function 进行完全初始化,以重新建立所有功能上下文,完成 Function 恢复到其 D0active 状态。

支持 D3cold 唤醒功能的函数必须维护他们的 PME 上下文(在 PMCSR 中),
当 PME_En 设置时,用于在恢复过程中由 PME 服务例程软件检查。保留的附加上下文是特定于实现的。(D3cold 唤醒功能由PME 功能配合软件实现,在D3cold期间PMECSR必须做好状态的维护(比如说这些状态:a Function’s PME_Status bit, the requesting agent’s Requester ID, Caller ID if supported by a modem, IP information for IP directed network packets that trigger a resume event, etc.  这些状态写一清零))

必须使用辅助电源来支持功能内的 PME 事件检测、链路重新激活,并在 D3 冷内保存 PME 上下文。 请注意,一旦 I/O 层次结构恢复到完全通信状态,作为链接重新激活的结果,唤醒代理然后将 PME 消息传播到层次结构的根,指示 PME 事件的来源。 有关 PME 的详细信息,请参阅第 1.1.1 节。(PME相关事件必须使用aux power,并且若从D3 cold恢复到链路重新激活可以完全交互的状态,发起唤醒的一方必须传播PME消息至EP通知发生了一次PME事件)

ps:

PCIe功耗控制--Legacy PCI Compatible PM 可参考:

PCIe功耗控制--Legacy PCI Compatible PM_maxwell2ic的博客-CSDN博客_pcie 功耗切换

举报

相关推荐

%1$@、 %2$@、 %1$d

0 条评论