關於sata狀態寄存器和錯誤寄存器的理解

  1. 在AHCI協議中Port Register中有如下幾個寄存器,我們這裏主要關注PxSSTS和PxSERR

2. 什麼是SCR寄存器

參考AHCI協議14.1章節

Sata host適配器包括了一個額外的寄存器塊,這些寄存器是分離的獨立的,映射了ATA command Block Register,用來上報狀態和錯誤信息。

這些寄存器,Serial ATA Status and Control registers 即SCR寄存器

3. PxSSTS寄存器和PxSERR寄存器與SCR寄存器的關係

 

4. SCR寄存器是什麼?從哪裏來?

上面的(1)中提到了SCR寄存器是映射了ATA command Block Register,那麼該寄存器從哪裏來呢?下圖可以解釋該問題:

可以看到寫操作由於是host主動發起的,這時ATA command block中並沒有狀態和錯誤寄存器的信息,我們更關注的是讀操作,可以看到ATA command block中包含了狀態寄存器和錯誤寄存器。

目前能確定的ATA command register 和 SSTATUS走的不是同一條路,更新並不關聯。

 

5. ATA command register從host到device打通

從下圖可以看到在transport layer,host中有command Register和control register,我理解這就是AHCI協議中描述的ATA command block and control block register,應該也就是我們常說的shadow register,而且在device端也可以看到對應的模塊。

那麼從host出發,我們在application 層組包觸發命令發送,host適配器首先在transport層填充shadow register,然後device transport層收到。反之亦然。

6. Status/Error寄存器中到底是什麼內容

協議中對此也有描述,不過太複雜,各bit對應含義太多。

這裏我們列舉最通俗的一種情況,我們參考了微信公衆號【存儲隨筆】中的描述見下圖

7. 關於SStatus

其實這兩個寄存器也就是我們在AHCI協議中看到的PxSSTS和PxSERR寄存器。

這兩個寄存器從協議中看是用來描述sata host接口狀態和錯誤信息的。

在這裏我們首先展示一下SStatus寄存器,下圖摘自AHCI協議

從手冊中的描述來看一旦phy層觸發了COMRESET to device,這時該寄存器就會更新

8. 關於SError寄存器

錯誤寄存器可以分爲兩部分

高16bit提供了比較直觀的錯誤

低16bit只是說明了錯誤類型

所有一旦發生異常上報錯誤時,該寄存器不止上報一種錯誤。

 

最後,本文檔主要說明兩條信息線的維護流程

  1. 接收FIS中的status/error - host shadow register(ATA command) - device Task file data register
  2. SStatus(PxSSTS)/SError(PxSERR)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章