drm/bochs: Validate display modes against available video memory

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
This commit is contained in:
Thomas Zimmermann
2024-09-02 12:53:47 +02:00
parent c3ac343c14
commit 4dc9bb66eb

View 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;