SATA信息传输FIS结构总结

一、简介

  FIS是一种用于Host和device之间信息传输的机制,每个FIS的格式都是固定的,并且对应唯一的ID。本文主要介绍常用FIS传输过程和对FIS内容进行详解,通过构造的FIS例子方便大家快速掌握FIS,常用的FIS TYPE如下:

二、总体介绍

2.1 详细FIS传输过程

  当双方都空闲时,都在持续发送 SYNC 原语,这种状态称为空闲状态(IDLE)。发送方想要发起 FIS 发送,它开始持续发送 X_RDY 原语。经过一段延迟后,接收方收到了 X_RDY (该延迟来自链路层、物理层的信号处理延迟),此时如果接收方准备好接收 FIS 了,就持续发送 R_RDY 原语。发送方收到了 R_RDY 原语,就发送一个 SOF 原语,随后紧跟着逐个发送 FIS 数据包的 dword (包括 FIS-type,Payload,CRC),最后一个 dword (CRC) 发送完后要紧跟一个 EOF 原语,然后持续发送 WTRM 原语。接收方收到 SOF 后,开始持续发送 R_IP 原语,指示接受正在进行 (receiving in progress) 。完整地收完 FIS 后进行 CRC 检查。在收到 WTRM 原语后,如果 CRC 检查正确,就持续发送 R_OK 原语,否则持续发送 R_ERR 原语。发送方收到 R_OK 或 R_ERR 后,开始持续发送 SYNC 。接收方收到 SYNC 后,也开始持续发送 SYNC ,至此回到空闲状态,FIS 传输结束。如果发送方收到的是 R_ERR ,就向上层报告错误,上层决定是否重传该 FIS 。

  从该过程我们可以看到,当一个通道发送 FIS 时,另一个通道在发送 R_RDY, R_IP, R_OK, R_ERR 这四种原语来控制对方发送 FIS 的过程,因此在一个时间点上 FIS 不可能双向发送。换句话说,SATA在物理上是全双工,在逻辑上是半双工。

  另外,由于 HBA 和 device 都有发起 FIS 发送过程的权力,因此有可能刚好 HBA 和 device 都在发送 X_RDY,同时试图启动 FIS 发送。SATA规定这种情况下 HBA 总是要让着 device : HBA 只要检测到了 device 发来的 X_RDY ,就要放弃当前的发送进程,转而发送 R_RDY ,准备接收 device 发来的 FIS 。

2.2 FIS内容详解

C -当寄存器传输是由于命令寄存器的更新时,这个位被设置为1。当寄存器传输由于设备控制寄存器的更新而被设置为零。
Control -包含Shadow Register的设备控制寄存器的内容
Command - 包含Shadow Register块的命令寄存器的内容
Device-包含Shadow Register的设备寄存器的内容
LBA(7:0) - Contains the contents of the LBA low register of the Shadow Register Block.
LBA(15:8) - Contains the contents of the LBA mid register of the Shadow Register Block.
LBA(23:16) - Contains the contents of the LBA high register of the Shadow Register Block.
LBA(31:24) - Contains the contents of the expanded address field of the Shadow Register Block
LBA(39:32) – Contains the contents of the expanded address field of the Shadow Register Block
LBA(47:40) – Contains the contents of the expanded address field of the Shadow Register Block
Features(7:0) - Contains the contents of the Features register of the Shadow Register Block
Features(15:8) – Contains the contents of the expanded address field of the Shadow Register Block
PM Port – If an endpoint device is attached via a Port Multiplier, specifies the device port address that the FIS should be delivered to.This field is set by the host.
R – Reserved – shall be cleared to zero.
Count(7:0) - Contains the contents of the Sector Count register of the Shadow Register Block.

三、FIS实例

3.1 构造一个write FIS

  通过协议可以看到一个write buffer的FIS COMMAND是0xE8,然后Device位根据描述可以填写。

3.1.1 WRITE FIS内容

3.1.2 协议分析仪trace分析

  对照2.2所描述的FIS结构,SOF可以不关注,第二行开始依次对应一个Dword。
分析第一个Dword,0x0A618027,bit[7:0] = 27代表FIS TYPE,bit[11:8] = 0表示不支持PMP,bit[15:12] = 0x8,表示C bit置位,应从COMMAND位读取bit [23:16] = 0x61为WRITE FPDMA命令,Sector count bit[31:24] = 0x0A,即10 LBA,后面的FIS依次参考分析。

3.1.3 write过程总trace

3.2 构造一个read FIS

  通过协议可以看到一个read buffer的FIS COMMAND是0xE4,然后Device位根据描述可以填写。

3.2.1 READ FIS内容

3.2.2 协议分析仪 read trace

具体分析过程参考3.1.2 write过程

3.2.3 read过程总trace

3.3 FIS和Command List储存

  HBA使用系统内存的一个区域来通信接收到的fis上的信息。该结构由PxCLB和PxFB所设置的值。
对每个port对应的P#CLB和P#FB寄存器进行赋值

3.3.1 HBA Memory Space Usage

具体存放位置如下:

3.3.2 具体FIS存放规则

当DMA设置FIS从设备到达时,HBA将其复制到该结构的DSFIS区域。
当一个PIO设置FIS从设备到达时,HBA将其复制到该结构的PSFIS区域。
当D2H寄存器FIS从设备到达时,HBA将其复制到该结构的RFIS区域。
当Set Device Bits FIS从设备到达时,HBA将其复制到该设备的SDBFIS区域。

3.4 Comand List

  主机与Device通信是通过FIS进行相互通知,通知后Device根据命令内容从command list对应的地址去获取相应的信息。
一个Port最多支持32个command,同时不同的command对应不同的command table。

3.4.1 Port System Memory Structures

3.4.2 command具体内容

Command List Structure
整体结构内容如下:

详细内容介绍:

3.4.3 构造一个Command List

Command Table

Command FIS (CFIS)
  这是一个软件构建的FIS。对于数据传输操作,这是H2D寄存器FIS格式Serial ATA Revision 2.6规范中规定的。HBA卡设置PxTFD.STS。BSY,然后发送此结构为附加端口。如果附加了端口倍增器,则该字段必须具有端口倍增器FIS本身的端口号-它不能由HBA卡添加。CFIS的有效长度为2 ~ 16个Dwords并且必须是Dword粒度。
ATAPI Command (ACMD)
  这是一个软件构造的区域,长度为12或16字节,包含ATAPI命令to如果在命令头中设置了“A”位,则发送。ATAPI命令长度为12或16字节在长度。HBA卡传输的长度由bios发送的PIO设置FIS决定请求ATAPI命令的设备。
Physical Region Descriptor Table (PRDT)
  该表包含数据传输的分散/收集列表。它包含一个0的列表(没有数据要传输)最多65,535个条目。第0项是指在PRD表中的第一个条目。“CH[PRDTL] - 1”指的是表中的最后一项,其中长度为字段来自该命令槽的命令列表条目中的PRDTL字段。

四、其他trace

4.1 PIO SETUP FIS

4.2 DMA SETUP FIS

4.3 DATA FIS

4.4 Set Device Bist FIS

 

原文链接:https://blog.csdn.net/Luckiers/article/details/134611416

posted @ 2024-07-19 10:51  咸鱼书生  阅读(161)  评论(0编辑  收藏  举报