]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
firmware/sysfb: Disable sysfb for firmware buffers with unknown parent
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 24 Sep 2024 08:41:03 +0000 (10:41 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Thu, 26 Sep 2024 06:22:20 +0000 (08:22 +0200)
The sysfb framebuffer handling only operates on graphics devices
that provide the system's firmware framebuffer. If that device is
not known, assume that any graphics device has been initialized by
firmware.

Fixes a problem on i915 where sysfb does not release the firmware
framebuffer after the native graphics driver loaded.

Reported-by: Borah, Chaitanya Kumar <chaitanya.kumar.borah@intel.com>
Closes: https://lore.kernel.org/dri-devel/SJ1PR11MB6129EFB8CE63D1EF6D932F94B96F2@SJ1PR11MB6129.namprd11.prod.outlook.com/
Closes: https://gitlab.freedesktop.org/drm/i915/kernel/-/issues/12160
Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: b49420d6a1ae ("video/aperture: optionally match the device in sysfb_disable()")
Cc: Javier Martinez Canillas <javierm@redhat.com>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Helge Deller <deller@gmx.de>
Cc: Sam Ravnborg <sam@ravnborg.org>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Alex Deucher <alexander.deucher@amd.com>
Cc: dri-devel@lists.freedesktop.org
Cc: Linux regression tracking (Thorsten Leemhuis) <regressions@leemhuis.info>
Cc: <stable@vger.kernel.org> # v6.11+
Acked-by: Alex Deucher <alexander.deucher@amd.com>
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240924084227.262271-1-tzimmermann@suse.de
drivers/firmware/sysfb.c

index 02a07d3d0d40a91770b5039d818bf944813800f5..a3df782fa687b0f14a2646eccaf635c3bb247b2b 100644 (file)
@@ -67,9 +67,11 @@ static bool sysfb_unregister(void)
 void sysfb_disable(struct device *dev)
 {
        struct screen_info *si = &screen_info;
+       struct device *parent;
 
        mutex_lock(&disable_lock);
-       if (!dev || dev == sysfb_parent_dev(si)) {
+       parent = sysfb_parent_dev(si);
+       if (!dev || !parent || dev == parent) {
                sysfb_unregister();
                disabled = true;
        }