RK3588的gpu是mali g610,这个驱动已经默认合入主线mesa了,对于社区,知名开源机构Collabora开源了基于mali的panthor方案,mesa这边使用主线版本,内核更新基于linux6.8的panthor驱动即可。文章详情如下:
https://www.collabora.com/news-and-blog/news-and-events/release-the-panthor.html
对于mesa,我们需要更新到这笔commit之后即可:
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/26358
我们切一下mesa的仓库,我们可以直接针对mali显卡编译即可,如下:
meson . build/ -Dvulkan-drivers= -Dgallium-drivers=panfrost -Dllvm=disabled
对应文档如下:
https://docs.mesa3d.org/drivers/panfrost.html
对于内核,默认mesa对于的panthor版本在6.8上,我们需要更新如下仓库:
https://gitlab.freedesktop.org/panfrost/linux/-/tree/panthor-next+rk3588?ref_type=heads
其主要代码在:driver/gpu/drm/panthor
我们需要移植这里的代码到自己的版本上,例如linux6.1(已验证)/linux5.10(未验证)
我们知道mali显卡支持csf固件加载,这里的固件也提交在社区上了,可以从如下仓库获取:
https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
我们需要一个名字为mali_csffw.bin的文件放在系统环境下,或合并在内核中,通过firmware_request加载
对于mesa,我们需要切到24.1.0分支上构建,如果我们需要二进制,可以从ubuntu社区上找oibaf的每日构建,如下:
https://launchpad.net/~oibaf/+archive/ubuntu/graphics-drivers
对于指定版本的,根据下载链接修改版本号,可以下载到指定版本上。
当然,如果我们不需要mesa的deb系列包,仍然可以通过meson直接构建如下:
meson . build/ -Dvulkan-drivers= -Dgallium-drivers=panfrost -Dllvm=disabled
使能defconfig,如下:
CONFIG_DRM=y CONFIG_DRM_GPUVM=y CONFIG_DRM_EXEC=y CONFIG_DRM_SCHED=y CONFIG_IOMMU_SUPPORT=y CONFIG_IOMMU_IO_PGTABLE_LPAE=y CONFIG_DRM_GEM_SHMEM_HELPER=y CONFIG_PM_DEVFREQ=y CONFIG_DEVFREQ_GOV_SIMPLE_ONDEMAND=y CONFIG_DRM_PANTHOR=y CONFIG_ROCKCHIP_REGULATOR_COUPLER=y CONFIG_DRM_GPUVM=y
合入panthor驱动如下:
0041-panthor-v6.txt
设备树需要关闭原来的mali gpu节点,并新增基于panthor的节点如下:
From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 From: Boris Brezillon <boris.brezillon@collabora.com> Date: Mon, 7 Aug 2023 17:30:58 +0200 Subject: arm64: dts: rockchip: rk3588: Add GPU nodes Signed-off-by: Sebastian Reichel <sebastian.reichel@collabora.com> --- arch/arm64/boot/dts/rockchip/rk3588s.dtsi | 119 ++++++++++ 1 file changed, 119 insertions(+) diff --git a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi index 762a095648b1..f43f10340d5d 100644 --- a/arch/arm64/boot/dts/rockchip/rk3588s.dtsi +++ b/arch/arm64/boot/dts/rockchip/rk3588s.dtsi @@ -962,6 +962,120 @@ usb_host2_xhci: usb@fcd00000 { snps,dis-del-phy-power-chg-quirk; snps,dis-tx-ipgap-linecheck-quirk; snps,dis_rxdet_inp3_quirk; + }; + + gpu_opp_table: gpu-opp-table { + compatible = "operating-points-v2"; + + nvmem-cells = <&gpu_leakage>; + nvmem-cell-names = "leakage"; + + rockchip,pvtm-voltage-sel = < + 0 815 0 + 816 835 1 + 836 860 2 + 861 885 3 + 886 910 4 + 911 9999 5 + >; + rockchip,pvtm-pvtpll; + rockchip,pvtm-offset = <0x1c>; + rockchip,pvtm-sample-time = <1100>; + rockchip,pvtm-freq = <800000>; + rockchip,pvtm-volt = <750000>; + rockchip,pvtm-ref-temp = <25>; + rockchip,pvtm-temp-prop = <(-135) (-135)>; + rockchip,pvtm-thermal-zone = "gpu-thermal"; + + clocks = <&cru CLK_GPU>; + clock-names = "clk"; + rockchip,grf = <&gpu_grf>; + volt-mem-read-margin = < + 855000 1 + 765000 2 + 675000 3 + 495000 4 + >; + low-volt-mem-read-margin = <4>; + intermediate-threshold-freq = <400000>; /* KHz */ + rockchip,temp-hysteresis = <5000>; + rockchip,low-temp = <10000>; + rockchip,low-temp-min-volt = <750000>; + rockchip,high-temp = <85000>; + rockchip,high-temp-max-freq = <800000>; + + opp-300000000 { + opp-hz = /bits/ 64 <300000000>; + opp-microvolt = <675000 675000 850000>; + }; + opp-400000000 { + opp-hz = /bits/ 64 <400000000>; + opp-microvolt = <675000 675000 850000>; + }; + opp-500000000 { + opp-hz = /bits/ 64 <500000000>; + opp-microvolt = <675000 675000 850000>; + }; + opp-600000000 { + opp-hz = /bits/ 64 <600000000>; + opp-microvolt = <675000 675000 850000>; + }; + opp-700000000 { + opp-hz = /bits/ 64 <700000000>; + opp-microvolt = <700000 700000 850000>; + opp-microvolt-L2 = <687500 687500 850000>; + opp-microvolt-L3 = <675000 675000 850000>; + opp-microvolt-L4 = <675000 675000 850000>; + opp-microvolt-L5 = <675000 675000 850000>; + }; + opp-800000000 { + opp-hz = /bits/ 64 <800000000>; + opp-microvolt = <750000 750000 850000>; + opp-microvolt-L1 = <737500 737500 850000>; + opp-microvolt-L2 = <725000 725000 850000>; + opp-microvolt-L3 = <712500 712500 850000>; + opp-microvolt-L4 = <700000 700000 850000>; + opp-microvolt-L5 = <700000 700000 850000>; + }; + opp-900000000 { + opp-hz = /bits/ 64 <900000000>; + opp-microvolt = <800000 800000 850000>; + opp-microvolt-L1 = <787500 787500 850000>; + opp-microvolt-L2 = <775000 775000 850000>; + opp-microvolt-L3 = <762500 762500 850000>; + opp-microvolt-L4 = <750000 750000 850000>; + opp-microvolt-L5 = <737500 737500 850000>; + }; + opp-1000000000 { + opp-hz = /bits/ 64 <1000000000>; + opp-microvolt = <850000 850000 850000>; + opp-microvolt-L1 = <837500 837500 850000>; + opp-microvolt-L2 = <825000 825000 850000>; + opp-microvolt-L3 = <812500 812500 850000>; + opp-microvolt-L4 = <800000 800000 850000>; + opp-microvolt-L5 = <787500 787500 850000>; + }; + }; + + gpu: gpu@fb000000 { + compatible = "rockchip,rk3588-mali", "arm,mali-valhall-csf"; + reg = <0x0 0xfb000000 0x0 0x200000>; + interrupts = <GIC_SPI 92 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 93 IRQ_TYPE_LEVEL_HIGH 0>, + <GIC_SPI 94 IRQ_TYPE_LEVEL_HIGH 0>; + interrupt-names = "job", "mmu", "gpu"; + + clock-names = "core", "coregroup", "stacks"; + clocks = <&cru CLK_GPU>, <&cru CLK_GPU_COREGROUP>, + <&cru CLK_GPU_STACKS>; + assigned-clocks = <&scmi_clk SCMI_CLK_GPU>; + assigned-clock-rates = <200000000>; + power-domains = <&power RK3588_PD_GPU>; + operating-points-v2 = <&gpu_opp_table>; + #cooling-cells = <2>; + dynamic-power-coefficient = <2982>; + status = "disabled"; }; @@ -3124,6 +3238,11 @@ gpio4: gpio@fec50000 { }; }; + gpu_grf: syscon@fd5a0000 { + compatible = "rockchip,rk3588-gpu-grf", "syscon"; + reg = <0x0 0xfd5a0000 0x0 0x100>; + }; + av1d: video-codec@fdc70000 { compatible = "rockchip,rk3588-av1-vpu"; reg = <0x0 0xfdc70000 0x0 0x800>; --
对于firmware加载部分,如果我们有initrd,则firmware可以放在inird中加载,如果没有,我们可以将其放在内核中自包含,则如下修改:
diff --git a/drivers/gpu/drm/panthor/panthor_fw.c b/drivers/gpu/drm/panthor/panthor_fw.c index ef232c0c2049..de85e30241f6 100644 --- a/drivers/gpu/drm/panthor/panthor_fw.c +++ b/drivers/gpu/drm/panthor/panthor_fw.c @@ -705,7 +705,7 @@ static int panthor_fw_load(struct panthor_device *ptdev) (u32)GPU_ARCH_MINOR(ptdev->gpu_info.gpu_id), CSF_FW_NAME); - ret = request_firmware(&fw, fw_path, ptdev->base.dev); + ret = request_firmware(&fw, CSF_FW_NAME, ptdev->base.dev); if (ret) { drm_err(&ptdev->base, "Failed to load firmware image '%s'\n", CSF_FW_NAME); @@ -1367,4 +1367,4 @@ int panthor_fw_init(struct panthor_device *ptdev) return ret;
defconfig设置如下:
CONFIG_FW_LOADER=y CONFIG_EXTRA_FIRMWARE="mali_csffw.bin" CONFIG_EXTRA_FIRMWARE_DIR="firmware"
此时固件应该放在内核目录如下:
firmware/ └── mali_csffw.bin
至此,panthor的移植已完全完成,如果内核panthor启动成功,则出现如下日志:
[ 10.187485] panthor fb000000.gpu-panthor: [drm] clock rate = 198000000 [ 10.188422] panthor fb000000.gpu-panthor: EM: OPP:400000 is inefficient [ 10.188429] panthor fb000000.gpu-panthor: EM: OPP:300000 is inefficient [ 10.188525] panthor fb000000.gpu-panthor: EM: created perf domain [ 10.188854] panthor fb000000.gpu-panthor: [drm] mali-g610 id 0xa867 major 0x0 minor 0x0 status 0x5 [ 10.188866] panthor fb000000.gpu-panthor: [drm] Features: L2:0x7120306 Tiler:0x809 Mem:0x301 MMU:0x2830 AS:0xff [ 10.188875] panthor fb000000.gpu-panthor: [drm] shader_present=0x50005 l2_present=0x1 tiler_present=0x1 [ 10.190340] panthor fb000000.gpu-panthor: [drm] Firmware protected mode entry not be supported, ignoring [ 10.190563] panthor fb000000.gpu-panthor: [drm] CSF FW v1.1.0, Features 0x0 Instrumentation features 0x71 [ 10.190996] [drm] Initialized panthor 1.0.0 20230801 for fb000000.gpu-panthor on minor 1
此时我们glmark2测试如下,则代表系统启动正常
root@kylin:~# glmark2 ======================================================= glmark2 2021.02 ======================================================= OpenGL Information GL_VENDOR: Mesa GL_RENDERER: Mali-G610 (Panfrost) GL_VERSION: 3.1 Mesa 24.1.0-devel-panthor (git-1c769cb2b0) ======================================================= [build] use-vbo=false: FPS: 1859 FrameTime: 0.538 ms