棋子 · 2 天前

PCIe 调试:超级好用的 rescan 与 remove 命令

在 Linux 中,我们经常使用 remove 和 rescan 命令对 PCI 设备进行操作,常常用于设备调试和故障排查。

以下是对这两个命令的简单介绍:

1.remove 命令  

remove 命令用于从系统中移除指定的 PCI 设备。这通常涉及到卸载设备的驱动程序并从内核中删除设备节点

命令格式

echo 1 > /sys/bus/pci/devices//remove

参数

         :表示 PCI 设备的 Bus:Device:Function 地址。例如,0000:15:00.0。

案例

假设你有一个 BDF 地址为 0000:05:02.0 的 PCI 设备,你可以使用以下命令将其移除:

echo 1 > /sys/bus/pci/devices/0000:15:00.0/remove

/sys/bus/pci/devices/0000:15:00.0 目录内容如下所示

image.png

2.remove 执行的操作

使用 echo 1 > /sys/bus/pci/devices/0000:15:00.0/remove 命令移除一个 PCI 设备时,Linux 内核会进行一系列的操作来确保设备被安全地移除,主要包含如下操作:

2.1.卸载设备驱动程序

•卸载驱动程序:内核会尝试卸载与该设备关联的驱动程序。这包括停止所有与该设备相关的服务和进程,确保设备不再被使用。

•释放资源:内核会释放设备占用的资源,如中断(IRQ)、DMA 缓冲区、内存映射等。

2.2.关闭设备

•停止设备:内核会向设备发送停止命令,确保设备不再进行任何操作。

•断开设备连接:内核会断开设备与系统的连接,包括断开设备的电源和数据路径。

2.3.更新 IOMMU 组  

•移除设备:内核会将设备从其所属的 IOMMU 组中移除。这涉及到更新 IOMMU 组的成员列表,确保其他设备不会受到移除操作的影响。

•更新 IOMMU 表:内核会更新 IOMMU 表,移除与该设备相关的条目,确保 IOMMU 不再为该设备提供内存保护和虚拟化支持。

NOTE: 执行remove命令后在terminal输入demsg 命令可以看到如下提示:

iommu: Removing device 0000:15:00.0 from group 29

表示IOMMU已将0000:15:00.0设备从其所属的29组中移除

2.4.更新设备树

更新设备树:内核会从设备树中移除该设备的节点,确保系统不再识别该设备。

更新设备状态:内核会更新设备的状态信息,标记该设备为已移除。

此时使用 lspci 命令将无法查询到 15:00.0 的 PCI 设备    

2.5.释放 PCI 配置空间  

释放配置空间:内核会释放设备的 PCI 配置空间,包括基地址寄存器(BARs)、命令寄存器、状态寄存器等。

清除配置寄存器:内核会清除设备的配置寄存器,确保设备的配置状态被重置。

例如:文件夹/sys/bus/pci/devices/0000:15:00.0会被删除

2.6.更新系统日志  

记录操作:内核会将移除操作记录到系统日志中,以便后续调试和审计。

通知用户空间:内核会通知用户空间,告知设备已被移除。用户空间的工具和服务可以监听这些事件并采取相应的行动。

3.rescan 命令

在 Linux 中,rescan 命令用于重新扫描 PCI 总线,检测并加载所有可用的 PCI 设备。

echo 1 > /sys/bus/pci/rescan

3.1.参数

1:表示触发重新扫描操作。

/sys/bus/pci/rescan:这是内核提供的一个特殊文件,写入 1 会触发 PCI 总线的重新扫描

3.2.常见使用场景

•设备热插拔:当你插入新的 PCI 设备时,可以使用 rescan 命令让系统检测并加载新设备。

•设备移除后重新检测:当你使用 remove 命令移除设备后,可以使用 rescan 命令重新检测并加载该设备。

•调试和故障排除:在调试过程中,重新扫描 PCI 总线可以帮助你确认设备是否被正确识别和加载。

4.rescan 后的操作

如下 demsg 消息显示了 Linux 内核在重新扫描 PCI 总线时对 BDF 地址为 0000:15:00.0 的 PCI 设备进行的初始化过程,主要包含了内存映射与 bar 地址分配、电源管理、IOMMU 添加设备与 Error 提示。

[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: [1f67:1111] type 00 class 0x020000
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: reg 0x10: [mem 0x21fe0000000-0x21fefffffff 64bit pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: reg 0x20: [mem 0x21ff0000000-0x21ff000ffff 64bit pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: reg 0x30: [mem 0x00000000-0x0007ffff pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: PME# supported from D0 D3hot
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: reg 0x164: [mem 0x21ff0010000-0x21ff001ffff 64bit pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: VF(n) BAR0 space: [mem 0x21ff0010000-0x21ff008ffff 64bit pref] (contains BAR0 for 8 VFs)
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: reg 0x174: [mem 0x21ff0090000-0x21ff009ffff 64bit pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: VF(n) BAR4 space: [mem 0x21ff0090000-0x21ff010ffff 64bit pref] (contains BAR4 for 8 VFs)        
[Wed Jan  2 16:11:13 2008] iommu: Adding device 0000:15:00.0 to group 29
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: BAR 0: assigned [mem 0x21fe0000000-0x21fefffffff 64bit pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: BAR 6: assigned [mem 0xfb600000-0xfb67ffff pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: BAR 4: assigned [mem 0x21ff0000000-0x21ff000ffff 64bit pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: BAR 7: assigned [mem 0x21ff0010000-0x21ff008ffff 64bit pref]
[Wed Jan  2 16:11:13 2008] pci 0000:15:00.0: BAR 11: assigned [mem 0x21ff0090000-0x21ff010ffff 64bit pref]
[Wed Jan  2 16:11:13 2008] DMAR: 64bit 0000:15:00.0 uses identity mapping
[Wed Jan  2 16:11:13 2008] xsc-pci 0000:15:00.0: xsc_check_cmdq_version:388:(pid 18793): cmdq version check failed, expecting version 33, actual version 45
[Wed Jan  2 16:11:13 2008] xsc-pci 0000:15:00.0: xsc_init_once:480:(pid 18793): Failed to check cmdq version
[Wed Jan  2 16:11:14 2008] xsc-pci 0000:15:00.0: xsc_load_one:628:(pid 18793): xsc_init_once failed -22
[Wed Jan  2 16:11:14 2008] xsc-pci 0000:15:00.0: xsc_pci_probe:840:(pid 18793): xsc_load_one failed -22
[Wed Jan  2 16:11:14 2008] xsc-pci: probe of 0000:15:00.0 failed with error -22

END

作者:IC小鸽
文章来源:IC小鸽

推荐阅读

更多 IC 设计干货请关注IC设计专栏。欢迎添加极术小姐姐微信(id:aijishu20)加入技术交流群,请备注研究方向。

推荐阅读
关注数
19694
内容数
1304
主要交流IC以及SoC设计流程相关的技术和知识
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息