通用闪存存储¶
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)
低功耗
高随机 IOPs 和低延迟
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 参考时钟频率配置¶
Devicetree 可以在 UFS 控制器节点下定义一个名为“ref_clk”的时钟,以指定 UFS 存储部件的预期参考时钟频率。 基于 ACPI 的系统可以使用名为“ref-clk-freq”的 ACPI 设备特定数据属性来指定频率。 无论哪种方式,该值都解释为 Hz 为单位的频率,并且必须与 UFS 规范中给出的值之一匹配。 UFS 子系统将在执行通用控制器初始化时尝试读取该值。 如果该值可用,UFS 子系统将确保相应设置 UFS 存储设备的 bRefClkFreq 属性,如果存在不匹配,则会修改它。