记录:rk3568适配开源GPU驱动(panfrost)
摘要:本文介绍了在RK3568芯片上移植Mali-G52 GPU驱动的过程。主要包括内核dts文件修改和内核配置调整两部分。
·
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 0
84001 87000 1
87001 91000 2
91001 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型号是否支持。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)