【write protect】
Boot partition write protect:boot partition 支持兩種等級的write protect:Permanent and power-on,通過設定BOOT_WP register(EXD_CSD[]173)
- BOOT_WP所有的register(除了bit2和bit4)都只能在一個power cycle寫一次,用來設定boot partition write protect類型。
- bit2和bit4第一次被寫入就會永久改變這些bit。
- 如果bit2(B_PERM_WP_EN)被設置,它只能對一個boot partition有效,host應該確認bit7和bit3來選擇正確的boot partition。
主機可以通過設置 B_PERM_WP_DIS(EXT_CSD[173] 位 4)和 B_PWR_WP_DIS(EXT_CSD[173] 位 6)來禁用引導區域中的永久和上電寫保護。 如果不需要引導區保護,建議設置這些位以確保引導區不會受到無意或惡意的保護。
write protect是為了允許host保護數據不被erase或者write覆蓋,所提供的功能。eMMC應當支持兩種等級的write protect command。
- 針對整個eMMC device(包括boot area、general purpose、rpmb、user、enhance)設置為power-on或temporary in the CSD。
- 對於設置為寫保護的特殊段,ERASE_GROUP_DEF in exd_csd決定了段的size。如果它是0,那么WP_GRP_SIZE決定了段的size。如果它設置為1的話,那么HC_WP_GRP_SIZE(EXT_CSD)決定了段的大小
- SET_WRITE_PROT command(CMD28)用來set 尋址寫保護組的寫保護功能,address的單位是byte,但它設置的是組地址,需要組對齊。
【cache】
cache是位於device的一段臨時存儲區,訪問cache可以通過 single block read/writ,pre-defined mutil block read/write 或者是open-end (cmd18/cmd25 + cmd12)
【CMDQ】
Command queue是三星和高通在eMMC V5.1上聯合提出來的一個提案(joint proposal)。它允許host可以
發出一個隊列包含32個data-transfer command。CMDQ可能對random read/write性能提升更明顯。
[introduction]
命令隊列 (CQ) 功能在 v5.1 中被引入 e•MMC 標准。包含向設備發送task,命令先前發送的任務,以及額外的任務管理功能的命令。
CQHCI描述了HW/SW 部分,包含了一個有關CQ的硬件模塊,這個模塊執行有sw提供的硬件信息,通過總線協議與設備溝通發送任務,命令任務執行,復制數據到/從系統內存,已經產生中斷。CQHCI 的目標是提供一個統一的接口方法來訪問 e•MMC 中的命令隊列硬件功能,以便可以為這些功能提供標准或通用的軟件驅動程序。 通用驅動程序適用於任何供應商的命令隊列硬件。 本附件包括系統軟件和主機控制器中 CQ 硬件之間的硬件/軟件接口的描述。
[Featurn summary]
- Task-level 協議在主機的軟件和硬件之間
- 使用主機內存中的task列表無阻塞發布數據傳輸任務
- Direct-Command (DCMD) tasks through which software can send any e•MMC command, by its index and argument, to the device, using CQHCI,(直接命令,軟件可以通過它使用 CQHCI 通過其索引和參數向設備發送任何 e•MMC 命令,)
-
Queue-Barrier (QBR) feature through which software can control the execution order of tasks, and
Task management and error recovery executed by software, by halting the CQ hardware at known locations
The following acronyms are used in this annex:
CQ Command Queuing
CQE Command Queuing Engine
CQHCI Command Queuing Host Controller Interface
DCMD Direct Command
QBR Queue Barrier
QSR Queue Status Register
SQS Send Queue Status
TDL Task Descriptor List
CQE負責管理主機軟件和emmc device的接口,CQE看做是host controller的外部單元。
CQE通過內存task descriptor list和doorbell寄存器接收來自軟件的task。CQE發送cmd44和cmd45給emmc device,同時存儲task信息。
CQE也讀取設備的queue status register,來決定執行哪個task,通過CMD46(read) OR CMD47(Write)。
Taks issuance: task descriptor list/Doorbell register
B.2.2. Task Processing by Host Hardware
一旦task descriptor和transfer descriptor寫到了slot i里面,軟件通過向CQTDBR reg中對應i bit寫入1,來發布task。這個操作信號發送給CQE來處理任務。在對應的slot中的descriptor有效之前,軟件不得向CQTDBR寫入來發送task。
Task selection and Execution
CQE也要負責讀取設備的Queue Status Register(QSR)來決定哪個task准備執行,選擇task執行,並且命令執行。
QSR通過發送cmd13來被讀取。如果數據傳輸正在進行,CQE 在數據傳輸結束時發送 SQS,如在CQSSC1.CBC 寄存器字段。 如果總線空閑,CQE 會定期發送 SQS 命令,如配置CQSSC1.CIT 寄存器字段。
Dorrbell用來命令task處於執行狀態,CQE自己決定選擇哪個task來執行。
Task completion:中斷和中斷合並
在一個data transfer task完成之前,數據傳輸完成之后,一個中斷可能產生,如果有需要的話。
Direct command
為了發送DCMD,軟件向slot #31寫入DCMD TASK descriptor,並且按下doorbell。DCMD的作用是用來發送沒有data傳輸的cmd,比如cmd0.cmd12, or cmd13.
Queue-Barrier task
為了使能host對於tasks之間的順序控制,一個任務可以被標記為Queue-barrier Task通過set QBR bit在task descriptor。
QBR用來隔離兩個任務。用來服務一些對順序有要求的CMD,比如erase。
- QBR 任務僅在執行完之前發出的所有任務之后,才發送到設備
- 新任務在QBR 任務執行完成之后,才會發送給device。
Halt feature
有時候,軟件需要直接在bus上執行命令,task management command(cmd48) or error recovery.這種情況下,軟件需要halt CQE, 以便軟件可以獲取bus的控制權和發送自己的command。
這是通過讓CQCTL寄存器的HALT bit寫入1來完成的。CQE不會立刻停止,而是等待知道當前的操作完成(比如data transfer),然后才halt並且不再發送其他command。
CQE在暫停請求的確切行為如下定義:
- 如果data transfer操作已經開始,CQE不會發送其他command,會等待data transfer的完成然后通知software。
- 如果task queueing正在進行,【CMD44 and CMD45】, CQE會完成這筆操作,發送這兩條command並且進行response,然后通知軟件。
- 如果command在傳輸過程中,CQE會完成這條command,並且接受response。
Error Detection and Recovery
當一個error被檢測到,CQE會做如下:
- 停止發送command;
- 如果錯誤在command/response 傳輸過程中被檢測,存儲task ID和command index;
- 如果在data transfer期間檢測到錯誤,存儲啟動所述數據傳輸的命令的任務 ID 和命令索引。
- 如果response期間檢測到error,CQE產生一個RED中斷。
Theory of Operation
本節向軟件開發人員提供有關主機軟件預期行為的信息,以便它最佳地使用 CQE 來實現 e•MMC 命令隊列。
Command queue初始化順序:
- 初始化和試能device的cmdq
- 配置CQTDLBA AND CQTDLBAU來指出分配給TDL的內存位置。
- 配置CQSSC1來控制何時CQE發送cmd13給device;
- 配置CQIC寄存器來控制中斷合並特性:enable/disable,設置中斷計數器和計時保護。
- 配置CQRMEM來控制哪個error可能去觸發一個RED 中斷;
- 往CQCFG寫1來試能CQE。
task issuance sequence:
- host queue task
- 每個task都由cmd44來編碼block count,direct,Prio,taksID... CMD45編碼address;
- 在收到cmd45之后,device把task存在queue里;
- host詢問taskID,避免使用重復的ID。
- QSR
- 32bit register,由taskID對應映射;
- host可以在任何時刻發送cmd13,來查詢QSR;
- 每個bit表示對應的task的狀態,“0-->pending or no task, "1-->ready for execution"
- 每次host想execute,都需要先查詢QSR。
- 如果task ready for execution,使用cmd46/47來執行read /write 。direction需要和CMD44發出一致
- 在data transfer階段
- host可以發出新task(cmd44/45)
- 發出cmd13在任何時刻。
以上的CMD都是有硬件來發送,軟件需要做的是維護兩個位於memory的(task/transfer)descriptor list,然后利用doorbell register去trigger task。
Task descriptor主要指示task的具體參數,而transfer descriptor是指示data buffer在memory的位置。DCMD task只能發給slot31。
對於QBR bit set的task,它會等待在它之前的task都完成之后,才會發給device。而在它之后的task則必須等待它完成QBR查詢。