hypervisor display显卡节点card0生成过程

文章详细描述了在Android平台中,QCOM设备树配置文件(如direwolf-g9ph.dtsi和quin-vm-display-la.dtsi)的结构,以及Makfile中针对不同配置(如单LA和QUIN_GVM)的编译设置。重点讨论了如何通过msm-cfg和msm-hyp-legacy模块创建card0和renderD128DRM设备,以及驱动加载和初始化过程中的关键步骤。

ditsi 配置

lagvm/LINUX/android/vendor/qcom/proprietary/devicetree/qcom

direwolf-g9ph.dts   #include "direwolf-vm-la.dtsi"
direwolf-vm-la.dtsi #include "display/quin-vm-display-la.dtsi"
quin-vm-display-la.dtsi
//对应/sys/class/drm/card0/device/driver的节点
//dtsi节点层级
//soc:
//qcom,sde-cfg:
//qcom,sde-sub-cfg@0:
//qcom,sde_kms_hyp@ae00000
&soc {
        sde_cfg: qcom,sde-cfg {
                compatible = "qcom,sde-cfg";

                qcom,sde-sub-cfg@0 {
                        reg = <0>;
                        wfd_kms: qcom,wfd_kms@0 {
                                compatible = "qcom,wfd-kms";
                                qcom,client-id = "7815";
                        };

                        qcom,sde_kms_hyp@ae00000 {
                                compatible = "qcom,sde-kms-hyp";
                                qcom,kms = <&wfd_kms>;
                        };
                };

                qcom,sde-sub-cfg@1 {
                        reg = <1>;
                        qcom,sde_kms_hyp@ae00000 {
                                compatible = "qcom,sde-kms-hyp-legacy";
                                qcom,client-id = "7815";
                        };
                };
        };
};

 Makfile 配置

# SPDX-License-Identifier: GPL-2.0-only
//单LA 
# auto-detect subdirs
ifeq (y, $(findstring y, $(CONFIG_ARCH_SA8155) $(CONFIG_ARCH_SA6155) $(CONFIG_ARCH_SA8195)))
include $(srctree)/techpack/display/config/augen3disp.conf
LINUXINCLUDE += -include $(srctree)/techpack/display/config/augen3dispconf.h
LINUXINCLUDE += -I$(srctree)/techpack/display/include \
        -I$(srctree)/techpack/display/include/uapi/display

USERINCLUDE = -I$(srctree)/techpack/display/include/uapi/display
endif
//Q+A  这个CONFIG_QTI_QUIN_GVM宏enable
ifeq (y, $(findstring y, $(CONFIG_QTI_QUIN_GVM)))
include $(srctree)/techpack/display/config/gvmgen3disp.conf
LINUXINCLUDE += -include $(srctree)/techpack/display/config/gvmgen3dispconf.h
endif

//根据config 配置msm-hyp msm-hyp-legacy msm-cfg参与编译
obj-$(CONFIG_DRM_MSM) += msm/
obj-$(CONFIG_DRM_MSM_HYP) += msm-hyp/
obj-$(CONFIG_DRM_MSM_HYP_LEGACY) += msm-hyp-legacy/
obj-$(CONFIG_MSM_SDE_ROTATOR) += rotator/
obj-$(CONFIG_DRM_MSM_CFG) += msm-cfg/

/techpack/display/config/gvmgen3dispconf.h
* SPDX-License-Identifier: GPL-2.0-only */
/*
 * Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
 */

#define CONFIG_DRM_MSM_HYP 1
#define CONFIG_DRM_MSM_HYP_WFD 1
#define CONFIG_SYNC_FILE 1
#define CONFIG_DRM_MSM_LEASE 1
gvmgen3disp.conf
export CONFIG_DRM_MSM_LEASE=y
export CONFIG_SYNC_FILE=y
export CONFIG_DRM_MSM_HYP_WFD=y
ifeq ($(CONFIG_QGKI), y)
export CONFIG_DRM_MSM_HYP=y
export CONFIG_DRM_MSM_HYP_LEGACY=y
export CONFIG_DRM_MSM_CFG=y
endif

drm设备创建card0 和renderD128

1,前面提到的需要分析的代码中,其实只有红框部分代码有用(msm-cfg&msm-hyp-legacy),绿框中的代码在内核驱动加载的时候只会运行register,而根本不会执行probe函数。

2,绿框中的代码完全不编译也不影响系统运行,这些代码感觉像是历史遗留代码

unning kernel seems to be up-to-date. No services need to be restarted. No containers need to be restarted. No user sessions are running outdated binaries. No VM guests are running outdated hypervisor (qemu) binaries on this host. [1] 14461 Error: unable to open display :1 root@srv771551:~# The XKEYBOARD keymap compiler (xkbcomp) reports: > Warning: Could not resolve keysym XF86CameraAccessEnable > Warning: Could not resolve keysym XF86CameraAccessDisable > Warning: Could not resolve keysym XF86CameraAccessToggle > Warning: Could not resolve keysym XF86NextElement > Warning: Could not resolve keysym XF86PreviousElement > Warning: Could not resolve keysym XF86AutopilotEngageToggle > Warning: Could not resolve keysym XF86MarkWaypoint > Warning: Could not resolve keysym XF86Sos > Warning: Could not resolve keysym XF86NavChart > Warning: Could not resolve keysym XF86FishingChart > Warning: Could not resolve keysym XF86SingleRangeRadar > Warning: Could not resolve keysym XF86DualRangeRadar > Warning: Could not resolve keysym XF86RadarOverlay > Warning: Could not resolve keysym XF86TraditionalSonar > Warning: Could not resolve keysym XF86ClearvuSonar > Warning: Could not resolve keysym XF86SidevuSonar > Warning: Could not resolve keysym XF86NavInfo Errors from xkbcomp are not fatal to the X server # 查看详细的DRM初始 查看详细的DRM初始化日志 sudo dmesg | grep -iE 'drm|i915|amdgpu|nouveau' # 强制重新加载图形模块(以Intel为例) sudo rmmod i915 sudo modprobe i915 debug=1 [ 8.488129] ACPI: bus type drm_connector registered [ 11.694958] systemd[1]: Starting modprobe@drm.service - Load Kernel Module drm... rmmod: ERROR: Module i915 is not currently loaded modprobe: FATAL: Module i915 not found in directory /lib/modules/6.8.0-60-generic root@srv771551:~# # 检查物理显示接口状态 sudo apt install edid-decode -y sudo cat /sys/class/drm/card0-DP-1/edid | edid-decode # 检测显示端口热插拔状态 grep -H . /sys/class/drm/*/status Reading package lists... Done Building dependency tree... Done Reading state information... Done The following NEW packages will be installed: edid-decode 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 134 kB of archives. After this operation, 350 kB of additional disk space will be used. Get:1 http://in.archive.ubuntu.com/ubuntu noble/universe amd64 edid-decode amd64 0.1~git20220315.cb74358c2896-1.1 [134 kB] Fetched 134 kB in 1s (126 kB/s) Selecting previously unselected package edid-decode. (Reading database ... 104591 files and directories currently installed.) Preparing to unpack .../edid-decode_0.1~git20220315.cb74358c2896-1.1_amd64.deb ... Unpacking edid-decode (0.1~git20220315.cb74358c2896-1.1) ... Setting up edid-decode (0.1~git20220315.cb74358c2896-1.1) ... Processing triggers for man-db (2.12.0-4build2) ... Scanning processes... Scanning linux images... Running kernel seems to be up-to-date. No services need to be restarted. No containers need to be restarted. No user sessions are running outdated binaries. No VM guests are running outdated hypervisor (qemu) binaries on this host. cat: /sys/class/drm/card0-DP-1/edid: No such file or directory EDID of 'stdin' was empty. grep: /sys/class/drm/*/status: No such file or directory root@srv771551:~# # 使用LLVMpipe软件渲染 sudo apt install mesa-utils -y LIBGL_ALWAYS_SOFTWARE=1 glxinfo | grep "OpenGL renderer" # 验证CPU渲染能力 MESA_GL_VERSION_OVERRIDE=4.5 glxgears Reading package lists... Done Building dependency tree... Done Reading state information... Done mesa-utils is already the newest version (9.0.0-2). 0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded. OpenGL renderer string: llvmpipe (LLVM 19.1.1, 256 bits) The XKEYBOARD keymap compiler (xkbcomp) reports: > Warning: Could not resolve keysym XF86CameraAccessEnable > Warning: Could not resolve keysym XF86CameraAccessDisable > Warning: Could not resolve keysym XF86CameraAccessToggle > Warning: Could not resolve keysym XF86NextElement > Warning: Could not resolve keysym XF86PreviousElement > Warning: Could not resolve keysym XF86AutopilotEngageToggle > Warning: Could not resolve keysym XF86MarkWaypoint > Warning: Could not resolve keysym XF86Sos > Warning: Could not resolve keysym XF86NavChart > Warning: Could not resolve keysym XF86FishingChart > Warning: Could not resolve keysym XF86SingleRangeRadar > Warning: Could not resolve keysym XF86DualRangeRadar > Warning: Could not resolve keysym XF86RadarOverlay > Warning: Could not resolve keysym XF86TraditionalSonar > Warning: Could not resolve keysym XF86ClearvuSonar > Warning: Could not resolve keysym XF86SidevuSonar > Warning: Could not resolve keysym XF86NavInfo Errors from xkbcomp are not fatal to the X server 6622 frames in 5.0 seconds = 1324.350 FPS 5306 frames in 5.0 seconds = 1061.041 FPS 6476 frames in 5.0 seconds = 1295.068 FPS 7356 frames in 5.0 seconds = 1471.104 FPS 7530 frames in 5.0 seconds = 1505.943 FPS 7202 frames in 5.0 seconds = 1440.160 FPS 6918 frames in 5.0 seconds = 1383.580 FPS 6448 frames in 5.0 seconds = 1289.433 FPS 6896 frames in 5.0 seconds = 1379.091 FPS 7166 frames in 5.0 seconds = 1433.100 FPS
05-29
Hypervisor 配置中,虚拟 GPU(vGPU)的作用是为虚拟机提供硬件级别的图形加速能力。通过将物理 GPU 设备分配给一个或多个虚拟机,可以实现对 3D 图形、视频编解码以及通用计算任务(如 AI 计算)的支持。然而,在某些配置场景下,尽管 GPU 设备已经出现在 PCI 总线上,但在虚拟机内部却无法识别到该设备。 ### vGPU 虚拟机中找不到设备的原因分析 1. **Hypervisor 中的 CPUID 控制设置不当** - `hypervisor.cpuid.v0="FALSE"` 是一种用于屏蔽虚拟化特征的配置选项,常见于 VMware ESXi 环境中。此设置会阻止虚拟机检测到运行在虚拟化环境中的事实,可能导致某些驱动程序(尤其是 NVIDIA 显卡驱动)无法正确初始化 GPU 设备。 - 如果未正确配置此参数,NVIDIA 驱动可能因检测到虚拟化标志而拒绝加载,从而导致虚拟机内看不到 GPU 设备[^2]。 2. **设备直通配置错误** - 在进行 GPU 直通时,必须确保物理 GPU 已从宿主机中完全卸载,并正确绑定到 VFIO 或其他支持直通的驱动上。若 GPU 设备仍被宿主机占用,则虚拟机无法访问该设备。 - 对于 Windows 宿主机,需使用 PowerShell 命令卸载设备并将其分配给虚拟机: ```powershell Dismount-VMHostAssignableDevice -VMHost $vmHost -DevicePath $devicePath Add-VMAssignableDevice -VM $vm -DevicePath $devicePath ``` 若未执行上述步骤,设备可能无法被虚拟机识别[^1]。 3. **MMIO 地址空间不足** - GPU 设备需要足够的 MMIO(Memory-Mapped I/O)空间来映射其寄存器和显存区域。若 MMIO 分配过小,可能导致地址冲突或设备初始化失败。 - 在配置虚拟机时,应预留至少 512 MB 的额外缓冲区以避免此类问题。 4. **固件与 BIOS 设置限制** - 某些 GPU(尤其是消费级显卡如 NVIDIA GTX/RTX 系列)对虚拟化有严格的限制,要求 BIOS 中启用 IOMMU(Intel VT-d 或 AMD-Vi),并在虚拟机中使用特定固件(如 OVMF)启动。 - 若 BIOS 中未启用相关功能,或未正确配置固件镜像路径,GPU 可能无法完成基本的初始化过程,从而导致设备不可见。 5. **操作系统与驱动兼容性问题** - 即使设备已成功直通至虚拟机,若操作系统中未安装合适的驱动程序,也无法识别 GPU。例如,在 Ubuntu 中尝试使用 NVIDIA 显卡时,由于默认内核模块冲突或驱动版本不兼容,可能出现“nvidia-smi 找不到设备”的情况。 - 此类问题在使用 EXSI + Ubuntu 组合时尤为常见,部分用户转而采用 Debian 以获得更好的兼容性[^3]。 6. **虚拟机配置文件缺失关键参数** - 在 KVM/QEMU 环境中,若虚拟机 XML 配置文件中未正确添加 GPU 设备信息,或地址总线号不匹配,也可能导致设备无法识别。需确保 `<hostdev>` 标签中包含正确的 PCI 地址信息: ```xml <hostdev mode='subsystem' type='pci' managed='yes'> <source> <address domain='0x0000' bus='0x01' slot='0x00' function='0x0'/> </source> </hostdev> ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值