默认情况下openwrt并没有启用nvme特性

需要使用make kernel_menuconfig 进入 Device 设置并启用NVMe

编译后启动内核panic如下


[    0.810128] Kernel bug detected[#1]:
[    0.813779] CPU: 0 PID: 9 Comm: kworker/u2:1 Not tainted 4.14.162 #0
[    0.820240] Workqueue: nvme-wq nvme_reset_work
[    0.824749] task: 87c22d00 task.stack: 87cfa000
[    0.829336] $ 0   : 00000000 00000001 80276b18 00000001
[    0.834642] $ 4   : 87c1f8e8 00000000 87cfbd70 87d55c00
[    0.839948] $ 8   : 00000000 00000008 00000000 00000001
[    0.845252] $12   : 00000000 00000400 ffffffff 00000000
[    0.850556] $16   : 87c1f8e8 87c1f844 87c1f800 804c0000
[    0.855862] $20   : 87cf6c00 00000000 87c1f8e8 00000088
[    0.861169] $24   : 00000400 c71307b5
[    0.866475] $28   : 87cfa000 87cfbd50 804d0000 802752e4
[    0.871784] Hi    : 00000000
[    0.874699] Lo    : 00000001
[    0.877624] epc   : 80276b18 nvme_pci_reg_read64+0x0/0x4
[    0.883012] ra    : 802752e4 nvme_init_identify+0x94/0x6e0
[    0.888568] Status: 11009403 KERNEL EXL IE
[    0.892819] Cause : 10800024 (ExcCode 09)
[    0.896883] PrId  : 00019655 (MIPS 24KEc)
[    0.900942] Modules linked in:
[    0.904045] Process kworker/u2:1 (pid: 9, threadinfo=87cfa000, task=87c22d00, tls=00000000)
[    0.912506] Stack : 80038118 87c22d00 87e11600 87c1f844 87c1f800 87e11600 87c1f844 87c1f870
[    0.920994]         87c1f87c 87cf6c00 00000000 801f35d4 87cf6c00 87c1f844 00000000 00000000
[    0.929478]         87c1f844 87c1f844 87e11600 87c1f800 87ce9680 c71307b5 87c1f938 87c1f844
[    0.937964]         87c1f800 87ce9680 87cf6c00 00000000 87c1f8e8 802785f8 87cb6198 00000000
[    0.946448]         00000000 80024450 00000002 8003516c 87ce9d00 87c22d00 00000000 00000000
[    0.954932]         ...
[    0.957413] Call Trace:
[    0.959894] [<80276b18>] nvme_pci_reg_read64+0x0/0x4
[    0.964930] [<802752e4>] nvme_init_identify+0x94/0x6e0
[    0.970142] [<802785f8>] nvme_reset_work+0x488/0x1164

IDA反汇编后发现上述崩溃点的代码竟然是

.text:000011E8  # =============== S U B R O U T I N E =======================================
.text:000011E8
.text:000011E8
.text:000011E8 nvme_pci_reg_read64:                     # DATA XREF: .rodata:00004570↓o
.text:000011E8                 break   0x3000
.text:000011E8  # End of function nvme_pci_reg_read64

查看源代码 drivers/nvme/host/pci.c


static int nvme_pci_reg_read64(struct nvme_ctrl *ctrl, u32 off, u64 *val)
{*val = readq(to_nvme_dev(ctrl)->bar + off);return 0;
}

可能是mips这个平台并没有readq这个函数,寻找其他readq发现

/** Some devices and/or platforms don't advertise or work with INTx* interrupts. Pre-enable a single MSIX or MSI vec for setup. We'll* adjust this later.*/result = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_ALL_TYPES);if (result < 0)return result;dev->ctrl.cap = lo_hi_readq(dev->bar + NVME_REG_CAP);

这可能是一个workaround,所以把上述代码的readq改成lo_hi_readq即可,如下


static int nvme_pci_reg_read64(struct nvme_ctrl *ctrl, u32 off, u64 *val)
{*val = lo_hi_readq(to_nvme_dev(ctrl)->bar + off);return 0;
}

编译openwrt并刷机启动,果然识别到了nvme (建兴T11 Plus 256G)

root@OpenWrt:/# lspci
00:00.0 PCI bridge: MEDIATEK Corp. Device 0801 (rev 01)
01:00.0 Non-Volatile memory controller: Lite-On Technology Corporation Device 5100 (rev 01)
root@OpenWrt:/# ls /dev/nvme*
/dev/nvme0      /dev/nvme0n1    /dev/nvme0n1p1

挂载ext4分区后,测速

root@OpenWrt:/mnt# time dd if=/dev/zero of=./640MB.bin bs=64k count=10000 conv=fsync
10000+0 records in
10000+0 records out
real    0m 14.64s
user    0m 0.02s
sys     0m 12.72s
root@OpenWrt:/mnt# time dd if=./640MB.bin of=/dev/null bs=64k count=10000
10000+0 records in
10000+0 records out
real    0m 8.14s
user    0m 0.02s
sys     0m 7.47s

计算后,写入速度 43.71MB/s 读取速度 78.62MB/s,还算不错!

mt7628 pcie挂载nvme并测试相关推荐

  1. 基于PCIe的NVMe协议在FPGA中实现方法

    NVMe协议是工作在PCIE的最上层协议层的,故需要先搞清楚PCIE.本文基于Xilinx的UltraScale+,开发工具为Vivado2021.2.学习中以spec为主,其它资料辅助参考(重点介绍 ...

  2. 微星970A-G43 主板 PCIE接NVME固态硬盘无法启动Win7,解决方案

    微星970A-G43 主板 PCIE接NVME固态硬盘无法启动Win7解决心路! 华硕M5A97主板添加 PCI NVME硬盘 ADM970芯片组添加PCIE NVME硬盘,并WIN7启动问题. 97 ...

  3. linux nvme固态硬盘,Linux PCIe SSD NVME 性能调优篇

    直接来干货!怎么调优 PBlaze IV PCIe SSD NVMe.  Go! 1. 中断绑定 在Redhat 6.5中的NVMe驱动会自动把全部的中断向量绑定到core0上,如果有多个SSD, c ...

  4. [固态硬盘协议 第3回] 你懂 PCIE 和 NVME是如何相依相恋?

    前言 固态硬盘中的王者,一说非PCIE 莫属,一说非NVME SSD 莫属. PCIE 和 NVME 因何而生? PCIE 和 NVME 的联系和区别? 本着对 PCIE 和 NVME 的好奇心,本文 ...

  5. MIPI C-PHY/D-PHY/ UFS/ SDIO/eMMC/DP/eDP/DDR5/LPDDR5/I3C/PCIE/Automotive Ethernet/Serdes......测试方案

    MIPI C-PHY/D-PHY/ UFS/ SDIO/eMMC/DP/eDP/DDR5/LPDDR5/I3C/PCIE/Automotive Ethernet/Serdes-测试方案介绍_Reete ...

  6. [元带你学NVMe协议] PCIe 和 NVME 寄存器

    声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言. 个人辛苦整理,付费内容,禁止转载. 内容摘要 前言 NVMe(Over PCIe)寄存器主要分为两类,一类是PCIe配置空 ...

  7. [NVME协议8] : 从传输层看PCIE 和 NVME 交互

    声明 主页: 元存储的博客_CSDN博客 https://blog.csdn.net/vagrant0407?type=blog 本文依据公开知识及个人经验整理而成,如有错误请留言. 文章为个人辛苦整 ...

  8. XFS为例 讨论NVMe SSD测试注意事项

    之前一篇<测给你看!异步I/O模式下NVMe SSD性能有多高>文章,介绍了同步I/O和异步I/O模式下NVMe SSD性能的差异,更高性能的存储设备也需要更高的压力才能显示其性能优势.在 ...

  9. 微星970A-G43 主板 PCIE转NVME固态硬盘做WIN10启动盘,解决方案

    本人有台微星A970-G43主板,只支持sata3的硬盘.无奈现在M2接口的固态硬盘速度飞快,心痒也想搞一搞,又不想换平台.查看网上资源说更新bios可以支持PCIE转NVME固态硬盘. 买了一块转接 ...

最新文章

  1. 在Windows 7下安装Oracle 11g的解决方法
  2. c语言字母g,C语言库函数(G类字母) - 1.doc
  3. ThinkSNS积分商城系统 一站式解决企业商城建站需求
  4. Yii2 获取URL的一些方法
  5. 堆排序(利用最大堆)
  6. CNCF发布K8s项目历程报告,35k贡献者有你吗?
  7. 【Python】Jupyter Notebook 配置路径
  8. C语言,计算数据类型及所对应的字节数。
  9. 数据库的跨平台设计(转)
  10. 什么是北京54坐标系
  11. word中公式添加序号后字体变小问题的解决方案(2010和2016两个版本)
  12. The Top 50 ‘Pictures of the Day’ for 2011
  13. Start Developing iOS Apps (Swift) 学习笔记 (1)
  14. bMap+Echarts--百度地图使用方法
  15. 谷歌人工智能检索开普勒望远镜数据后,找到了“迷你太阳系”
  16. 【时间序列分析】11.AR(1)和AR(2)模型
  17. 如何使用mount命令远程挂载
  18. 页面拖动功能jquery +js+html5 移动 弹出框 拖动 弹出框 拖动 div 拖动 弹出框
  19. 【推荐系统】召回离线评估指标Hit Ratio
  20. BZOJ1191 超级英雄Hero

热门文章

  1. win2003能装mysql_Windows2003系统安装mysql小结
  2. 八进制数输出二进制c语言,C语言 某数输出二进制的某位
  3. 某计算机型号,某计算机的型号为486/33,其中33的含义是?
  4. ctf(pwn) canary保护机制讲解 与 解密方法介绍
  5. 解决UbuntuE: 无法修正错误,因为您要求某些软件包保持现状,就是它们破坏了软件包间的依赖关系
  6. 2014 ecb,_it’s_easy_as_123(修改bmp文件头) 攻防世界;
  7. compact php,php中compact函数的功能起什么作用呢?
  8. C语言预定义宏 __func__、__FUNCTION__、__LINE__、__FILE__、__DATE__、__TIME__
  9. python绘制柱状图,如何改变柱状柱间距,如何设置横纵轴标签(绘制Intel Realsense D435深度误差柱状图)
  10. python dict()函数(用于创建一个字典)