【已评审】新增资源协作接口 bmc.kepler.Chip.FlashIO

背景

来源1:BMC原有能力收集Flash存储的日志信息,在不同代际的硬件上通路设计存在差异,硬件新通路上要求通过SPIOverHisport实现。
来源2:新增krun特性,其中krun固件是保存在Flash器件上的,预期通过SPIOverHisport来擦写该Flash实现krun固件升级的功能。

当前现状与差距/问题分析:
现状:当前已实现了SPIOverHisport的总线
差距:SPIOverHisport总线提供的是原始单个SPI帧内容发送的Read和Write方法。无法满足当前的使用
1、Flash上的读\写\擦除的功能实现是依赖多个帧命令去实现的,如写操作需要先发送写使能命令,再发送页编程的命令(一般Flash器件单页是256字节),再发送读取状态的命令来判断写操作是否完成,直接通过总线需要多次RPC调用。
2、当前已实现的所有Chip类型都没用擦除的方法
3、Flash器件中存在3字节寻址模式和4字节地址的模式的差异,超过16MByte的地址必须使用4字节寻址模式,需要Chip的读写方法中去设置

关联ISSUE

整体方案

1、支持Flash器件抽象成SPIFlash器件类型,约束当前SPIFlash只能配置在SPIOverHisport总线下使用。
2、SPIFlash器件实现以前的BlockIO中的Read和Write方法,其中该方法具体实现细节由框架进行封装(业务无需感知SPI帧格式以及Flash相关的命令字)
3、Flash器件通用能力读、写、擦除,针对擦除功能需要新增Erase方法。(Flash的存储单元物理结构和写入机制决定了它必须先擦除后再写入,不支持直接覆盖)
4、考虑业务扩展性和Flash命令字的种类很多,针对Flash新增Write和Read方法,用于支持业务自定义封装SPI帧内容并由框架侧进行帧内容透传。

详细描述

评审点1、新增资源协作接口 bmc.kepler.Chip.FlashIO

接口描述 :该接口共提供5个方法,用于提供Flash器件已封装后的读、写、擦除能力和SPI原始写入帧发送和读取帧发送和接收的能力。方法描述如下

方法评审点

方法名称 请求签名 请求参数描述 响应签名 响应参数描述 方法描述 访问权限
Read uu Offset: Flash器件上读取的偏移位置
Length: 读取的长度
ay OutData:读取的结果 读取操作,按字节读取从芯片的offset偏移位置读取指定长度内容 BasicSetting
Write uay Offset: Flash器件上写入的偏移位置
InData:写入的数据内容
NA 写入操作,按字节将指定内容写入芯片的offset偏移位置 BasicSetting
Erase uy Offset: 待擦除区域所在偏移位置
Type:擦除类型,0:扇区擦除, 1:32K块擦除, 2:64K块擦除, 3:芯片擦除
NA 擦除操作,根据Offset所在扇区/块/芯片进行擦除 BasicSetting
RawRead uay Length: 读取的数据长度
InData:读取帧数据,包括命令字及负载数据
ay OutData:读取的结果 原始读取操作,支持单个自定义格式帧数据的原始读取操作 BasicSetting
RawWrite ay InData:写入帧数据,包括命令字及负载内容 NA 原始写入操作,支持单个自定义格式帧数据的原始写入操作 BasicSetting

方法实现介绍

方法 bmc.kepler.Chip.FlashIO
Read 描述:读取操作,按字节读取从芯片的offset偏移位置读取指定长度内容,具体实现流程包括
1、发送读状态寄存器命令 – 用于读取当前Flash器件是否正在写操作
2、判断是否需要进行4字节寻址模式切换
3、判断从当前offset开始读取是否需要进行切页操作
4、发送固定读请求命令字 + 读取地址
5、判断是否需要切换回3字节寻址模式
6、将读取的数据内容返回
Write 描述:写入操作,按字节将指定内容写入芯片的offset偏移位置,具体实现流程包括
1、发送读状态寄存器命令 – 用于读取当前Flash器件是否正在写操作
2、判断是否需要进行4字节寻址模式切换
3、判断从当前offset开始写入是否需要进行切页操作
4、发送写使能命令字 – 每次写命令前都需要发送一次写使能命令字
5、发送固定写请求命令字 + 写入地址 + 写入的数据内容
6、判断是否需要切换回3字节寻址模式

Erase 描述:擦除操作,根据Offset所在扇区/块/芯片进行擦除,具体实现流程包括
1、发送读状态寄存器命令 – 用于读取当前Flash器件是否正在写操作
2、判断是否需要进行4字节寻址模式切换
3、发送写使能命令字
4、根据擦除类型,发送对应的擦除请求命令字 + 擦除区域的偏移
5、判断是否需要切换回3字节寻址模式

RawRead 描述:原始读取操作,支持单个自定义格式帧数据的原始读取操作
1、发送数据(由业务拼接 命令字 + 内容)
2、返回响应的数据
RawWrite 描述:原始写入操作,支持单个自定义格式帧数据的原始写入操作
1、发送数据(由业务拼接 命令字 + 内容)

资源协作接口bmc.kepler.Chip.FlashIO接口新增path影响

路径 接口新增影响 CSR配置影响 持久化影响 其他影响
/bmc/kepler/Chip/SPIFlash/:Id 对外提供SPIFlash器件的原始读写命令能力和擦除能力 无影响 不涉及

对已有接口影响

1、bmc.kepler.Chip接口影响

接口描述

提供器件访问的健康状态、硬件上电状态、硬件自检结果和硬件通道锁定的资源协作属性,和设置器件可访问状态以及硬件通道加锁和解锁的能力。
【mdb_interface中bmc.kepler.Chip定义】

资源协作接口bmc.kepler.Chip接口新增path影响

路径 接口新增影响 CSR配置影响 持久化影响 其他影响
/bmc/kepler/Chip/SPIFlash/:Id 对外提供SPIFlash器件的健康状态等属性,硬件可访问状态设置能力和硬件通道加锁解锁的能力 无影响 不涉及

2、bmc.kepler.Release.Chip接口影响

接口描述

提供Release版本下BMC直接读取器件数据的能力。
【mdb_interface中bmc.kepler.Release.Chip定义】

资源协作接口bmc.kepler.Release.Chip接口新增path影响

路径 接口新增影响 CSR配置影响 持久化影响 其他影响
/bmc/kepler/Chip/SPIFlash/:Id 提供Release版本下读取Flash器件数据的能力 无影响 不涉及

3、bmc.kepler.Release.TraceChip接口影响

接口描述

提供启动和停止跟踪芯片对象的读写数据的能力。
【mdb_interface中bmc.kepler.Release.TraceChip定义】

资源协作接口bmc.kepler.Release.TraceChip接口新增path影响

路径 接口新增影响 CSR配置影响 持久化影响 其他影响
/bmc/kepler/Chip/SPIFlash/:Id 提供控制Flash器件的实时数据跟踪能力 无影响 不涉及

4、bmc.kepler.Chip.BlockIO接口影响

接口描述

提供通用的器件读、写、先写后读、批量写、插件请求等能力。

接口必要性

bmc.kepler.Chip.BlockIO中Read、Write方法实现与bmc.kepler.Chip.FlashIO中Read、Write方法一致,实现该接口是为了保证SPIFlash器件类型也可以使用Scanner、Accessor机制,并与其他器件类型一样具备插件请求、批量写等扩展场景。

【mdb_interface中bmc.kepler.Chip.BlockIO定义】

资源协作接口bmc.kepler.Chip.BlockIO接口新增path影响

路径 接口新增影响 CSR配置影响 持久化影响 其他影响
/bmc/kepler/Chip/SPIFlash/:Id 提供Flash器件的通用读、写、先写后读、批量写和插件写等能力 无影响 不涉及

评审结论

1、同意新增协作接口 bmc.kepler.Chip.FlashIO。同意原有资源协作接口bmc.kepler.Chip、bmc.kepler.Release.Chip、bmc.kepler.Release.TraceChip、bmc.kepler.Chip.BlockIO下新增支持SPIFlash器件能力

遗留问题

1、参考模板编写,包括标题和内容
2、多个参数需要换行区分开来,方便阅读和理解
3、方法名称使用Raw修饰的目的需要明确,是否必须?
4、上面描述实现BlockIO的Read和Write方法,跟这里接口下RawRead和RawWrite有什么区别和联系?

第1、2点已修改
第3点:Raw修饰的目的是为了代表该接口是未经过额外封装的,也可以通过说明补充,省略Raw前缀
第4点:BlockIO中的Read和Write为业务可直接使用的经过封装后的接口,用户使用读/写去操作SPIFlash的时候,不再需要去感知到Flash器件内部通讯协议中的命令字和Flash器件的状态。例如BMC侧想要去实现对一个Flash器件的写操作的时候,是必现由以下多帧内容组成的(第1帧:发送读取状态的命令字,用于判断当前Flash是否处于正在写的状态; 第2帧:发送写使能的命令字,每次写或者擦除操作前需要先打开一次写使能开关; 第3帧:将写命令字+写入内容组成一帧数据进行发送;并且对于读取或写入长度超过单页Flash的场景下,BlockIO Read/Write底层还会分成多帧命令去操作,对用户屏蔽了这块器件细节)。而FlashIO中的RawRead和RawWrite是属于能力的扩展,对于Flash通讯协议中的40+命令字,无法全部都进行封装,因此提供了自定义命令字+帧内容的接口,用于除读、写、擦的应用场景外使用。

需要补充说明,实现BlockIO接口的作用和目的。

FlashIO应当实现完整的Flash器件读写擦功能,不能将Flash器件的功能切割到不同的接口实现。

已线下评审,议题评审通过。