# PCI/PCIe(6): PCIe Reset ## Conventional Reset Conventional Reset 是包括除 Function Level Reset(FLR) 之外的所有 PCIe reset 機制,其又可分為 Fundamental Reset 和非 Fundamental Reset 兩類。 任何類型的 Conventional Reset 結束時,必須設定具有 "Sticky" 屬性的暫存器(PCIe 中定義的一種暫存器屬性,詳見 7.4 Configuration Register Types) 除外的所有 port 暫存器和 state machine 至規範中指定的初始值。 ### Fundamental Reset Fundamental Reset 是指在所有 form factor 和系統硬體配置中,一般而言都必須有一個硬體機制來設定或重置所有 port 狀態到 PCIe 規範中指定的初始值。 Fundamental Reset 有兩種方式。一種是可以由系統向 PCIe 擴充卡(Adapter Card) 或裝置送出 `PERST#` 訊號觸發。 另一種是對於不支持 `PERST#` 的擴充卡或裝置,則其必須自動產生 Fundamental Reset,具體方式在規範中並未詳細定義。唯一務必遵守的是,採用這種方式且由平台供電的情況下,當供電功率超出其 form factor 或系統定義的標準電壓時,裝置自身**必須**進行 Fundamental Reset。 #### Cold Reset Cold reset 是 Fundamental Reset 的一種。向裝置供電導致 reset 的情況下,即為 Cold Reset。 #### Warm Reset 在某些情況下,無需斷電並重新供電,硬體即可從外部觸發 Reset。這稱為 Warn Reset。Warm Reset 也是 Fundamental Reset 的一種。 ### Non-Fundamental Reset #### Hot Reset Hot reset 的目的是允許使用 in-band 訊號重置已配置的 link 和相關的下游裝置。這屬於一種 Non-Fundamental Reset。 藉此 In-band 機制,可強制 link 進入 Electrical Idle 狀態從而停用之。進而導致下游裝置進行 hot reset。 ## Function Level Reset Function Level Reset(FLR) 機制提供軟體以 Function 層級的方式 reset PCIe endpoint。與 Conventional Reset 不同,FLR 只對目標 Function 影響,而不影響 Link 狀態。 這是一個可選功能,但規範強烈建議 PCIe 裝置對此的支援。 這種功能在數種情境上具有優勢,舉例而言: * 在某些系統中,控制某個 Function 的軟體可能會無法正常運作。為防止資料損壞,必須停止此 Function 正在執行的所有 PCIe 和外部 I/O(非 PCI Express)操作。而其他的 reset 方式並不能保證外部 I/O 操作停止。 * 在硬體分區的平台上,硬體從一個分區(partition)遷移到另一個分區時,必須確保硬體不會保留任何殘留知識在前一個分區。例如,用戶的秘密資訊被委託給第一而非第二個分區。由於 Function 範圍廣泛,因此必須以 Function 獨立的方式完成相關操作。 * 當系統軟體嘗試將某個 Function 從 software stack 移出時,有時需要先將狀態重設到未初始化狀態,此時能夠利用 FLR ![image](https://hackmd.io/_uploads/By3HrfhMeg.png) 裝置對於 FLR 的支援與否,可以透過 Device Capabilities Register 中的 Function level reset capability 來確認。 ![image](https://hackmd.io/_uploads/SJXpSM2zxl.png) FLR 的觸法則是可以藉由 Device Control Register 的 Initiate Function Level Reset 進行。