共用方式為


D3cold 的韌體需求

從 Windows 8 開始,即使系統保持 S0 電源狀態,裝置仍可進入 D3cold 電源子狀態。 本主題描述實作內嵌裝置 D3cold 支援的韌體需求。 下列討論旨在協助韌體開發人員讓其內嵌裝置可靠地進入和結束 D3cold。

此外,也會簡短討論支援 D3cold 的設備磁碟機需求。 如需 D3cold 之設備磁碟機支援的詳細資訊,請參閱 在驅動程式中支援 D3cold

簡介

裝置電源狀態 定義于 ACPI 規格中,以及各種匯流排規格中。 PCI 匯流排規格自引進 PCI 電源管理後,將 D3 (分割為兩個子狀態,) 裝置電源狀態分成兩個子狀態:D3hot 和 D3cold。 此區別已新增至 ACPI 3.0 中的 ACPI 規格,並在 ACPI 4.0 中擴充。 Windows 一律同時支援 D3 子狀態,但只有在整個機器結束 S0 () 系統電源狀態以進入睡眠或休眠狀態時,Windows 7 和舊版 Windows 才支援 D3cold 子狀態,通常是 S3 或 S4。 從 Windows 8 開始,即使系統維持在 S0 中,設備磁碟機也可以讓裝置進入 D3cold 狀態。

通常稱為 「D3」 的 D3hot 是裝置的「軟關閉」狀態。 在此狀態中,裝置可由匯流排掃描偵測,而傳送至裝置的命令可能會導致裝置再次開啟電源。 在 D3cold 中,會移除所有電源,但可能會有少量電源以驅動裝置喚醒邏輯的例外狀況。 例如,針對 PCI Express (PCIe) 裝置,主要裝置電源 Vcc 通常會在轉換為 D3cold 時關閉。 關閉 Vcc 可減少耗電量,並延長行動硬體平臺可在電池計量上執行的時間。 當裝置處於 D3cold 時,匯流排掃描無法偵測到它,而且無法接收命令。 還原 Vcc 電源會將裝置移至未初始化的狀態,這通常相當於 D0 狀態。 接著,軟體必須重新初始化裝置,使其進入工作狀態。

將裝置放在 D3cold 中不一定表示已移除裝置的所有電源來源,這表示只會移除主要電源 Vcc。 如果喚醒邏輯不需要輔助電源,Vaux 也可以移除它。 不過,可能需要向處理器發出喚醒事件訊號的裝置必須能夠繪製足夠的電源來操作喚醒邏輯。 例如,乙太網路網路介面卡 (NIC) 主要電源已移除,可能會從乙太網路纜線繪製足夠的電源。 或者,Wi-Fi NIC 的待命電源可能從 PCIe 介面外部的來源提供,在此情況下,可以完全關閉 PCIe 介面。

在下列討論中,說明啟用裝置電源狀態轉換為 D3cold 的一組需求。 這些需求分為下列兩種類別:

  • 韌體和平臺需求

  • 設備磁碟機需求

這兩個類別的第一個類別是此討論的主要焦點。 會顯示第二個類別的簡短概觀。 如需設備磁碟機需求的詳細資訊,請參閱 在驅動程式中支援 D3cold

韌體和平臺需求

在下列討論中,會針對這兩種情況呈現啟用 D3cold 的韌體和平臺需求:

  • 在 ACPI 中列舉裝置時。

  • 當裝置由其父匯流排列舉時。

下列大部分的討論都是 PCIe 特有的。 不過,此處所述的一般原則通常也適用于其他公車。

抽象化一些詳細資料,將 Vcc 電源重新套用至內嵌裝置,以觸發從 D3cold 轉換為 D0 的轉換。 重新套用電源可有效地還原裝置與匯流排的連線。 Windows 會讀取裝置的識別碼,以區分下列兩種情況:

  • 裝置已由另一個裝置移除並取代。

  • 已移除相同的裝置,然後重新插入。

如果識別碼相符,裝置驅動程式會重新初始化裝置。 如果識別碼不相符,Windows 會卸載設備磁碟機,並為新裝置建置新的驅動程式堆疊。 例如,PCIe 會查詢廠商識別碼、裝置識別碼和子系統識別碼, (這些識別碼會分割成某些規格版本中的子裝置和子廠商識別碼) 。 這些識別碼必須符合先前連接的裝置在重新套用電源後 (,而匯流排指定的等候期間) ;否則,Windows 會將新裝置視為與上一個裝置不同。

案例 1:ACPI 中列舉內嵌裝置

如果內嵌裝置無法透過 PCIe 或 USB 等匯流排規格所定義的機制進行探索,但裝置會永久連線 (或至少連線專用於已知裝置) ,ACPI _HID和/或_CID物件可以在平臺韌體中描述此裝置。 這些物件可讓 OSPM 列舉裝置。 (「OSPM」 是 ACPI 規格中定義的詞彙。這表示鬆散地「不是韌體的軟體」。) OSPM 只有在沒有匯流排列舉值可以偵測到裝置識別碼時,才會列舉裝置。 例如,OSPM 會列舉 ISA 匯流排上的裝置。 此外,Chip (SoC) 系統上的裝置通常會由 ACPI 列舉,因為它們位於不可列舉的網狀架構上。 這類裝置的範例包括 USB 和 SD 主機控制器。

ACPI) 中列舉的平臺韌體 (

OSPM 使用 \_SB._OSC 將全平臺 OSPM 功能傳達給平臺韌體。 平臺韌體必須在 \_SB._OSC 傳回值中設定位 2,以向 OSPM 指出裝置支援_PR3。 For more information, see section 6.2.10.2, "Platform-Wide OSPM Capabilities", in the ACPI 5.0 specification.

僅透過 ACPI) 探索到的內嵌裝置 (

為了支援 D3cold,平臺韌體應該為內嵌裝置實作下列 ACPI 電源資源物件:

  • _PR0:此物件會評估 D0 (完全處於) 裝置電源狀態的裝置電源需求。 傳回值是裝置需要處於 D0 狀態的電源資源清單。

  • _PR2:此物件會評估 D2 裝置電源狀態中的裝置電源需求。 傳回值是裝置在 D2 狀態所需的電源資源清單。 請注意,基於歷史原因,Windows 預期每當出現_PR0時,_PR2就會出現。 如果在硬體中實作 D2,_PR2列出 D2 所需的電源資源。 如果未實作 D2,_PR2會列出與_PR0相同的資源。

  • _PR3:此物件會評估 D3hot 裝置電源狀態中的裝置電源需求。 傳回值是裝置在 D3hot 狀態中所需的電源資源清單。

  • 對於任何_PRx物件中所識別的每個電源資源,必須實作下列控制方法:

    • _OFF:將電源資源設定為 關閉 狀態, (關閉資源) 。

    • _ON:將電源資源設定為 開啟 狀態 (資源電源) 。

    • _STA:此物件會評估為電源資源的目前 開啟關閉 狀態, (0:關閉,1: on) 。

當 ACPI 在_PR3所列的電源資源上執行_OFF控制方法時,就會轉換至 D3cold。 請注意,如果裝置函式驅動程式指出支援 D3cold,此支援並不表示所有轉換至 D3 會導致快速轉換至 D3cold。 裝置可能會輸入並停留在 D3hot 中一段時間,然後返回 D0 而不需輸入 D3cold,或稍後再輸入 D3cold。

ACPI) 中列舉的父裝置 (

父裝置不需要能夠進行電源管理。 不過,如果父裝置受電源管理,如果任何子系 (相依裝置) 不在 D3 中,Windows 永遠不會關閉此裝置。

ACPI) 中列舉的範例 (

下列區塊圖顯示系統匯流排上標示為 EMBD) 的內嵌裝置 (。 Vcc () 的主要電源和輔助電源 (Vaux) 可以透過標示為電源邏輯的區塊獨立開啟和關閉。

acpi 列舉的內嵌裝置。

下列 ASL 程式碼範例說明上圖中內嵌裝置所使用的電源資源。 此範例會以描述設備磁碟機功能的_OSC控制項方法宣告開始。 接下來,會宣告裝置的兩個電源資源:資源名稱 PVCC 和 PVAX 會指派給裝置的主要和輔助電源、 VccVaux。 最後,電源資源需求會針對裝置支援的每個裝置電源狀態列出,並說明裝置的喚醒功能。

Scope (\_SB)
{
     Method(_OSC, 4, NotSerialized) // Platform-wide Capabilities Check.
     {  
          ... // This must indicate support for _PR3.
     }

     PowerResource(PVCC,0,0) // Power resource representing the main power for the device.
                             // Required for the device to be fully functional (D0).
     {
          Name(_STA,VAR1)        // Return the state of the power resource.
          Method(_ON,0x0) {...}  // Turn on the power resource and set VAR1 to 1.
          Method(_OFF,0x0) {...} // Turn off the power resource and set VAR1 to 0.
     }

     PowerResource(PVAX,0,0) // Power resource representing the auxiliary power for the device.
                             // Required for low-power, less-functional states (e.g., D3hot).
     {
          Name(_STA,VAR2)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     Device(EMBD) // An ACPI-enumerated device on the processor bus that supports D3Cold
     {
               Name(_HID, ...)
               ... // Other (non-power) objects for this device

          // Indicate support for D0.
               Name(_PR0, Package() {PVCC, PVAX}) // Power resources required for D0

          // Indicate support for D1 (optional)...

          // Indicate support for D2.
               Name(_PR2, Package() {PVCC, PVAX}) // If D2 is implemented in the hardware,
                                                  //  list the power resources needed by D2.
                                                  // If D2 is not implemented, list the same
                                                  //  resources as _PR3.

          // Indicate support for D3Cold.
               Name(_PR3, Package() {PVCC, PVAX}) // Power resource for D3. These will be 
                                                  //  turned off ONLY if drivers opt-in to D3cold.
 
          // Indicate support for wake. Required for entry into D3cold, even if the device doesn't
          // need or have a wake mechanism.
               Name(_S0W, 4) // The existence of this object indicates that the platform is
                             //  capable of handling wake events from this device while in S0. 
                             // The value of this object indicates the lowest D-state this device
                             //  can be in to trigger wake events that can be handled while the
                             //  platform is in S0.

          // Enable wake events (optional) 
          //  If this device actually does generate wake events, there must be a way for OSPM to
          //  enable and disable them. The mechanism for this depends on the platform hardware:
               /*
               Name(_PRW, ...) // If the event is signaled via a GPE bit (SCI) OR
                               //  if there are power resources required only for wake.
               Name(_CRS, ...) // If the event is signaled via a wake-capable interrupt.
                
               Method(_DSW, 3) {...} // Can be used with either of the above, if wake enablement
                                     // varies depending on the target S-state and D-state.
               */
     }  // End of Device EMBD
} End Scope \_SB

案例 2:內嵌裝置已列舉匯流排

如果內嵌裝置符合一般匯流排規格,例如 PCIe 或 USB,則此裝置可透過匯流排定義的機制來探索,而且可以透過匯流排部分或完全透過匯流排提供電源。 如果此裝置不是由其他側帶電源資源提供電源,裝置的主要電源來源就是將裝置連線到父匯流排控制器的連結。 匯流排列舉裝置可由內嵌裝置定義中的_ADR物件來識別。 _ADR 物件可用來提供 OSPM 與內嵌裝置父匯流排上裝置的位址。 此位址可用來將匯流排的裝置標記法系結 (,如匯流排硬體所見,) 與 ACPI 韌體) 所見之裝置 (的平臺標記法。 (_ADR位址編碼是匯流排特定的。 For more information, see section 6.1.1, "_ADR (Address)", in the ACPI 5.0 specification.) 採用這項機制時,必須與父匯流排驅動程式協調 D3cold 支援。

如果內嵌裝置的主要電源來源是將此裝置連線到其父匯流排的連結,將裝置放在 D3cold 的主要需求是關閉連結。 如需轉換至 D3cold 的詳細資訊,請參閱 裝置電源狀態中的狀態圖表。

平臺韌體 (匯流排列舉)

OSPM 使用 \_SB._OSC 將全平臺 OSPM 功能傳達給平臺韌體。 平臺韌體必須在 \_SB._OSC 傳回值中設定位 2,以向 OSPM 指出裝置支援_PR3。 For more information, see section 6.2.10.2, "Platform-Wide OSPM Capabilities", in the ACPI 5.0 specification.

內嵌裝置 (匯流排列舉)

不需要 D3cold 特定的 ACPI 變更。 在此情況下,只要設備磁碟機和平臺指出支援 D3cold,當父匯流排結束 D0 並進入低電源狀態 Dx 時,即可關閉提供電源給內嵌裝置的匯流排連結。 從連結移除電源時,就會發生從 D3hot 轉換為 D3cold 的內嵌裝置。 父匯流排進入的 Dx 狀態可以是任何會導致關閉連結電源的狀態。

父裝置 (匯流排列舉)

父匯流排的 ACPI 描述項必須執行下列動作:

  • 實作 _S0W (Dx) 。 此物件會將 Dx 指定為子 (內嵌) 裝置在 S0 狀態時喚醒的最低電源 D 狀態。

  • 定義電源資源來代表將子 (內嵌) 裝置連線到父匯流排的連結。 此外,應該為此電源資源定義_ON、_OFF和_STA物件。 此清單後面的 ASL 程式碼範例將連結電源描述為兩個資源:PVC1 和 PVX1。 針對這些資源,會定義這些資源_ON、_OFF和_STA物件。

  • 如果 「Dx」 (最低電源 D 狀態;請參閱第一個清單專案) 為 D3cold,請提供_PR3物件,其中包含 D3hot () ,例如 Vcc 和 Vaux) ,子系 (內嵌) 裝置所需的電源資源。 如果 D0、D2 和 D3hot 需要相同的電源,則_PR0、_PR2和_PR3都指定相同的電源資源。 只有在子裝置進入 D3cold 時,才會關閉這些資源。

    基於歷史原因,每當_PR0存在時,Windows 預期_PR2存在。 如果在硬體中實作 D2,_PR2列出 D2 所需的電源資源。 如果未實作 D2,_PR2會列出與_PR0相同的資源。

  • 實作_PR0。 父匯流排_PR0物件中的資源清單應該包含將父匯流排連接到子 (內嵌) 裝置連結的資源。

(匯流排列舉) 範例

下列區塊圖中的範例硬體組態顯示 D3cold 可為 PCIe 裝置啟用兩種不同的方式。 首先,標示為 ENDP) 的端點 (會連線到 PCIe 根埠 (RP01) ,並透過 PCIe 連結從其父裝置接收輔助電源。 其次,圖表中的 HD 音訊 裝置沒有其父裝置的標準連結, (標示 為 PCI0) 的 PCI 控制器,因此模型與 ACPI 列舉案例類似。

匯流排列舉的內嵌裝置。

此圖中的 RP01 裝置有主要電源來源 Vcc1和輔助電源 Vaux1。 同樣地, HD 音訊 裝置有主要電源、 Vcc2和輔助電源 Vaux2

下列 ASL 程式碼說明父匯流排控制器 (PCI0) ,以及上圖所示 ENDPHD Audio 裝置所需的電源資源。

Scope (_SB)
{
     Method(_OSC, 4, NotSerialized) // Platform-wide Capabilities Check.
     {  
          ... // This must indicate support for _PR3.
     }

     PowerResource(PVC1,0,0) // Power resource representing Vcc1 for the RP01 device.
                             // Required for the device(s) to be fully functional (D0).
     {
          Name(_STA,VAR0)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     PowerResource(PVX1,0,0) // Power resource representing Vaux1 for the RP01 device.
                             // Required for low-power, less-functional states (e.g., D3hot).
     {
          Name(_STA,VAR1)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     PowerResource(PVC2,0,0) // Power resource representing Vcc2 for the HD device.
                             // Required for the device(s) to be fully functional (D0).
     {
          Name(_STA,VAR2)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     PowerResource(PVX2,0,0) // Power resource representing Vaux2 for the HD device.
                             // Required for low-power, less-functional states (e.g., D3hot).
     {
          Name(_STA,VAR3)
          Method(_ON,0x0) {...}
          Method(_OFF,0x0) {...}
     }

     ... // Power resources for other child devices

     Device(PCI0) // The PCI root complex
     {
          Name(_HID, EISAID("PNP0A08"))  // ACPI enumerated
          Method(_OSC, 4, NotSerialized) // PCIe-specific Capabilities Check.
          {     
               ... // This must support hand-off of PCIe control to the OS.
          }
          ... // Other (non-power) objects for this device

          Device(RP01) // PCIe Root Port 1
          {
                    Name(_ADR, "...") // Bus enumerated
                    ... // Other (non-power) objects for this device
    
               // Indicate support for D0.
                    Name(_PR0, Package() {PVC1, PVX1}) // Power resources required for D0.
                                                       // Includes the Link Power for ENDP.

               // Indicate support for D1 (optional)...

               // Indicate support for D2.
                    Name(_PR2, Package(){PVC1, PVX1}) 

               // Indicate support for wake. Required for entry into D3cold, even if the
               // device doesn't need or have a wake mechanism.
                    Name(_S0W, 4) // The existence of this object indicates the platform
                                  //  is capable of handling wake events from this device
                                  //  while the platform is in S0. 
                                  // The value of this object indicates the lowest D-state
                                  //  this device can be in to trigger wake events that 
                                  //  can be handled while the platform is in S0.

               // Enable wake events (optional) 
               //  If this device actually does generate wake events, there must be a way
               //  for OSPM to enable and disable them. The mechanism for this depends on
               //  the platform hardware:

                    /*
                    Name(_PRW, ...) // If the event is signaled via a GPE bit (SCI) OR
                                    //  if there are power resources required only for wake.
                    Name(_CRS, ...) // If the event is signaled via a wake-capable interrupt.

                    Method(_DSW, 3) {...} // Can be used with both of the above, if wake
                                          //  enablement varies depending on the target 
                                          //  S-state and D-state.
                    */

                    Device(ENDP) // This device supports D3cold. No power-related objects
                                 // are required.
                    {
                         Name(_ADR, "...")  // Bus enumerated
                         ... // Other (non-power) objects
                    }  // End of Device ENDP
          }  // End of Device RP01

          Device(HD) // A PCIe Bus0 device (HD Audio) that supports D3cold. Note that
                     //  this case is modeled similar to the ACPI-enumerated case
                     //  because device HD has no standard link to its parent.
          {
                    Name(_ADR, "...") // Bus enumerated
                    ... // Other (non-power) objects for this device
    
               // Indicate support for D0.
                    Name(_PR0, Package() {PVC2, PVX2}) // Power resources required for D0
                            
               // Indicate support for D1 (optional)...

               // Indicate support for D2.
                    Name(_PR2, Package(){PVC2, PVX2})

               // Indicate support for D3Cold.
                    Name(_PR3, Package() {PVC2, PVX2}) // Power resource for D3; These will
                                                       //  be turned off ONLY if drivers
                                                       //  opt-in to D3cold.
 
               // Indicate support for wake. Required for entry into D3cold, even if the
               // device doesn't need or have a wake mechanism.
                    Name(_S0W, 4) // The existence of this object indicates that the platform
                                  //  is capable of handling wake events from this device 
                                  //  while the platform is in S0. 
                                  // The value of this object indicates the lowest D-state
                                  //  this device can be in to trigger wake events that can
                                  //  be handled while the platform is in S0.

               // Enable wake events (optional). 
               //  If this device actually does generate wake events, there must be a way for
               //  OSPM to enable and disable them. The mechanism for this depends on the HW:
                    /*
                    Name(_PRW, ...) // If the event is signaled via a GPE bit (SCI) OR
                                    //  if there are power resources required only for wake.
                    Name(_CRS, ...) // If the event is signaled via a wake-capable interrupt.

                    Method(_DSW, 3) {...} // Can be used with both of the above, if wake
                                          //  enablement varies depending on the target
                                          //  S-state and D-state.
                    */
          }  // End Device HD

          ... // Device objects for other child devices

     }  // End Device PCI0
}  // End Scope _SB

其他可能性

上述兩個範例所示的技術可以結合,以支援使用匯流排電源和側帶電源的組態。

設備磁碟機需求

裝置的電源原則擁有者通常 (函式驅動程式) 會告知作業系統是否要啟用裝置從 D3hot 轉換為 D3cold。 驅動程式可以在安裝裝置的 INF 檔案中提供這項資訊。 或者,驅動程式可以在執行時間呼叫 SetD3ColdSupport 常式,以動態啟用或停用裝置轉換成 D3cold。 藉由讓裝置進入 D3cold,驅動程式會保證下列行為:

  • 當電腦維持在 S0 中時,裝置可以容許從 D3hot 轉換為 D3cold。

  • 當裝置從 D3cold 返回 D0 時,裝置會正常運作。

無法符合任一需求的裝置可能會在輸入 D3cold 之後無法使用,直到電腦重新開機或進入睡眠狀態為止。 如果裝置必須能夠發出來自其輸入之任何低電量 Dx 狀態的喚醒事件訊號,除非驅動程式確定裝置的喚醒訊號可在 D3cold 中運作,否則不得啟用 D3cold 的專案。

如需詳細資訊,請參閱 在驅動程式中支援 D3cold