AHCI sata设备初始化流程

检测sata设备:

  1. 检测hba的存在
  2. 根据hba的port挨个检测是否连接。根据intel文档,需要检测的项有:pxssts.det=03h,pxssts.ipm=02h或06h
  3. 检测signature,0101的就是sata了

初始化sata设备:

  1. 关闭指令执行。设置pxcmd.st=0,pxcmd.fre=0。
  2. 将command list重新定位。要注意:command list对齐是1k的,received fis是256对齐,command table则是128对齐。由于command table的长度是128+16*n,n是prdt的项数。所以,一般来说,n应取8的倍数。尤其需要注意的是,每个prdt虽然可以支持4mb,但sata标准对dma读取最大只支持8k,因此若你需要使用dma一次读取很多扇区,则用于command list的存储空间会相当的大。
  3. 启用指令执行。设置pxcmd.fre=1,pxcmd.st=1。

读取/写入sata设备

  1. 通过pxsaac和pxci找到空闲的command slot。
  2. 将这个slot的prdt顺序指向缓冲区,注意设置每个prdt的byte count,这是从0开始的,0表示1。
  3. 设置command header的prdtl,注意这是从1开始的,1表示1。根据读取/写入设置command header的w。
  4. 设置command header的fis为h2d register fis。视乎所用的具体指令,设置fis的command和c。设置起始扇区和操作扇区数,具体参考sata标准。注意不同的fis,对不同字段的使用方式不同。
  5. 先设置pxsaac,然后设置pxci,让hba开始传输指令。
  6. 检测pxsaac,看这个slot是否空闲。如果空闲,则说明传输已经完成。查看各个错误寄存器,是否有错误发生。

总体来说,初始化过程非常麻烦,而且8k的读取限制对prdt的内存需求太高。但使用起来并不麻烦。另外,无法得知设备的扇区大小,只能假定为512字节。

猜你喜欢

转载自blog.csdn.net/qq_40155300/article/details/81332124