正文
AER
AER(Advanced Error Reporting)是一種用于檢測和報告PCIe設(shè)備中發(fā)生的錯誤的機制,它允許PCIe設(shè)備檢測到并報告各種類型的錯誤。錯誤類型包含Correctable Errors 和Uncorrectable errors兩種,其中Uncorrectable errors下面又分為ERR_FATAL和ERR_NONFATAL。
- Correctable Errors:可糾正錯誤是指錯誤發(fā)生后,硬件可以自動恢復(fù),不影響正常業(yè)務(wù)。
- Uncorrectable errors:錯誤發(fā)生后,影響設(shè)備功能,硬件不能自動恢復(fù)
- ERR_FATAL:致命錯誤,此錯誤類型影響了PCIe link鏈路,為了防止錯誤擴散,通常會由錯誤設(shè)備的上游橋?qū)﹀e誤設(shè)備進(jìn)行復(fù)位操作
- ERR_NONFATAL:指影響了設(shè)備功能,但是PCIe link還是穩(wěn)定的

AER功能啟動條件:
- 對于EP設(shè)備和RC都應(yīng)該啟動Command Register寄存器中SERR#Enable;
- 對于EP設(shè)備,需要將AER中不可糾正錯誤掩碼和可糾正錯誤掩碼清空;
- 對于EP設(shè)備,需要將Device Control Register寄存器中Correctable Error Reporting Enable、Non-Fatal Error Reporting Enable、Fatal Error Reporting Enable、Unsupported Request Reporting Enable功能打開;
- 對于RC,需要將AER Root Error Command Register寄存器中Correctable Error Reporting Enable、Non-Fatal Error Reporting Enable、Fatal Error Reporting Enable功能打開
AER相關(guān)寄存器

當(dāng)Uncorrectable Error Status Register 寄存器對應(yīng)Bit為1時,Uncorrectable Error Severity Register 寄存器對應(yīng)Bit為1表示ERR_FATAL ,為0表示ERR_NONFATAL 。
Advanced Error Reporting Extended Capability Header (O?set 00h)

Bit Location |
Register Description |
15:0 |
PCI Express Extended Capability ID,PCIe擴展Cap的ID,對于AER功能,其ID為0x0001. |
19:16 |
Capability Version,對于支持End-End TLP Prefix的設(shè)備,這個必須為2,其他設(shè)備可填1或2. |
31:20 |
Next Capability O?set,下一個Cap的偏移地址。 |
Uncorrectable Error Status Register (O?set 04h)
不可糾正錯誤狀態(tài)寄存器表示PCI Express設(shè)備上單個錯誤的錯誤檢測狀態(tài)。該寄存器不同Bit置1表示檢測到特定錯誤,軟件可以通過向相應(yīng)的位寫入1b來清除錯誤狀態(tài),寄存器含義如下:

[0] Undefined
Undefined-從該位讀取的值是未定義的。
[3:1] Reserve
[4] Data Link Protocol Error Status
可能原因:發(fā)送端數(shù)據(jù)鏈路層收到了預(yù)期之外的ACK或NAK。
數(shù)據(jù)鏈路層在發(fā)送TLP之前,發(fā)送端會將TLP封裝,加上Sequence前綴和LCRC后綴,用于保障數(shù)據(jù)鏈路層兩端報文完整性,如下圖所示。

假設(shè)上電協(xié)商之后發(fā)送端只發(fā)送了Sequence=1的一個報文,那么發(fā)送端就預(yù)期接收Sequence=1的ACK或NAK。接收端接收到這個報文之后,應(yīng)該回復(fù)一個ACK或NAK報文(假設(shè)不聚合),這個回復(fù)的報文中Sequence也必須為1。ACK/NAK的報文格式如下。

當(dāng)接收端接收到的ACK或NCK的Sequence不等于1,那么將產(chǎn)生Data Link Protocol Error,如果Data Link Protocol Error Status位對應(yīng)的mask不為1,則將Data Link Protocol Error Status位置1,并上報錯誤。
數(shù)據(jù)鏈路層更詳細(xì)的交互流程可參考網(wǎng)址或查看PCIe體系結(jié)構(gòu)導(dǎo)讀第7.2章節(jié)。
[5] Surprise Down Error Status (Optional)
該狀態(tài)為可選,如果硬件不支持,則應(yīng)硬連接至0。
由link up狀態(tài)在L0期間突然被置位,表示物理鏈路層意外斷開。這個功能一般是橋設(shè)備支持的功能,也就是說,橋下面的EP意外鏈路斷開時,橋設(shè)備可以將該Bit置1,并上報給系統(tǒng)軟件。設(shè)備未插好、暴力熱插拔都可能產(chǎn)生該錯誤。
當(dāng)橋設(shè)備Slot Capabilities Register的Hot-Plug Surprise bit置1時(表示支持熱插拔),橋設(shè)備將不會上報這個錯誤。
[11:6] Reserve
[12] Poisoned TLP Received Status
在TLP報文中,有一個EP Bit表示這個報文是否為Poisoned TLP,當(dāng)該Bit為1時,表示這個報文攜帶的Date已經(jīng)不可靠,注意,這個EP只是表征報文攜帶的數(shù)據(jù)不可靠了,與報文的Header無關(guān)。
[13] Flow Control Protocol Error Status (Optional)
接收端一段時間未收到更新Credit的報文或更新Credit超過限制。
[14] Completion Timeout Status
一個經(jīng)常碰到的錯誤。請求端發(fā)出的Non-post請求(cfg read與memory read)在規(guī)定時間內(nèi)未收到完成報文。可通過修改請求端的Device Capabilities 2 Register 寄存器來調(diào)整超時時間。
[15] Completer Abort Status (Optional)
響應(yīng)者接收到請求,因為某些原因無法正確響應(yīng)這個請求,將回復(fù)Completer Abort報文給請求者,并將Completer Abort Status置1。
可能出現(xiàn)錯誤的原因:
- 設(shè)備接收的請求,違反了設(shè)備的某些規(guī)則,比如讀BAR空間長度超出能力;
- 設(shè)備已經(jīng)處于某種錯誤狀態(tài),無法正確響應(yīng)請求;
- 設(shè)備接收到存在訪問控制服務(wù)錯誤(Access Control Services Error)的請求;
- PCIe-to-PCI橋接收到針對其連接的PCI設(shè)備的請求,但是該PCI設(shè)備無法處理該請求,則PCIe-to-PCI橋回復(fù)Completer Abort報文給請求者。
[16] Unexpected Completion Status
當(dāng)請求者收到非預(yù)期的完成報文,將上報該錯誤。
可能原因:
- 請求者接收到的完成報文中的Request ID與請求者BDF不一致;
- 請求者接收到的完成報文中的Comleter ID與所有Outstanding請求中的Request ID不一致;
- 請求者接收到的完成報文,檢查其中Tag,發(fā)現(xiàn)并無對應(yīng)的Outstanding請求。

[17] Receiver Overflow Status (Optional)
接收端收到的TLP多于可用的接收緩沖空間。出現(xiàn)這種問題,要么是FC有問題,要么就是接收端發(fā)送的request由問題。
[18] Malformed TLP Status
接受者接收到了畸形報文,則上報該錯誤。
可能原因:
- 設(shè)備接收到Message報文,檢查發(fā)現(xiàn)流量類型不是TC 0;
- 設(shè)備接收到TLP中TD位是1,但TLP又不帶ECRC,或TLP中TD位是0,但TLP又帶ECRC;
- 設(shè)備接收到Completer報文,但報文攜帶數(shù)據(jù)長度超過設(shè)備協(xié)商的MPS(Max Payload Size);
- 設(shè)備接收到TLP數(shù)據(jù)長度(Data Length)與包頭中的長度值不一致;
- 設(shè)備接收到TLP發(fā)現(xiàn)違反了RCB對齊要求;
- 設(shè)備接收到Completer報文,發(fā)現(xiàn)其完成狀態(tài)是CRS(Configuration Request Retry Status),但該Completer報文對應(yīng)的請求不是配置請求;
- 設(shè)備接收TLP其TC域包含了一個未被分配到當(dāng)前使能的VC的值;
- 設(shè)備接收TLP,發(fā)現(xiàn)報文中字節(jié)使能沖突,比如讀2個DW數(shù)據(jù)的請求,其Last DW BE為0;
- RC收到Downstream Ports發(fā)送的Assert_INTx/Deassert_INTx Messages。
[19] ECRC Error Status (Optional)
設(shè)備接收TLP報文,ECRC校驗錯誤,這也就意味著LCRC校驗是成功的,大概率是報文通過pcie switch時,數(shù)據(jù)出現(xiàn)了問題。
[20] Unsupported Request Error Status
收到的報文不屬于任何一種協(xié)議規(guī)定的DLLP或TLP類型,或者報文的域段非法或越界(如MEM WRITE訪問越界)等。注意,只要是會返回Comleter報文的請求,就不會上報Unsupported Request Error,而是通過Comleter報文來指示,比如,cfg報文訪問設(shè)備未實現(xiàn)的function。
[21] ACS Violation Status (Optional)
接收的posted或non-posted請求中,存在訪問控制錯誤。
[22] Uncorrectable Internal Error Status (Optional)
PCIe IP內(nèi)部出現(xiàn)錯誤,可能情況很多,比如IP后端模塊給IP反壓導(dǎo)致丟包。
[23] MC Blocked TLP Status (Optional)
筆者對其不了解。
[24] AtomicOp Egress Blocked Status (Optional)
如果Port口將AmicOp Egress Blocking使能,則在其收到待轉(zhuǎn)發(fā)的AtomicOp Request請求時,將提前結(jié)束這個請求,并給請求者回復(fù)UR completion。
[25] TLP Prefix Blocked Error Status (Optional)
如果Port口將End-End TLP Prefix Blocking使能,則在其收到帶Prefix的TLP時,將提前結(jié)束這個請求,并給請求者回復(fù)UR completion(如果是Non-post的話)。
[26] Poisoned TLP Egress Blocked Status (Optional)
如果Port口將Poisoned TLP Egress Blocking使能,則在其收到待轉(zhuǎn)發(fā)的poisoned TLP時,將上報Poisoned TLP Egress Blocked error。
[31:27] Reserve
Uncorrectable Error Mask Register (O?set 08h)
不可恢復(fù)錯誤掩碼寄存器,與狀態(tài)寄存器一一對應(yīng),當(dāng)對應(yīng)Bit為1時,表示不檢測也不上報對應(yīng)錯誤。

默認(rèn)情況下,22 Bit(Uncorrectable Internal Error Mask )和26 Bit(Poisoned TLP Egress Blocked Mask)復(fù)位值為1。
Uncorrectable Error Severity Register (O?set 0Ch)
不可恢復(fù)錯誤嚴(yán)重程度寄存器,當(dāng)不可恢復(fù)錯誤狀態(tài)寄存器某個Bit為1時,不可恢復(fù)錯誤嚴(yán)重程度寄存器對應(yīng)Bit為1,則表示致命錯誤(ERR_FATAL),為0則表示非致命錯誤(ERR_NONFATAL)。


注意,上面默認(rèn)為1表示部分錯誤只要上報,必然為致命錯誤。
Correctable Error Status Register (O?set 10h)
可恢復(fù)錯誤狀態(tài)寄存器,表示硬件發(fā)生了可恢復(fù)錯誤,由硬件自行糾正之后上報錯誤狀態(tài),注意,一般來說,可糾正錯誤不會影響正常業(yè)務(wù)。

[0] Receiver Error Status
Link errors都可以認(rèn)為是receiver error,可能原因:
- 可能是協(xié)商過程中出現(xiàn)誤碼;
- 可能是由于lane處于L0時的MAC錯誤;
- 錯誤lane中接收到Control控制符號;
- 鏈路可能從L0跳轉(zhuǎn)到Recovery狀態(tài)的信號完整性問題造成。
[5:1] Reserve
[6] Bad TLP Status
先來看一張TLP處理流程圖:

從上面可以知道導(dǎo)致Bad TLP錯誤的有三種可能:
- 接收出錯(Rx Err);
- 數(shù)據(jù)鏈路層CRC校驗出錯(LCRC);
- 數(shù)據(jù)鏈路層接收的報文序列號與預(yù)期序列號不一致(Sequence Number)。
[7] Bad DLLP Status
DLLP報文計算CRC出錯。
[8] REPLAY_NUM Rollover Status
TLP因為某些原因重傳,當(dāng)重傳次數(shù)超過四次則上報REPLAY_NUM Rollover錯誤。注意,一旦設(shè)備上報這個錯誤,鏈路會進(jìn)入recovery重新訓(xùn)練。
[11:9] Reserve
[12] Replay Timer Timeout Status
發(fā)送端每發(fā)送一個TLP報文都會有啟動一個定時器,在規(guī)定時間內(nèi)未接收到正確的ACK/NAK,則上報Replay Timer Timeout錯誤。
[13] Advisory Non-Fatal Error Status
在某些情況下,非致命錯誤的檢測器不確定錯誤是否可恢復(fù),或者是否需要任何恢復(fù)動作。例如,如果RC嘗試配置請求訪問設(shè)備未實現(xiàn)的function,則完成報文中的UR狀態(tài)可以告知向RC錯誤信息,而不需要設(shè)備ERR_NONFATAL消息告知RC,因此,設(shè)備將AER中的Advisory Non-Fatal Error Status置起和device status中的Unsupported Request置起,但又不會置位AER中的Unsupported Request Error Status。
[14] Corrected Internal Error Status
可能是由于內(nèi)部Hard IP RAM中的ECC錯誤。
[15] Header Log Overflow Status
設(shè)備接收到錯誤報文,會將報文head記錄在AER的Header Log字段中,當(dāng)記滿之后再來錯誤TLP,則上報Header Log Overflow錯誤。
[31:16] Reserve
Correctable Error Mask Register (O?set 14h)
可糾正錯誤掩碼寄存器,注意,默認(rèn)有3種錯誤上報不開啟。

Advanced Error Capabilities and Control Register (O?set 18h)

Bit |
描述 |
權(quán)限 |
4:0 |
First Error Pointer,第一個不可恢復(fù)錯誤的位置(lspci中十六進(jìn)制顯示),當(dāng)PCIe設(shè)備出現(xiàn)錯誤時,往往不止一個錯誤,找到第一個錯誤類型可通過該字段 |
ROS |
5 |
ECRC Generation Capable,表示function能否支持產(chǎn)生ECRC |
RO |
6 |
ECRC Generation Enable,當(dāng)function支持產(chǎn)生ECRC時,可通過該Bit控制function開啟ECRC功能 |
RWS |
7 |
ECRC Check Capable,表示function能否支持校驗ECRC |
RO |
8 |
ECRC Check Enable,當(dāng)function支持校驗ECRC時,可通過該Bit控制function開啟ECRC校驗功能 |
RWS |
9 |
Multiple Header Recording Capable,表示function支持多個錯誤head報文記錄能力,當(dāng)出現(xiàn)報文錯誤時,按照錯誤順序依次記錄多個TLP head。該寄存器與First Error Pointer聯(lián)動,比如First Error Pointer指示了某個錯誤,并且是錯誤TLP導(dǎo)致的,那么Header Log就記錄著這個錯誤TLP head,當(dāng)清除First Error Pointer對應(yīng)的錯誤時(對應(yīng)Bit寫1),F(xiàn)irst Error Pointer將指向下一個錯誤類型,并且Header Log與之聯(lián)動,若錯誤并非TLP導(dǎo)致,則Header Log為無效值。 |
RO |
10 |
Multiple Header Recording Enable,使能多錯誤報文head記錄能力 |
RWS |
11 |
TLP Prefix Log Present,表示function支持End to End TLP Prefix error記錄能力,錯誤TLP head記錄在AER中TLP Prefix Log Register中 |
ROS |
12 |
Completion Timeout Prefix/Header Log Capable,該Bit為1表示function記錄了一筆完成超時TLP的head,即該function發(fā)出請求超時未得到響應(yīng),則將該請求TLP記錄 |
RO |
Header Log Register (O?set 1Ch)
4DW寄存器,用來存放異常TLP的head。PCIe協(xié)議要求支持AER的設(shè)備,至少支持存放一個head。
其對應(yīng)格式為:

通過lspci -vvvs xxx 命令可以查看設(shè)備的HeaderLog,例如:
[root@localhost ~]# lspci -vvvs 00:1c.2
00:1c.2 PCI bridge: Intel Corporation Device 7aba (rev 11) (prog-if 00 [Normal decode])
...
Capabilities: [100 v1] Advanced Error Reporting
UESta: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UEMsk: DLP- SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF- MalfTLP- ECRC- UnsupReq- ACSViol-
UESvrt: DLP+ SDES- TLP- FCP- CmpltTO- CmpltAbrt- UnxCmplt- RxOF+ MalfTLP+ ECRC- UnsupReq- ACSViol-
CESta: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr-
CEMsk: RxErr- BadTLP- BadDLLP- Rollover- Timeout- AdvNonFatalErr+
AERCap: First Error Pointer: 00, ECRCGenCap- ECRCGenEn- ECRCChkCap- ECRCChkEn-
MultHdrRecCap- MultHdrRecEn- TLPPfxPres- HdrLogCap-
HeaderLog: 00000000 00000000 00000000 00000000
RootCmd: CERptEn+ NFERptEn+ FERptEn+
RootSta: CERcvd- MultCERcvd- UERcvd- MultUERcvd-
FirstFatal- NonFatalMsg- FatalMsg- IntMsg 0
ErrorSrc: ERR_COR: 0000 ERR_FATAL/NONFATAL: 0000
...
正常情況,HeaderLog中為全0,當(dāng)出現(xiàn)異常報文時,將記錄TLP的head 4DW,比如:
HeaderLog: 4a000001 15000004 fd000000 00000000
根據(jù)head byte0(0x4a)可以知道,異常報文是帶數(shù)據(jù)的完成報文(CplD),再根據(jù)具體報文格式解析就好了,比如。

上面異常報文的錯誤是Request ID(0xfd00)不對,這筆報文對應(yīng)的是cfg0 read請求,一般源Request ID是0x0000,回復(fù)的Request ID卻是0xfd00。
報文類型可查看以下:

注:r2表示第二Bit為0或1都可,但細(xì)分報文類型不一樣。
更多報文類型頭部格式請查閱協(xié)議第二章節(jié)。
Root Error Command Register (O?set 2Ch)
注意,該寄存器只有RC才有效,普通PCIe設(shè)備沒有該字段。
Bit |
描述 |
權(quán)限 |
0 |
Correctable Error Reporting Enable,可糾正錯誤中斷上報能力使能,當(dāng)該RC下游任何設(shè)備上報可糾正錯誤消息,都將觸發(fā)中斷告知系統(tǒng) |
RW |
1 |
Non-Fatal Error Reporting Enable,非致命錯誤中斷上報能力使能,當(dāng)該RC下游任何設(shè)備上報非致命錯誤消息,都將觸發(fā)中斷告知系統(tǒng) |
RW |
2 |
Fatal Error Reporting Enable,致命錯誤中斷上報能力使能,當(dāng)該RC下游任何設(shè)備上報致命錯誤消息,都將觸發(fā)中斷告知系統(tǒng) |
RW |
上電默認(rèn)都是關(guān)閉的,但系統(tǒng)內(nèi)核一般會全部打開。
Root Error Status Register (O?set 30h)
注意,該寄存器只有RC才有效,普通PCIe設(shè)備沒有該字段。

Bit |
描述 |
權(quán)限 |
0 |
ERR_COR Received,當(dāng)Root Port收到Correctable Error Message后該Bit被置1 |
RW1CS |
1 |
Multiple ERR_COR Received,當(dāng)Root Error Status Register中的ERR_COR Received Bit被置1且Root Port再次收到了Correctable Error Message,該Bit被置1 |
RW1CS |
2 |
ERR_FATAL/NONFATAL Received,當(dāng)Root Port接收到Fatal或者Non-Fatal Message后且該Bit為0時,該Bit被置1 |
RW1CS |
3 |
Multiple ERR_FATAL/NONFATAL Received,當(dāng)Root Error Status Register中的ERR_FATAL/NONFATAL Received Bit被置1且Root Port再次收到了Error Message,該Bit被置1 |
RW1CS |
4 |
First Uncorrectable Fatal,當(dāng)Root Port收到的第一個uncorrectable error message是ERR_FATAL error則置1 |
RW1CS |
5 |
Non-Fatal Error Messages Received,當(dāng)Root Port收到一個或者多個Non-Fatal Uncorrectable Error Messages后該Bit被置1 |
RW1CS |
6 |
Fatal Error Messages Received,當(dāng)Root Port收到一個或者多個Fatal Uncorrectable Error Messages后該Bit被置1 |
RW1CS |
8:7 |
ERR_COR Subclass,當(dāng)ERR_COR Received bit被置1,ERR_COR Subclass保存的是Root Port接收到的ERR_COR Message中ERR_COR Received 域的值 |
ROS/RsvdZ |
31:27 |
Advanced Error Interrupt Message Number,定義了Root port針對收到的error message將使用MSI/MSIX的哪個entry來產(chǎn)生中斷。這個field由HW給出的,并且可能會隨著enable MSI/MSIX entry數(shù)目的不同而變化。注意,這個值必須小于等于31,因為需要兼容MSI中斷(MSI最多32個中斷) |
RO |
Error Source Identification Register (O?set 34h)
注意,該寄存器只有RC才有效,普通PCIe設(shè)備沒有該字段。
用來保存Root Port收到的第一筆Correctable Error Message的Requester ID或Uncorrectable Fatal/Non-Fatal Error Message的Requester ID。
TLP Prefix Log Register (O?set 38h)
設(shè)備必須支持且使能了TLP Prefix能力,這個字段才有效。
這個寄存器保存了觸發(fā)錯誤的TLP包的End-End TLP Prefix(local TLP Prefix報文錯誤不會記錄在此),其數(shù)據(jù)排布方式與Header Log Register相同。
DPC
DPC(Downstream Port Containment)是一種用于處理PCIe鏈路中錯誤情況的機制。當(dāng)PCIe鏈路上的一個設(shè)備發(fā)送錯誤信號時,DPC機制允許系統(tǒng)針對該錯誤進(jìn)行處理,以避免錯誤的傳播和影響其他設(shè)備。具體而言,DPC機制會隔離出故障設(shè)備,從而限制錯誤的影響范圍,確保其他設(shè)備繼續(xù)正常工作。注意:DPC機制依賴于AER提供的錯誤信息來進(jìn)行錯誤處理。
AER和DPC通常結(jié)合使用,以提供更全面的錯誤處理和容錯機制。當(dāng)PCIe設(shè)備發(fā)生錯誤時,AER會檢測和報告錯誤的詳細(xì)信息,而DPC則可以根據(jù)這些錯誤信息采取相應(yīng)的措施,例如隔離故障設(shè)備,以維護(hù)整個PCIe系統(tǒng)的穩(wěn)定性和可靠性。通常,Downstream Port接收到下游發(fā)送的不可糾正錯誤消息,會將下游鏈路斷開,防止錯誤擴散,如果在調(diào)試PCIe設(shè)備時碰到link斷開情況并且系統(tǒng)未重啟,則很大可能是DPC發(fā)揮的作用。
相關(guān)寄存器

DPC Capability Register (O?set 04h)
DPC能力寄存器。

Bit |
描述 |
權(quán)限 |
4:0 |
DPC Interrupt Message Number,定義了Port針對收到的error message將使用MSI/MSIX的哪個entry來產(chǎn)生中斷通知的系統(tǒng)。這個field由HW給出的,并且可能會隨著enable MSI/MSIX entry數(shù)目的不同而變化。注意,這個值必須小于等于31,因為需要兼容MSI中斷(MSI最多32個中斷) |
RO |
5 |
RP Extensions for DPC,該位表示根端口支持特定于根端口的一組定義的DPCl擴展(即DPC 0x10之后的寄存器有效)。PCIe switch下行端口不能設(shè)置此位 |
RO |
6 |
Poisoned TLP Egress Blocking Supported,該Bit置1,表示支持阻塞 Poisoned TLP能力 |
RO |
7 |
DPC Sofware Triggering Supported,該Bit置1,表示根端口或交換機下行端口支持軟件觸發(fā)DPC。對于支持DPC的RP擴展的Root Port必須設(shè)置此位 |
RO |
11:8 |
RP PIO Log Size ,該字段表示為RP PIO日志寄存器分配了多少DWORDs,由RP PIO Header Log、RP PIO ImpSpec Log和RP PIO TLP Prefix Log組成。如果Root Port支持DPC的RP擴展,該字段的值必須大于等于4;否則,該字段的值必須為0 |
RO |
12 |
DL_Active ERR_COR Signaling Supported,表示根端口或交換機下游端口支持在鏈路轉(zhuǎn)換為DL_Active狀態(tài)時,支持使用ERR_COR進(jìn)行信號傳輸 |
RO |
DPC Control Register (O?set 06h)
DPC控制寄存器。

Bit |
描述 |
權(quán)限 |
1:0 |
DPC Trigger Enable,用于控制DPC是否檢測下游錯誤。00,表示關(guān)閉檢測;01,表示檢測不可恢復(fù)錯誤和致命錯誤消息;02,表示檢測不可恢復(fù)錯誤、致命錯誤消息、非致命錯誤消息;03,預(yù)留 |
RW |
2 |
DPC Completion Control,這個Bit控制在DPC期間回復(fù)什么完成狀態(tài)的報文給下游。0,回復(fù)Completer Abort (CA) Completion Status完成報文;1,回復(fù)Unsupported Request (UR) Completion Status完成報文 |
RW |
3 |
DPC Interrupt Enable,該Bit置1,當(dāng)DPC檢測到問題,是否要上報中斷 |
RW |
4 |
DPC ERR_COR Enable,該Bit置1,當(dāng)DPC檢測到問題,可以發(fā)送ERR_COR消息給上游報告已觸發(fā)DPC |
RW |
5 |
Poisoned TLP Egress Blocking Enable,該Bit置1,則不允許轉(zhuǎn)發(fā)Poisoned TLP |
RW/RO |
6 |
DPC Sofware Trigger,向該Bit寫1,可以軟件觸發(fā)DPC,這個Bit讀為0 |
RW/RO |
7 |
DL_Active ERR_COR Enabl,如果設(shè)置了該位,表示根端口或交換機下游端口支持在鏈路轉(zhuǎn)換為DL_Active狀態(tài)時,支持使用ERR_COR進(jìn)行信號傳輸(即主動發(fā)出ERR_COR) |
RW/RO |
8 |
DPC SIG_SFW Enable,當(dāng)設(shè)置時,啟用發(fā)送ERR_COR消息,以指示已啟用ERR_COR信號的DPC事件(ECS有效) |
RW/RO |
DPC Status Register (O?set 08h)

Bit |
描述 |
權(quán)限 |
0 |
DPC Trigger Status,當(dāng)該Bit置1時,表示DPC已經(jīng)觸發(fā),此時這個Port下游鏈路將LTSSM轉(zhuǎn)為禁用狀態(tài)(鏈路斷開無法link),只有將此Bit寫1清除,LTSSM才能從禁用狀態(tài)釋放出來,即下游重新訓(xùn)練,注意,進(jìn)入DPC之后,必須等待100ms才能清除(鏈路link down需要一定時間),且清除之后還必須等待100ms才能訪問下游設(shè)備 |
RW1CS |
2:1 |
DPC Trigger Reason,表示是因為什么觸發(fā)DPC的。00b,表示收到未屏蔽的不可糾正錯誤;01b,表示收到ERR_NONFATAL消息;10b,表示收到ERR_FATAL消息;11b,表示信息由擴展字段(DPC Trigger Reason Extension)指示; |
ROS |
3 |
DPC Interrupt Status,表示是否產(chǎn)生了DPC中斷 |
RW1CS |
4 |
DPC RP Busy,當(dāng)觸發(fā)DPC時,可能DP內(nèi)部在繁忙,必須等待該Bit為0時,才能對DPC Trigger Status寫1 |
RO/RsvdZ |
6:5 |
DPC Trigger Reason Extension,DPC觸發(fā)原因擴展字段,當(dāng)DPC Trigger Reason字段為11b時,該字段才有效。00b,表示由RP PIO error觸發(fā)DPC;01b,表示由軟件主動觸發(fā)DPC |
ROS |
12:8 |
RP PIO First Error Pointer,該字段指示RP PIO狀態(tài)寄存器中的位位置,當(dāng)該位被設(shè)置時,該字段被認(rèn)為是有效的。當(dāng)該字段有效時,軟件將1b寫入指定的RP PIO Status位(從而清除它),該字段必須恢復(fù)到其默認(rèn)值。該字段僅適用于支持DPC的RP擴展的Root端口,否則為保留。如果該字段不為Reserved,則默認(rèn)值為11111b,表示永久保留的RP PIO狀態(tài)位,因此保證該字段不被認(rèn)為是有效的。 |
ROS/RsvdZ |
13 |
DPC SIG_SFW Status,當(dāng)該Bit置1,表示使用了SIG_SFW ERR_COR消息觸發(fā)了DPC事件 |
RW1CS/RsvdZ |
DPC Error Source ID Register (O?set 0Ah)
錯誤源ID寄存器,當(dāng)Port收到ERR_NONFATAL或ERR_FATAL而觸發(fā)DPC時,該字段存放發(fā)送錯誤消息的請求者ID(BDF)。
其他寄存器
只有Root Port支持?jǐn)U展DPC能力(RP Extensions for DPC)才有效,本文不展開。
如果您覺得閱讀本文對您有幫助,請點一下“推薦”按鈕,您的“推薦”將是我最大的寫作動力!
|