记录:rk3568适配开源GPU驱动(panfrost)
rk3568采用的GPU是Mali-G52,该型号的GPU已在5.10内核的panfrost驱动中被支持。下面记录下移植过程。
1.内核dts修改:
kernel 5.10: arch/arm64/boot/dts/rockchip/rk3568.dtsi
gpu: gpu@fde60000 {compatible = "rockchip,rk3568-mali", "arm,mali-bifrost";reg = <0x0 0xfde60000 0x0 0x4000>;interrupts = <GIC_SPI 40 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 41 IRQ_TYPE_LEVEL_HIGH>,<GIC_SPI 39 IRQ_TYPE_LEVEL_HIGH>;interrupt-names = "job", "mmu", "gpu";upthreshold = <40>;downdifferential = <10>;clocks = <&scmi_clk 1>, <&cru CLK_GPU>;clock-names = "gpu", "bus";power-domains = <&power RK3568_PD_GPU>;#cooling-cells = <2>;operating-points-v2 = <&gpu_opp_table>;status = "disabled";gpu_power_model: power-model {compatible = "simple-power-model";leakage-range= <5 15>;ls = <(-24002) 22823 0>;static-coefficient = <100000>;dynamic-coefficient = <953>;ts = <(-108890) 63610 (-1355) 20>;thermal-zone = "gpu-thermal";};};gpu_opp_table: opp-table2 {compatible = "operating-points-v2";mbist-vmin = <825000 900000 950000>;nvmem-cells = <&gpu_leakage>, <&core_pvtm>, <&mbist_vmin>, <&gpu_opp_info>,<&specification_serial_number>, <&remark_spec_serial_number>;nvmem-cell-names = "leakage", "pvtm", "mbist-vmin", "opp-info","specification_serial_number", "remark_spec_serial_number";rockchip,supported-hw;rockchip,max-volt = <1000000>;rockchip,temp-hysteresis = <5000>;rockchip,low-temp = <0>;rockchip,low-temp-adjust-volt = </* MHz MHz uV */0 800 50000>;rockchip,pvtm-voltage-sel = <0 84000 084001 87000 187001 91000 291001 100000 3>;rockchip,pvtm-ch = <0 5>;/* RK3568 && RK3568M gpu OPPs */opp-200000000 {opp-hz = /bits/ 64 <200000000>;opp-microvolt = <850000>;};opp-300000000 {opp-hz = /bits/ 64 <300000000>;opp-microvolt = <850000>;};opp-400000000 {opp-hz = /bits/ 64 <400000000>;opp-microvolt = <850000>;};opp-600000000 {opp-hz = /bits/ 64 <600000000>;opp-microvolt = <900000>;opp-microvolt-L0 = <900000>;opp-microvolt-L1 = <875000>;opp-microvolt-L2 = <850000>;opp-microvolt-L3 = <850000>;};opp-700000000 {opp-hz = /bits/ 64 <700000000>;opp-microvolt = <950000>;opp-microvolt-L0 = <950000>;opp-microvolt-L1 = <925000>;opp-microvolt-L2 = <900000>;opp-microvolt-L3 = <875000>;};opp-800000000 {opp-supported-hw = <0xf9 0xffff>;opp-hz = /bits/ 64 <800000000>;opp-microvolt = <1000000>;opp-microvolt-L0 = <1000000>;opp-microvolt-L1 = <975000>;opp-microvolt-L2 = <950000>;opp-microvolt-L3 = <925000>;};};
2.修改内核配置
CONFIG_DRM_PANFROST=y
# CONFIG_DRM_IGNORE_IOTCL_PERMIT is not set
注意:CONFIG_DRM_IGNORE_IOTCL_PERMIT宏不要打开,不然ubuntu启动桌面的时候会报错。
[ 14.891337] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000018
[ 14.900242] Mem abort info:
[ 14.903080] ESR = 0x96000005
[ 14.906264] EC = 0x25: DABT (current EL), IL = 32 bits
[ 14.911698] SET = 0, FnV = 0
[ 14.914844] EA = 0, S1PTW = 0
[ 14.918061] Data abort info:
[ 14.921001] ISV = 0, ISS = 0x00000005
[ 14.924865] CM = 0, WnR = 0
[ 14.927892] user pgtable: 4k pages, 39-bit VAs, pgdp=0000000013099000
[ 14.934362] [0000000000000018] pgd=0000000000000000, p4d=0000000000000000, pud=0000000000000000
[ 14.943125] Internal error: Oops: 96000005 [#1] SMP
[ 14.948006] Modules linked in:
[ 14.951071] CPU: 0 PID: 804 Comm: gnome-shell Not tainted 5.10.198 #295
[ 14.957681] Hardware name: Rockchip RK3568 ISG505 Board (DT)
[ 14.963341] pstate: 40400009 (nZcv daif +PAN -UAO -TCO BTYPE=--)
[ 14.969359] pc : drm_getunique+0x38/0x120
[ 14.973369] lr : drm_getunique+0x30/0x120
[ 14.977375] sp : ffffffc00be9bc70
[ 14.980695] x29: ffffffc00be9bc70 x28: ffffffc00be9bd78
[ 14.986008] x27: ffffffc00be9bd78 x26: 0000000000000001
[ 14.991319] x25: ffffff800b4a8800 x24: 00000000c0106401
[ 14.996631] x23: 0000000000000000 x22: ffffff800b4a8800
[ 15.001943] x21: 0000000000000000 x20: ffffff8005dd70a8
[ 15.007254] x19: ffffffc00be9bd78 x18: 0000000000000000
[ 15.012567] x17: 0000000000000000 x16: 0000000000000000
[ 15.017878] x15: 0000007ffb143bf8 x14: 0000000000000000
[ 15.023190] x13: 0000000000000000 x12: 0000000000000000
[ 15.028501] x11: 0000000000000000 x10: 0000000000000000
[ 15.033811] x9 : ffffffc00956319c x8 : ffffff800d0c5400
[ 15.039122] x7 : 000000000e200081 x6 : ffffffc00be9bd88
[ 15.044434] x5 : ffffffc00be9bd88 x4 : ffffff800d0c5400
[ 15.049745] x3 : 0000000000000000 x2 : ffffff800d0c5400
[ 15.055056] x1 : 0000000000000000 x0 : 0000000000000000
[ 15.060369] Call trace:
[ 15.062825] drm_getunique+0x38/0x120
[ 15.066486] drm_ioctl_kernel+0xbc/0x104
[ 15.070411] drm_ioctl+0x230/0x480
[ 15.073819] __arm64_sys_ioctl+0xb0/0xf4
[ 15.077747] el0_svc_common.constprop.0+0x70/0x1d0
[ 15.082538] do_el0_svc+0x24/0x30
[ 15.085861] el0_svc+0x20/0x30
[ 15.088918] el0_sync_handler+0xb0/0xb4
[ 15.092756] el0_sync+0x1a0/0x1c0
如果不想关闭CONFIG_DRM_IGNORE_IOTCL_PERMIT宏也可参考下面代码进行修改。
diff --git a/drivers/gpu/drm/drm_ioctl.c b/drivers/gpu/drm/drm_ioctl.c
index 6172f786012b..dbdfaa755bea 100644
--- a/drivers/gpu/drm/drm_ioctl.c
+++ b/drivers/gpu/drm/drm_ioctl.c
@@ -121,6 +121,13 @@ int drm_getunique(struct drm_device *dev, void *data,mutex_lock(&dev->master_mutex);master = file_priv->master;
+
+ if (master == NULL) {
+ u->unique_len = 0;
+ mutex_unlock(&dev->master_mutex);
+ return 0;
+ }
+if (u->unique_len >= master->unique_len) {if (copy_to_user(u->unique, master->unique, master->unique_len)) {mutex_unlock(&dev->master_mutex);
正常启动后内核log如下:
linaro@linaro-alip:~$ dmesg | grep panf
[ 6.924978] panfrost fde60000.gpu: clock rate = 594000000
[ 6.924997] panfrost fde60000.gpu: bus_clock rate = 500000000
[ 6.925906] panfrost fde60000.gpu: mali-g52 id 0x7402 major 0x1 minor 0x0 status 0x0
[ 6.925921] panfrost fde60000.gpu: features: 00000000,13de77ff, issues: 00000000,00000400
[ 6.925932] panfrost fde60000.gpu: Features: L2:0x07110206 Shader:0x00000002 Tiler:0x00000209 Mem:0x1 MMU:0x00002823 AS:0xff JS:0x7
[ 6.925940] panfrost fde60000.gpu: shader_present=0x1 l2_present=0x1
[ 6.927235] [drm] Initialized panfrost 1.1.0 20180908 for fde60000.gpu on minor 1
3.文件系统
因为我用的是ubuntu20.04的文件系统,系统中使用的mesa版本是21.2.6,该版本中已经对Mali-G52提供了支持,所以不需要在进行移植,但是因为panfrost驱动不依赖闭源mali库上的那些修改,所以需要将libdrm和xserver切换回公版的版本,不在使用RK修改过的版本,并且因为不在使用libmali库,所以如果之前有装过,这个也需要卸载掉。
sudo apt-get remove --purge libmali*
对于其他文件系统如果mesa的版本过低,请升级到支持Mali-G52的版本。这点可以在mesa源码的"src/panfrost"下进行搜索,看看GPU型号是否支持。