Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1357410
  • 博文数量: 281
  • 博客积分: 8800
  • 博客等级: 中将
  • 技术积分: 3346
  • 用 户 组: 普通用户
  • 注册时间: 2006-05-17 22:31
文章分类

全部博文(281)

文章存档

2013年(1)

2012年(18)

2011年(16)

2010年(44)

2009年(86)

2008年(41)

2007年(10)

2006年(65)

我的朋友

分类: LINUX

2009-05-24 18:29:26

AHCI is defined to take the basics of the scatter/gather list concept of Bus Master IDE, and expand it to CPU/software overhead and provide support for Serial ATA features such as hot plug, powermanagement, and accessing of several devices without performing master/slave emulation.

 

Communication between a device and software moves from the task file via byte-wide accesses to a command FIS located in system memory that is fetched by the HBA. This reduces command setup timesignificantly, allowing for many more devices to be added to a single host controller. Software no longer communicates directly to a device via the task file.

 

AHCI is defined to keep the HBA relatively simple so that it can act as a data mover. An HBA

implementing AHCI does not parse any of the ATA or ATAPI commands as they are transferred to the device, although it is not prohibited from doing so.

 

All data transfers between the device and system memory occur through the HBA acting as a bus master to system memory. Whether the transaction is of a DMA type or a PIO type, the HBA fetches and stores data to memory, offloading the CPU. There is no data port that can be accessed.

 

All transfers are performed in a DMA fashion and the use of the PIO command type is strongly

discouraged. PIO has limited support for errors – for example, the ending status field of a PIO transfer is given to the HBA during the PIO Setup FIS, before the data is transferred. However, some commands may only be performed via PIO commands (such as IDENTIFY DEVICE). Some HBA implementations may limit PIO support to one DRQ block of data per command.

 

The AHCI defines a standard mechanism for implementing a SATA command queue using the DMA Setup FIS. An HBA which supports queuing has individual slots in the Command List allocated in system memory for all the commands. Software can place a command into any empty slot, and upon notifying the HBA via a register access, the HBA shall fetch the command and transfer it. The tag that is returned in the DMA Setup FIS is used as an index into the command list to get the scatter/gather list used in the transfer.

 

This command list can be used by system software and the HBA even when non-queued commands need to be transferred. System software can still place multiple commands in the list, whether DMA, PIO, or ATAPI, and the HBA shall walk the list and transfer them.

This multiple-use of the command list is achieved by the HBA only moving its command list pointer when the BSY, DRQ, and ERR bits are cleared by the device. It is system software’s responsibility to not mix queued and non-queued commands in the command list.

 

由于是一个端口对应多个终端设备,因此必须具有一个机制来决定数据通路:什么时候使用哪一个设备?什么时候进行传输?这些都是需要考虑的问题。

  Port Multiplier具有两种切换机制:Command-based Switching和FIS-based Switching,可以翻译为基于命令的切换机制和基于FIS的切换机制,FIS(Frame Information Structure,帧信息结构)是SATA为了实现异步传输数据块而使用的封包,“正常”的SATA设备都使用FIS,除了第一代推出的实际上是包装过的PATA(同步传输)。要支持FIS,也需要驱动的支持,标准的AHCI规范使用了FIS。

Command-based Switching基于命令的切换机制:控制器端口在同一时间只对一个设备发起命令,这种方式就是简单地对端口进行扩展

  和PATA相比,SATA的FIS结构允许异步ATA传输,例如,SATA控制器发出读取命令之后可以去干其它事情,驱动器(如,SATA硬盘)准备好数据之后,再主动发送数据给SATA控制器(当然,要具有FIS),控制器并不知道驱动器读取数据需要的时间,在PATA上,只能使用一个块一个块地传输-确认-传输-确认循环,SATA FIS就不需要这样。

FIS-based Switching基于FIS的切换机制:除了发起命令,控制器端口还可以执行来自任何设备的命令,这些都是可以同时进行的,因此提供了最大的性能

  显然,对于通常的点对点SATA而言,FIS虽然有用,不过并不明显,在Port Multiplier端口复用器的情况下,FIS可以发挥到最大的效用。FIS-based Switching基于FIS的切换机制允许主控制器不停地发出命令,终端设备则不停工作,并可以在任意的时候发送数据给控制端(当然,Port Multiplier需要进行拥挤管理),这样的结构可以实现最大的并行处理并达到最高的效率。

 
ATA7-3读后感(2009-05-08 10:21:51)

ata7(sata)与ata6(pata)是兼容的
SSD之前的HDD使用cyllinder,SSD使用LBA
disparity表示在串口上传输的数据里0和1中数目的不同个数
adapter是包含了所有层次的适配器
包括device adapter和host adapter
primitive由4个Byte构成的DWORD,第一个byte是控制信号(K开头)后面三个byte是数据信号(D开头)
靠改变register的某些位来执行的指令叫register delivered command;这是介于高层软件和底层硬件之间的操作,类似于单片机的汇编语言
signature用来让host辨别device,signature由device设置,signature在command register block中随着FIS传送
sata传输时,16bit的数据发送时,高8位首先发送然后再是低8位
pata是用一个port接多个device,device编号不同表示不同的device总线是共用的,一根连线上有device0和device1;
sata是用多个port接每一个device每个device有自己的连线,devie都是devive0;
host中的state machine与device中同层的state machine配合使用,host或device中相邻层次之间的state machine配合使用;
SATA连接可以直接和host连接也可以通过电缆和host连接,就像USB接口一样;PATA也一样;
模拟前端由高速差分信号驱动器和高速差分信号接收器构成
OOB信号的辨别依靠两个align原语间空操作的时间长度
comreset和cominit形式上是一样的,但comreset只能从host到device,而cominit只能从device到host
SATA发送和接收时是以单bit方式传输的,但是在接受方会连续收到10bit以后再解码

OOB:
  device与host连接是首先从device支持的最高速开始的,如果最高速不满足则用较低速率再次匹配,直到最低速率也不能匹配后device将进入error状态;
换速等待时间为54.6us;
  速率匹配是以一连串的align字符收发实现的,这一连串的align字符要跟在6个comwake(device to host)之后;
  host接受到device发来的comwake以后就开始在TX端以最低速率发送D10.2数据,同时在RX端接受device发来的align流(align流紧跟在6个comwake之后),align流最多可以接受32K个(,接受完align流以后又在TX端将这些align流以接收速度发送给device,即送回给device,873us内没有接受到则host重启物理连接过程;
D10.2表示此时连接已建立,但要协商传输速度;
  通信链路建立完毕,device发送sync表示可以进行读写等操作了;
 
      out of band
      comreset cominit comwake
      用于物理联路的连接与速率匹配;
      power on时的timing

链路层功能:
  1.与对等传输层协商传送,并在双方都要传输时进行仲裁冲突
  2.在传输层的FIS两端加入SOF  CRC  EOF原语封装成frame
  3.以DWORD形式接受传输层送来的FIS
  4.对传输层送来的FIS进行CRC校验
  5.提供流量控制(加入控制原语)
  6.加扰与解扰
  7.8b 10b编解码
  8.接受对等链路层的确认信息,向传输层报告发送情况
链路层:
  primitive原语是基于control signals的(以K开头)
  链路层不必知道frame中的内容(FIS),只需要能够识别frame中的原语信号(一个frame由4个原语构成);
  link层是一个中间过渡层,位于传输层和物理层之间;
  每当传输完一个10b的character后都要根据刚才传输的character重新计算running disparity的值,RD的值只有+  - 0三种
  RD会在5b/6b 3b/4b两个子模块里计算,5b/6b编码前的RD是上一个8b/10b编码以后计算的RD结果;
  5B/6B编码完以后重新计算一次RD,作为3b/4b编码前的RD,3b/4b编码完成以后再次计算RD,作为下一个8B/10B中5b/6b编码前的RD
  如果编码以后的0的个数与1的个数相同则rd的值不变,0与1的个数相同的编码称为neutral disparity;000111  111000  0011  1100被限制出现;
  SOF  EOF  CRC payload都是以DWORD形式存在
  FIS是以多个DWORDS形式存在的
  data和control signal之前总是primitive先行;只有hold原语可以插入在frame中
  frame总是由sof  fis crc eof组成
  crc也要以DWORD方式存在;
  另外一些原语可以存在于SOf和EOF的有效FIS之间直接存在于SOF和EOF之间;
  原语用来在host device之间传输实时信息用来匹配通信;
  k28.5开头的原语表示停顿(align),后跟3个byte以凑成一个DWORD;
  其它作用的原语均以k28.3字节开头,所有原语都是以DWORD形式存在的;
  align原语本身是neutral disparity的所以align的插入不会改变disparity
  align原语总是成对发出的;
  通信链路建立完成以后,链路层发出的前两个DWORD(first and second words)应该是2个连续的align原语,后跟254个非align的DWORD;
  align原语的第一个byte是k28.5;
  align原语用来调整物理层,它对link层不起作用
  扰码是通过一个线性反馈移位寄存器实现的;
  扰码的单位是frame,以检测到SOF原语作为新的扰码操作的开始;
  扰码最多可以对2048个DWORD进行(位于一个frame里的数据)
  正常的DMA传输以EOF作为结束;
  DMAT是中断DMA传输的原语,由当前的backchannel发出;
  收到DMAT原语后,计算CRC和加上EOF,中止当前DMA;
  DMA Active FIS可以重新启动DMA传输;
  EOF后还会继续传送register device to host FIS给host,以报告状态,这符合ATA7-1;
  SATA中的FIS传输类似于PATA中的信号线;
  hold/holda原语就是用来进行流量控制的,它们插在FIS之间里传输;
  R_ok、R_ip、R_rdy 、R_err  x_rdy都是针对payload而言的,即针对FIS而言
  这也属于register delivered command,只不过在PATA中直接写device的command block reigster,在SATA中是先写host中的shadow command block register,然后通过FIS传到device中的command block reigster;
  SATA里面是通过FIS来表示此时采用PIO还是DMA方式传输的;PATA中使用专用的DMA信号线和16位的data port;
  CRC只针对payload部分;串扰既包括对data的串扰也包括对crc校验部分的串扰;8b/10b编码包括SOF和EOF等四部分的编码;

传输层作用:
  a.发送时根据FIS的种类及格式构造FIS,接受时检测FIS种类并分解得到有用信息
  b.通知链路层传送frame以及获取链路层传来的frame receipt确认(host收到FIS后也会向device发送确认信息的FIS)
  c.管理和流量控制
  d.向上层报告传输完成或者报错

传输层:
  传输层的作用就是如何构造FIS 以及如何解析FIS,不需要知道frame是如何传输的,这和link层刚好相反
  host和device传输层的状态因FIS的内容不同而不同
  a.FIS是由一些DWORD(4个byte)构成的
  b.原语primitive用来定义边界信息以及流量控制(hold/holda)、传输速率控制、状态报告
  payload content是真正有用信息,先写到shadow command block register和shadow control block register里,再通过FIS形式、frame形式、DOWRD比特流形式传到device里的command register block和control register block;
  shadow command block用于映射到command register block;shadow control block用于映射到control register block;
  exp: 扩展地址内的内容,用48bit寻址时采用;

FIS register-host to device:
  a.host的command register写操作或者device的control register写操作都会引起host-device FIS的传送
  b.host adapter在write操作后的400ns内会代替device将BSY置1,然后再将register FIS host to device传到device的寄存器中;
  c.host里status register中的BSY或DRQ置位时不允许写command block register
  a. 如果该FIS是用来更新device的command register 则C置位为1,如果该FIS是用来更新device control register(位于control block register里)则C置位为0;
  b. 同时将device中寄存器C和SRST都置位为1是不允许的
  c. 在PATA中是通过CS0 CS1/CA0 CA1 CA2来选择command block register还是control block register;在SATA中仅用一个register FIS host to device就搞定;
  a.device接受到host发出的FIS以后,用已接受的FIS中寄存器的内容更新device的本地寄存器内容,如果C位为1,则执行command部分指定的操作,如果C为0则执行control部分指定的操作

FIS register-device to host:
  由FIS的种类就可以确定FIS的格式和长度;FIS中包含了command的号,在command register处指定;
  本来应该是device的中断未决状态,在此由FIS register device to host传送到host的 shadow command/control register block内;
  a.device to host FIS用于device修改host中shadow block里的command register和control register
  b.还可以返回device执行的命令已经完成
  c.由device先发起的FIS
  当host中status register中的BSY和DRQ位都为0时,device to host FIS可以用来置位host中 status register的SERV,以获得总线使用权,这相当于PATA中的ASSERT信号;
  接受到device to host FIS以后将会重写host shadow command block和shadow control block
  当host中shadow register里的BSY和DRQ位都是0时,将丢弃device to host FIS,不更新host 的shadow command block和 shadow control block,进入空闲

FIS set device bits:
  用于device向host,作用与IDENTIFY DEVICE命令完全不同;SET device bits FIS是device用来改写host adapter的shadow寄存器中的error或status里的某些位;IDENTIFY DEVICE作用是向host表明device当前状况,如速率和特征集的支持情况等;
  I表示在收到该FIS以后,如果shadow status register中BSY和DRQ位都为0时,host adapter进入中断等待状态
  设置host shadow status中的高低位:包括8位的error register和status register中的6位,但不影响status中的BSY  DRQ  以及bit3   bit7
  将I位置1后可以设置host中status register的SERV位置1,以要求总线使用权,此时BSY和DRQ位要都为0;这是本FIS常见用法;
  Set device bits FIS到达host端后:
    FIS中的error部分写入host内shadow bolock中的error register(8位)
    status-Hi部分写入 status的6 5 4三位
    sataus-Lo部分写入satus的2 1 0三位
    FIS中的I位为1且host中status中的BSY和DRQ都为0则host进入中断等待状态(实际上表明device进入中断等待状态)

FIS DMA Activate-device to host:
  DMA传输由device发出DMA激活FIS,然后host将数据以DMA方式传送到device;
  每发送一个DMA DATA  FIS后,要再次收到DMA Activate FIS才能发送下一个DMA DATA FIS;
  收到DMA activate FIS以后,如果host adapter的DMA控制器已经被编程过则开始将数据封装成DMA data FIS传送,;如果DMA控制器没有被编程则等待,一旦编程就开始DMA传输
  dma avtivate FIS只能在DMA写中用

FIS first party DMA SETUP:
  DMA first pary是双向的,既可以从host到device 也可以从device到host;
  BUFFER OFFSET用于random access;
  DMA transfer count是以BYTE形式为单位的;
  DMA first party只支持sata不支持pata;
  SATA中的DMA是host向device传输,first partyDMA是双向传输;
  PATA中的multi-word DMA和ultra DMA都可以双向传输,仅仅采样频率不同;
  first party dma setup FIS只在DMA context改变时需要用到,一旦DMA传输硬件环境建立完毕,DMA数据就按顺序传输,传输方式也是DWORD
  传输时一方的D为1 另一方的D为0
  如果I位置1则DMA传输完成以后则进入中断未决状态;
  接受方用接受到的fist party DMA FIS来给自己的DMAC编程;

FIS PIO SETUP:
  PIOsetup FIS是device到host,用于要求建立PIO传输;DMA传输也是一样需要先发送activate;
  D=1 write  D=0 read;
  该FIS向host提供了足够的信息用于host掌控PIO传输;
  与DMA传输一样,每传一个DATA FIS就要一个PIO SETUP FIS传输下一个DATA FIS;
  host收到device发来的PIO setup FIS以后会将FIS中status、error寄存器的值写入host的shadow register里的satus register和error register,然后host software对shadow register进行写操作,每写一次就将一个word写入data FIS里,此时countdown寄存器要相应减1,E_status在countdown寄存器减为0后的400ns内传到shadow status register,data最后以DWORD形式存在

FIS DATA:
  如果有n个DWORD要传输则data FIS有n+1个DWORD长(第一个DWORD用于控制);
  32个bit(一个DWORD),但在一个frame里的DWORD不能超过2048个(8k byte);
  传输前不够DWORD的将在高word(左边的word)补0成DWORD
  first party dma可以从device角度出发将host read操作看成是device write操作;
  data-device to host用于PIO read,DMA read,First party DMA write to host memory;
  data-host to device用于PIO write,DMA write, first party DMA read of host memory;

sata如何实现ATA命令:通过不同的FIS完成在PATA中复杂的信号连线以及时序功能;
物理层的原理图及内部信号功能:
物理层主要作用:
物理层的数据线、电源线及组合接口
物理层的OOB信号
BIST:环路测试
电源模式管理: slumber partial

IDENTIFY DEVICE属于general feature set,在PATA和SATA中都是通过PIO模式传输256WORD,以供host了解device的信息;  

阅读(2498) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~