|
@@ -9991,6 +9991,7 @@ int intel_framebuffer_init(struct drm_device *dev,
|
|
|
struct drm_mode_fb_cmd2 *mode_cmd,
|
|
|
struct drm_i915_gem_object *obj)
|
|
|
{
|
|
|
+ int aligned_height, tile_height;
|
|
|
int pitch_limit;
|
|
|
int ret;
|
|
|
|
|
@@ -10084,6 +10085,13 @@ int intel_framebuffer_init(struct drm_device *dev,
|
|
|
if (mode_cmd->offsets[0] != 0)
|
|
|
return -EINVAL;
|
|
|
|
|
|
+ tile_height = IS_GEN2(dev) ? 16 : 8;
|
|
|
+ aligned_height = ALIGN(mode_cmd->height,
|
|
|
+ obj->tiling_mode ? tile_height : 1);
|
|
|
+ /* FIXME drm helper for size checks (especially planar formats)? */
|
|
|
+ if (obj->base.size < aligned_height * mode_cmd->pitches[0])
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
drm_helper_mode_fill_fb_struct(&intel_fb->base, mode_cmd);
|
|
|
intel_fb->obj = obj;
|
|
|
intel_fb->obj->framebuffer_references++;
|