如何解决提交第一个命令后,NVMe 控制器在 CSTS 寄存器中返回致命错误标志
我正在尝试在 32 位 PowerPC 板上初始化 NVMe SSD,刚好足以发出身份命令。我没有操作系统。
这些是我已采取的步骤:
- 禁用 dcache
- 找到 SDD
- 获取 bar0,去掉最后一个 nybble,并将其用作控制区地址(易失性结构)
- 为管理完成和提交队列分配一些内存:16*64 字节用于提交,256 字节用于完成。两者都有 16 个条目
- 将控制区域中的 AQA 设置为
ENDIAN_FLIP((16<<16)|16)
,因为每个条目都有 16 个条目 - 使用 memset 将队列清零
- 将 ASQ 和 ACQ 设置为各自的地址(Endian 翻转)
- 通过将其与
0x01000000
进行按位比较,确保未启用 CSTS 中的 EN - 通过将 CC 设置为
0x01000000
来启用控制器 - 等待 CSTS 通知它已启用。到目前为止这是有效的
- 确保 CSTS 不包含致命错误标志。作品
- 分配一个 4096kb 的内存块用于识别控制器响应
- 来自结构体的表单提交条目:
.cdw0 = ENDIAN_FLIP(0x00000006)//identify command
.prp1 = ENDIAN_FLIP(block_address_32bit)//loading 32-bit address into 64-bit space
.cdw10 = ENDIAN_FLIP(0x00000001)//identify controller
- 将结构复制到提交队列[0]
- 本地增加尾门铃寄存器(从0到1)
- 将 NVMe 控制区域的尾门铃寄存器设置为
ENDIAN_FLIP(local_tail_doorbell_counter)
- 检查 CSTS 是否没有致命标志。此处失败:CSTS 返回
0x03000000
,这意味着 NVMe 控制器已启用并且发生了致命错误
是否知道出了什么问题,或者我可以做些什么来找到更好的错误信息?
我一直在阅读规范,似乎我做的一切都是正确的:/
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。