- 在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只是说明了错误类型
所有一旦发生异常上报错误时,该寄存器不止上报一种错误。
最后,本文档主要说明两条信息线的维护流程
- 接收FIS中的status/error - host shadow register(ATA command) - device Task file data register
- SStatus(PxSSTS)/SError(PxSERR)