]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
drm/sysfb: Return errno code from drm_sysfb_get_visible_size()
authorThomas Zimmermann <tzimmermann@suse.de>
Thu, 18 Jun 2026 08:41:59 +0000 (10:41 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Mon, 22 Jun 2026 09:03:22 +0000 (11:03 +0200)
Change the return type of drm_sysfb_get_visible_size() to s64 so
that it returns a possible errno code from _get_validated_size0().
Fix callers to handle the errno code.

The currently returned unsigned type converts an errno code to a
very large size value, which drivers interpret as visible size of
the system framebuffer. Later efforts to reserve the framebuffer
resource fail.

The bug has been present since efidrm and vesadrm got merged. It
was then part of each driver.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Fixes: 32ae90c66fb6 ("drm/sysfb: Add efidrm for EFI displays")
Fixes: a84eb6abe2b6 ("drm/sysfb: Add vesadrm for VESA displays")
Reviewed-by: Javier Martinez Canillas <javierm@redhat.com>
Cc: Thomas Zimmermann <tzimmermann@suse.de>
Cc: Javier Martinez Canillas <javierm@redhat.com>
Cc: dri-devel@lists.freedesktop.org
Cc: <stable@vger.kernel.org> # v6.16+
Link: https://patch.msgid.link/20260618084327.46567-4-tzimmermann@suse.de
drivers/gpu/drm/sysfb/drm_sysfb_helper.h
drivers/gpu/drm/sysfb/drm_sysfb_screen_info.c
drivers/gpu/drm/sysfb/efidrm.c
drivers/gpu/drm/sysfb/vesadrm.c

index b14df5b54bc9a8dc30b813abcfe0ff1026315903..d48b92a903f75f564c81f48dfbfd1bf23a2901f5 100644 (file)
@@ -50,7 +50,7 @@ struct resource *drm_sysfb_get_memory_si(struct drm_device *dev,
 int drm_sysfb_get_stride_si(struct drm_device *dev, const struct screen_info *si,
                            const struct drm_format_info *format,
                            unsigned int width, unsigned int height, u64 size);
-u64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
+s64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
                                  unsigned int height, unsigned int stride, u64 size);
 #endif
 
index 8b14eaa304c0294baec9925d854275526fd3e1c7..042d1b79669640c226b2ed8ead94b5722e674491 100644 (file)
@@ -65,7 +65,7 @@ int drm_sysfb_get_stride_si(struct drm_device *dev, const struct screen_info *si
 }
 EXPORT_SYMBOL(drm_sysfb_get_stride_si);
 
-u64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
+s64 drm_sysfb_get_visible_size_si(struct drm_device *dev, const struct screen_info *si,
                                  unsigned int height, unsigned int stride, u64 size)
 {
        u64 vsize = mul_u32_u32(height, stride);
index a335c94a7bd7505ff32928d331e315618d011af9..d5adef5deb638bdf2f37e5990415963f8e47a52b 100644 (file)
@@ -150,7 +150,8 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
        const struct screen_info *si;
        const struct drm_format_info *format;
        int width, height, stride;
-       u64 vsize, mem_flags;
+       s64 vsize;
+       u64 mem_flags;
        struct resource resbuf;
        struct resource *res;
        struct efidrm_device *efi;
@@ -204,8 +205,8 @@ static struct efidrm_device *efidrm_device_create(struct drm_driver *drv,
        if (stride < 0)
                return ERR_PTR(stride);
        vsize = drm_sysfb_get_visible_size_si(dev, si, height, stride, resource_size(res));
-       if (!vsize)
-               return ERR_PTR(-EINVAL);
+       if (vsize < 0)
+               return ERR_PTR(vsize);
 
        drm_dbg(dev, "framebuffer format=%p4cc, size=%dx%d, stride=%d bytes\n",
                &format->format, width, height, stride);
index 4e00113e5c770043377ce243709371022d9a837b..d60a67fc1d5b45fdbf724d5036a00b736e1a13e7 100644 (file)
@@ -400,7 +400,7 @@ static struct vesadrm_device *vesadrm_device_create(struct drm_driver *drv,
        const struct screen_info *si;
        const struct drm_format_info *format;
        int width, height, stride;
-       u64 vsize;
+       s64 vsize;
        struct resource resbuf;
        struct resource *res;
        struct vesadrm_device *vesa;
@@ -455,8 +455,8 @@ static struct vesadrm_device *vesadrm_device_create(struct drm_driver *drv,
        if (stride < 0)
                return ERR_PTR(stride);
        vsize = drm_sysfb_get_visible_size_si(dev, si, height, stride, resource_size(res));
-       if (!vsize)
-               return ERR_PTR(-EINVAL);
+       if (vsize < 0)
+               return ERR_PTR(vsize);
 
        drm_dbg(dev, "framebuffer format=%p4cc, size=%dx%d, stride=%d bytes\n",
                &format->format, width, height, stride);