通用闪存存储¶
1. 概述¶
通用闪存存储 (UFS) 是一种用于闪存设备的存储规范。它旨在为移动设备(如智能手机和平板电脑)中基于嵌入式和可移动闪存的存储提供通用的存储接口。该规范由 JEDEC 固态技术协会定义。UFS 基于 MIPI M-PHY 物理层标准。UFS 使用 MIPI M-PHY 作为物理层,MIPI Unipro 作为链路层。
UFS 的主要目标是提供
优化的性能
对于 UFS 1.0 和 1.1 版本,目标性能如下
必须支持 Gear1(速率 A:1248Mbps,速率 B:1457.6Mbps)
可选支持 Gear2(速率 A:2496Mbps,速率 B:2915.2Mbps)
该标准的未来版本,
Gear3(速率 A:4992Mbps,速率 B:5830.4Mbps)
低功耗
高随机 IOP 和低延迟
2. UFS 架构概述¶
UFS 具有基于 SCSI SAM-5 架构模型的层式通信架构。
UFS 通信架构由以下层组成。
2.1 应用层¶
应用层由 UFS 命令集层 (UCS)、任务管理器和设备管理器组成。UFS 接口被设计为与协议无关,但是 SCSI 已被选择为 UFS 协议层 1.0 和 1.1 版本的基础协议。
UFS 支持 SPC-4 和 SBC-3 定义的 SCSI 命令子集。
- UCS
它处理 UFS 规范支持的 SCSI 命令。
- 任务管理器
它处理 UFS 定义的任务管理功能,这些功能用于命令队列控制。
- 设备管理器
它处理设备级操作和设备配置操作。设备级操作主要涉及设备电源管理操作和到互连层的命令。设备级配置涉及处理查询请求,这些查询请求用于修改和检索设备的配置信息。
2.2 UFS 传输协议 (UTP) 层¶
UTP 层通过服务访问点为更高层提供服务。UTP 为更高层定义了 3 个服务访问点。
UDM_SAP:设备管理器服务访问点暴露给设备管理器,用于设备级操作。这些设备级操作是通过查询请求完成的。
UTP_CMD_SAP:命令服务访问点暴露给 UFS 命令集层 (UCS) 以传输命令。
UTP_TM_SAP:任务管理服务访问点暴露给任务管理器以传输任务管理功能。
UTP 通过 UFS 协议信息单元 (UPIU) 传输消息。
2.3 UFS 互连 (UIC) 层¶
UIC 是 UFS 分层架构的最低层。它处理 UFS 主机和 UFS 设备之间的连接。UIC 由 MIPI UniPro 和 MIPI M-PHY 组成。UIC 为上层提供 2 个服务访问点
UIC_SAP:用于在 UFS 主机和 UFS 设备之间传输 UPIU。
UIO_SAP:用于向 Unipro 层发出命令。
3. UFSHCD 概述¶
UFS 主机控制器驱动程序基于 Linux SCSI 框架。UFSHCD 是一个低级设备驱动程序,充当 SCSI 中间层和基于 PCIe 的 UFS 主机控制器之间的接口。
当前的 UFSHCD 实现支持以下功能
3.1 UFS 控制器初始化¶
初始化模块将 UFS 主机控制器置于活动状态,并准备控制器在 UFSHCD 和 UFS 设备之间传输命令/响应。
3.2 UTP 传输请求¶
UFSHCD 的传输请求处理模块从 SCSI 中间层接收 SCSI 命令,形成 UPIU,并将 UPIU 发送到 UFS 主机控制器。此外,该模块还解码从 UFS 主机控制器以 UPIU 形式接收的响应,并向 SCSI 中间层通知命令的状态。
3.3 UFS 错误处理¶
错误处理模块处理主机控制器致命错误、设备致命错误和 UIC 互连层相关错误。
3.4 SCSI 错误处理¶
这是通过在 SCSI 中间层注册的 UFSHCD SCSI 错误处理例程完成的。SCSI 中间层发出的一些错误处理命令的示例包括中止任务、LUN 重置和主机重置。执行这些任务的 UFSHCD 例程通过 .eh_abort_handler、.eh_device_reset_handler 和 .eh_host_reset_handler 在 SCSI 中间层注册。
在此版本的 UFSHCD 中,未实现查询请求和电源管理功能。
4. BSG 支持¶
此传输驱动程序支持与 UFS 设备交换 UFS 协议信息单元 (UPIU)。通常,用户空间将分配 struct ufs_bsg_request 和 struct ufs_bsg_reply(请参阅 ufs_bsg.h)分别作为 request_upiu 和 reply_upiu。这些 UPIU 的填充应符合 JEDEC 规范 UFS2.1 第 10.7 段。注意风险自担:驱动程序不再进行输入验证,并按原样将 UPIU 发送到设备。打开 /dev/ufs-bsg 中的 bsg 设备并发送具有适用 sg_io_v4 的 SG_IO
io_hdr_v4.guard = 'Q';
io_hdr_v4.protocol = BSG_PROTOCOL_SCSI;
io_hdr_v4.subprotocol = BSG_SUB_PROTOCOL_SCSI_TRANSPORT;
io_hdr_v4.response = (__u64)reply_upiu;
io_hdr_v4.max_response_len = reply_len;
io_hdr_v4.request_len = request_len;
io_hdr_v4.request = (__u64)request_upiu;
if (dir == SG_DXFER_TO_DEV) {
io_hdr_v4.dout_xfer_len = (uint32_t)byte_cnt;
io_hdr_v4.dout_xferp = (uintptr_t)(__u64)buff;
} else {
io_hdr_v4.din_xfer_len = (uint32_t)byte_cnt;
io_hdr_v4.din_xferp = (uintptr_t)(__u64)buff;
}
如果要读取或写入描述符,请使用 sg_io_v4 的适当 xferp。
与 ufs-bsg 端点交互并使用其基于 UPIU 的协议的用户空间工具位于
有关该工具及其支持的功能的更多详细信息,请参阅该工具的 README。
UFS 规范可以在以下位置找到
5. UFS 参考时钟频率配置¶
设备树可以在 UFS 控制器节点下定义一个名为“ref_clk”的时钟,以指定 UFS 存储部件的预期参考时钟频率。基于 ACPI 的系统可以使用名为“ref-clk-freq”的 ACPI 设备特定数据属性来指定频率。在这两种方式中,该值都被解释为以 Hz 为单位的频率,并且必须与 UFS 规范中给出的值之一匹配。UFS 子系统将在执行通用控制器初始化时尝试读取该值。如果该值可用,UFS 子系统将确保 UFS 存储设备的 bRefClkFreq 属性得到相应设置,并且如果存在不匹配,则会对其进行修改。