Message ID | 20191028154928.4058-3-tzimmermann@suse.de (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | drm/ast: Convert to atomic modesetting | expand |
On Mon, Oct 28, 2019 at 04:49:21PM +0100, Thomas Zimmermann wrote: > Each video mode's primary plane requires a minimum amount of video > memory. For double buffering, this is at most half the available > VRAM. Check this constraint. Acked-by: Gerd Hoffmann <kraxel@redhat.com> > > Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> > --- > drivers/gpu/drm/ast/ast_main.c | 25 ++++++++++++++++++++++++- > 1 file changed, 24 insertions(+), 1 deletion(-) > > diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c > index 3a9b4cb73f2f..48d57ab42955 100644 > --- a/drivers/gpu/drm/ast/ast_main.c > +++ b/drivers/gpu/drm/ast/ast_main.c > @@ -387,8 +387,31 @@ static int ast_get_dram_info(struct drm_device *dev) > return 0; > } > > +enum drm_mode_status ast_mode_config_mode_valid(struct drm_device *dev, > + const struct drm_display_mode *mode) > +{ > + static const unsigned long max_bpp = 4; /* DRM_FORMAT_XRGBA8888 */ > + > + struct ast_private *ast = dev->dev_private; > + unsigned long fbsize, fbpages, max_fbpages; > + > + /* To support double buffering, a framebuffer may not > + * consume more than half of the available VRAM. > + */ > + max_fbpages = (ast->vram_size / 2) >> PAGE_SHIFT; > + > + fbsize = mode->hdisplay * mode->vdisplay * max_bpp; > + fbpages = DIV_ROUND_UP(fbsize, PAGE_SIZE); > + > + if (fbpages > max_fbpages) > + return MODE_MEM; > + > + return MODE_OK; > +} > + > static const struct drm_mode_config_funcs ast_mode_funcs = { > - .fb_create = drm_gem_fb_create > + .fb_create = drm_gem_fb_create, > + .mode_valid = ast_mode_config_mode_valid, > }; > > static u32 ast_get_vram_info(struct drm_device *dev) > -- > 2.23.0 >
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c index 3a9b4cb73f2f..48d57ab42955 100644 --- a/drivers/gpu/drm/ast/ast_main.c +++ b/drivers/gpu/drm/ast/ast_main.c @@ -387,8 +387,31 @@ static int ast_get_dram_info(struct drm_device *dev) return 0; } +enum drm_mode_status ast_mode_config_mode_valid(struct drm_device *dev, + const struct drm_display_mode *mode) +{ + static const unsigned long max_bpp = 4; /* DRM_FORMAT_XRGBA8888 */ + + struct ast_private *ast = dev->dev_private; + unsigned long fbsize, fbpages, max_fbpages; + + /* To support double buffering, a framebuffer may not + * consume more than half of the available VRAM. + */ + max_fbpages = (ast->vram_size / 2) >> PAGE_SHIFT; + + fbsize = mode->hdisplay * mode->vdisplay * max_bpp; + fbpages = DIV_ROUND_UP(fbsize, PAGE_SIZE); + + if (fbpages > max_fbpages) + return MODE_MEM; + + return MODE_OK; +} + static const struct drm_mode_config_funcs ast_mode_funcs = { - .fb_create = drm_gem_fb_create + .fb_create = drm_gem_fb_create, + .mode_valid = ast_mode_config_mode_valid, }; static u32 ast_get_vram_info(struct drm_device *dev)
Each video mode's primary plane requires a minimum amount of video memory. For double buffering, this is at most half the available VRAM. Check this constraint. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> --- drivers/gpu/drm/ast/ast_main.c | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-)