如何设置 amdgpu 选项

如何设置 amdgpu 选项

操作系统:Ubuntu 22.04.1

rocminfo 出现错误,我正在尝试让它正常工作。

如何设置 amdgpu 选项?例如设置选项amdgpu cwsr_enable=0。是否有地方列出选项以及如何设置它们以及它们的作用?

答案1

以下是对您问题的一些解答:

是否有地方列出了这些选项以及如何设置它们以及它们的作用?

(答案很简短,所以我把这个放在第一位)

modinfo amdgpu

param:在输出中查找。这些是此内核模块的所有可用参数选项。Linux 内核文档也有一些关于这些内容的有用信息:

如何设置 amdgpu 选项?

(答案比较长,因为方法有很多)

正如我们上面看到的,amdgpu是 Linux 内核源代码树中存在的开源 AMD 显卡驱动程序的名称。它们包含在 Ubuntu 的库存内核中。

内核模块(又称驱动程序)有可以通过多种方式设置的参数

  1. 通过 Grub Kernel 命令行设置
  • 有两种方法可以做到这一点,取决于您是否希望选项在重启后继续存在。
    1. 通过 GRUB 命令行的临时方法
      • 启动系统并等待 GRUB 菜单显示(如果您没有看到 GRUB 菜单,请Shift在启动系统后立即按住左键)。有些系统使用 UEFI 启动并跳过此屏幕,而其他系统仍支持较旧的 MBR 启动方法并且不会跳过它。
      • 在 GRUB 内核选择屏幕上,突出显示您想要使用的内核版本条目。
      • 按下e以编辑该内核命令行。
      • 您要查找的行如下所示:linux /boot/vmlinuz-6.2.0-20-generic ROOT=UUID=1234567-ABCD ro quiet splash
      • 在此行末尾添加您的内核选项和内核模块选项。
      • 可以直接传递内核级参数(例如noacpinomodeset等等......)
      • 内核模块级参数可以使用名称+点modulename.param语法传递:(例如:amdgpu.dpm=0,,amdgpu.aspm=0等等......)
    2. 通过生成的 GRUB 配置命令行实现持久方法
      • 编辑/etc/default/grub文件为root(例如:sudo vi /etc/default/grubsudo nano /etc/default/grub
      • 找到以下行GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
      • 在最后一个双引号内,添加您的 Linux 内核启动参数和/或模块级参数。
      • 笔记:模块级参数的语法与上面的临时 GRUB 命令行方法相同。(例如amdgpu.dpm=0,,amdgpu.aspm=0等等......)
      • 更新 Grub:sudo update-grub
      • e重新启动,现在每次内核启动时都应该添加参数。(可以使用上述编辑 GRUB 启动行方法查看和验证是否如此)
  1. 通过 Modprobe Drop-In 目录设置

    • 此方法也是持久性的,并在启动过程的稍后modprobe加载内核模块时应用

      • 您不能通过这种方式设置内核级参数,只能设置模块级参数。
      • 这仅适用于可加载内核模块(不是编译好的模块,而是作为模块)。 有关详细信息,请参阅 Gentoo Wiki
      • 笔记:这些配置文件的语法略有不同,因为您不需要modulename.param这里的语法。 (请参阅 Drop-In 配置文件语法man modprobe.d的完整文档。)/etc/modprobe.d
    • 为你的 GPU 添加新的 Drop-In 配置文件

      • 例如,要设置dpm=0aspm=0

        echo 'options amdgpu dpm=0 aspm=0' | sudo tee /etc/modprobe.d/amdgpu-options.conf
        
    • 再生initramfs

        sudo update-initramfs -u -k all
      
    • 重启!

  2. 加载带有临时更改的模块

    • 通常这适用于测试即插即用设备的临时更改

    • 但是,对于在 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,该过程如下所示:

  1. 打开终端并运行:sudo dmesg -H --nopager --follow

    • 查找来自 GPU 驱动程序的消息(例如amdgpu)。可能有一些有用的错误消息可用于诊断问题。
    • enter在这个终端上按几次可能会有帮助,以提供一些空间,以便新消息在最后可以轻松看到。
  2. 打开另一个终端并运行:(sudo rmmod amdgpu或辅助 GPU 使用的驱动程序名称或内核模块)

    • 检查模块是否已经卸载:sudo lsmod | grep -i amdgpu
    • 如果它当前没有加载到内核中,那么你应该看不到任何输出。
  3. 查找辅助 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在这种情况下,声卡使用内核模块)

  4. 使用上面找到的总线 ID 模拟移除 PCIe 设备:

    • 例如:

      # To reset PCI bus ID: 03:00.0
      echo 1 | sudo tee /sys/bus/pci/devices/0000\:03\:00.0/remove
      
  5. 重新扫描 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
    
  6. 检查加载的模块参数是否按预期正确设置:

      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/设置选项的方法,然后重试。
  7. dmesg在另一个终端检查您的输出。

    • 之前的错误还存在吗?
    • 自参数值改变以来,有什么变化或新的变化吗?
  8. 重复并调整参数,直到找到可以解决问题的方法(或者内核彻底崩溃并需要重新启动!)

相关内容