微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

提交第一个命令后,NVMe 控制器在 CSTS 寄存器中返回致命错误标志

如何解决提交第一个命令后,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 举报,一经查实,本站将立刻删除。