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型号是否支持。

Logo

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

更多推荐