Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

drm/amdgpu: Move test for fbdev GEM object into generic helper

Provide a generic helper that tests if fbdev emulation is backed by
a specific GEM object. Not all drivers use client buffers (yet), hence
also test against the first GEM object in the fbdev framebuffer.

Convert amdgpu. The helper will also be useful for radeon.

Reviewed-by: Alex Deucher <alexander.deucher@amd.com>
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Signed-off-by: Alex Deucher <alexander.deucher@amd.com>

authored by

Thomas Zimmermann and committed by
Alex Deucher
1837c76b 1b5cf07d

+41 -18
+3 -18
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
··· 1738 1738 stime, etime, mode); 1739 1739 } 1740 1740 1741 - static bool 1742 - amdgpu_display_robj_is_fb(struct amdgpu_device *adev, struct amdgpu_bo *robj) 1743 - { 1744 - struct drm_device *dev = adev_to_drm(adev); 1745 - struct drm_fb_helper *fb_helper = dev->fb_helper; 1746 - 1747 - if (!fb_helper || !fb_helper->buffer) 1748 - return false; 1749 - 1750 - if (gem_to_amdgpu_bo(fb_helper->buffer->gem) != robj) 1751 - return false; 1752 - 1753 - return true; 1754 - } 1755 - 1756 1741 int amdgpu_display_suspend_helper(struct amdgpu_device *adev) 1757 1742 { 1758 1743 struct drm_device *dev = adev_to_drm(adev); ··· 1760 1775 list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) { 1761 1776 struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc); 1762 1777 struct drm_framebuffer *fb = crtc->primary->fb; 1763 - struct amdgpu_bo *robj; 1764 1778 1765 1779 if (amdgpu_crtc->cursor_bo && !adev->enable_virtual_display) { 1766 1780 struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo); ··· 1774 1790 if (!fb || !fb->obj[0]) 1775 1791 continue; 1776 1792 1777 - robj = gem_to_amdgpu_bo(fb->obj[0]); 1778 - if (!amdgpu_display_robj_is_fb(adev, robj)) { 1793 + if (!drm_fb_helper_gem_is_fb(dev->fb_helper, fb->obj[0])) { 1794 + struct amdgpu_bo *robj = gem_to_amdgpu_bo(fb->obj[0]); 1795 + 1779 1796 r = amdgpu_bo_reserve(robj, true); 1780 1797 if (r == 0) { 1781 1798 amdgpu_bo_unpin(robj);
+30
drivers/gpu/drm/drm_fb_helper.c
··· 37 37 #include <drm/drm_fb_helper.h> 38 38 #include <drm/drm_fourcc.h> 39 39 #include <drm/drm_framebuffer.h> 40 + #include <drm/drm_gem_framebuffer_helper.h> 40 41 #include <drm/drm_modeset_helper_vtables.h> 41 42 #include <drm/drm_print.h> 42 43 #include <drm/drm_vblank.h> ··· 1787 1786 return 0; 1788 1787 } 1789 1788 EXPORT_SYMBOL(drm_fb_helper_hotplug_event); 1789 + 1790 + /** 1791 + * drm_fb_helper_gem_is_fb - Tests if GEM object is framebuffer 1792 + * @fb_helper: fb_helper instance, can be NULL 1793 + * @obj: The GEM object to test, can be NULL 1794 + * 1795 + * Call drm_fb_helper_gem_is_fb to test is a DRM device's fbdev emulation 1796 + * uses the specified GEM object for its framebuffer. The result is always 1797 + * false if either poiner is NULL. 1798 + * 1799 + * Returns: 1800 + * True if fbdev emulation uses the provided GEM object, or false otherwise. 1801 + */ 1802 + bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper, 1803 + const struct drm_gem_object *obj) 1804 + { 1805 + const struct drm_gem_object *gem = NULL; 1806 + 1807 + if (!fb_helper || !obj) 1808 + return false; 1809 + if (fb_helper->buffer && fb_helper->buffer->gem) 1810 + gem = fb_helper->buffer->gem; 1811 + else if (fb_helper->fb) 1812 + gem = drm_gem_fb_get_obj(fb_helper->fb, 0); 1813 + 1814 + return gem == obj; 1815 + } 1816 + EXPORT_SYMBOL_GPL(drm_fb_helper_gem_is_fb); 1817 +
+8
include/drm/drm_fb_helper.h
··· 271 271 272 272 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper); 273 273 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper); 274 + bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper, 275 + const struct drm_gem_object *obj); 274 276 #else 277 + static inline bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper, 278 + const struct drm_gem_object *obj) 279 + { 280 + return false; 281 + } 282 + 275 283 static inline void drm_fb_helper_prepare(struct drm_device *dev, 276 284 struct drm_fb_helper *helper, 277 285 unsigned int preferred_bpp,