UFS(Universal Flash Storage)的出现就是为了取代eMMC和SD cards,它兼具eMMC优点(low power)和SCSI SSD优点(high performance),因而是基于SCSI架构的,称它mobile SSD最合适。如果是可移除(removable)的就是UFS card了。

SCSI architectural model

SCSI devices之间关系是一个client-server model:

scsi-cs-model.png

如上图,client是SCSI Initiator,server是SCSI Target,client负责发起request,server则respond这个请求,他们通过Service Delivery Subsystem连接起来。

另外,SCSI Target由一到多个LU组成,用LUN来识别:

scsi-cs-with-lun-model.png

LU包含Device Server和Task Manager,分别处理client发来的相应request。用well know LU定义只包含特定的功能的LU。

看下C/S通信使用的三层协议模型:

scsi-3layer-prot.png

Interconnect layer就是C/S模型里提到的Service Delivery Subsystem,还提供了一些服务和信号机制供物理层数据传输用, 缩成SIL。

最后还有个SCSI domain model:

scsi-domain.png

可见,SCSI domain由SCSI devices和a servce delivery subsystem组成。

UFS architectural overview

ok,UFS arch是基于SCSI arch的,来看spec里的arch图:

ufs-top-lvl-arch.png

三层架构,来详细点:

  • Application Layer: UCS(处理r/w等normal cmds) + device manager(device level控制) + task manager(command queue控制)三大块组成。

  • UTP: 提供服务给上层用,UTP架构采用了SCSI的C/S model,其中UFS Host是client,UFS device是server。它们之间的交流使用一个叫做UPIU(UFS Protocol Information Unit)的东东。

  • UIC: 处理连接,由MIPI UniPro和MIPI M-PHY组成。UniPro就是Unified Protocol,mobile领域使用的一种高速互连接口。通常都和物理层(如M-PHY)一道完成通讯。

UniPro还有子层:

unipro-layer-view.png

UniPro提供给DME(Device Management Entity)访问。

UFS LUs

先看下spec的UFS domain图:

ufs-scsi-domain.png

这个图很清楚,提下UFS最大支持N个LU,除了well-known LUs。Device server处理cmd,Task set是一组cmds,Task manager控制cmd顺序。

4个Well-Known LU(W-LU) in UFS:

SCSI REPORT LUNS + UFS Device + Boot(启动相关) + RPMB(安全有关)

一般买来的UFS没有LUN,需要create,这个行为叫做provisioning,也叫Logical block provisioning。

UFS的UPIU有个Query function,定义了Query Request UPIU和Query Response UPIU。Query查询用来在C/S间读写数据,这些数据包含了system data,配置,descriptor,flags等。

这些关于device的descriptors分成好多种,比如有GEOMETRY描述符,里面定义了UFS大小:

ufs-geo-desc-size.png

UFSHCI

来看下Host侧的相关定义,UFSHCI是Host Controller Interface,它的目标就是定义一个统一的访问HW的接口,这样的好处是可以提供一个通用的driver,这个driver可以和不同vendor的HCI一起工作。

我们看下从HCI角度的UFS架构图:

ufs-arch-from-hci.png

这个接口位于Host driver和HW之间,由Host controller管理。

UFSHCI定义了两个接口空间(interface spaces):MMIO space + Host memory space,看下这个interface架构:

ufshci-intf-arch.png

MMIO space/IO Memory就是各种Registers,结合Host memory中的Transfer Request Descriptors完成和HW通信。

Linux kernel support

  • Documentation/scsi/ufs.txt
  • Documentation/ABI/testing/sysfs-driver-ufs
  • ufs device drv: drivers/scsi/ufs
  • ufs phy drv: drivers/phy/phy-core.c + drivers/phy/qualcomm

Done.

ps: 以上参考UFS和SCSI相关free spec。