通用快閃記憶體儲存

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 屬性,如果存在不匹配,則會修改它。