bloggerads

2014年4月5日 星期六

AHCI (Advanced Host Controller Interface)

AHCI是PC架構下常見的儲存裝置控制器,透過AHCI我們可以將ATA command以SATA的形式發送給device。

一個AHCI controller最多可以implement 32個port,AHCI spec厲害的地方是定義了NCQ command。也就是host可以先發送最多32個command給device, 由device來決定要先做哪個command。近年來拜NAND flash快速發展所賜, 配上NCQ command,硬碟終於可以跑到接近SATA 3所定義的物理極速600MB/s。請參考下面這張TOSHIBA 120G的SSD跑分


焦點拉回spec,AHCI在PC架構上是一個PCI 或PCIe controller, 他的class code是Rx[B:9]=0x010601。

MMIO base address定義在PCI CFG header就Bar#4,在開機時,Bios會依照AHCI spec要求assign 一個align to 8KB的MMIO的base address。access MMIO address 可以看到General Host Control Registers(0~0xFF) + port0~31 (每個port range為0x80)這兩大部分


從GHC registers我們可以知道這個controller的能力如這個AHCI controller implement哪些port可以讓software使用,發生中斷的原因以及透過這些register做Global host reset。

至於對某個port上的硬碟發command最主要是透過port control registers來辦到。透過port的register我們也可以發port reset這種局部reset來命令此port的SATA phy重新link。

Q: 如何對port發command?
A: 首先先把記憶體宣告好,把要發的command以 command FIS型態填在宣告的記憶體上,如果是帶資料的command則還需要把PRD Table描述好,並將其指到一個準備傳送或接收資料的記憶體位址(注意必須是Word aligned)。最後去set PxCI,command就可以發到碟機了。

最後附上精心製作的AHCI register表,祝大家都可以寫出屬於自己的AHCI driver


Overall Registers layout

PRDT layout



沒有留言:

張貼留言