]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/amdgpu: Move test for fbdev GEM object into generic helper
authorThomas Zimmermann <tzimmermann@suse.de>
Wed, 4 Mar 2026 12:58:38 +0000 (13:58 +0100)
committerAlex Deucher <alexander.deucher@amd.com>
Fri, 6 Mar 2026 21:31:35 +0000 (16:31 -0500)
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>
drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
drivers/gpu/drm/drm_fb_helper.c
include/drm/drm_fb_helper.h

index bef9dce2e7eacc09b7cdbea1a7ed555fedb23236..f5cd6854244273716350b73b57520aa93541f99a 100644 (file)
@@ -1738,21 +1738,6 @@ bool amdgpu_crtc_get_scanout_position(struct drm_crtc *crtc,
                                                  stime, etime, mode);
 }
 
-static bool
-amdgpu_display_robj_is_fb(struct amdgpu_device *adev, struct amdgpu_bo *robj)
-{
-       struct drm_device *dev = adev_to_drm(adev);
-       struct drm_fb_helper *fb_helper = dev->fb_helper;
-
-       if (!fb_helper || !fb_helper->buffer)
-               return false;
-
-       if (gem_to_amdgpu_bo(fb_helper->buffer->gem) != robj)
-               return false;
-
-       return true;
-}
-
 int amdgpu_display_suspend_helper(struct amdgpu_device *adev)
 {
        struct drm_device *dev = adev_to_drm(adev);
@@ -1775,7 +1760,6 @@ int amdgpu_display_suspend_helper(struct amdgpu_device *adev)
        list_for_each_entry(crtc, &dev->mode_config.crtc_list, head) {
                struct amdgpu_crtc *amdgpu_crtc = to_amdgpu_crtc(crtc);
                struct drm_framebuffer *fb = crtc->primary->fb;
-               struct amdgpu_bo *robj;
 
                if (amdgpu_crtc->cursor_bo && !adev->enable_virtual_display) {
                        struct amdgpu_bo *aobj = gem_to_amdgpu_bo(amdgpu_crtc->cursor_bo);
@@ -1790,8 +1774,9 @@ int amdgpu_display_suspend_helper(struct amdgpu_device *adev)
                if (!fb || !fb->obj[0])
                        continue;
 
-               robj = gem_to_amdgpu_bo(fb->obj[0]);
-               if (!amdgpu_display_robj_is_fb(adev, robj)) {
+               if (!drm_fb_helper_gem_is_fb(dev->fb_helper, fb->obj[0])) {
+                       struct amdgpu_bo *robj = gem_to_amdgpu_bo(fb->obj[0]);
+
                        r = amdgpu_bo_reserve(robj, true);
                        if (r == 0) {
                                amdgpu_bo_unpin(robj);
index 05803169bed5715756fe715e3b47b1c30bcfae15..a883534e19e456b01797a79b425ccd412b517907 100644 (file)
@@ -37,6 +37,7 @@
 #include <drm/drm_fb_helper.h>
 #include <drm/drm_fourcc.h>
 #include <drm/drm_framebuffer.h>
+#include <drm/drm_gem_framebuffer_helper.h>
 #include <drm/drm_modeset_helper_vtables.h>
 #include <drm/drm_print.h>
 #include <drm/drm_vblank.h>
@@ -1786,3 +1787,32 @@ int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper)
        return 0;
 }
 EXPORT_SYMBOL(drm_fb_helper_hotplug_event);
+
+/**
+ * drm_fb_helper_gem_is_fb - Tests if GEM object is framebuffer
+ * @fb_helper: fb_helper instance, can be NULL
+ * @obj: The GEM object to test, can be NULL
+ *
+ * Call drm_fb_helper_gem_is_fb to test is a DRM device's fbdev emulation
+ * uses the specified GEM object for its framebuffer. The result is always
+ * false if either poiner is NULL.
+ *
+ * Returns:
+ * True if fbdev emulation uses the provided GEM object, or false otherwise.
+ */
+bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper,
+                            const struct drm_gem_object *obj)
+{
+       const struct drm_gem_object *gem = NULL;
+
+       if (!fb_helper || !obj)
+               return false;
+       if (fb_helper->buffer && fb_helper->buffer->gem)
+               gem = fb_helper->buffer->gem;
+       else if (fb_helper->fb)
+               gem = drm_gem_fb_get_obj(fb_helper->fb, 0);
+
+       return gem == obj;
+}
+EXPORT_SYMBOL_GPL(drm_fb_helper_gem_is_fb);
+
index 05cca77b7249c3d39bd01418f333d6a663897716..ca214b5c028332290f6a5bf1393bd0fe9dbba4cc 100644 (file)
@@ -271,7 +271,15 @@ int drm_fb_helper_ioctl(struct fb_info *info, unsigned int cmd,
 
 int drm_fb_helper_hotplug_event(struct drm_fb_helper *fb_helper);
 int drm_fb_helper_initial_config(struct drm_fb_helper *fb_helper);
+bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper,
+                            const struct drm_gem_object *obj);
 #else
+static inline bool drm_fb_helper_gem_is_fb(const struct drm_fb_helper *fb_helper,
+                                          const struct drm_gem_object *obj)
+{
+       return false;
+}
+
 static inline void drm_fb_helper_prepare(struct drm_device *dev,
                                         struct drm_fb_helper *helper,
                                         unsigned int preferred_bpp,