diff options
Diffstat (limited to 'drivers/gpu/drm/amd/amdgpu/amdgpu_display.c')
| -rw-r--r-- | drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | 40 | 
1 files changed, 9 insertions, 31 deletions
| diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c index 93f700ab1bfb..76ee8e04ff11 100644 --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c | |||
| @@ -35,6 +35,7 @@ | |||
| 35 | #include <linux/pm_runtime.h> | 35 | #include <linux/pm_runtime.h> | 
| 36 | #include <drm/drm_crtc_helper.h> | 36 | #include <drm/drm_crtc_helper.h> | 
| 37 | #include <drm/drm_edid.h> | 37 | #include <drm/drm_edid.h> | 
| 38 | #include <drm/drm_gem_framebuffer_helper.h> | ||
| 38 | #include <drm/drm_fb_helper.h> | 39 | #include <drm/drm_fb_helper.h> | 
| 39 | 40 | ||
| 40 | static void amdgpu_display_flip_callback(struct dma_fence *f, | 41 | static void amdgpu_display_flip_callback(struct dma_fence *f, | 
| @@ -151,8 +152,6 @@ int amdgpu_display_crtc_page_flip_target(struct drm_crtc *crtc, | |||
| 151 | struct drm_device *dev = crtc->dev; | 152 | struct drm_device *dev = crtc->dev; | 
| 152 | struct amdgpu_device *adev = dev->dev_private; | 153 | struct amdgpu_device *adev = dev->dev_private; | 
| 153 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | 154 | struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); | 
| 154 | struct amdgpu_framebuffer *old_amdgpu_fb; | ||
| 155 | struct amdgpu_framebuffer *new_amdgpu_fb; | ||
| 156 | struct drm_gem_object *obj; | 155 | struct drm_gem_object *obj; | 
| 157 | struct amdgpu_flip_work *work; | 156 | struct amdgpu_flip_work *work; | 
| 158 | struct amdgpu_bo *new_abo; | 157 | struct amdgpu_bo *new_abo; | 
| @@ -174,15 +173,13 @@ int amdgpu_display_crtc_page_flip_target(struct drm_crtc *crtc, | |||
| 174 | work->async = (page_flip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0; | 173 | work->async = (page_flip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0; | 
| 175 | 174 | ||
| 176 | /* schedule unpin of the old buffer */ | 175 | /* schedule unpin of the old buffer */ | 
| 177 | old_amdgpu_fb = to_amdgpu_framebuffer(crtc->primary->fb); | 176 | obj = crtc->primary->fb->obj[0]; | 
| 178 | obj = old_amdgpu_fb->obj; | ||
| 179 | 177 | ||
| 180 | /* take a reference to the old object */ | 178 | /* take a reference to the old object */ | 
| 181 | work->old_abo = gem_to_amdgpu_bo(obj); | 179 | work->old_abo = gem_to_amdgpu_bo(obj); | 
| 182 | amdgpu_bo_ref(work->old_abo); | 180 | amdgpu_bo_ref(work->old_abo); | 
| 183 | 181 | ||
| 184 | new_amdgpu_fb = to_amdgpu_framebuffer(fb); | 182 | obj = fb->obj[0]; | 
| 185 | obj = new_amdgpu_fb->obj; | ||
| 186 | new_abo = gem_to_amdgpu_bo(obj); | 183 | new_abo = gem_to_amdgpu_bo(obj); | 
| 187 | 184 | ||
| 188 | /* pin the new buffer */ | 185 | /* pin the new buffer */ | 
| @@ -192,7 +189,7 @@ int amdgpu_display_crtc_page_flip_target(struct drm_crtc *crtc, | |||
| 192 | goto cleanup; | 189 | goto cleanup; | 
| 193 | } | 190 | } | 
| 194 | 191 | ||
| 195 | r = amdgpu_bo_pin(new_abo, amdgpu_display_framebuffer_domains(adev), &base); | 192 | r = amdgpu_bo_pin(new_abo, amdgpu_display_supported_domains(adev), &base); | 
| 196 | if (unlikely(r != 0)) { | 193 | if (unlikely(r != 0)) { | 
| 197 | DRM_ERROR("failed to pin new abo buffer before flip\n"); | 194 | DRM_ERROR("failed to pin new abo buffer before flip\n"); | 
| 198 | goto unreserve; | 195 | goto unreserve; | 
| @@ -482,31 +479,12 @@ bool amdgpu_display_ddc_probe(struct amdgpu_connector *amdgpu_connector, | |||
| 482 | return true; | 479 | return true; | 
| 483 | } | 480 | } | 
| 484 | 481 | ||
| 485 | static void amdgpu_display_user_framebuffer_destroy(struct drm_framebuffer *fb) | ||
| 486 | { | ||
| 487 | struct amdgpu_framebuffer *amdgpu_fb = to_amdgpu_framebuffer(fb); | ||
| 488 | |||
| 489 | drm_gem_object_put_unlocked(amdgpu_fb->obj); | ||
| 490 | drm_framebuffer_cleanup(fb); | ||
| 491 | kfree(amdgpu_fb); | ||
| 492 | } | ||
| 493 | |||
| 494 | static int amdgpu_display_user_framebuffer_create_handle( | ||
| 495 | struct drm_framebuffer *fb, | ||
| 496 | struct drm_file *file_priv, | ||
| 497 | unsigned int *handle) | ||
| 498 | { | ||
| 499 | struct amdgpu_framebuffer *amdgpu_fb = to_amdgpu_framebuffer(fb); | ||
| 500 | |||
| 501 | return drm_gem_handle_create(file_priv, amdgpu_fb->obj, handle); | ||
| 502 | } | ||
| 503 | |||
| 504 | static const struct drm_framebuffer_funcs amdgpu_fb_funcs = { | 482 | static const struct drm_framebuffer_funcs amdgpu_fb_funcs = { | 
| 505 | .destroy = amdgpu_display_user_framebuffer_destroy, | 483 | .destroy = drm_gem_fb_destroy, | 
| 506 | .create_handle = amdgpu_display_user_framebuffer_create_handle, | 484 | .create_handle = drm_gem_fb_create_handle, | 
| 507 | }; | 485 | }; | 
| 508 | 486 | ||
| 509 | uint32_t amdgpu_display_framebuffer_domains(struct amdgpu_device *adev) | 487 | uint32_t amdgpu_display_supported_domains(struct amdgpu_device *adev) | 
| 510 | { | 488 | { | 
| 511 | uint32_t domain = AMDGPU_GEM_DOMAIN_VRAM; | 489 | uint32_t domain = AMDGPU_GEM_DOMAIN_VRAM; | 
| 512 | 490 | ||
| @@ -526,11 +504,11 @@ int amdgpu_display_framebuffer_init(struct drm_device *dev, | |||
| 526 | struct drm_gem_object *obj) | 504 | struct drm_gem_object *obj) | 
| 527 | { | 505 | { | 
| 528 | int ret; | 506 | int ret; | 
| 529 | rfb->obj = obj; | 507 | rfb->base.obj[0] = obj; | 
| 530 | drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd); | 508 | drm_helper_mode_fill_fb_struct(dev, &rfb->base, mode_cmd); | 
| 531 | ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs); | 509 | ret = drm_framebuffer_init(dev, &rfb->base, &amdgpu_fb_funcs); | 
| 532 | if (ret) { | 510 | if (ret) { | 
| 533 | rfb->obj = NULL; | 511 | rfb->base.obj[0] = NULL; | 
| 534 | return ret; | 512 | return ret; | 
| 535 | } | 513 | } | 
| 536 | return 0; | 514 | return 0; | 
