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 <tzimmerm...@suse.de>
Acked-by: Gerd Hoffmann <kra...@redhat.com>
---
 drivers/gpu/drm/tiny/bochs.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/drivers/gpu/drm/tiny/bochs.c b/drivers/gpu/drm/tiny/bochs.c
index bde70a6075ec..69c5f65e9853 100644
--- a/drivers/gpu/drm/tiny/bochs.c
+++ b/drivers/gpu/drm/tiny/bochs.c
@@ -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;
-- 
2.46.0


Reply via email to