summaryrefslogtreecommitdiff
path: root/drivers/gpu/drm/sysfb/efidrm.c
diff options
context:
space:
mode:
authorThomas Zimmermann <tzimmermann@suse.de>2026-06-18 10:41:59 +0200
committerThomas Zimmermann <tzimmermann@suse.de>2026-06-22 11:03:22 +0200
commit7bab0f09d753f098977bbba3955d694c2e2c25da (patch)
treeaa820d611e94493eb22828e16ff2502bb3c370fa /drivers/gpu/drm/sysfb/efidrm.c
parentb771974988ec7ce077a7246fa0fa588c246fe581 (diff)
downloadlinux-next-7bab0f09d753f098977bbba3955d694c2e2c25da.tar.gz
linux-next-7bab0f09d753f098977bbba3955d694c2e2c25da.zip
drm/sysfb: Return errno code from drm_sysfb_get_visible_size()
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
Diffstat (limited to 'drivers/gpu/drm/sysfb/efidrm.c')
-rw-r--r--drivers/gpu/drm/sysfb/efidrm.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/drivers/gpu/drm/sysfb/efidrm.c b/drivers/gpu/drm/sysfb/efidrm.c
index a335c94a7bd7..d5adef5deb63 100644
--- a/drivers/gpu/drm/sysfb/efidrm.c
+++ b/drivers/gpu/drm/sysfb/efidrm.c
@@ -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);