]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
drm/bochs: Validate display modes against available video memory
authorThomas Zimmermann <tzimmermann@suse.de>
Mon, 2 Sep 2024 10:53:47 +0000 (12:53 +0200)
committerThomas Zimmermann <tzimmermann@suse.de>
Fri, 6 Sep 2024 12:41:37 +0000 (14:41 +0200)
For each mode, test the required memory against the available video
memory. Filters out modes that do not fit into display memory.

Also remove the old test against the 4 MiB limit. It is now obsolete
and did not necessarily produce correct results.

v2:
- fix __udivdi3 linker error (kernel test robot)
- fix vdisplay and hdisplay usage

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Gerd Hoffmann <kraxel@redhat.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240902105546.792625-10-tzimmermann@suse.de
drivers/gpu/drm/tiny/bochs.c

index bde70a6075ec94bc6defd5058bfdf46935fe7bf3..69c5f65e98535294cf5dde80d449e9d056eebef9 100644 (file)
@@ -558,8 +558,28 @@ static const struct drm_connector_funcs bochs_connector_funcs = {
        .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
 };
 
+static enum drm_mode_status bochs_mode_config_mode_valid(struct drm_device *dev,
+                                                        const struct drm_display_mode *mode)
+{
+       struct bochs_device *bochs = to_bochs_device(dev);
+       const struct drm_format_info *format = drm_format_info(DRM_FORMAT_XRGB8888);
+       u64 pitch;
+
+       if (drm_WARN_ON(dev, !format))
+               return MODE_ERROR;
+
+       pitch = drm_format_info_min_pitch(format, 0, mode->hdisplay);
+       if (!pitch)
+               return MODE_BAD_WIDTH;
+       if (mode->vdisplay > DIV_ROUND_DOWN_ULL(bochs->fb_size, pitch))
+               return MODE_MEM;
+
+       return MODE_OK;
+}
+
 static const struct drm_mode_config_funcs bochs_mode_config_funcs = {
        .fb_create = drm_gem_fb_create_with_dirty,
+       .mode_valid = bochs_mode_config_mode_valid,
        .atomic_check = drm_atomic_helper_check,
        .atomic_commit = drm_atomic_helper_commit,
 };
@@ -687,15 +707,8 @@ static int bochs_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent
 {
        struct bochs_device *bochs;
        struct drm_device *dev;
-       unsigned long fbsize;
        int ret;
 
-       fbsize = pci_resource_len(pdev, 0);
-       if (fbsize < 4 * 1024 * 1024) {
-               DRM_ERROR("less than 4 MB video memory, ignoring device\n");
-               return -ENOMEM;
-       }
-
        ret = drm_aperture_remove_conflicting_pci_framebuffers(pdev, &bochs_driver);
        if (ret)
                return ret;