Nvme协议第三章 Controller Registers

2024-05-07 05:04

本文主要是介绍Nvme协议第三章 Controller Registers,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

控制器寄存器位于MLBAR/MUBAR寄存器(PCI BAR0和BAR1)中,该寄存器应映射到支持有序访问和可变访问宽度的内存空间。host主机通过访问虚拟内存的方式访问该部分寄存器。

注:访问过程只能一次访问一个寄存器,不能多个访问。

寄存器如下:

 1 Offset 00h:CAP

 注意type类型以及bit位。MPSMAX和MPSMIN只是设置一个最大最小范围,具体实际的配置还是需要使用CC.MPS设置。(下图是nvme驱动code(Linux-6.8.8)调用read接口读bar空间 cap信息)

 

 全局搜索了下code,用到ctrl->cap的地方:

 nvme disable controller时候,等待CSTS_RDY状态变化,cap有一项timeout项,需要读取timeout时间,此时间可以理解为一个上限时间,不能超过此时间。通常是以500ms为一个单位。

 /**********************************************************************************************************/

 

 在驱动nvme enable ctrl内:

1 首先读取bar空间CAP,写入到本地ctrl->cap

2 获取dev page min;

3 CSS支持情况,协议定义如下:

 4 关于ctrl->ctrl_config配置,放到后面详细说明。这里配置了ctrl_config,然后写入到nvme register。

 5 重新读取cc reg,然后cap reg重读一次(这里暂时没理解到为什么cc写入一次,会影响到cap)

 6 超时判断,如果&NVME_CAP_CRMS_CRWMS为真,那么需要读取Controller Ready timeout

   定义:NVME_REG_CRTO  = 0x0068,   /* Controller Ready Timeouts */

7 开启cc enable

8 超时等待,等待NVME_CSTS_RDY状态转变。

 /**********************************************************************************************************/

 此函数是mps转换sector。

 /**********************************************************************************************************/

 当admin命令queue create完成,执行nvme_init_ctrl_finish函数。

1 读取SSD FW版本,即:

2  读取admin queue entry size:表明单个queue支持的最大entry个数。

3 读取NSSRS:是否支持子系统

 4 identify和configuration设置。(后序再详细解析)

/**********************************************************************************************************/

 扫描NS信息。NVME_CAP_CRMS_CRIMS

nvme协议上对59bit和60bit是reserved,但是nvme驱动里面代表什么含义?

Offset 08h: VS – Version

当admin AQA等信息全部设置完成,可以create admin命令后,执行nvme_init_ctrl_finish函数,读取SSD 版本信息。

Offset 14h: CC – Controller Configuration

3.1 CC.EN 

 在CC.EN =1之前,host应该设置:CC.AMS 、CC.MPS、CC.CSS。

如果在初始化CC.IOCQES和(CC.IOSQES之前去创建IO queue,那么会造成controller去终止创建IO CQ和IO SQ,并返回一个无效状态(status code of Invalid Queue Size)。

当SQ doorbell tail写入成功后,EN应该设置为1。 

当EN被清空为“0”时,控制器不得处理命令,也不得将CQ entry写入到CQ queue里面。

当EN状态从1->0时候,controller被重启。删除所有的IO queue(SQ和CQ),复位Admin SQ和CQ queue,硬件处于idle状态。controller级别重启并不影响到PCI寄存器设定和AQA ASQ ACQ的设定。但是其他相关联的,在bar空间(本章节就是bar空间寄存器定义,应该可以这样理解)恢复成默认状态。

controller应该确保在重启操作之前,已经发送到nvme设备的命令,数据没有丢失(需要SSD PLP掉电保护机制来保证),并收到cpl msg到CQ。

当EN被清空为0时候,一旦controller准备好重新启用,CSTS.RDY 被controller清空为0;

当EN=1时候,如果controller准备好处理命令,CSTS.RDY 被controller设置为1。

以下两个情况导致未定义结果

CSTS.RDY=1时,EN状态从0->1过程中;

CSTS.RDY=0时,EN状态从1->0过程中;

另外:AQA ASQ和ACQ只能在EN=0情况下进行修改

查看Linux内核code,驱动中关于CC.EN设置:

nvme_disable_ctrl函数内部,设置EN=0,用于shutdown流程。

/**********************************************************************************************************/

nvme_enable_ctrl函数如上CAP的描述,设置EN=1。

/**********************************************************************************************************/

 函数是表面此刻continue是否正在处理cmd。必须在EN=1才有效。

 3.2 CC.CSS

 

CC.CSS是为了IO SQ选择使用的命令集。host应该选择一个支持的命令集,并且只能在CC.EN =0情况下修改,这个改动应该适用于正在使用的所有IO SQ。(主要关注nvme命令)

  3.3 CC.MPS

MPS是设置host page size,但是范围只能在[CAP.MPSMIN,CAP.MPSMAX]。

 关于CC.AMS、CC.SHN、CC.IOSQES、CC.IOCQES如上,依然写入到ctrl->ctrl_config。

  3.4 CC.AMS

 选择仲裁机制,也需要在EN=0情况下设置。

3.5 CC.SHN

用于设置 shutdown notification。host应该在PCI power management state改变或者下电发生前进行设置。

发生warm reboot时候,需要重新配置(关于reboot类型 如cold warm等,可以单独分析);

特别注意:当SHN改变成01b或者10b时候,其他位域可能会改变。

3.6 CC.IOSQES

用于定义IO命令集可以保存多少个SQ entry。

3.7 CC.IOCQES

用于定义IO命令集可以保存多少个CQ entry 。

驱动内部定义CC IOSQES= 6 << 16 =  0x60000;IOCQES= 4 << 20 = 0x400000。

这篇关于Nvme协议第三章 Controller Registers的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966396

相关文章

Spring Boot Controller处理HTTP请求体的方法

《SpringBootController处理HTTP请求体的方法》SpringBoot提供了强大的机制来处理不同Content-Type​的HTTP请求体,这主要依赖于HttpMessageCo... 目录一、核心机制:HttpMessageConverter​二、按Content-Type​处理详解1.

Java controller接口出入参时间序列化转换操作方法(两种)

《Javacontroller接口出入参时间序列化转换操作方法(两种)》:本文主要介绍Javacontroller接口出入参时间序列化转换操作方法,本文给大家列举两种简单方法,感兴趣的朋友一起看... 目录方式一、使用注解方式二、统一配置场景:在controller编写的接口,在前后端交互过程中一般都会涉及

Nginx中配置HTTP/2协议的详细指南

《Nginx中配置HTTP/2协议的详细指南》HTTP/2是HTTP协议的下一代版本,旨在提高性能、减少延迟并优化现代网络环境中的通信效率,本文将为大家介绍Nginx配置HTTP/2协议想详细步骤,需... 目录一、HTTP/2 协议概述1.HTTP/22. HTTP/2 的核心特性3. HTTP/2 的优

关于WebSocket协议状态码解析

《关于WebSocket协议状态码解析》:本文主要介绍关于WebSocket协议状态码的使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录WebSocket协议状态码解析1. 引言2. WebSocket协议状态码概述3. WebSocket协议状态码详解3

Spring中@RestController和@Controller的使用及区别

《Spring中@RestController和@Controller的使用及区别》:本文主要介绍Spring中@RestController和@Controller的使用及区别,具有很好的参考价... 目录Spring中@RestController和@Controller使用及区别1. 基本定义2. 使

Qt 中集成mqtt协议的使用方法

《Qt中集成mqtt协议的使用方法》文章介绍了如何在工程中引入qmqtt库,并通过声明一个单例类来暴露订阅到的主题数据,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一,引入qmqtt 库二,使用一,引入qmqtt 库我是将整个头文件/源文件都添加到了工程中进行编译,这样 跨平台

Java如何接收并解析HL7协议数据

《Java如何接收并解析HL7协议数据》文章主要介绍了HL7协议及其在医疗行业中的应用,详细描述了如何配置环境、接收和解析数据,以及与前端进行交互的实现方法,文章还分享了使用7Edit工具进行调试的经... 目录一、前言二、正文1、环境配置2、数据接收:HL7Monitor3、数据解析:HL7Busines

【Linux】应用层http协议

一、HTTP协议 1.1 简要介绍一下HTTP        我们在网络的应用层中可以自己定义协议,但是,已经有大佬定义了一些现成的,非常好用的应用层协议,供我们直接使用,HTTP(超文本传输协议)就是其中之一。        在互联网世界中,HTTP(超文本传输协议)是一个至关重要的协议,他定义了客户端(如浏览器)与服务器之间如何进行通信,以交换或者传输超文本(比如HTML文档)。

【Go】go连接clickhouse使用TCP协议

离开你是傻是对是错 是看破是软弱 这结果是爱是恨或者是什么 如果是种解脱 怎么会还有眷恋在我心窝 那么爱你为什么                      🎵 黄品源/莫文蔚《那么爱你为什么》 package mainimport ("context""fmt""log""time""github.com/ClickHouse/clickhouse-go/v2")func main(

2024.9.8 TCP/IP协议学习笔记

1.所谓的层就是数据交换的深度,电脑点对点就是单层,物理层,加上集线器还是物理层,加上交换机就变成链路层了,有地址表,路由器就到了第三层网络层,每个端口都有一个mac地址 2.A 给 C 发数据包,怎么知道是否要通过路由器转发呢?答案:子网 3.将源 IP 与目的 IP 分别同这个子网掩码进行与运算****,相等则是在一个子网,不相等就是在不同子网 4.A 如何知道,哪个设备是路由器?答案:在 A