【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查询。