客户机驱动要求
本页说明协同仿真对客户机内核、amdgpu 驱动参数和 ROM 写入顺序的要求。完整参数表与取值理由以 客户机参数为准,驱动开发细节见内核源码。
镜像与驱动前提
客户机镜像需要与内核版本匹配的 amdgpu DKMS 模块(ROCm 7.0),以及
amddrm_exec等同组模块;缺少模块会导致 TTM 初始化失败。IP discovery 固件位于
/usr/lib/firmware/amdgpu/mi300_discovery,因此discovery=2可以从磁盘文件读取 IP 信息。VBIOS 文件位于
/root/roms/mi300.rom,需要在加载驱动前写入共享内存。自动加载由
/lib/systemd/system/cosim-gpu-initialize.service和/usr/local/bin/cosim-gpu-initialize.sh完成,顺序是写 ROM、再modprobe。
内核命令行
样例 vHost 模板 resources/vhosts/qemu.yaml使用以下命令行:
console=ttyS0 root=/dev/vda1 rw nokaslr modprobe.blacklist=amdgpu
modprobe.blacklist=amdgpu防止 PCI 子系统在 ROM 写入共享内存之前自动加载驱动。vHost 模板会把 vHost 的 cmdline与设备 guest_hints.cmdline拼接后传给 QEMU 的 -append。
驱动参数
modprobe amdgpu ip_block_mask=0x67 ppfeaturemask=0 dpm=0 audio=0 ras_enable=0 discovery=2
ip_block_mask=0x67:只启用 common、GMC、IH、GFX 和 SDMA,禁用 PSP 与 SMU;使用0x6f会启用 PSP 并导致初始化失败。ppfeaturemask=0与dpm=0:协同仿真没有电源管理硬件,关闭 PowerPlay 与动态电源管理。audio=0:没有音频硬件。ras_enable=0:避免最小化 VBIOS 下atom_context为空导致的空指针崩溃。discovery=2:从磁盘上的固件文件做 IP discovery,而不是读 GPU ROM 或寄存器。
ROM 写入顺序
modprobe之前必须执行:
dd if=/root/roms/mi300.rom of=/dev/mem bs=1k seek=768 count=128
该命令把 128 KiB 的 MI300X VBIOS 写到物理地址 0xC0000至 0xDFFFF,gem5 的 AMDGPUDevice::readROM()从共享客户机内存读取该区域。之所以必须显式写入,是因为 amdgpu 的五种 BIOS 发现路径在协同仿真下全部失败:
BIOS 发现路径 |
失败原因 |
|---|---|
|
QEMU Q35 没有 ACPI ATRM 方法。 |
|
没有 ACPI VFCT 表。 |
|
通过 SMU 寄存器读取,但 SMU 被 |
|
没有平台提供的 ROM。 |
|
协同仿真下不可用。 |
自动加载与手动恢复
正常启动时 cosim-gpu-initialize.service会自动完成 ROM 写入与驱动加载。需要手动恢复时:
dd if=/root/roms/mi300.rom of=/dev/mem bs=1k seek=768 count=128
modprobe amdgpu ip_block_mask=0x67 ppfeaturemask=0 dpm=0 audio=0 ras_enable=0 discovery=2
dmesg | grep -i amdgpu | tail -20
验证方式
# 驱动是否加载,是否识别出 gfx942
lsmod | grep amdgpu
dmesg | grep -i -E "amdgpu|gfx942" | tail -30
# IP discovery 与队列状态
rocminfo | head -40
rocm-smi
# 自动加载服务是否成功
systemctl status cosim-gpu-initialize.service
能够看到 MI300X 设备、gfx942代理和可用的 ROCm 队列,说明功能路径已经打通。首个 HIP 程序的验证步骤见 验证客户机。
常见失败
症状 |
首先检查 |
处理 |
|---|---|---|
|
ROM 是否已写入、 |
按顺序执行 ROM 写入与 |
|
|
使用 |
|
镜像中是否存在 |
用 |
|
DKMS 模块与 |
重建或更换匹配的镜像。 |
|
|
按日志修复后手动执行上面的命令。 |
源码与依据
自动加载脚本:
resources/images/recipes/ubuntu/24.04/x86_64/rocm/7.0/files/cosim_gpu_initialize.sh。启动 vHost:
resources/vhosts/qemu.yaml。驱动侧 ROM 读取:
third_party/gem5/src/dev/amdgpu/amdgpu_device.cc中的readROM()。参数唯一事实源:客户机参数。
相关页面
QEMU 作为 vhost:客户机的启动方式。
MI300X PCI/BAR 接口:ROM BAR 与 VGA ROM 窗口。
模型调试:驱动加载后的模型侧调试。
客户机参数:modprobe、dd 与 IP mask 参考。
已知问题:完整已知问题清单。
验证客户机:验证客户机与首个 HIP 程序。