drm/i915/display: fbdev: Move custom restore code to new callback
authorThomas Zimmermann <tzimmermann@suse.de>
Thu, 12 Dec 2024 17:08:46 +0000 (18:08 +0100)
committerMaarten Lankhorst <dev@lankhorst.se>
Wed, 5 Mar 2025 20:48:49 +0000 (21:48 +0100)
i915's fbdev contains code for restoring the client's framebuffer. It
is specific to i195 and cannot be ported to the common fbdev client.

Introduce the callback struct drm_fb_helper.fb_restore and implement
it for i915. The fbdev helpers invoke the callback after restoring the
fbdev client.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Reviewed-by: Maarten Lankhorst <maarten.lankhorst@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20241212170913.185939-6-tzimmermann@suse.de
Signed-off-by: Maarten Lankhorst <dev@lankhorst.se>
drivers/gpu/drm/drm_fb_helper.c
drivers/gpu/drm/i915/display/intel_fbdev.c
include/drm/drm_fb_helper.h

index fb3614a7ba44bbd5e21d8c4547325a880506aa05..87bb25648d929daf030cdd5c4338268addc533cc 100644 (file)
@@ -245,6 +245,9 @@ __drm_fb_helper_restore_fbdev_mode_unlocked(struct drm_fb_helper *fb_helper,
        if (do_delayed)
                drm_fb_helper_hotplug_event(fb_helper);
 
+       if (fb_helper->funcs->fb_restore)
+               fb_helper->funcs->fb_restore(fb_helper);
+
        return ret;
 }
 
index 024dde94b1d75915dbc2e37af2737e6c896aacf5..408e44251c479c8a885ee4d5f4734e4358f9a582 100644 (file)
@@ -278,9 +278,17 @@ static int intelfb_dirty(struct drm_fb_helper *helper, struct drm_clip_rect *cli
        return 0;
 }
 
+static void intelfb_restore(struct drm_fb_helper *fb_helper)
+{
+       struct intel_fbdev *ifbdev = to_intel_fbdev(fb_helper);
+
+       intel_fbdev_invalidate(ifbdev);
+}
+
 static const struct drm_fb_helper_funcs intel_fb_helper_funcs = {
        .fb_probe = intelfb_create,
        .fb_dirty = intelfb_dirty,
+       .fb_restore = intelfb_restore,
 };
 
 /*
@@ -518,8 +526,6 @@ static int intel_fbdev_restore_mode(struct drm_i915_private *dev_priv)
        if (ret)
                return ret;
 
-       intel_fbdev_invalidate(ifbdev);
-
        return 0;
 }
 
index 8426b9921a03b996198b556176a560f326bf35f6..a7d7a3b945ea3d6194516886c063e9ef44ef9143 100644 (file)
@@ -99,6 +99,19 @@ struct drm_fb_helper_funcs {
         * 0 on success, or an error code otherwise.
         */
        int (*fb_dirty)(struct drm_fb_helper *helper, struct drm_clip_rect *clip);
+
+       /**
+        * @fb_restore:
+        *
+        * Driver callback to restore internal fbdev state. If set, fbdev
+        * emulation will invoke this callback after restoring the display
+        * mode.
+        *
+        * Only for i915. Do not use in new code.
+        *
+        * TODO: Fix i915 to not require this callback.
+        */
+       void (*fb_restore)(struct drm_fb_helper *helper);
 };
 
 /**