From 85087083de0f0406db97c8d9c29eba9db7153cb1 Mon Sep 17 00:00:00 2001 From: Sandy Huang Date: Wed, 3 Apr 2024 10:42:45 +0800 Subject: [PATCH] drm/rockchip: fb: Fix kenrel panic when cat /d/dri/0/state at kernel logo stage when userspace cat /d/dri/0/state, the driver will try to dump gem info throught obj->funcs->print_info(p, indent, obj), if logo gem object less funcs init, it will appears the following error: [ 52.587405][ T2156] pc : drm_gem_print_info+0xcc/0xf8 [ 52.587862][ T2156] lr : drm_gem_print_info+0xc8/0xf8 [ 52.588313][ T2156] sp : ffffffc00e35ba30 [ 52.588664][ T2156] x29: ffffffc00e35ba30 x28: 00000000010e0000 x27: 0000000000000000 [ 52.589358][ T2156] x26: 0000000000000004 x25: ffffff80c0c57150 x24: 000000000000010e [ 52.590051][ T2156] x23: ffffffc009bcdd48 x22: ffffffc009bcdd48 x21: ffffffc00e35bba8 [ 52.590744][ T2156] x20: 0000000000000004 x19: ffffff80c5cae0d0 x18: ffffffc00d92d080 [ 52.591437][ T2156] x17: 0000000000000000 x16: 00000000000000a4 x15: ffffffc0094a4174 [ 52.592130][ T2156] x14: 0000000000000000 x13: 000000000000004e x12: ffff0000ffffff00 [ 52.592824][ T2156] x11: 0000000000000000 x10: 0000000000001000 x9 : 4f57b917247aff00 [ 52.593516][ T2156] x8 : 0000000000000000 x7 : 3d646574726f706d x6 : 000000000000000a [ 52.594209][ T2156] x5 : ffffff80c5f08216 x4 : ffffffc009bbfcb5 x3 : ffff0a00ffffff04 [ 52.594902][ T2156] x2 : 0000000000000001 x1 : ffffffc009bbfcb4 x0 : 0000000000000010 [ 52.595595][ T2156] Call trace: [ 52.595882][ T2156] drm_gem_print_info+0xcc/0xf8 [ 52.596301][ T2156] drm_framebuffer_print_info+0x19c/0x2f4 [ 52.596799][ T2156] drm_atomic_plane_print_state+0xb8/0x1d0 [ 52.597305][ T2156] __drm_state_dump+0x7c/0x1a0 [ 52.597714][ T2156] drm_state_info+0x50/0x7c [ 52.598101][ T2156] seq_read_iter+0x128/0x414 [ 52.598499][ T2156] seq_read+0x90/0xc8 [ 52.598841][ T2156] full_proxy_read+0x6c/0xf4 [ 52.599240][ T2156] vfs_read+0xe8/0x27c [ 52.599594][ T2156] ksys_read+0x78/0xe4 before the following commit, drm_gem_print_info() function will check obj->funcs confirm is !NULL, and then call obj->funcs->print_info, this can avoid kernel panic. commit d693def4fd1c ("drm: Remove obsolete GEM and PRIME callbacks from struct drm_driver") https://patchwork.freedesktop.org/patch/391822/ Signed-off-by: Sandy Huang Change-Id: I7236ac7f3f5475e6446546f069146a3fa0d7f2fe --- drivers/gpu/drm/rockchip/rockchip_drm_fb.c | 1 + drivers/gpu/drm/rockchip/rockchip_drm_gem.c | 2 +- drivers/gpu/drm/rockchip/rockchip_drm_gem.h | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c index b5dac5749106..4cb6fc93baea 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c @@ -144,6 +144,7 @@ rockchip_drm_logo_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 fb->flags |= ROCKCHIP_DRM_MODE_LOGO_FB; rockchip_logo_fb->logo = logo; rockchip_logo_fb->fb.obj[0] = &rockchip_logo_fb->rk_obj.base; + rockchip_logo_fb->fb.obj[0]->funcs = &rockchip_gem_object_funcs; drm_gem_object_init(dev, rockchip_logo_fb->fb.obj[0], PAGE_ALIGN(logo->size)); rockchip_logo_fb->rk_obj.dma_addr = logo->dma_addr; rockchip_logo_fb->rk_obj.kvaddr = logo->kvaddr; diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c index d62534849a6f..ed208bf979b4 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.c +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.c @@ -584,7 +584,7 @@ static void rockchip_gem_release_object(struct rockchip_gem_object *rk_obj) kfree(rk_obj); } -static const struct drm_gem_object_funcs rockchip_gem_object_funcs = { +const struct drm_gem_object_funcs rockchip_gem_object_funcs = { .free = rockchip_gem_free_object, .export = rockchip_drm_gem_prime_export, .get_sg_table = rockchip_gem_prime_get_sg_table, diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h index 7b13590ffb43..5b434cb1e494 100644 --- a/drivers/gpu/drm/rockchip/rockchip_drm_gem.h +++ b/drivers/gpu/drm/rockchip/rockchip_drm_gem.h @@ -76,4 +76,7 @@ int rockchip_gem_prime_end_cpu_access(struct drm_gem_object *obj, enum dma_data_direction dir); void rockchip_gem_get_ddr_info(void); + +extern const struct drm_gem_object_funcs rockchip_gem_object_funcs; + #endif /* _ROCKCHIP_DRM_GEM_H */