ufs2.2 协议扫盲(二十)

13.4.14 WriteBooster
13.4.14.1 Overview

TLC NAND的写入性能远低于SLC NAND,因为逻辑定义的TLC位需要更多的编程步骤并且具有更高的纠错概率。 为了提高写入性能,将部分 TLC NAND(普通存储)配置为 SLC NAND,并临时或永久用作写入缓冲区。 使用 SLC NAND 作为 WriteBooster Buffer 可以以更低的延迟处理写入请求并提高整体写入性能。 分配给用户区的 TLC NAND 的某些部分被分配为 WriteBooster 缓冲区。 写入到 WriteBooster 缓冲区的数据可以通过显式主机命令或在休眠 (HIBERN8) 状态时隐式刷新到 TLC NAND 存储中。 TLC 和 SLC NAND 以外的技术(QLC MLC)可以用作普通存储和 WriteBooster Buffer。
ufs2.2 协议扫盲(二十)_第1张图片

dExtendedUFSFeaturesSupport 的位[8]表示设备是否支持WriteBoster功能。
有两种WriteBoster操作模式:“LU专用缓冲区”模式和“共享缓冲区”模式。在“LU专用缓冲区”模式下,WriteBooter缓冲区专用于一个逻辑单元,而在“共享缓冲区”模式下,除已知的逻辑单元外,所有逻辑单元共享相同的WriteBooter缓冲区。bSupportedWriteBoosterBufferTypes指示设备支持哪些模式。在两种WriteBoster操作模式下,WriteBoster缓冲区大小都是可配置的。
有两个用户空间配置选项:“减少用户空间”和“保留用户空间”。随着“用户空间减少”,WriteBoster缓冲区减少了总的可配置用户空间;虽然“保留用户空间”,但总空间并没有减少。当fWriteBoosterEn标志设置为1时,WriteBooster功能将启用。
bAvailableWriteBoosterBufferSize 属性表示WriteBoster缓冲区中的可用空间。当需要刷新WriteBooster缓冲区时,会触发异常事件:WeExceptionEventStatus的位[5]被设置为指示WriteBooster缓冲区中的数据应刷新到正常存储。
有两个标志用于控制WriteBoster缓冲区刷新操作。fWriteBoosterBufferFlushEn标志启用刷新操作:当设置为1时,设备应刷新WriteBooster缓冲区。fWriteBoosterBufferFlushDuringHibernate在休眠期间启用刷新操作:只要链接进入休眠状态,设备就会启动WriteBooster缓冲区刷新操作。
bWriteBoosterBufferFlushStatus属性提供刷新操作状态,而bWriteBoosterBufferLifeTimeEst属性指示WriteBooster缓冲区的估计生存期。

13.4.14.2 WriteBooster configuration
dExtendedUFSFeaturesSupport的位[8]表示设备是否支持WriteBoster功能。如果设备不支持此功能,尝试将配置描述符中的WriteBoster参数设置为不同于零的值的查询请求将失败,并且查询响应UPIU中的查询响应字段应设置为“一般故障”。
WriteBooster缓冲区可根据设备功能配置为“LU专用缓冲区”模式或“共享缓冲区”模式。bSupportedWriteBoosterBufferTypes指示设备支持哪些模式。
如果bWriteBoosterBufferPreserveUserSpaceEn设置为00h,WriteBooster缓冲区将减少可在资源调配时配置的总用户空间。将writeboosterbuffercapadjfac指示的值乘以WriteBooster缓冲区大小,可以计算出减少量。例如,对于具有SLC NAND WriteBooster缓冲区的TLC NAND存储设备,bWriteBoosterBufferCapAdjFac值为3;因此,可配置的总用户容量减少了3×WriteBosterBufferCapacity。
将bWriteBoosterBufferPreserveUserSpaceEn设置为01h可以避免减少可在资源调配时配置的总用户空间,但这可能会导致性能降低.
LU dedicated buffer mode
如果设备支持“LU专用缓冲区”模式,则通过将bWriteBoosterBufferType设置为00h来配置此模式。通过设置相关单元描述符的dLUNumWriteBoosterBufferAllocUnits字段来配置逻辑单元WriteBooster缓冲区大小。只有大于零的值才能启用逻辑单元中的WriteBoster功能。当bConfigDescrLock属性设置为01h时,无法再更改逻辑单元配置。
支持的WriteBoster缓冲区的最大数量在几何体描述符的BDeviceMaxWriteBosterlus参数中定义。BDeviceMaxWriteBosterlus为01h,因此WriteBosterBuffer只能在一个逻辑单元中配置
WriteBooster缓冲区仅适用于配置为“正常内存类型”(bMemoryType=00h)和“非boot已知逻辑单元”(bBootLunID=00h)的0到7之间的逻辑单元,否则查询请求将失败,查询响应字段应设置为“一般故障”。
Shared buffer mode
如果设备支持“共享缓冲区”模式,则通过将bWriteBoosterBufferType设置为01h来配置此模式。通过设置设备描述符的dNumSharedWriteBoosterBufferAllocUnits字段来配置WriteBoster缓冲区大小。请注意,如果bWriteBoosterBufferType设置为01h,但dNumSharedWriteBoosterBufferAllocUnits设置为零,则WriteBoosterBufferAllocUnits功能将被禁用
13.4.14.3 Writing data to WriteBooster Buffer
如果fWriteBoosterEn标志设置为零,则写入任何逻辑单元的数据将写入正常存储器。

如果fWriteBoosterEn标志设置为1,并且设备配置为“共享缓冲区”模式,则写入任何逻辑单元的数据都会写入共享写入器缓冲区。
如果fWriteBoosterEn标志设置为1,且设备配置为“LU专用缓冲区”模式,则写入配置为使用专用缓冲区的逻辑单元的数据将写入逻辑单元WriteBooster缓冲区。写入任何未配置为使用专用缓冲区的逻辑单元的数据将写入正常存储器。
写入WriteBooster缓冲区可能会缩短WriteBooster缓冲区的生存期和可用性。
在“LU专用缓冲区”模式下,当fWriteBoosterEn设置为1时,如果有多个挂起的命令,设备可能会将其他LU的数据写入WriteBooster缓冲区。
每当WriteBoster缓冲区的耐久性被完全消耗时,写入命令的处理就像WriteBoster功能被禁用一样。因此,建议仅当需要WriteBooster性能时,才将fWriteBoosterEn设置为1,以便WriteBooster功能可以使用更长时间。
在共享缓冲区配置中,当fWriteBoosterEn为1时,可能不需要WriteBooster性能的数据将写入WriteBooster缓冲区,填充WriteBooster缓冲区并提前消耗其耐久性的概率更高。
如果没有可用的缓冲区,WriteBooster模式下的写入数据将以正常写入性能存储在正常存储器中。主机可以通过引用BaAvailableWriteBosterBufferSize属性来识别可用的WriteBooster缓冲区大小。此可用缓冲区大小由WriteBooster操作减小,由WriteBooster缓冲区刷新操作增大。可用的缓冲区大小可以通过UNMAP命令来增加。
WriteBoosterBufferLifeTimeest属性指示WriteBooster缓冲区的生存期。如果bWriteBoosterBufferLifeTimeEst的值等于0Bh(超过其最大估计WriteBooster缓冲区寿命),则应像禁用WriteBooster功能一样处理写入命令。

13.4.14.4 Flushing WriteBooster Buffer
当writebooter的整个缓冲区被使用时,数据将被写入普通存储器,而不是writebooter缓冲区。当WriteBoster缓冲区已满或接近满时,设备会通知主机,并需要 WRITEBOOSTER_FLUSH_NEEDED异常事件.
 通过设置WeExceptionEventControl属性的WriteBoster_event_EN位,可以启用WriteBoster_FLUSH_所需的事件机制。
 有两种方法可以将数据从WriteBooster缓冲区刷新到正常存储器:一种是使用显式刷新命令,另一种是在链接休眠状态下启用刷新。如果fWriteBoosterBufferFlushEn标志设置为1,则设备应将WriteBoster缓冲区中存储的数据刷新到正常存储。如果fWriteBoosterBufferFlushDuringHibernate设置为1,则只要链路进入休眠(HIBERN8)状态,设备就会自动刷新WriteBooster缓冲区数据。
 刷新WriteBooster缓冲区所需的时间取决于要刷新的数据量。bWriteBoosterBufferFlushStatus属性指示WriteBooster刷新操作的状态。只有在命令队列为空时,设备才能执行WriteBooster刷新操作。如果设备在刷新WriteBooster缓冲区时收到命令,则设备可能会暂停刷新操作以加快该命令的处理。请注意,即使bWriteBoosterBufferFlushStatus已暂时暂停,它仍将指示“正在进行刷新操作”(01h)。完成主机命令后,设备将自动恢复刷新WriteBooster缓冲区中的数据。
flushing 操作进行时,设备处于 Active power mode .
 如果fWriteBoosterBufferFlushEn和fWriteBoosterBufferFlushDuringHibernate均设置为零,则设备应停止 flushing 操作.
13.4.14.5 Preserve user space option
 有两个用户空间配置选项:“减少用户空间”和“保留用户空间”。通过“减少用户空间”,WriteBoster缓冲区减少了总的可配置用户空间。而“保留用户空间”,用户空间并没有减少。然而,物理存储分配可能小于所有逻辑单元的总容量,因为部分物理存储用于writebooter缓冲区。
​​​​​​​ 当分配给逻辑单元的物理存储被完全使用时,设备将开始使用分配给WriteBoster缓冲区的物理存储。因此,WriteBoster缓冲区大小可能小于最初配置的大小。通过读取dcurrentWriteBosterBufferSize属性,可以发现WriteBosterBufferSize缓冲区的当前大小。通过将BavailableWriteBosterBufferSize(可用WriteBosterBufferSize的百分比)的值乘以DcurrentWriteBosterBufferSize(当前WriteBosterBufferSize)的值,可以计算WriteBosterBufferSize缓冲区中的近似可用空间。
​​​​​​​ ​​​​​​​几何体描述符的bSupportedWriteBoosterBufferUserSpaceReductionTypes参数指示支持哪些选项。将设备描述符的bWriteBoosterBufferPreserveUserSpaceEn参数设置为01h将启用“保留用户空间”。
​​​​​​​ ​​​​​​​这种模式的缺点是,当用于WriteBooster缓冲区的物理存储返回到用户空间时,可能会出现性能下降,因为设备必须进行内部数据结构调整,以及刷新WriteBoster缓冲区数据。如果空闲存储空间增加足够多,设备可以再次从物理存储中构建WriteBoster缓冲区。如果重复增加和减少剩余的存储空间,则writebooter缓冲区可能会从用户存储空间重复构建并返回到用户存储空间,并且可能会发生性能下降。
​​​​​​​ ​​​​​​​由于将用于WriteBoster缓冲区的存储器返回到用户存储空间而导致的性能下降量取决于设备。这是因为用户空间和WriteBoster缓冲区之间的迁移条件取决于设备容量和供应商的迁移策略,其中包括迁移的粒度和频率、迁移开始时剩余的可用用户空间百分比等。有关更多详细信息,请参阅设备数据表。

你可能感兴趣的:(UFS,c语言,linux,驱动开发,C,架构)