操作系统:Ubuntu 22.04.1
rocminfo 出现错误,我正在尝试让它正常工作。
如何设置 amdgpu 选项?例如设置选项amdgpu cwsr_enable=0
。是否有地方列出选项以及如何设置它们以及它们的作用?
答案1
以下是对您问题的一些解答:
是否有地方列出了这些选项以及如何设置它们以及它们的作用?
(答案很简短,所以我把这个放在第一位)
modinfo amdgpu
param:
在输出中查找。这些是此内核模块的所有可用参数选项。Linux 内核文档也有一些关于这些内容的有用信息:
如何设置 amdgpu 选项?
(答案比较长,因为方法有很多)
正如我们上面看到的,amdgpu
是 Linux 内核源代码树中存在的开源 AMD 显卡驱动程序的名称。它们包含在 Ubuntu 的库存内核中。
内核模块(又称驱动程序)有可以通过多种方式设置的参数:
- 通过 Grub Kernel 命令行设置
- 有两种方法可以做到这一点,取决于您是否希望选项在重启后继续存在。
- 通过 GRUB 命令行的临时方法
- 启动系统并等待 GRUB 菜单显示(如果您没有看到 GRUB 菜单,请
Shift
在启动系统后立即按住左键)。有些系统使用 UEFI 启动并跳过此屏幕,而其他系统仍支持较旧的 MBR 启动方法并且不会跳过它。 - 在 GRUB 内核选择屏幕上,突出显示您想要使用的内核版本条目。
- 按下
e
以编辑该内核命令行。 - 您要查找的行如下所示:
linux /boot/vmlinuz-6.2.0-20-generic ROOT=UUID=1234567-ABCD ro quiet splash
- 在此行末尾添加您的内核选项和内核模块选项。
- 可以直接传递内核级参数(例如
noacpi
,nomodeset
等等......) - 内核模块级参数可以使用名称+点
modulename.param
语法传递:(例如:amdgpu.dpm=0
,,amdgpu.aspm=0
等等......)
- 启动系统并等待 GRUB 菜单显示(如果您没有看到 GRUB 菜单,请
- 通过生成的 GRUB 配置命令行实现持久方法
- 编辑
/etc/default/grub
文件为root
(例如:sudo vi /etc/default/grub
或sudo nano /etc/default/grub
) - 找到以下行
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
- 在最后一个双引号内,添加您的 Linux 内核启动参数和/或模块级参数。
- 笔记:模块级参数的语法与上面的临时 GRUB 命令行方法相同。(例如
amdgpu.dpm=0
,,amdgpu.aspm=0
等等......) - 更新 Grub:
sudo update-grub
e
重新启动,现在每次内核启动时都应该添加参数。(可以使用上述编辑 GRUB 启动行方法查看和验证是否如此)
- 编辑
- 通过 GRUB 命令行的临时方法
通过 Modprobe Drop-In 目录设置
此方法也是持久性的,并在启动过程的稍后
modprobe
加载内核模块时应用- 您不能通过这种方式设置内核级参数,只能设置模块级参数。
- 这仅适用于可加载内核模块(不是编译好的模块,而是作为模块)。 有关详细信息,请参阅 Gentoo Wiki)
- 笔记:这些配置文件的语法略有不同,因为您不需要
modulename.param
这里的语法。 (请参阅 Drop-In 配置文件语法man modprobe.d
的完整文档。)/etc/modprobe.d
为你的 GPU 添加新的 Drop-In 配置文件
例如,要设置
dpm=0
和aspm=0
:echo 'options amdgpu dpm=0 aspm=0' | sudo tee /etc/modprobe.d/amdgpu-options.conf
再生
initramfs
sudo update-initramfs -u -k all
重启!
加载带有临时更改的模块
通常这适用于测试即插即用设备的临时更改
但是,对于在 UEFI -> 内核启动 -> Init 启动阶段很早就开始使用的 GPU 等设备来说,这可能不是理想的方法。
如果您的系统具有集成显卡(例如 Intel Corporation HD Graphics 630 或类似产品),这在诊断或测试辅助 GPU 的内核模块参数时可能会有所帮助。
sudo modprobe <module_name> [parameter=value]
其中
[parameter=value]
代表该模块可用的自定义参数列表,并且<module_name>
是内核模块的名称(amdgpu
在本例中)请参阅更多详细信息RedHat 的文档在这里
在双 GPU 系统上测试临时内核模块参数
最后一种方法在测试具有集成 GPU 和辅助 PCIe GPU(例如 AMD / Nvidia / Intel ARC)的系统时很有用。它在诊断基本卡初始化问题、使用 VFIO 和/或 IOMMU 以及其他用例时特别有用。 笔记:如果你对这些更高级的主题有疑问,那么首先尝试上述其他更简单的方法。
要遵循此方法,通常需要进入主板的 BIOS(假设它支持此功能)并启用集成 GPU 作为主/默认显示 GPU。然后,我们必须启动 Linux 并在一个终端中检查内核日志消息,同时在另一个终端中卸载内核模块并重置另一个辅助 PCIe GPU。
对于使用内核模块的 AMD 辅助 GPU amdgpu
,该过程如下所示:
打开终端并运行:
sudo dmesg -H --nopager --follow
- 查找来自 GPU 驱动程序的消息(例如
amdgpu
)。可能有一些有用的错误消息可用于诊断问题。 enter
在这个终端上按几次可能会有帮助,以提供一些空间,以便新消息在最后可以轻松看到。
- 查找来自 GPU 驱动程序的消息(例如
打开另一个终端并运行:(
sudo rmmod amdgpu
或辅助 GPU 使用的驱动程序名称或内核模块)- 检查模块是否已经卸载:
sudo lsmod | grep -i amdgpu
- 如果它当前没有加载到内核中,那么你应该看不到任何输出。
- 检查模块是否已经卸载:
查找辅助 GPU 的 PCIe 总线 ID:
跑步:
sudo lspci
AMD
在输出中查找,例如在我的系统上我看到:$ sudo lspci | grep -i amd 01:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Upstream Port of PCI Express Switch (rev c1) 02:00.0 PCI bridge: Advanced Micro Devices, Inc. [AMD/ATI] Navi 10 XL Downstream Port of PCI Express Switch 03:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Navi 23 [Radeon RX 6600/6600 XT/6600M] (rev c1) 03:00.1 Audio device: Advanced Micro Devices, Inc. [AMD/ATI] Navi 21/23 HDMI/DP Audio Controller
在此系统上,AMD RX 6600 显示在 PCI 总线 ID 上:
03:00.0
请注意,GPU 卡内部有多个 PCIe 端口/交换机,以及一个基于 Intel HDA 的 HDMI 音频设备,我们可以忽略它们。(交换机本质上是直通 GPU + Intel HDA 声卡的。
snd_hda_intel
在这种情况下,声卡使用内核模块)
使用上面找到的总线 ID 模拟移除 PCIe 设备:
例如:
# To reset PCI bus ID: 03:00.0 echo 1 | sudo tee /sys/bus/pci/devices/0000\:03\:00.0/remove
重新扫描 PCIe 总线,并立即使用参数重新加载 GPU 驱动模块:
# The semicolon separates two commands and runs them in quick succession # The reasoning here is that once you write '1' to 'rescan' via sysfs, the kernel might decide to auto-load the amdgpu module automatically without your specified parameters. # As such, sometimes it's best to use /etc/modprobe.d or another method for specifying parameters, although reboots can be slower to test. echo 1 | sudo tee /sys/bus/pci/rescan ; sudo modprobe amdgpu dpm=0 aspm=0
检查加载的模块参数是否按预期正确设置:
module=amdgpu; ls /sys/module/$module/parameters/ | while read parameter; do \ echo -n "Parameter: $parameter --> "; \ sudo cat /sys/module/$module/parameters/$parameter; \ done;
- 如果设置与您传递给的设置不匹配
modprobe
,则驱动程序可能在应用您的选项之前自动加载。 - 如果
modprobe param=foo
设置不起作用,请尝试使用/etc/modprobe.d/
设置选项的方法,然后重试。
- 如果设置与您传递给的设置不匹配
dmesg
在另一个终端检查您的输出。- 之前的错误还存在吗?
- 自参数值改变以来,有什么变化或新的变化吗?
重复并调整参数,直到找到可以解决问题的方法(或者内核彻底崩溃并需要重新启动!)