On 05/10/2018 09:58, Daniel Vetter wrote:
On Fri, Oct 5, 2018 at 9:39 AM Neil Armstrong narmstrong@baylibre.com wrote:
[...]
OK, won't this be enough ? --- a/include/drm/drm_mode_config.h +++ b/include/drm/drm_mode_config.h @@ -333,6 +333,8 @@ struct drm_mode_config_funcs {
- @min_height: minimum fb pixel height on this device
- @max_width: maximum fb pixel width on this device
- @max_height: maximum fb pixel height on this device
- @max_fb_width: maximum fb buffer width if differs from max_width
- @max_fb_height: maximum fb buffer height if differs from max_height
- @funcs: core driver provided mode setting functions
- @fb_base: base address of the framebuffer
- @poll_enabled: track polling support for this device
@@ -508,6 +510,7 @@ struct drm_mode_config {
int min_width, min_height; int max_width, max_height;
int max_fb_width, max_fb_height; const struct drm_mode_config_funcs *funcs; resource_size_t fb_base;
--- a/drivers/gpu/drm/drm_framebuffer.c +++ b/drivers/gpu/drm/drm_framebuffer.c @@ -283,14 +283,20 @@ drm_internal_framebuffer_create(struct drm_device *dev, return ERR_PTR(-EINVAL); }
if ((config->min_width > r->width) || (r->width > config->max_width)) {
if ((config->min_width > r->width) ||
(!config->max_fb_width && r->width > config->max_width) ||
(config->max_fb_width && r->width > config->max_fb_width)) { DRM_DEBUG_KMS("bad framebuffer width %d, should be >= %d && <= %d\n",
r->width, config->min_width, config->max_width);
r->width, config->min_width, config->max_fb_width ?
config->max_fb_width : config->max_width); return ERR_PTR(-EINVAL); }
if ((config->min_height > r->height) || (r->height > config->max_height)) {
if ((config->min_height > r->height) ||
(!config->max_fb_height && r->height > config->max_height) ||
(config->max_fb_height && r->height > config->max_fb_height)) { DRM_DEBUG_KMS("bad framebuffer height %d, should be >= %d && <= %d\n",
r->height, config->min_height, config->max_height);
r->height, config->min_height, config->max_fb_height ?
config->max_fb_height : config->max_height); return ERR_PTR(-EINVAL); }
and in the driver :
drm->mode_config.max_width = 4096;
drm->mode_config.max_height = 3840;
drm->mode_config.max_fb_width = 16384;
drm->mode_config.max_fb_height = 8192;
With this I leave the mode filtering intact.
Not enough. See https://dri.freedesktop.org/docs/drm/gpu/drm-kms-helpers.html#c.drm_connecto... and scroll down to mode_valid. You need to filter modes both in the detect paths, and the atomic_check paths.
Detect is explicitly filtered out, but atomic_check was only implicitly filtered, through the max fb size checks. Ok, you could light up a mode that's bigger than max fb, but in practice, no userspace ever did that. But with your code we're missing crucial validation now, and userspace could fall over that. What I think we need is to add mode filter against mode_config.max_width/height in drm_atomic_helper_check_modeset(). Probably best to stuff that into the mode_valid() function.
Ok I understood now, thanks for pointer, I'll try to add this.
Neil
Cheers, Daniel
Neil
-Daniel
Neil
Bunch of igt to make sure we're not missing anything would be sweet on top, e.g. e.g. trying to set a mode over the limit and making sure it fails.
Cheers, Daniel
drivers/gpu/drm/meson/meson_drv.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c index d344312..2e29968 100644 --- a/drivers/gpu/drm/meson/meson_drv.c +++ b/drivers/gpu/drm/meson/meson_drv.c @@ -243,8 +243,8 @@ static int meson_drv_bind_master(struct device *dev, bool has_components) goto free_drm;
drm_mode_config_init(drm);
- drm->mode_config.max_width = 3840;
- drm->mode_config.max_height = 2160;
drm->mode_config.max_width = 16384;
drm->mode_config.max_height = 8192; drm->mode_config.funcs = &meson_mode_config_funcs;
/* Hardware Initialization */
-- 2.7.4
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel
dri-devel mailing list dri-devel@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/dri-devel