PCIE Spec ---Power management

Overview

电源管理主要是分为两个大类:D states 和 L states。

D states 是和某个特定的 Function 有关的电源状态:

      • D0为运行状态,功耗最大
      • D1、D2为中间省电状态
      • D3Hot是一个非常低的功率状态
      • D3Cold为关机状态

L states 是和特定的 link 有关的电源状态:

      • L0是运行状态
      • L0p是L0的低功率子状态
      • L0s, L1, L1.0, L1.1和L1.2是各种低功率状态

电源管理主要提供如下服务:

  • 识别给定功能的电源管理功能的机制
  • 将功能转换到某种电源管理状态的能力
  • 通知当前功能的电源管理状态
  • 在特定事件上唤醒系统的选项

下面是链路状态的转化:

Device Power Management States (D-States) of a Function

设备电源状态主要有以下几个:

    • D0:是设备正常运行的状态,其他的模式则是用于节能从而关闭部分操作,从而达到节能的目的,但是更低的功耗也就一位置恢复到 D0 状态的时间需要更多。
    • D1:可选的状态,D1 发生时除了消息以及配置 TLP 可以接收,其他所有的请求都会视为不支持的 TLP。若是发生 TLP 错误,则需要返回至 D0 状态处理 D0 到 D1 是需要软件参与的,用于保存任何的状态信息,并且从 D0 切换至 D1 需要处理完所有的 TLP。
    • D2:也是可选的状态,设备可能有段时间未使用,则进入,显著提高节能能力,但是同时保留直接唤醒至 D0 的能力。相同链路中只能有配置以及信息请求,其他的请求也是未支持的。
    • D3 状态又可以分成两类:
      • D3 hot:
        • No_Rest_Soft = 1----------function 的上下文是在 D3 hot 的状态下收集的,若是软件从 D3hot-->D0 状态,需要重新初始化 Function。
        • No_Rest_Soft = 0----------Function 的上下文不在 D3 hot 状态下收集,所以不能确认上下文是否被清除,所以需要重新初始化。
        • Note:若是链路层切换至 L2/L3 ready,则不需要管 No_Rest_Soft 的值,都是需要重新初始化的。
      • D3 cold:在设备电源移除之后进入的状态,若是重新进入 D0 状态需要 Function 重新进行初始化。

PCI Bridges and Power Management

由于电源管理是在操作系统的指导下进行的,因此每一类函数都必须有一个明确定义的标准,以确定功能可用性,以及在每种电源管理状态下运行时必须保留哪些功能上下文。一些示例设备类规范已经被提议作为ACPI规范的一部分,用于从音频到网络外接卡的各种功能。虽然为大多数函数定义特定于设备类的行为策略超出了本规范的范围,但定义PCI桥接函数所需的行为,这里的定义适用于所有三种类型的PCIe桥:

      • Host bridge, PCI Express to expansion bus bridge, or other ACPI enumerated bridge
      • Switches
      • PCI Express to PCI bridge
      • PCI-to-CardBus bridge

控制这些函数状态的机制在一定程度上取决于哪种类型的起源设备存在。下面的部分描述这些机制是如何在三种类型的桥上工作的.

介绍PCI Express Bridge功能的电源管理策略。PCI Express Bridge 可以被描述为具有次级总线下游的始发设备。介绍网桥功能的电源管理状态与其从母线的电源管理状态之间的关系。从图5-19中可以看出,从操作系统的角度来看,本章描述的PCI Express Bridge行为对于主机桥、交换机和PCI Express到PCI桥都是通用的。

Switches and PCI Express to PCI Bridges

交换机或PCI Express到PCI桥的次要总线的电源管理策略与为任何桥功能定义的策略相同,桥函数的PMCSR_BSE寄存器中的BPCC_En和B2_B3#总线电源/时钟控制字段支持与任何其他桥相同的功能。

Power Management Events

电源管理事件有两种类型:

  • 唤醒事件
  • PME 产生

Wakeup事件用于请求打开电源。PME生成事件用于向系统标识请求上电的函数。在传统的PCI中,这两个事件都与pme#信号相关。pme#信号由函数断言,以请求更改其电源管理状态。

当PME_En位被设置并且事件发生时,函数设置PME_Status位,并断言pme#信号。它保持pme#信号断言,直到PME_En位或PME_Status被清除(通常由软件)。

在PCI Express中,Wakeup事件与wake#信号相关联。如果支持,WAKE#信号在相关的外形规格中定义,当功能处于D3Cold和PME_En设置时,函数使用该信号来请求更改其PCI-PM电源管理状态。

### PCIE PM_PME 格式规范解释 #### 消息结构 PME (Power Management Event) 是一种特殊的消息TLP(Transaction Layer Packet)。这种消息源自PCIe端点(EP),PCI Express Legacy 端点或根端口(RP), 并被路由至根联合体(RC)[^2]。 #### 请求ID字段 在PME消息中,`Request ID` 字段表示触发电源管理状态改变的设备身份。这一特性使得系统能够识别哪个具体组件发出了电源状态变更的通知[^2]。 #### 数据格式细节 对于具体的PM_PME数据包而言, 它遵循标准的TLP头部定义,并在其基础上增加了特定于电源管理事件的信息: - **FMT/TYPE**: 设置为 `0b1011_000` 表明这是一个配置读取命令。 - **TC (Traffic Class)** 和其他控制位保持默认值。 - **TD (Tagged)** 及 **AT (Attribution Type)** 均设为零。 - **Length** 被设定成最小长度即 1 DW。 - **Requester ID** 如前所述携带源设备的身份信息。 - **Message Code** 设定为 `0x18`, 这是 PCIe 规范指定用来指示 PME 的代码。 ```cpp struct PciExpressPme { uint32_t fmt_type : 7; // FMT/TYPE field set to indicate a config read command. uint32_t tc : 3; // Traffic class and other control bits are default. uint32_t td_at : 2; // TD and AT both set to zero. uint32_t length : 10; // Length is minimal at one double word. uint32_t requester_id : 16;// Carries the source device identity info. uint32_t msg_code : 8; // Set to '0x18' as specified by PCI-E spec for PME. }; ``` 当Root Complex接收到此类消息之后会将该通知传递给系统的电力管理系统以便采取相应的措施来响应此事件[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值