| From bcfa48ff785bd121316592b131ff6531e3e696bb Mon Sep 17 00:00:00 2001 |
| From: Julia Zhang <julia.zhang@amd.com> |
| Date: Mon, 3 Jun 2024 19:31:09 +0800 |
| Subject: drm/amdgpu: avoid using null object of framebuffer |
| |
| From: Julia Zhang <julia.zhang@amd.com> |
| |
| commit bcfa48ff785bd121316592b131ff6531e3e696bb upstream. |
| |
| Instead of using state->fb->obj[0] directly, get object from framebuffer |
| by calling drm_gem_fb_get_obj() and return error code when object is |
| null to avoid using null object of framebuffer. |
| |
| Reported-by: Fusheng Huang <fusheng.huang@ecarxgroup.com> |
| Signed-off-by: Julia Zhang <Julia.Zhang@amd.com> |
| Reviewed-by: Huang Rui <ray.huang@amd.com> |
| Signed-off-by: Alex Deucher <alexander.deucher@amd.com> |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| --- |
| drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c | 18 ++++++++++++++++-- |
| 1 file changed, 16 insertions(+), 2 deletions(-) |
| |
| --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c |
| +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_vkms.c |
| @@ -3,6 +3,7 @@ |
| #include <drm/drm_atomic_helper.h> |
| #include <drm/drm_edid.h> |
| #include <drm/drm_simple_kms_helper.h> |
| +#include <drm/drm_gem_framebuffer_helper.h> |
| #include <drm/drm_vblank.h> |
| |
| #include "amdgpu.h" |
| @@ -314,7 +315,13 @@ static int amdgpu_vkms_prepare_fb(struct |
| return 0; |
| } |
| afb = to_amdgpu_framebuffer(new_state->fb); |
| - obj = new_state->fb->obj[0]; |
| + |
| + obj = drm_gem_fb_get_obj(new_state->fb, 0); |
| + if (!obj) { |
| + DRM_ERROR("Failed to get obj from framebuffer\n"); |
| + return -EINVAL; |
| + } |
| + |
| rbo = gem_to_amdgpu_bo(obj); |
| adev = amdgpu_ttm_adev(rbo->tbo.bdev); |
| |
| @@ -368,12 +375,19 @@ static void amdgpu_vkms_cleanup_fb(struc |
| struct drm_plane_state *old_state) |
| { |
| struct amdgpu_bo *rbo; |
| + struct drm_gem_object *obj; |
| int r; |
| |
| if (!old_state->fb) |
| return; |
| |
| - rbo = gem_to_amdgpu_bo(old_state->fb->obj[0]); |
| + obj = drm_gem_fb_get_obj(old_state->fb, 0); |
| + if (!obj) { |
| + DRM_ERROR("Failed to get obj from framebuffer\n"); |
| + return; |
| + } |
| + |
| + rbo = gem_to_amdgpu_bo(obj); |
| r = amdgpu_bo_reserve(rbo, false); |
| if (unlikely(r)) { |
| DRM_ERROR("failed to reserve rbo before unpin\n"); |