尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

RK3568适配Panfrost开源GPU驱动:主线内核+Mesa实战指南

RK3568适配Panfrost开源GPU驱动:主线内核+Mesa实战指南 手头这块RK3568板子折磨了快一个月终于把panfrost驱动跑起来了。作为开源GPU驱动的支持者我一直对Mali GPU的闭源驱动有意见而RK3568里的Mali G52 MP2又正好在panfrost支持列表里所以适配本质上不是能不能跑的问题而是怎么把内核、设备树、Mesa这几个环节理顺的问题。这篇文章就记录一下我在这块板子上从零适配panfrost的完整过程包括踩过的坑、改过的配置、以及最后实际验证的效果。如果你也想把RK3568从厂商闭源生态里解放出来切到主线内核跑开源GPU这篇应该能直接当操作手册用。1. 为什么要在RK3568上折腾panfrost1.1 RK3568的GPU与官方闭源驱动现状RK3568这颗SoCCPU是四核Cortex-A55GPU是Mali-G52 2EE也就是常说的MP2性能在嵌入式里属于中端水平。官方SDK默认带的是ARM提供的闭源Mali驱动在Rockchip 5.10内核里以mali.ko或者bifrost模块形式存在。闭源驱动不是不能跑日常QT界面、老一点GLES应用都还行但问题在于它和Rockchip魔改内核深度绑定你想升级内核、切换到主线版本闭源驱动基本直接废掉。更麻烦的是闭源Mali驱动把GPU节点、显示节点、电源管理全封装成一套私有接口出了问题几乎没法自己调试。内核日志里报个Oops你连源码都看不到只能去联系原厂或者翻反汇编。这对做长期维护的项目来说风险很高。随着Rockchip社区对主线内核的支持越来越完善很多人开始把内核切到主线这时候panfrost就成了性价比最高的开源替代方案。1.2 panfrost到底是什么Panfrost是Linux内核里基于DRM框架的Mali GPU开源驱动支持Midgard和Bifrost两代GPU架构RK3568的Mali-G52恰好是Bifrost架构。内核侧负责硬件初始化、命令队列、MMU、电源域管理用户态由Mesa里的Panfrost Gallium驱动负责把OpenGL ES、Vulkan调用翻译成Mali硬件能理解的指令。整条链路都不需要ARM官方的二进制模块也不需要芯片原厂的NDA授权。和官方闭源驱动对比panfrost优势很鲜明它会跟主线内核同步更新代码完全开源遇到问题可以自己看源码、提issue、直接向社区反馈。劣势也客观存在性能峰值比闭源低一点部分图形扩展支持滞后Vulkan还在完善中。但对大多数嵌入式Linux场景来说能用主线内核、能跑稳定的GLES2/3、能顺利接DRM/KMS和Wayland远比压榨最后那点帧率重要。1.3 适配前需要想清楚的几个问题不是所有项目都适合立刻切panfrost。如果你做的是Android系统必须用Vulkan高阶特性或者GPU通用计算OpenCL那闭源驱动在现阶段还是更靠谱的选择。如果你的产品只是跑一个固定界面的HMI、工业平板应用、或者一个长期维护的Linux发行版那panfrost完全够用而且能显著降低供应链风险。另一个需要提前确认的是版本匹配。panfrost要求内核至少5.15以上Mesa至少21.3以上越新越省心。我在这块板子上用6.1内核加Mesa 22.3整体很稳定。如果你还在用Rockchip BSP那种老旧用户库比如libmali、rga私有封装建议先评估清楚哪些要替换再动手。盲目切驱动会导致图形栈直接崩掉最后还得回滚。2. 适配前的软硬件准备2.1 硬件平台与开发环境我这边用的是一块常见的RK3568核心板加底板DDR 4GeMMC 32G显示走HDMI调试口是串口。文件系统是Debian 11arm64自己制作的rootfs。这里有个前提如果rootfs还在跑Rockchip闭源libmali或者特定版本的libegl建议先换成发行版默认的Mesa。我当时测试时发现不换Mesa的话虽然内核panfrost已经加载EGL始终初始化不了因为用户态库还是闭源那一套根本不认识panfrost的render节点。交叉编译工具链直接用标准aarch64-linux-gnu-Debian和Ubuntu下安装crossbuild-essential-arm64就行。如果板子内存够、CPU不吃紧也可以直接放在板上交叉编译RK3568四核A55编译一遍内核大概需要20到40分钟比起在PC上等交叉编译也没慢太多。我更习惯先在PC上交叉编译好Image和dtb再用SD卡启动验证。2.2 内核和用户态组件选型内核版本是成败关键。Rockchip BSP 5.10内核虽然也带了panfrost驱动选项但设备树、时钟、电源管理和主线差了不少直接用会遇到各种奇怪问题。我更推荐直接切主线内核至少5.15实际建议6.1。主线内核里drivers/gpu/drm/panfrost目录自带完整驱动不需要打补丁而且对RK3568显示控制器、Codec、以及各种外设的支持也日益完善。用户态方面Debian 11默认Mesa 21.2已经包含了Panfrost Gallium驱动和EGL/GLES支持理论上装好就能用。如果系统版本太老比如Ubuntu 20.04默认Mesa 20.3Panfrost对G52的支持还不够稳定建议要么换源升级Mesa要么从源码编译Mesa 22.x。我的经验是Mesa版本落后带来的问题远比内核版本落后更多因为GLES扩展和GPU解码逻辑都在用户态维护。2.3 内核配置的关键选项除了CONFIG_DRM_PANFROST还要确认几个选项。首先是CONFIG_DRM必须为y它是整个DRM框架的基础。然后是CONFIG_DRM_ROCKCHIP这个是Rockchip显示控制器的驱动虽然GPU适配不强依赖它但如果你要在本地看到渲染结果必须把显示链路打通否则只能跑离屏渲染。再就是检查有没有残留的闭源驱动配置比如CONFIG_MALI_...、CONFIG_ROCKCHIP_MALI...之类一旦打开会抢占GPU设备树节点panfrost就没法绑定。实际操作时可以在menuconfig里直接搜PANFROST关键字选中编译进内核*再把CONFIG_DRM_ROCKCHIP也打开。如果不需要显示输出只做远程渲染或者无头计算可以不开Rockchip DRM但至少要有GPU render节点。3. 实操从内核编译到panfrost驱动加载3.1 获取源码与编译主线内核以Linux 6.1为例。先拉代码git clone --depth 1 --branch v6.1 https://github.com/torvalds/linux.git cd linux export ARCHarm64 export CROSS_COMPILEaarch64-linux-gnu- make defconfig make menuconfig在menuconfig里进入Device Drivers - Graphics support找到Panfrost (DRM support for ARM Mali GPUs)选中为*。如果找不到多半是CONFIG_DRM没有打开。配置保存后直接编译make -j$(nproc) Image dtbs编译出来的arch/arm64/boot/Image和arch/arm64/boot/dts/rockchip/目录下对应板型的dtb就是我们要的。注意不同厂商的板子设备树文件名差异很大比如正点原子、香橙派、友善等都有自己的dts别拿evb的dtb去烧第三方板子否则起不了。编译时报缺libssl-dev、flex、bison是正常现象按提示安装即可。3.2 设备树GPU节点调整我在这块板子上遇到的第一道坎就是设备树。RK3568的GPU节点在SoC的dtsi里通常长这样gpu: gpufde60000 { compatible arm,mali-bifrost; reg 0x0 0xfde60000 0x0 0x40000; interrupts GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH, GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH, GIC_SPI 42 IRQ_TYPE_LEVEL_HIGH; interrupt-names job, mmu, gpu; clocks cru CLK_GPU, cru CLK_GPU_PVTM; clock-names gpu, pvtm; #cooling-cells 2; status okay; };compatible是内核匹配panfrost的关键。panfrost驱动的of_device_id里包含arm,mali-bifrost如果你的设备树厂家还在用rockchip,rk3568-mali或者仅保留vendor兼容字符串内核就不会绑定。所以适配时要确认或补上arm,mali-bifrost。另外电源域不能漏。RK3568的GPU有独立电源域需要加power-domains power RK3568_PD_GPU;没有这行驱动有时候能挂载但真要申请电源、动态调频时容易崩。GPU的OPP表一般保留SoC dtsi里的gpu_opp_table否则频率管理会异常。这里多说一句设备树是RK3568所有外设适配的载体OV5695摄像头、BT1120视频输出、YT6801网卡、触摸旋转这些全都体现在设备树里但GPU节点只要compatible和status对了基本不会和其他外设冲突。3.3 编译烧录与驱动加载确认编译完Image和dtb后替换到启动分区。我这边是TF卡启动直接在PC上挂载TF卡的boot分区mount /dev/sdX1 /mnt/boot cp /path/Image /mnt/boot/Image cp /path/板型.dtb /mnt/boot/rk-kernel.dtb sync umount /mnt/boot重启后第一件事看内核日志dmesg | grep -i panfrost如果正常会看到类似[ 2.730740] panfrost fde60000.gpu: clock rate 800000000 [ 2.731047] panfrost fde60000.gpu: mali-g52 id 0x7602 major 0x0 minor 0x0 [ 2.741723] [drm] Initialized panfrost 1.2.0 20181108 for fde60000.gpu on minor 1再看DRM节点ls -l /dev/dri/应该能看到card0、renderD128等。如果/dev/dri不存在说明DRM层没起来检查CONFIG_DRM是不是没编进去。如果只有renderD128而没有card0也不一定有问题无显示应用只依赖render节点。3.4 实际渲染验证从kmscube到glmark2内核驱动加载只是第一步能不能真正画图还得看用户态。先安装工具apt install mesa-utils libgl1-mesa-dri libegl1-mesa libgles2-mesa kmscube glmark2-es2先跑kmscubekmscube如果HDMI屏幕上有旋转彩色立方体说明EGL/GBM已经通过panfrost正常渲染了。这个程序会自己找card0RK3568上一般没问题。再跑离屏测试glmark2-es2 --off-screen离屏模式不依赖显示输出适合验证GPU计算和GLES2能力。我这边800MHz的G52跑下来glmark2-es2能到1000分左右具体数值受DDR频率、CPU状态影响。对比官方闭源Mali大概有八成功力日常QT界面、MiniGUI、视频叠加都没啥压力。如果kmscube黑屏没输出先查eglinfoeglinfo重点看EGL依赖的DRM device是不是指向panfrost的render节点。如果显示的是llvmpipe软渲染说明Mesa没走panfrost Gallium大概率是Mesa版本或库路径问题。4. 实操中的常见问题与排查实录4.1 驱动加载失败返回-22或找不到节点最常见的问题是dmesg里完全没有panfrost或者这样一行panfrost: probe of fde60000.gpu failed with error -22-22基本上就是设备树属性错误。先检查节点状态和匹配字符串cat /proc/device-tree/gpu/compatible cat /proc/device-tree/gpu/status如果status为disabled在板级dts里加gpu { status okay; };。如果compatible不含arm,mali-bifrost补上。还有可能是电源域索引错误对照dt-bindings/power/rk3568-power.h里的宏检查。我之前遇到过一种情况板级dts里把GPU节点reg覆盖错了导致驱动请求IO资源失败。排查方法很简单cat /proc/iomem | grep gpu看地址是否和dts一致不一致就改回默认值。4.2 和闭源Mali驱动残留冲突如果你没有彻底换主线内核而是在Rockchip BSP内核上开启panfrost很容易踩到闭源残留的坑。闭源Mali驱动通常叫mali_kbase、mali或bifrost编译进内核或者作为模块加载时会占用相同设备节点panfrost在匹配时就会失败或者设备节点被占用。排查方式lsmod | grep mali dmesg | grep -i mali有模块就先rmmod然后重新检查配置。更稳妥的是直接换主线内核彻底移除Rockchip私有驱动的一整套代码路径省心得多。主线内核里也有Rockchip显示驱动和RGA但和Mali GPU无关。4.3 Mesa里Panfrost后端缺失或库路径不对内核显示panfrost正常但跑glmark2-es2报EGL初始化失败或者这样libGL error: failed to open dri driver这是用户态Gallium驱动没装好。检查ls /usr/lib/aarch64-linux-gnu/dri/panfrost_dri.so没有就说明Mesa构建时没包含panfrost。从源码编译Mesa时要加启动参数meson setup build/ -Dgallium-driverspanfrost -Dvulkan-drivers \ -Ddri-drivers -Dglxdri -Deglenabled -Dgbmenabled \ -Dplatformsx11,wayland ninja -C build ninja -C build install ldconfig注意编译前要装好meson、ninja-build、libdrm-dev、libx11-dev等依赖。编译完覆盖系统Mesa后再用eglinfo确认EGL_VENDOR里出现了Panfrost相关字样。4.4 性能偏低或者花屏panfrost在G52上总体稳定偶尔有花屏大概率是Mesa版本的bug。升级Mesa到最新稳定版通常能解决。性能偏低则要看GPU频率是否到标称值可以用cat /sys/kernel/debug/devfreq/fde60000.gpu/cur_freq查看当前频率。如果发现GPU一直跑在低频率先看设备树里的OPP表和regulator设置再看governor。调试阶段可以直接切性能模式echo performance /sys/class/devfreq/fde60000.gpu/governor量产产品不建议一直performance温度和功耗hold不住还是得用自带的simple_ondemand加温控策略。5. 适配完成后的经验总结与可扩展方向5.1 从GPU适配延伸到其他设备树工作RK3568上设备树适配的经验完全可以平移到其他外设。调试OV5695摄像头时你同样要配置I2C、MIPI D-PHY、电源引脚配置BT1120输出时要搞定视频输出节点的时序和引脚复用YT6801这种PCIe转网口芯片则要理顺PCIe控制器、复位GPIO和电源时序。这些和GPU驱动在设备树层面遵循同一个逻辑节点状态、compatible、电源域、时钟一个都不能少。既然已经切到主线内核Uboot开机动画、触摸横竖屏这些周边也可以一并处理。Uboot加开机动画需要在Uboot源码里配置rockchip-logo相关支持触摸屏竖屏改横屏只需在设备树里修改rotation属性或者对应的panel参数。很多看起来无关的底层配置本质上都是设备树和驱动绑定的问题主线化之后反而更容易排查。5.2 我对panfrost在RK3568上可用性的实际评价我在RK3568上用了大概两个月跑过Qt界面、MiniGUI应用、GLES2的Demo整体体验远超预期。少数复杂粒子效果或者高负荷游戏场景会比闭源驱动慢一截但普通嵌入式HMI完全够用。Vulkan方面panfrost对Bifrost的支持仍在完善中如果项目必须重度依赖Vulkan计算现阶段闭源驱动仍然更稳。我的建议是如果你的项目有长期维护、内核需要升级、或者想摆脱厂商私有生态越早切到panfrost越好。但一定不要用太老的Mesa保持主线最新稳定版是最省事的方案。调试过程中把dmesg、eglinfo、glmark2的日志都存下来遇到问题先搜内核里panfrost的提交记录版本匹配对了问题往往迎刃而解。最后再说一个实用小技巧判断panfrost是否真的在跑GPU时可以同时看top和cat /sys/kernel/debug/devfreq/fde60000.gpu/loadGPU利用率能直观告诉你硬件有没有参与工作而不是CPU在模拟。
返回列表