All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
@ 2015-11-11 17:11 ville.syrjala
  2015-11-11 17:11 ` [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create() ville.syrjala
                   ` (3 more replies)
  0 siblings, 4 replies; 20+ messages in thread
From: ville.syrjala @ 2015-11-11 17:11 UTC (permalink / raw)
  To: intel-gfx; +Cc: dri-devel, stable, Daniel Vetter, Tvrtko Ursulin

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

We try to convert the old way of of specifying fb tiling (obj->tiling)
into the new fb modifiers. We store the result in the passed in mode_cmd
structure. But that structure comes directly from the addfb2 ioctl, and
gets copied back out to userspace, which means we're clobbering the
modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
flag wasn't even set by the user). Hence if the user reuses the struct
for another addfb2, the ioctl will be rejected since it's now asking for
some modifiers w/o the flag set.

Fix the problem by making a copy of the user provided structure. We can
play any games we want with the copy.

Cc: stable@vger.kernel.org
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
Testcase: igt/kms_addfb_basic/clobbered-modifier
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 drivers/gpu/drm/i915/intel_display.c | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index b5f7493..c3aa6f5 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -14578,17 +14578,18 @@ static int intel_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 intel_user_framebuffer_create(struct drm_device *dev,
 			      struct drm_file *filp,
-			      struct drm_mode_fb_cmd2 *mode_cmd)
+			      struct drm_mode_fb_cmd2 *user_mode_cmd)
 {
 	struct drm_framebuffer *fb;
 	struct drm_i915_gem_object *obj;
+	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
 
 	obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
-						mode_cmd->handles[0]));
+						mode_cmd.handles[0]));
 	if (&obj->base == NULL)
 		return ERR_PTR(-ENOENT);
 
-	fb = intel_framebuffer_create(dev, mode_cmd, obj);
+	fb = intel_framebuffer_create(dev, &mode_cmd, obj);
 	if (IS_ERR(fb))
 		drm_gem_object_unreference_unlocked(&obj->base);
 
-- 
2.4.10


^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create()
  2015-11-11 17:11 [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params ville.syrjala
@ 2015-11-11 17:11 ` ville.syrjala
  2015-11-16 15:20   ` Tvrtko Ursulin
  2015-11-17  9:48   ` [Intel-gfx] " Daniel Vetter
  2015-11-11 17:11 ` [PATCH i-g-t] tests/kms_addfb_basic: Add clobbered-modifier subtest ville.syrjala
                   ` (2 subsequent siblings)
  3 siblings, 2 replies; 20+ messages in thread
From: ville.syrjala @ 2015-11-11 17:11 UTC (permalink / raw)
  To: intel-gfx; +Cc: dri-devel

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Drivers shouldn't clobber the passed in addfb ioctl parameters.
i915 was doing just that. To prevent it from happening again,
pass the struct around as const, starting all the way from
internal_framebuffer_create().

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
I tried to cross-compile everything, and didn't get any failures,
but I'm not 100% sure I caught every driver.
---
 drivers/gpu/drm/amd/amdgpu/amdgpu_display.c  | 4 ++--
 drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h     | 2 +-
 drivers/gpu/drm/armada/armada_fb.c           | 4 ++--
 drivers/gpu/drm/armada/armada_fb.h           | 2 +-
 drivers/gpu/drm/ast/ast_drv.h                | 2 +-
 drivers/gpu/drm/ast/ast_fb.c                 | 2 +-
 drivers/gpu/drm/ast/ast_main.c               | 4 ++--
 drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 2 +-
 drivers/gpu/drm/bochs/bochs.h                | 2 +-
 drivers/gpu/drm/bochs/bochs_fbdev.c          | 2 +-
 drivers/gpu/drm/bochs/bochs_mm.c             | 4 ++--
 drivers/gpu/drm/cirrus/cirrus_drv.h          | 2 +-
 drivers/gpu/drm/cirrus/cirrus_fbdev.c        | 2 +-
 drivers/gpu/drm/cirrus/cirrus_main.c         | 4 ++--
 drivers/gpu/drm/drm_crtc.c                   | 4 ++--
 drivers/gpu/drm/drm_crtc_helper.c            | 2 +-
 drivers/gpu/drm/drm_fb_cma_helper.c          | 4 ++--
 drivers/gpu/drm/exynos/exynos_drm_fb.c       | 4 ++--
 drivers/gpu/drm/exynos/exynos_drm_fb.h       | 2 +-
 drivers/gpu/drm/gma500/framebuffer.c         | 6 +++---
 drivers/gpu/drm/i915/intel_display.c         | 2 +-
 drivers/gpu/drm/mgag200/mgag200_drv.h        | 2 +-
 drivers/gpu/drm/mgag200/mgag200_fb.c         | 2 +-
 drivers/gpu/drm/mgag200/mgag200_main.c       | 4 ++--
 drivers/gpu/drm/msm/msm_drv.h                | 4 ++--
 drivers/gpu/drm/msm/msm_fb.c                 | 4 ++--
 drivers/gpu/drm/nouveau/nouveau_display.c    | 4 ++--
 drivers/gpu/drm/nouveau/nouveau_display.h    | 2 +-
 drivers/gpu/drm/omapdrm/omap_drv.h           | 6 +++---
 drivers/gpu/drm/omapdrm/omap_fb.c            | 4 ++--
 drivers/gpu/drm/qxl/qxl_display.c            | 4 ++--
 drivers/gpu/drm/qxl/qxl_drv.h                | 2 +-
 drivers/gpu/drm/qxl/qxl_fb.c                 | 2 +-
 drivers/gpu/drm/radeon/radeon_display.c      | 4 ++--
 drivers/gpu/drm/radeon/radeon_mode.h         | 2 +-
 drivers/gpu/drm/rcar-du/rcar_du_kms.c        | 2 +-
 drivers/gpu/drm/rockchip/rockchip_drm_fb.c   | 6 +++---
 drivers/gpu/drm/rockchip/rockchip_drm_fb.h   | 2 +-
 drivers/gpu/drm/shmobile/shmob_drm_kms.c     | 2 +-
 drivers/gpu/drm/tegra/drm.h                  | 2 +-
 drivers/gpu/drm/tegra/fb.c                   | 4 ++--
 drivers/gpu/drm/tilcdc/tilcdc_drv.c          | 2 +-
 drivers/gpu/drm/udl/udl_drv.h                | 2 +-
 drivers/gpu/drm/udl/udl_fb.c                 | 4 ++--
 drivers/gpu/drm/virtio/virtgpu_display.c     | 4 ++--
 drivers/gpu/drm/virtio/virtgpu_drv.h         | 2 +-
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c          | 2 +-
 include/drm/drm_crtc.h                       | 2 +-
 include/drm/drm_crtc_helper.h                | 2 +-
 include/drm/drm_fb_cma_helper.h              | 2 +-
 50 files changed, 74 insertions(+), 74 deletions(-)

diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
index e173a5a..7d5e058 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
@@ -481,7 +481,7 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
 int
 amdgpu_framebuffer_init(struct drm_device *dev,
 			struct amdgpu_framebuffer *rfb,
-			struct drm_mode_fb_cmd2 *mode_cmd,
+			const struct drm_mode_fb_cmd2 *mode_cmd,
 			struct drm_gem_object *obj)
 {
 	int ret;
@@ -498,7 +498,7 @@ amdgpu_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 amdgpu_user_framebuffer_create(struct drm_device *dev,
 			       struct drm_file *file_priv,
-			       struct drm_mode_fb_cmd2 *mode_cmd)
+			       const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj;
 	struct amdgpu_framebuffer *amdgpu_fb;
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
index b62c171..de452996 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
@@ -551,7 +551,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
 
 int amdgpu_framebuffer_init(struct drm_device *dev,
 			     struct amdgpu_framebuffer *rfb,
-			     struct drm_mode_fb_cmd2 *mode_cmd,
+			     const struct drm_mode_fb_cmd2 *mode_cmd,
 			     struct drm_gem_object *obj);
 
 int amdgpufb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
diff --git a/drivers/gpu/drm/armada/armada_fb.c b/drivers/gpu/drm/armada/armada_fb.c
index 1c90969..5fa4bf2 100644
--- a/drivers/gpu/drm/armada/armada_fb.c
+++ b/drivers/gpu/drm/armada/armada_fb.c
@@ -35,7 +35,7 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
 };
 
 struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
-	struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
+	const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
 {
 	struct armada_framebuffer *dfb;
 	uint8_t format, config;
@@ -101,7 +101,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
 }
 
 static struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
-	struct drm_file *dfile, struct drm_mode_fb_cmd2 *mode)
+	struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
 {
 	struct armada_gem_object *obj;
 	struct armada_framebuffer *dfb;
diff --git a/drivers/gpu/drm/armada/armada_fb.h b/drivers/gpu/drm/armada/armada_fb.h
index ce3f12e..48073c4 100644
--- a/drivers/gpu/drm/armada/armada_fb.h
+++ b/drivers/gpu/drm/armada/armada_fb.h
@@ -19,6 +19,6 @@ struct armada_framebuffer {
 #define drm_fb_obj(fb) drm_fb_to_armada_fb(fb)->obj
 
 struct armada_framebuffer *armada_framebuffer_create(struct drm_device *,
-	struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
+	const struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
 
 #endif
diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
index 05f6522..e227f8a 100644
--- a/drivers/gpu/drm/ast/ast_drv.h
+++ b/drivers/gpu/drm/ast/ast_drv.h
@@ -309,7 +309,7 @@ extern void ast_mode_fini(struct drm_device *dev);
 
 int ast_framebuffer_init(struct drm_device *dev,
 			 struct ast_framebuffer *ast_fb,
-			 struct drm_mode_fb_cmd2 *mode_cmd,
+			 const struct drm_mode_fb_cmd2 *mode_cmd,
 			 struct drm_gem_object *obj);
 
 int ast_fbdev_init(struct drm_device *dev);
diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
index a37e7ea..5320f8c 100644
--- a/drivers/gpu/drm/ast/ast_fb.c
+++ b/drivers/gpu/drm/ast/ast_fb.c
@@ -163,7 +163,7 @@ static struct fb_ops astfb_ops = {
 };
 
 static int astfb_create_object(struct ast_fbdev *afbdev,
-			       struct drm_mode_fb_cmd2 *mode_cmd,
+			       const struct drm_mode_fb_cmd2 *mode_cmd,
 			       struct drm_gem_object **gobj_p)
 {
 	struct drm_device *dev = afbdev->helper.dev;
diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
index 541a610..9759009 100644
--- a/drivers/gpu/drm/ast/ast_main.c
+++ b/drivers/gpu/drm/ast/ast_main.c
@@ -309,7 +309,7 @@ static const struct drm_framebuffer_funcs ast_fb_funcs = {
 
 int ast_framebuffer_init(struct drm_device *dev,
 			 struct ast_framebuffer *ast_fb,
-			 struct drm_mode_fb_cmd2 *mode_cmd,
+			 const struct drm_mode_fb_cmd2 *mode_cmd,
 			 struct drm_gem_object *obj)
 {
 	int ret;
@@ -327,7 +327,7 @@ int ast_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 ast_user_framebuffer_create(struct drm_device *dev,
 	       struct drm_file *filp,
-	       struct drm_mode_fb_cmd2 *mode_cmd)
+	       const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj;
 	struct ast_framebuffer *ast_fb;
diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
index 244df0a..8168954 100644
--- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
+++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
@@ -402,7 +402,7 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data)
 }
 
 static struct drm_framebuffer *atmel_hlcdc_fb_create(struct drm_device *dev,
-		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
+		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	return drm_fb_cma_create(dev, file_priv, mode_cmd);
 }
diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
index 71f2687..19b5ada 100644
--- a/drivers/gpu/drm/bochs/bochs.h
+++ b/drivers/gpu/drm/bochs/bochs.h
@@ -149,7 +149,7 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
 
 int bochs_framebuffer_init(struct drm_device *dev,
 			   struct bochs_framebuffer *gfb,
-			   struct drm_mode_fb_cmd2 *mode_cmd,
+			   const struct drm_mode_fb_cmd2 *mode_cmd,
 			   struct drm_gem_object *obj);
 int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr);
 int bochs_bo_unpin(struct bochs_bo *bo);
diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
index 09a0637..7520bf8 100644
--- a/drivers/gpu/drm/bochs/bochs_fbdev.c
+++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
@@ -34,7 +34,7 @@ static struct fb_ops bochsfb_ops = {
 };
 
 static int bochsfb_create_object(struct bochs_device *bochs,
-				 struct drm_mode_fb_cmd2 *mode_cmd,
+				 const struct drm_mode_fb_cmd2 *mode_cmd,
 				 struct drm_gem_object **gobj_p)
 {
 	struct drm_device *dev = bochs->dev;
diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
index f69e6bf..d812ad0 100644
--- a/drivers/gpu/drm/bochs/bochs_mm.c
+++ b/drivers/gpu/drm/bochs/bochs_mm.c
@@ -484,7 +484,7 @@ static const struct drm_framebuffer_funcs bochs_fb_funcs = {
 
 int bochs_framebuffer_init(struct drm_device *dev,
 			   struct bochs_framebuffer *gfb,
-			   struct drm_mode_fb_cmd2 *mode_cmd,
+			   const struct drm_mode_fb_cmd2 *mode_cmd,
 			   struct drm_gem_object *obj)
 {
 	int ret;
@@ -502,7 +502,7 @@ int bochs_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 bochs_user_framebuffer_create(struct drm_device *dev,
 			      struct drm_file *filp,
-			      struct drm_mode_fb_cmd2 *mode_cmd)
+			      const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj;
 	struct bochs_framebuffer *bochs_fb;
diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
index 7050615..1370a51 100644
--- a/drivers/gpu/drm/cirrus/cirrus_drv.h
+++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
@@ -207,7 +207,7 @@ int cirrus_dumb_create(struct drm_file *file,
 
 int cirrus_framebuffer_init(struct drm_device *dev,
 			   struct cirrus_framebuffer *gfb,
-			    struct drm_mode_fb_cmd2 *mode_cmd,
+			    const struct drm_mode_fb_cmd2 *mode_cmd,
 			    struct drm_gem_object *obj);
 
 bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height,
diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
index 589103b..3b5be72 100644
--- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
+++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
@@ -135,7 +135,7 @@ static struct fb_ops cirrusfb_ops = {
 };
 
 static int cirrusfb_create_object(struct cirrus_fbdev *afbdev,
-			       struct drm_mode_fb_cmd2 *mode_cmd,
+			       const struct drm_mode_fb_cmd2 *mode_cmd,
 			       struct drm_gem_object **gobj_p)
 {
 	struct drm_device *dev = afbdev->helper.dev;
diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
index 055fd86..0907715 100644
--- a/drivers/gpu/drm/cirrus/cirrus_main.c
+++ b/drivers/gpu/drm/cirrus/cirrus_main.c
@@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
 
 int cirrus_framebuffer_init(struct drm_device *dev,
 			    struct cirrus_framebuffer *gfb,
-			    struct drm_mode_fb_cmd2 *mode_cmd,
+			    const struct drm_mode_fb_cmd2 *mode_cmd,
 			    struct drm_gem_object *obj)
 {
 	int ret;
@@ -47,7 +47,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 cirrus_user_framebuffer_create(struct drm_device *dev,
 			       struct drm_file *filp,
-			       struct drm_mode_fb_cmd2 *mode_cmd)
+			       const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct cirrus_device *cdev = dev->dev_private;
 	struct drm_gem_object *obj;
diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index 24c5434..32dd134 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -45,7 +45,7 @@
 
 static struct drm_framebuffer *
 internal_framebuffer_create(struct drm_device *dev,
-			    struct drm_mode_fb_cmd2 *r,
+			    const struct drm_mode_fb_cmd2 *r,
 			    struct drm_file *file_priv);
 
 /* Avoid boilerplate.  I'm tired of typing. */
@@ -3235,7 +3235,7 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
 
 static struct drm_framebuffer *
 internal_framebuffer_create(struct drm_device *dev,
-			    struct drm_mode_fb_cmd2 *r,
+			    const struct drm_mode_fb_cmd2 *r,
 			    struct drm_file *file_priv)
 {
 	struct drm_mode_config *config = &dev->mode_config;
diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
index ef53475..6b4cf25 100644
--- a/drivers/gpu/drm/drm_crtc_helper.c
+++ b/drivers/gpu/drm/drm_crtc_helper.c
@@ -818,7 +818,7 @@ EXPORT_SYMBOL(drm_helper_connector_dpms);
  * metadata fields.
  */
 void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
-				    struct drm_mode_fb_cmd2 *mode_cmd)
+				    const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	int i;
 
diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
index c19a625..b7d5b84 100644
--- a/drivers/gpu/drm/drm_fb_cma_helper.c
+++ b/drivers/gpu/drm/drm_fb_cma_helper.c
@@ -74,7 +74,7 @@ static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
 };
 
 static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
-	struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
+	const const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
 	unsigned int num_planes)
 {
 	struct drm_fb_cma *fb_cma;
@@ -107,7 +107,7 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
  * checked before calling this function.
  */
 struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
-	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
+	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_fb_cma *fb_cma;
 	struct drm_gem_cma_object *objs[4];
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
index fcea28b..49b9bc3 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
+++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
@@ -117,7 +117,7 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
 
 struct drm_framebuffer *
 exynos_drm_framebuffer_init(struct drm_device *dev,
-			    struct drm_mode_fb_cmd2 *mode_cmd,
+			    const struct drm_mode_fb_cmd2 *mode_cmd,
 			    struct exynos_drm_gem **exynos_gem,
 			    int count)
 {
@@ -154,7 +154,7 @@ err:
 
 static struct drm_framebuffer *
 exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
-		      struct drm_mode_fb_cmd2 *mode_cmd)
+		      const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
 	struct drm_gem_object *obj;
diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h
index 726a2d4..a8a75ac 100644
--- a/drivers/gpu/drm/exynos/exynos_drm_fb.h
+++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h
@@ -18,7 +18,7 @@
 
 struct drm_framebuffer *
 exynos_drm_framebuffer_init(struct drm_device *dev,
-			    struct drm_mode_fb_cmd2 *mode_cmd,
+			    const struct drm_mode_fb_cmd2 *mode_cmd,
 			    struct exynos_drm_gem **exynos_gem,
 			    int count);
 
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
index 2eaf1b3..dc0508d 100644
--- a/drivers/gpu/drm/gma500/framebuffer.c
+++ b/drivers/gpu/drm/gma500/framebuffer.c
@@ -241,7 +241,7 @@ static struct fb_ops psbfb_unaccel_ops = {
  */
 static int psb_framebuffer_init(struct drm_device *dev,
 					struct psb_framebuffer *fb,
-					struct drm_mode_fb_cmd2 *mode_cmd,
+					const struct drm_mode_fb_cmd2 *mode_cmd,
 					struct gtt_range *gt)
 {
 	u32 bpp, depth;
@@ -284,7 +284,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
 
 static struct drm_framebuffer *psb_framebuffer_create
 			(struct drm_device *dev,
-			 struct drm_mode_fb_cmd2 *mode_cmd,
+			 const struct drm_mode_fb_cmd2 *mode_cmd,
 			 struct gtt_range *gt)
 {
 	struct psb_framebuffer *fb;
@@ -488,7 +488,7 @@ out_err1:
  */
 static struct drm_framebuffer *psb_user_framebuffer_create
 			(struct drm_device *dev, struct drm_file *filp,
-			 struct drm_mode_fb_cmd2 *cmd)
+			 const struct drm_mode_fb_cmd2 *cmd)
 {
 	struct gtt_range *r;
 	struct drm_gem_object *obj;
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index c3aa6f5..58dbac7 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -14578,7 +14578,7 @@ static int intel_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 intel_user_framebuffer_create(struct drm_device *dev,
 			      struct drm_file *filp,
-			      struct drm_mode_fb_cmd2 *user_mode_cmd)
+			      const struct drm_mode_fb_cmd2 *user_mode_cmd)
 {
 	struct drm_framebuffer *fb;
 	struct drm_i915_gem_object *obj;
diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
index 912151c..205b280 100644
--- a/drivers/gpu/drm/mgag200/mgag200_drv.h
+++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
@@ -252,7 +252,7 @@ void mgag200_fbdev_fini(struct mga_device *mdev);
 				/* mgag200_main.c */
 int mgag200_framebuffer_init(struct drm_device *dev,
 			     struct mga_framebuffer *mfb,
-			     struct drm_mode_fb_cmd2 *mode_cmd,
+			     const struct drm_mode_fb_cmd2 *mode_cmd,
 			     struct drm_gem_object *obj);
 
 
diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
index b35b5b2..d9b04b0 100644
--- a/drivers/gpu/drm/mgag200/mgag200_fb.c
+++ b/drivers/gpu/drm/mgag200/mgag200_fb.c
@@ -138,7 +138,7 @@ static struct fb_ops mgag200fb_ops = {
 };
 
 static int mgag200fb_create_object(struct mga_fbdev *afbdev,
-				   struct drm_mode_fb_cmd2 *mode_cmd,
+				   const struct drm_mode_fb_cmd2 *mode_cmd,
 				   struct drm_gem_object **gobj_p)
 {
 	struct drm_device *dev = afbdev->helper.dev;
diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
index b1a0f56..9147444 100644
--- a/drivers/gpu/drm/mgag200/mgag200_main.c
+++ b/drivers/gpu/drm/mgag200/mgag200_main.c
@@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs mga_fb_funcs = {
 
 int mgag200_framebuffer_init(struct drm_device *dev,
 			     struct mga_framebuffer *gfb,
-			     struct drm_mode_fb_cmd2 *mode_cmd,
+			     const struct drm_mode_fb_cmd2 *mode_cmd,
 			     struct drm_gem_object *obj)
 {
 	int ret;
@@ -47,7 +47,7 @@ int mgag200_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 mgag200_user_framebuffer_create(struct drm_device *dev,
 				struct drm_file *filp,
-				struct drm_mode_fb_cmd2 *mode_cmd)
+				const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj;
 	struct mga_framebuffer *mga_fb;
diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
index 3be7a56..9a713b7 100644
--- a/drivers/gpu/drm/msm/msm_drv.h
+++ b/drivers/gpu/drm/msm/msm_drv.h
@@ -240,9 +240,9 @@ uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane);
 struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
 const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
 struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
-		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
+		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
 struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
-		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
+		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
 
 struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
 
diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
index 12171328..a474d6c 100644
--- a/drivers/gpu/drm/msm/msm_fb.c
+++ b/drivers/gpu/drm/msm/msm_fb.c
@@ -138,7 +138,7 @@ const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb)
 }
 
 struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
-		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
+		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *bos[4] = {0};
 	struct drm_framebuffer *fb;
@@ -168,7 +168,7 @@ out_unref:
 }
 
 struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
-		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
+		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
 {
 	struct msm_drm_private *priv = dev->dev_private;
 	struct msm_kms *kms = priv->kms;
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
index db6bc67..ea9d3bc 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -246,7 +246,7 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
 int
 nouveau_framebuffer_init(struct drm_device *dev,
 			 struct nouveau_framebuffer *nv_fb,
-			 struct drm_mode_fb_cmd2 *mode_cmd,
+			 const struct drm_mode_fb_cmd2 *mode_cmd,
 			 struct nouveau_bo *nvbo)
 {
 	struct nouveau_display *disp = nouveau_display(dev);
@@ -272,7 +272,7 @@ nouveau_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 nouveau_user_framebuffer_create(struct drm_device *dev,
 				struct drm_file *file_priv,
-				struct drm_mode_fb_cmd2 *mode_cmd)
+				const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct nouveau_framebuffer *nouveau_fb;
 	struct drm_gem_object *gem;
diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h
index 856abe0..5a57d8b 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.h
+++ b/drivers/gpu/drm/nouveau/nouveau_display.h
@@ -23,7 +23,7 @@ nouveau_framebuffer(struct drm_framebuffer *fb)
 }
 
 int nouveau_framebuffer_init(struct drm_device *, struct nouveau_framebuffer *,
-			     struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
+			     const struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
 
 struct nouveau_page_flip_state {
 	struct list_head head;
diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
index 5c367aa..130fca7 100644
--- a/drivers/gpu/drm/omapdrm/omap_drv.h
+++ b/drivers/gpu/drm/omapdrm/omap_drv.h
@@ -172,9 +172,9 @@ void copy_timings_drm_to_omap(struct omap_video_timings *timings,
 uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
 		uint32_t max_formats, enum omap_color_mode supported_modes);
 struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
-		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
+		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
 struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
-		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
+		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
 struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p);
 int omap_framebuffer_pin(struct drm_framebuffer *fb);
 void omap_framebuffer_unpin(struct drm_framebuffer *fb);
@@ -248,7 +248,7 @@ struct omap_dss_device *omap_encoder_get_dssdev(struct drm_encoder *encoder);
 
 static inline int objects_lookup(struct drm_device *dev,
 		struct drm_file *filp, uint32_t pixel_format,
-		struct drm_gem_object **bos, uint32_t *handles)
+		struct drm_gem_object **bos, const uint32_t *handles)
 {
 	int i, n = drm_format_num_planes(pixel_format);
 
diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
index 636a1f9..ad202df 100644
--- a/drivers/gpu/drm/omapdrm/omap_fb.c
+++ b/drivers/gpu/drm/omapdrm/omap_fb.c
@@ -364,7 +364,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
 #endif
 
 struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
-		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
+		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *bos[4];
 	struct drm_framebuffer *fb;
@@ -386,7 +386,7 @@ struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
 }
 
 struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
-		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
+		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
 {
 	struct omap_framebuffer *omap_fb = NULL;
 	struct drm_framebuffer *fb = NULL;
diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
index 183aea1..cddba07 100644
--- a/drivers/gpu/drm/qxl/qxl_display.c
+++ b/drivers/gpu/drm/qxl/qxl_display.c
@@ -521,7 +521,7 @@ static const struct drm_framebuffer_funcs qxl_fb_funcs = {
 int
 qxl_framebuffer_init(struct drm_device *dev,
 		     struct qxl_framebuffer *qfb,
-		     struct drm_mode_fb_cmd2 *mode_cmd,
+		     const struct drm_mode_fb_cmd2 *mode_cmd,
 		     struct drm_gem_object *obj)
 {
 	int ret;
@@ -1003,7 +1003,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
 static struct drm_framebuffer *
 qxl_user_framebuffer_create(struct drm_device *dev,
 			    struct drm_file *file_priv,
-			    struct drm_mode_fb_cmd2 *mode_cmd)
+			    const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj;
 	struct qxl_framebuffer *qxl_fb;
diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
index 01a8694..6e6b9b1 100644
--- a/drivers/gpu/drm/qxl/qxl_drv.h
+++ b/drivers/gpu/drm/qxl/qxl_drv.h
@@ -390,7 +390,7 @@ void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state);
 int
 qxl_framebuffer_init(struct drm_device *dev,
 		     struct qxl_framebuffer *rfb,
-		     struct drm_mode_fb_cmd2 *mode_cmd,
+		     const struct drm_mode_fb_cmd2 *mode_cmd,
 		     struct drm_gem_object *obj);
 void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
 void qxl_send_monitors_config(struct qxl_device *qdev);
diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
index c4a5526..11f543b 100644
--- a/drivers/gpu/drm/qxl/qxl_fb.c
+++ b/drivers/gpu/drm/qxl/qxl_fb.c
@@ -283,7 +283,7 @@ int qxl_get_handle_for_primary_fb(struct qxl_device *qdev,
 }
 
 static int qxlfb_create_pinned_object(struct qxl_fbdev *qfbdev,
-				      struct drm_mode_fb_cmd2 *mode_cmd,
+				      const struct drm_mode_fb_cmd2 *mode_cmd,
 				      struct drm_gem_object **gobj_p)
 {
 	struct qxl_device *qdev = qfbdev->qdev;
diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
index a8d9927..ded51fb 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1292,7 +1292,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
 int
 radeon_framebuffer_init(struct drm_device *dev,
 			struct radeon_framebuffer *rfb,
-			struct drm_mode_fb_cmd2 *mode_cmd,
+			const struct drm_mode_fb_cmd2 *mode_cmd,
 			struct drm_gem_object *obj)
 {
 	int ret;
@@ -1309,7 +1309,7 @@ radeon_framebuffer_init(struct drm_device *dev,
 static struct drm_framebuffer *
 radeon_user_framebuffer_create(struct drm_device *dev,
 			       struct drm_file *file_priv,
-			       struct drm_mode_fb_cmd2 *mode_cmd)
+			       const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj;
 	struct radeon_framebuffer *radeon_fb;
diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
index 830e171..b8e3c27 100644
--- a/drivers/gpu/drm/radeon/radeon_mode.h
+++ b/drivers/gpu/drm/radeon/radeon_mode.h
@@ -929,7 +929,7 @@ extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green
 				     u16 *blue, int regno);
 int radeon_framebuffer_init(struct drm_device *dev,
 			     struct radeon_framebuffer *rfb,
-			     struct drm_mode_fb_cmd2 *mode_cmd,
+			     const struct drm_mode_fb_cmd2 *mode_cmd,
 			     struct drm_gem_object *obj);
 
 int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
index ca12e8c..43bce69 100644
--- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
+++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
@@ -136,7 +136,7 @@ int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
 
 static struct drm_framebuffer *
 rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
-		  struct drm_mode_fb_cmd2 *mode_cmd)
+		  const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct rcar_du_device *rcdu = dev->dev_private;
 	const struct rcar_du_format_info *format;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
index 002645b..b8ac591 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
@@ -72,7 +72,7 @@ static struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
 };
 
 static struct rockchip_drm_fb *
-rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
+rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
 		  struct drm_gem_object **obj, unsigned int num_planes)
 {
 	struct rockchip_drm_fb *rockchip_fb;
@@ -102,7 +102,7 @@ rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
 
 static struct drm_framebuffer *
 rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
-			struct drm_mode_fb_cmd2 *mode_cmd)
+			const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct rockchip_drm_fb *rockchip_fb;
 	struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER];
@@ -173,7 +173,7 @@ static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
 
 struct drm_framebuffer *
 rockchip_drm_framebuffer_init(struct drm_device *dev,
-			      struct drm_mode_fb_cmd2 *mode_cmd,
+			      const struct drm_mode_fb_cmd2 *mode_cmd,
 			      struct drm_gem_object *obj)
 {
 	struct rockchip_drm_fb *rockchip_fb;
diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
index 09574d4..2fe47f1 100644
--- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
+++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
@@ -17,7 +17,7 @@
 
 struct drm_framebuffer *
 rockchip_drm_framebuffer_init(struct drm_device *dev,
-			      struct drm_mode_fb_cmd2 *mode_cmd,
+			      const struct drm_mode_fb_cmd2 *mode_cmd,
 			      struct drm_gem_object *obj);
 void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb);
 
diff --git a/drivers/gpu/drm/shmobile/shmob_drm_kms.c b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
index aaf98ac..388a0fc 100644
--- a/drivers/gpu/drm/shmobile/shmob_drm_kms.c
+++ b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
@@ -104,7 +104,7 @@ const struct shmob_drm_format_info *shmob_drm_format_info(u32 fourcc)
 
 static struct drm_framebuffer *
 shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
-		    struct drm_mode_fb_cmd2 *mode_cmd)
+		    const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	const struct shmob_drm_format_info *format;
 
diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
index 942cad9..d88a2d1 100644
--- a/drivers/gpu/drm/tegra/drm.h
+++ b/drivers/gpu/drm/tegra/drm.h
@@ -268,7 +268,7 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
 			struct tegra_bo_tiling *tiling);
 struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
 					struct drm_file *file,
-					struct drm_mode_fb_cmd2 *cmd);
+					const struct drm_mode_fb_cmd2 *cmd);
 int tegra_drm_fb_prepare(struct drm_device *drm);
 void tegra_drm_fb_free(struct drm_device *drm);
 int tegra_drm_fb_init(struct drm_device *drm);
diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
index bec07d9..ede9e94 100644
--- a/drivers/gpu/drm/tegra/fb.c
+++ b/drivers/gpu/drm/tegra/fb.c
@@ -92,7 +92,7 @@ static struct drm_framebuffer_funcs tegra_fb_funcs = {
 };
 
 static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
-				       struct drm_mode_fb_cmd2 *mode_cmd,
+				       const struct drm_mode_fb_cmd2 *mode_cmd,
 				       struct tegra_bo **planes,
 				       unsigned int num_planes)
 {
@@ -131,7 +131,7 @@ static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
 
 struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
 					struct drm_file *file,
-					struct drm_mode_fb_cmd2 *cmd)
+					const struct drm_mode_fb_cmd2 *cmd)
 {
 	unsigned int hsub, vsub, i;
 	struct tegra_bo *planes[4];
diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
index 876cad5..4ddb21e 100644
--- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
+++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
@@ -46,7 +46,7 @@ void tilcdc_module_cleanup(struct tilcdc_module *mod)
 static struct of_device_id tilcdc_of_match[];
 
 static struct drm_framebuffer *tilcdc_fb_create(struct drm_device *dev,
-		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
+		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	return drm_fb_cma_create(dev, file_priv, mode_cmd);
 }
diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
index 80adbac..4a064ef 100644
--- a/drivers/gpu/drm/udl/udl_drv.h
+++ b/drivers/gpu/drm/udl/udl_drv.h
@@ -108,7 +108,7 @@ void udl_fbdev_unplug(struct drm_device *dev);
 struct drm_framebuffer *
 udl_fb_user_fb_create(struct drm_device *dev,
 		      struct drm_file *file,
-		      struct drm_mode_fb_cmd2 *mode_cmd);
+		      const struct drm_mode_fb_cmd2 *mode_cmd);
 
 int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr,
 		     const char *front, char **urb_buf_ptr,
diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
index 62c7b1d..f09b11a 100644
--- a/drivers/gpu/drm/udl/udl_fb.c
+++ b/drivers/gpu/drm/udl/udl_fb.c
@@ -456,7 +456,7 @@ static const struct drm_framebuffer_funcs udlfb_funcs = {
 static int
 udl_framebuffer_init(struct drm_device *dev,
 		     struct udl_framebuffer *ufb,
-		     struct drm_mode_fb_cmd2 *mode_cmd,
+		     const struct drm_mode_fb_cmd2 *mode_cmd,
 		     struct udl_gem_object *obj)
 {
 	int ret;
@@ -624,7 +624,7 @@ void udl_fbdev_unplug(struct drm_device *dev)
 struct drm_framebuffer *
 udl_fb_user_fb_create(struct drm_device *dev,
 		   struct drm_file *file,
-		   struct drm_mode_fb_cmd2 *mode_cmd)
+		   const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj;
 	struct udl_framebuffer *ufb;
diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
index f545913..306a7df 100644
--- a/drivers/gpu/drm/virtio/virtgpu_display.c
+++ b/drivers/gpu/drm/virtio/virtgpu_display.c
@@ -215,7 +215,7 @@ static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = {
 int
 virtio_gpu_framebuffer_init(struct drm_device *dev,
 			    struct virtio_gpu_framebuffer *vgfb,
-			    struct drm_mode_fb_cmd2 *mode_cmd,
+			    const struct drm_mode_fb_cmd2 *mode_cmd,
 			    struct drm_gem_object *obj)
 {
 	int ret;
@@ -465,7 +465,7 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
 static struct drm_framebuffer *
 virtio_gpu_user_framebuffer_create(struct drm_device *dev,
 				   struct drm_file *file_priv,
-				   struct drm_mode_fb_cmd2 *mode_cmd)
+				   const struct drm_mode_fb_cmd2 *mode_cmd)
 {
 	struct drm_gem_object *obj = NULL;
 	struct virtio_gpu_framebuffer *virtio_gpu_fb;
diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
index 79f0abe..8f486f4 100644
--- a/drivers/gpu/drm/virtio/virtgpu_drv.h
+++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
@@ -328,7 +328,7 @@ void virtio_gpu_dequeue_fence_func(struct work_struct *work);
 /* virtio_gpu_display.c */
 int virtio_gpu_framebuffer_init(struct drm_device *dev,
 				struct virtio_gpu_framebuffer *vgfb,
-				struct drm_mode_fb_cmd2 *mode_cmd,
+				const struct drm_mode_fb_cmd2 *mode_cmd,
 				struct drm_gem_object *obj);
 int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
 void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 9fcd7f8..e38db351 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -930,7 +930,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
 
 static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
 						 struct drm_file *file_priv,
-						 struct drm_mode_fb_cmd2 *mode_cmd2)
+						 const struct drm_mode_fb_cmd2 *mode_cmd2)
 {
 	struct vmw_private *dev_priv = vmw_priv(dev);
 	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
index 3f0c690..bd27364 100644
--- a/include/drm/drm_crtc.h
+++ b/include/drm/drm_crtc.h
@@ -992,7 +992,7 @@ struct drm_mode_set {
 struct drm_mode_config_funcs {
 	struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
 					     struct drm_file *file_priv,
-					     struct drm_mode_fb_cmd2 *mode_cmd);
+					     const struct drm_mode_fb_cmd2 *mode_cmd);
 	void (*output_poll_changed)(struct drm_device *dev);
 
 	int (*atomic_check)(struct drm_device *dev,
diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
index 3febb4b..e22ab29 100644
--- a/include/drm/drm_crtc_helper.h
+++ b/include/drm/drm_crtc_helper.h
@@ -197,7 +197,7 @@ extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
 extern void drm_helper_move_panel_connectors_to_head(struct drm_device *);
 
 extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
-					   struct drm_mode_fb_cmd2 *mode_cmd);
+					   const struct drm_mode_fb_cmd2 *mode_cmd);
 
 static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
 				       const struct drm_crtc_helper_funcs *funcs)
diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h
index c54cf3d..be62bd3 100644
--- a/include/drm/drm_fb_cma_helper.h
+++ b/include/drm/drm_fb_cma_helper.h
@@ -18,7 +18,7 @@ void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
 void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
 
 struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
-	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd);
+	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
 
 struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
 	unsigned int plane);
-- 
2.4.10

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* [PATCH i-g-t] tests/kms_addfb_basic: Add clobbered-modifier subtest
  2015-11-11 17:11 [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params ville.syrjala
  2015-11-11 17:11 ` [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create() ville.syrjala
@ 2015-11-11 17:11 ` ville.syrjala
  2015-11-11 17:20   ` Chris Wilson
  2015-11-17  9:47   ` Daniel Vetter
  3 siblings, 0 replies; 20+ messages in thread
From: ville.syrjala @ 2015-11-11 17:11 UTC (permalink / raw)
  To: intel-gfx; +Cc: dri-devel

From: Ville Syrjälä <ville.syrjala@linux.intel.com>

Make sure the kernel doesn't clobber the modifiers when the user didn't
pass any.

Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
---
 tests/kms_addfb_basic.c | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/tests/kms_addfb_basic.c b/tests/kms_addfb_basic.c
index d466e4d..73000d6 100644
--- a/tests/kms_addfb_basic.c
+++ b/tests/kms_addfb_basic.c
@@ -101,6 +101,16 @@ static void invalid_tests(int fd)
 		f.modifier[1] = 0;
 	}
 
+	igt_subtest("clobberred-modifier") {
+		f.flags = 0;
+		f.modifier[0] = 0;
+		gem_set_tiling(fd, gem_bo, I915_TILING_X, 512*4);
+		igt_assert(drmIoctl(fd, LOCAL_DRM_IOCTL_MODE_ADDFB2, &f) == 0);
+		igt_assert(drmIoctl(fd, DRM_IOCTL_MODE_RMFB, &f.fb_id) == 0);
+		f.fb_id = 0;
+		igt_assert(f.modifier[0] == 0);
+	}
+
 	igt_fixture {
 		gem_close(fd, gem_bo);
 		gem_close(fd, gem_bo_small);
-- 
2.4.10

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply related	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
  2015-11-11 17:11 [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params ville.syrjala
@ 2015-11-11 17:20   ` Chris Wilson
  2015-11-11 17:11 ` [PATCH i-g-t] tests/kms_addfb_basic: Add clobbered-modifier subtest ville.syrjala
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 20+ messages in thread
From: Chris Wilson @ 2015-11-11 17:20 UTC (permalink / raw)
  To: ville.syrjala; +Cc: intel-gfx, Daniel Vetter, stable, dri-devel, Tvrtko Ursulin

On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> 
> We try to convert the old way of of specifying fb tiling (obj->tiling)
> into the new fb modifiers. We store the result in the passed in mode_cmd
> structure. But that structure comes directly from the addfb2 ioctl, and
> gets copied back out to userspace, which means we're clobbering the
> modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> flag wasn't even set by the user). Hence if the user reuses the struct
> for another addfb2, the ioctl will be rejected since it's now asking for
> some modifiers w/o the flag set.

What do we actually pass back to userspace through the struct? Do we
just want to
-#define DRM_IOCTL_MODE_ADDFB2          DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
+#define DRM_IOCTL_MODE_ADDFB2          DRM_IOR(0xB8, struct drm_mode_fb_cmd2
instead?
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
@ 2015-11-11 17:20   ` Chris Wilson
  0 siblings, 0 replies; 20+ messages in thread
From: Chris Wilson @ 2015-11-11 17:20 UTC (permalink / raw)
  To: ville.syrjala; +Cc: Daniel Vetter, intel-gfx, dri-devel, stable, Tvrtko Ursulin

On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> We try to convert the old way of of specifying fb tiling (obj->tiling)
> into the new fb modifiers. We store the result in the passed in mode_cmd
> structure. But that structure comes directly from the addfb2 ioctl, and
> gets copied back out to userspace, which means we're clobbering the
> modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> flag wasn't even set by the user). Hence if the user reuses the struct
> for another addfb2, the ioctl will be rejected since it's now asking for
> some modifiers w/o the flag set.

What do we actually pass back to userspace through the struct? Do we
just want to
-#define DRM_IOCTL_MODE_ADDFB2          DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
+#define DRM_IOCTL_MODE_ADDFB2          DRM_IOR(0xB8, struct drm_mode_fb_cmd2
instead?
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
  2015-11-11 17:20   ` Chris Wilson
@ 2015-11-11 17:24     ` Ville Syrjälä
  -1 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjälä @ 2015-11-11 17:24 UTC (permalink / raw)
  To: Chris Wilson, intel-gfx, Daniel Vetter, stable, dri-devel,
	Tvrtko Ursulin

On Wed, Nov 11, 2015 at 05:20:10PM +0000, Chris Wilson wrote:
> On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> > 
> > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > into the new fb modifiers. We store the result in the passed in mode_cmd
> > structure. But that structure comes directly from the addfb2 ioctl, and
> > gets copied back out to userspace, which means we're clobbering the
> > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > flag wasn't even set by the user). Hence if the user reuses the struct
> > for another addfb2, the ioctl will be rejected since it's now asking for
> > some modifiers w/o the flag set.
> 
> What do we actually pass back to userspace through the struct?

The fb id.

> Do we
> just want to
> -#define DRM_IOCTL_MODE_ADDFB2          DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
> +#define DRM_IOCTL_MODE_ADDFB2          DRM_IOR(0xB8, struct drm_mode_fb_cmd2
> instead?
> -Chris
> 
> -- 
> Chris Wilson, Intel Open Source Technology Centre

-- 
Ville Syrj�l�
Intel OTC

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
@ 2015-11-11 17:24     ` Ville Syrjälä
  0 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjälä @ 2015-11-11 17:24 UTC (permalink / raw)
  To: Chris Wilson, intel-gfx, Daniel Vetter, stable, dri-devel,
	Tvrtko Ursulin

On Wed, Nov 11, 2015 at 05:20:10PM +0000, Chris Wilson wrote:
> On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > 
> > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > into the new fb modifiers. We store the result in the passed in mode_cmd
> > structure. But that structure comes directly from the addfb2 ioctl, and
> > gets copied back out to userspace, which means we're clobbering the
> > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > flag wasn't even set by the user). Hence if the user reuses the struct
> > for another addfb2, the ioctl will be rejected since it's now asking for
> > some modifiers w/o the flag set.
> 
> What do we actually pass back to userspace through the struct?

The fb id.

> Do we
> just want to
> -#define DRM_IOCTL_MODE_ADDFB2          DRM_IOWR(0xB8, struct drm_mode_fb_cmd2)
> +#define DRM_IOCTL_MODE_ADDFB2          DRM_IOR(0xB8, struct drm_mode_fb_cmd2
> instead?
> -Chris
> 
> -- 
> Chris Wilson, Intel Open Source Technology Centre

-- 
Ville Syrjälä
Intel OTC

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
  2015-11-11 17:24     ` Ville Syrjälä
@ 2015-11-11 17:36       ` Chris Wilson
  -1 siblings, 0 replies; 20+ messages in thread
From: Chris Wilson @ 2015-11-11 17:36 UTC (permalink / raw)
  To: Ville Syrjälä
  Cc: intel-gfx, Daniel Vetter, stable, dri-devel, Tvrtko Ursulin

On Wed, Nov 11, 2015 at 07:24:40PM +0200, Ville Syrj�l� wrote:
> On Wed, Nov 11, 2015 at 05:20:10PM +0000, Chris Wilson wrote:
> > On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > > From: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> > > 
> > > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > > into the new fb modifiers. We store the result in the passed in mode_cmd
> > > structure. But that structure comes directly from the addfb2 ioctl, and
> > > gets copied back out to userspace, which means we're clobbering the
> > > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > > flag wasn't even set by the user). Hence if the user reuses the struct
> > > for another addfb2, the ioctl will be rejected since it's now asking for
> > > some modifiers w/o the flag set.
> > 
> > What do we actually pass back to userspace through the struct?
> 
> The fb id.

D'oh. Time to step away from the computer...
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
@ 2015-11-11 17:36       ` Chris Wilson
  0 siblings, 0 replies; 20+ messages in thread
From: Chris Wilson @ 2015-11-11 17:36 UTC (permalink / raw)
  To: Ville Syrjälä
  Cc: Daniel Vetter, intel-gfx, dri-devel, stable, Tvrtko Ursulin

On Wed, Nov 11, 2015 at 07:24:40PM +0200, Ville Syrjälä wrote:
> On Wed, Nov 11, 2015 at 05:20:10PM +0000, Chris Wilson wrote:
> > On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > > 
> > > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > > into the new fb modifiers. We store the result in the passed in mode_cmd
> > > structure. But that structure comes directly from the addfb2 ioctl, and
> > > gets copied back out to userspace, which means we're clobbering the
> > > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > > flag wasn't even set by the user). Hence if the user reuses the struct
> > > for another addfb2, the ioctl will be rejected since it's now asking for
> > > some modifiers w/o the flag set.
> > 
> > What do we actually pass back to userspace through the struct?
> 
> The fb id.

D'oh. Time to step away from the computer...
-Chris

-- 
Chris Wilson, Intel Open Source Technology Centre
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create()
  2015-11-11 17:11 ` [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create() ville.syrjala
@ 2015-11-16 15:20   ` Tvrtko Ursulin
  2015-11-17  9:48   ` [Intel-gfx] " Daniel Vetter
  1 sibling, 0 replies; 20+ messages in thread
From: Tvrtko Ursulin @ 2015-11-16 15:20 UTC (permalink / raw)
  To: ville.syrjala, intel-gfx; +Cc: dri-devel


Hi,

On 11/11/15 17:11, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>
> Drivers shouldn't clobber the passed in addfb ioctl parameters.
> i915 was doing just that. To prevent it from happening again,
> pass the struct around as const, starting all the way from
> internal_framebuffer_create().

Would it be safer (const pointer is quite weak) and less invasive to 
make a copy of the struct at the DRM level, in 
internal_framebuffer_create, or alternatively one level up?

Regards,

Tvrtko

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
  2015-11-11 17:11 [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params ville.syrjala
@ 2015-11-17  9:47   ` Daniel Vetter
  2015-11-11 17:11 ` [PATCH i-g-t] tests/kms_addfb_basic: Add clobbered-modifier subtest ville.syrjala
                     ` (2 subsequent siblings)
  3 siblings, 0 replies; 20+ messages in thread
From: Daniel Vetter @ 2015-11-17  9:47 UTC (permalink / raw)
  To: ville.syrjala
  Cc: intel-gfx, dri-devel, stable, Daniel Vetter, Tvrtko Ursulin, Jani Nikula

On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> 
> We try to convert the old way of of specifying fb tiling (obj->tiling)
> into the new fb modifiers. We store the result in the passed in mode_cmd
> structure. But that structure comes directly from the addfb2 ioctl, and
> gets copied back out to userspace, which means we're clobbering the
> modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> flag wasn't even set by the user). Hence if the user reuses the struct
> for another addfb2, the ioctl will be rejected since it's now asking for
> some modifiers w/o the flag set.
> 
> Fix the problem by making a copy of the user provided structure. We can
> play any games we want with the copy.
> 
> Cc: stable@vger.kernel.org
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
> Testcase: igt/kms_addfb_basic/clobbered-modifier
> Signed-off-by: Ville Syrj�l� <ville.syrjala@linux.intel.com>

Out of curiosity: Where does this blow up? That should be added to the
commit message (so that people affected can match it up with this fix).
With that:

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>


> ---
>  drivers/gpu/drm/i915/intel_display.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index b5f7493..c3aa6f5 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -14578,17 +14578,18 @@ static int intel_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  intel_user_framebuffer_create(struct drm_device *dev,
>  			      struct drm_file *filp,
> -			      struct drm_mode_fb_cmd2 *mode_cmd)
> +			      struct drm_mode_fb_cmd2 *user_mode_cmd)
>  {
>  	struct drm_framebuffer *fb;
>  	struct drm_i915_gem_object *obj;
> +	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
>  
>  	obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
> -						mode_cmd->handles[0]));
> +						mode_cmd.handles[0]));
>  	if (&obj->base == NULL)
>  		return ERR_PTR(-ENOENT);
>  
> -	fb = intel_framebuffer_create(dev, mode_cmd, obj);
> +	fb = intel_framebuffer_create(dev, &mode_cmd, obj);
>  	if (IS_ERR(fb))
>  		drm_gem_object_unreference_unlocked(&obj->base);
>  
> -- 
> 2.4.10
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
@ 2015-11-17  9:47   ` Daniel Vetter
  0 siblings, 0 replies; 20+ messages in thread
From: Daniel Vetter @ 2015-11-17  9:47 UTC (permalink / raw)
  To: ville.syrjala; +Cc: dri-devel, Tvrtko Ursulin, Daniel Vetter, intel-gfx, stable

On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> We try to convert the old way of of specifying fb tiling (obj->tiling)
> into the new fb modifiers. We store the result in the passed in mode_cmd
> structure. But that structure comes directly from the addfb2 ioctl, and
> gets copied back out to userspace, which means we're clobbering the
> modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> flag wasn't even set by the user). Hence if the user reuses the struct
> for another addfb2, the ioctl will be rejected since it's now asking for
> some modifiers w/o the flag set.
> 
> Fix the problem by making a copy of the user provided structure. We can
> play any games we want with the copy.
> 
> Cc: stable@vger.kernel.org
> Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
> Testcase: igt/kms_addfb_basic/clobbered-modifier
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>

Out of curiosity: Where does this blow up? That should be added to the
commit message (so that people affected can match it up with this fix).
With that:

Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>


> ---
>  drivers/gpu/drm/i915/intel_display.c | 7 ++++---
>  1 file changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index b5f7493..c3aa6f5 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -14578,17 +14578,18 @@ static int intel_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  intel_user_framebuffer_create(struct drm_device *dev,
>  			      struct drm_file *filp,
> -			      struct drm_mode_fb_cmd2 *mode_cmd)
> +			      struct drm_mode_fb_cmd2 *user_mode_cmd)
>  {
>  	struct drm_framebuffer *fb;
>  	struct drm_i915_gem_object *obj;
> +	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
>  
>  	obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
> -						mode_cmd->handles[0]));
> +						mode_cmd.handles[0]));
>  	if (&obj->base == NULL)
>  		return ERR_PTR(-ENOENT);
>  
> -	fb = intel_framebuffer_create(dev, mode_cmd, obj);
> +	fb = intel_framebuffer_create(dev, &mode_cmd, obj);
>  	if (IS_ERR(fb))
>  		drm_gem_object_unreference_unlocked(&obj->base);
>  
> -- 
> 2.4.10
> 

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Intel-gfx] [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create()
  2015-11-11 17:11 ` [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create() ville.syrjala
  2015-11-16 15:20   ` Tvrtko Ursulin
@ 2015-11-17  9:48   ` Daniel Vetter
  2015-11-17 13:30     ` John Harrison
  1 sibling, 1 reply; 20+ messages in thread
From: Daniel Vetter @ 2015-11-17  9:48 UTC (permalink / raw)
  To: ville.syrjala; +Cc: intel-gfx, dri-devel

On Wed, Nov 11, 2015 at 07:11:29PM +0200, ville.syrjala@linux.intel.com wrote:
> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Drivers shouldn't clobber the passed in addfb ioctl parameters.
> i915 was doing just that. To prevent it from happening again,
> pass the struct around as const, starting all the way from
> internal_framebuffer_create().
> 
> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> ---
> I tried to cross-compile everything, and didn't get any failures,
> but I'm not 100% sure I caught every driver.

Applied to drm-misc. With a bit of soaking that should catch anything
missed.
-Daniel

> ---
>  drivers/gpu/drm/amd/amdgpu/amdgpu_display.c  | 4 ++--
>  drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h     | 2 +-
>  drivers/gpu/drm/armada/armada_fb.c           | 4 ++--
>  drivers/gpu/drm/armada/armada_fb.h           | 2 +-
>  drivers/gpu/drm/ast/ast_drv.h                | 2 +-
>  drivers/gpu/drm/ast/ast_fb.c                 | 2 +-
>  drivers/gpu/drm/ast/ast_main.c               | 4 ++--
>  drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 2 +-
>  drivers/gpu/drm/bochs/bochs.h                | 2 +-
>  drivers/gpu/drm/bochs/bochs_fbdev.c          | 2 +-
>  drivers/gpu/drm/bochs/bochs_mm.c             | 4 ++--
>  drivers/gpu/drm/cirrus/cirrus_drv.h          | 2 +-
>  drivers/gpu/drm/cirrus/cirrus_fbdev.c        | 2 +-
>  drivers/gpu/drm/cirrus/cirrus_main.c         | 4 ++--
>  drivers/gpu/drm/drm_crtc.c                   | 4 ++--
>  drivers/gpu/drm/drm_crtc_helper.c            | 2 +-
>  drivers/gpu/drm/drm_fb_cma_helper.c          | 4 ++--
>  drivers/gpu/drm/exynos/exynos_drm_fb.c       | 4 ++--
>  drivers/gpu/drm/exynos/exynos_drm_fb.h       | 2 +-
>  drivers/gpu/drm/gma500/framebuffer.c         | 6 +++---
>  drivers/gpu/drm/i915/intel_display.c         | 2 +-
>  drivers/gpu/drm/mgag200/mgag200_drv.h        | 2 +-
>  drivers/gpu/drm/mgag200/mgag200_fb.c         | 2 +-
>  drivers/gpu/drm/mgag200/mgag200_main.c       | 4 ++--
>  drivers/gpu/drm/msm/msm_drv.h                | 4 ++--
>  drivers/gpu/drm/msm/msm_fb.c                 | 4 ++--
>  drivers/gpu/drm/nouveau/nouveau_display.c    | 4 ++--
>  drivers/gpu/drm/nouveau/nouveau_display.h    | 2 +-
>  drivers/gpu/drm/omapdrm/omap_drv.h           | 6 +++---
>  drivers/gpu/drm/omapdrm/omap_fb.c            | 4 ++--
>  drivers/gpu/drm/qxl/qxl_display.c            | 4 ++--
>  drivers/gpu/drm/qxl/qxl_drv.h                | 2 +-
>  drivers/gpu/drm/qxl/qxl_fb.c                 | 2 +-
>  drivers/gpu/drm/radeon/radeon_display.c      | 4 ++--
>  drivers/gpu/drm/radeon/radeon_mode.h         | 2 +-
>  drivers/gpu/drm/rcar-du/rcar_du_kms.c        | 2 +-
>  drivers/gpu/drm/rockchip/rockchip_drm_fb.c   | 6 +++---
>  drivers/gpu/drm/rockchip/rockchip_drm_fb.h   | 2 +-
>  drivers/gpu/drm/shmobile/shmob_drm_kms.c     | 2 +-
>  drivers/gpu/drm/tegra/drm.h                  | 2 +-
>  drivers/gpu/drm/tegra/fb.c                   | 4 ++--
>  drivers/gpu/drm/tilcdc/tilcdc_drv.c          | 2 +-
>  drivers/gpu/drm/udl/udl_drv.h                | 2 +-
>  drivers/gpu/drm/udl/udl_fb.c                 | 4 ++--
>  drivers/gpu/drm/virtio/virtgpu_display.c     | 4 ++--
>  drivers/gpu/drm/virtio/virtgpu_drv.h         | 2 +-
>  drivers/gpu/drm/vmwgfx/vmwgfx_kms.c          | 2 +-
>  include/drm/drm_crtc.h                       | 2 +-
>  include/drm/drm_crtc_helper.h                | 2 +-
>  include/drm/drm_fb_cma_helper.h              | 2 +-
>  50 files changed, 74 insertions(+), 74 deletions(-)
> 
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> index e173a5a..7d5e058 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
> @@ -481,7 +481,7 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
>  int
>  amdgpu_framebuffer_init(struct drm_device *dev,
>  			struct amdgpu_framebuffer *rfb,
> -			struct drm_mode_fb_cmd2 *mode_cmd,
> +			const struct drm_mode_fb_cmd2 *mode_cmd,
>  			struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -498,7 +498,7 @@ amdgpu_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  amdgpu_user_framebuffer_create(struct drm_device *dev,
>  			       struct drm_file *file_priv,
> -			       struct drm_mode_fb_cmd2 *mode_cmd)
> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj;
>  	struct amdgpu_framebuffer *amdgpu_fb;
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> index b62c171..de452996 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
> @@ -551,7 +551,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
>  
>  int amdgpu_framebuffer_init(struct drm_device *dev,
>  			     struct amdgpu_framebuffer *rfb,
> -			     struct drm_mode_fb_cmd2 *mode_cmd,
> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>  			     struct drm_gem_object *obj);
>  
>  int amdgpufb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
> diff --git a/drivers/gpu/drm/armada/armada_fb.c b/drivers/gpu/drm/armada/armada_fb.c
> index 1c90969..5fa4bf2 100644
> --- a/drivers/gpu/drm/armada/armada_fb.c
> +++ b/drivers/gpu/drm/armada/armada_fb.c
> @@ -35,7 +35,7 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
>  };
>  
>  struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
> -	struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
> +	const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
>  {
>  	struct armada_framebuffer *dfb;
>  	uint8_t format, config;
> @@ -101,7 +101,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
>  }
>  
>  static struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
> -	struct drm_file *dfile, struct drm_mode_fb_cmd2 *mode)
> +	struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
>  {
>  	struct armada_gem_object *obj;
>  	struct armada_framebuffer *dfb;
> diff --git a/drivers/gpu/drm/armada/armada_fb.h b/drivers/gpu/drm/armada/armada_fb.h
> index ce3f12e..48073c4 100644
> --- a/drivers/gpu/drm/armada/armada_fb.h
> +++ b/drivers/gpu/drm/armada/armada_fb.h
> @@ -19,6 +19,6 @@ struct armada_framebuffer {
>  #define drm_fb_obj(fb) drm_fb_to_armada_fb(fb)->obj
>  
>  struct armada_framebuffer *armada_framebuffer_create(struct drm_device *,
> -	struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
> +	const struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
>  
>  #endif
> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
> index 05f6522..e227f8a 100644
> --- a/drivers/gpu/drm/ast/ast_drv.h
> +++ b/drivers/gpu/drm/ast/ast_drv.h
> @@ -309,7 +309,7 @@ extern void ast_mode_fini(struct drm_device *dev);
>  
>  int ast_framebuffer_init(struct drm_device *dev,
>  			 struct ast_framebuffer *ast_fb,
> -			 struct drm_mode_fb_cmd2 *mode_cmd,
> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>  			 struct drm_gem_object *obj);
>  
>  int ast_fbdev_init(struct drm_device *dev);
> diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
> index a37e7ea..5320f8c 100644
> --- a/drivers/gpu/drm/ast/ast_fb.c
> +++ b/drivers/gpu/drm/ast/ast_fb.c
> @@ -163,7 +163,7 @@ static struct fb_ops astfb_ops = {
>  };
>  
>  static int astfb_create_object(struct ast_fbdev *afbdev,
> -			       struct drm_mode_fb_cmd2 *mode_cmd,
> +			       const struct drm_mode_fb_cmd2 *mode_cmd,
>  			       struct drm_gem_object **gobj_p)
>  {
>  	struct drm_device *dev = afbdev->helper.dev;
> diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
> index 541a610..9759009 100644
> --- a/drivers/gpu/drm/ast/ast_main.c
> +++ b/drivers/gpu/drm/ast/ast_main.c
> @@ -309,7 +309,7 @@ static const struct drm_framebuffer_funcs ast_fb_funcs = {
>  
>  int ast_framebuffer_init(struct drm_device *dev,
>  			 struct ast_framebuffer *ast_fb,
> -			 struct drm_mode_fb_cmd2 *mode_cmd,
> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>  			 struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -327,7 +327,7 @@ int ast_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  ast_user_framebuffer_create(struct drm_device *dev,
>  	       struct drm_file *filp,
> -	       struct drm_mode_fb_cmd2 *mode_cmd)
> +	       const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj;
>  	struct ast_framebuffer *ast_fb;
> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
> index 244df0a..8168954 100644
> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
> @@ -402,7 +402,7 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data)
>  }
>  
>  static struct drm_framebuffer *atmel_hlcdc_fb_create(struct drm_device *dev,
> -		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
> +		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	return drm_fb_cma_create(dev, file_priv, mode_cmd);
>  }
> diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
> index 71f2687..19b5ada 100644
> --- a/drivers/gpu/drm/bochs/bochs.h
> +++ b/drivers/gpu/drm/bochs/bochs.h
> @@ -149,7 +149,7 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
>  
>  int bochs_framebuffer_init(struct drm_device *dev,
>  			   struct bochs_framebuffer *gfb,
> -			   struct drm_mode_fb_cmd2 *mode_cmd,
> +			   const struct drm_mode_fb_cmd2 *mode_cmd,
>  			   struct drm_gem_object *obj);
>  int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr);
>  int bochs_bo_unpin(struct bochs_bo *bo);
> diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
> index 09a0637..7520bf8 100644
> --- a/drivers/gpu/drm/bochs/bochs_fbdev.c
> +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
> @@ -34,7 +34,7 @@ static struct fb_ops bochsfb_ops = {
>  };
>  
>  static int bochsfb_create_object(struct bochs_device *bochs,
> -				 struct drm_mode_fb_cmd2 *mode_cmd,
> +				 const struct drm_mode_fb_cmd2 *mode_cmd,
>  				 struct drm_gem_object **gobj_p)
>  {
>  	struct drm_device *dev = bochs->dev;
> diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
> index f69e6bf..d812ad0 100644
> --- a/drivers/gpu/drm/bochs/bochs_mm.c
> +++ b/drivers/gpu/drm/bochs/bochs_mm.c
> @@ -484,7 +484,7 @@ static const struct drm_framebuffer_funcs bochs_fb_funcs = {
>  
>  int bochs_framebuffer_init(struct drm_device *dev,
>  			   struct bochs_framebuffer *gfb,
> -			   struct drm_mode_fb_cmd2 *mode_cmd,
> +			   const struct drm_mode_fb_cmd2 *mode_cmd,
>  			   struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -502,7 +502,7 @@ int bochs_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  bochs_user_framebuffer_create(struct drm_device *dev,
>  			      struct drm_file *filp,
> -			      struct drm_mode_fb_cmd2 *mode_cmd)
> +			      const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj;
>  	struct bochs_framebuffer *bochs_fb;
> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
> index 7050615..1370a51 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
> @@ -207,7 +207,7 @@ int cirrus_dumb_create(struct drm_file *file,
>  
>  int cirrus_framebuffer_init(struct drm_device *dev,
>  			   struct cirrus_framebuffer *gfb,
> -			    struct drm_mode_fb_cmd2 *mode_cmd,
> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>  			    struct drm_gem_object *obj);
>  
>  bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height,
> diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> index 589103b..3b5be72 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
> @@ -135,7 +135,7 @@ static struct fb_ops cirrusfb_ops = {
>  };
>  
>  static int cirrusfb_create_object(struct cirrus_fbdev *afbdev,
> -			       struct drm_mode_fb_cmd2 *mode_cmd,
> +			       const struct drm_mode_fb_cmd2 *mode_cmd,
>  			       struct drm_gem_object **gobj_p)
>  {
>  	struct drm_device *dev = afbdev->helper.dev;
> diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
> index 055fd86..0907715 100644
> --- a/drivers/gpu/drm/cirrus/cirrus_main.c
> +++ b/drivers/gpu/drm/cirrus/cirrus_main.c
> @@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
>  
>  int cirrus_framebuffer_init(struct drm_device *dev,
>  			    struct cirrus_framebuffer *gfb,
> -			    struct drm_mode_fb_cmd2 *mode_cmd,
> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>  			    struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -47,7 +47,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  cirrus_user_framebuffer_create(struct drm_device *dev,
>  			       struct drm_file *filp,
> -			       struct drm_mode_fb_cmd2 *mode_cmd)
> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct cirrus_device *cdev = dev->dev_private;
>  	struct drm_gem_object *obj;
> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
> index 24c5434..32dd134 100644
> --- a/drivers/gpu/drm/drm_crtc.c
> +++ b/drivers/gpu/drm/drm_crtc.c
> @@ -45,7 +45,7 @@
>  
>  static struct drm_framebuffer *
>  internal_framebuffer_create(struct drm_device *dev,
> -			    struct drm_mode_fb_cmd2 *r,
> +			    const struct drm_mode_fb_cmd2 *r,
>  			    struct drm_file *file_priv);
>  
>  /* Avoid boilerplate.  I'm tired of typing. */
> @@ -3235,7 +3235,7 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
>  
>  static struct drm_framebuffer *
>  internal_framebuffer_create(struct drm_device *dev,
> -			    struct drm_mode_fb_cmd2 *r,
> +			    const struct drm_mode_fb_cmd2 *r,
>  			    struct drm_file *file_priv)
>  {
>  	struct drm_mode_config *config = &dev->mode_config;
> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
> index ef53475..6b4cf25 100644
> --- a/drivers/gpu/drm/drm_crtc_helper.c
> +++ b/drivers/gpu/drm/drm_crtc_helper.c
> @@ -818,7 +818,7 @@ EXPORT_SYMBOL(drm_helper_connector_dpms);
>   * metadata fields.
>   */
>  void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
> -				    struct drm_mode_fb_cmd2 *mode_cmd)
> +				    const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	int i;
>  
> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
> index c19a625..b7d5b84 100644
> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
> @@ -74,7 +74,7 @@ static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
>  };
>  
>  static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
> -	struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
> +	const const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
>  	unsigned int num_planes)
>  {
>  	struct drm_fb_cma *fb_cma;
> @@ -107,7 +107,7 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
>   * checked before calling this function.
>   */
>  struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
> -	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
> +	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_fb_cma *fb_cma;
>  	struct drm_gem_cma_object *objs[4];
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
> index fcea28b..49b9bc3 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
> @@ -117,7 +117,7 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
>  
>  struct drm_framebuffer *
>  exynos_drm_framebuffer_init(struct drm_device *dev,
> -			    struct drm_mode_fb_cmd2 *mode_cmd,
> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>  			    struct exynos_drm_gem **exynos_gem,
>  			    int count)
>  {
> @@ -154,7 +154,7 @@ err:
>  
>  static struct drm_framebuffer *
>  exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
> -		      struct drm_mode_fb_cmd2 *mode_cmd)
> +		      const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
>  	struct drm_gem_object *obj;
> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h
> index 726a2d4..a8a75ac 100644
> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h
> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h
> @@ -18,7 +18,7 @@
>  
>  struct drm_framebuffer *
>  exynos_drm_framebuffer_init(struct drm_device *dev,
> -			    struct drm_mode_fb_cmd2 *mode_cmd,
> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>  			    struct exynos_drm_gem **exynos_gem,
>  			    int count);
>  
> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
> index 2eaf1b3..dc0508d 100644
> --- a/drivers/gpu/drm/gma500/framebuffer.c
> +++ b/drivers/gpu/drm/gma500/framebuffer.c
> @@ -241,7 +241,7 @@ static struct fb_ops psbfb_unaccel_ops = {
>   */
>  static int psb_framebuffer_init(struct drm_device *dev,
>  					struct psb_framebuffer *fb,
> -					struct drm_mode_fb_cmd2 *mode_cmd,
> +					const struct drm_mode_fb_cmd2 *mode_cmd,
>  					struct gtt_range *gt)
>  {
>  	u32 bpp, depth;
> @@ -284,7 +284,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
>  
>  static struct drm_framebuffer *psb_framebuffer_create
>  			(struct drm_device *dev,
> -			 struct drm_mode_fb_cmd2 *mode_cmd,
> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>  			 struct gtt_range *gt)
>  {
>  	struct psb_framebuffer *fb;
> @@ -488,7 +488,7 @@ out_err1:
>   */
>  static struct drm_framebuffer *psb_user_framebuffer_create
>  			(struct drm_device *dev, struct drm_file *filp,
> -			 struct drm_mode_fb_cmd2 *cmd)
> +			 const struct drm_mode_fb_cmd2 *cmd)
>  {
>  	struct gtt_range *r;
>  	struct drm_gem_object *obj;
> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> index c3aa6f5..58dbac7 100644
> --- a/drivers/gpu/drm/i915/intel_display.c
> +++ b/drivers/gpu/drm/i915/intel_display.c
> @@ -14578,7 +14578,7 @@ static int intel_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  intel_user_framebuffer_create(struct drm_device *dev,
>  			      struct drm_file *filp,
> -			      struct drm_mode_fb_cmd2 *user_mode_cmd)
> +			      const struct drm_mode_fb_cmd2 *user_mode_cmd)
>  {
>  	struct drm_framebuffer *fb;
>  	struct drm_i915_gem_object *obj;
> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
> index 912151c..205b280 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
> @@ -252,7 +252,7 @@ void mgag200_fbdev_fini(struct mga_device *mdev);
>  				/* mgag200_main.c */
>  int mgag200_framebuffer_init(struct drm_device *dev,
>  			     struct mga_framebuffer *mfb,
> -			     struct drm_mode_fb_cmd2 *mode_cmd,
> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>  			     struct drm_gem_object *obj);
>  
>  
> diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
> index b35b5b2..d9b04b0 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_fb.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_fb.c
> @@ -138,7 +138,7 @@ static struct fb_ops mgag200fb_ops = {
>  };
>  
>  static int mgag200fb_create_object(struct mga_fbdev *afbdev,
> -				   struct drm_mode_fb_cmd2 *mode_cmd,
> +				   const struct drm_mode_fb_cmd2 *mode_cmd,
>  				   struct drm_gem_object **gobj_p)
>  {
>  	struct drm_device *dev = afbdev->helper.dev;
> diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
> index b1a0f56..9147444 100644
> --- a/drivers/gpu/drm/mgag200/mgag200_main.c
> +++ b/drivers/gpu/drm/mgag200/mgag200_main.c
> @@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs mga_fb_funcs = {
>  
>  int mgag200_framebuffer_init(struct drm_device *dev,
>  			     struct mga_framebuffer *gfb,
> -			     struct drm_mode_fb_cmd2 *mode_cmd,
> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>  			     struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -47,7 +47,7 @@ int mgag200_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  mgag200_user_framebuffer_create(struct drm_device *dev,
>  				struct drm_file *filp,
> -				struct drm_mode_fb_cmd2 *mode_cmd)
> +				const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj;
>  	struct mga_framebuffer *mga_fb;
> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
> index 3be7a56..9a713b7 100644
> --- a/drivers/gpu/drm/msm/msm_drv.h
> +++ b/drivers/gpu/drm/msm/msm_drv.h
> @@ -240,9 +240,9 @@ uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane);
>  struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
>  const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
>  struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>  struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
>  
>  struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
>  
> diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
> index 12171328..a474d6c 100644
> --- a/drivers/gpu/drm/msm/msm_fb.c
> +++ b/drivers/gpu/drm/msm/msm_fb.c
> @@ -138,7 +138,7 @@ const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb)
>  }
>  
>  struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *bos[4] = {0};
>  	struct drm_framebuffer *fb;
> @@ -168,7 +168,7 @@ out_unref:
>  }
>  
>  struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>  {
>  	struct msm_drm_private *priv = dev->dev_private;
>  	struct msm_kms *kms = priv->kms;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
> index db6bc67..ea9d3bc 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_display.c
> +++ b/drivers/gpu/drm/nouveau/nouveau_display.c
> @@ -246,7 +246,7 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
>  int
>  nouveau_framebuffer_init(struct drm_device *dev,
>  			 struct nouveau_framebuffer *nv_fb,
> -			 struct drm_mode_fb_cmd2 *mode_cmd,
> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>  			 struct nouveau_bo *nvbo)
>  {
>  	struct nouveau_display *disp = nouveau_display(dev);
> @@ -272,7 +272,7 @@ nouveau_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  nouveau_user_framebuffer_create(struct drm_device *dev,
>  				struct drm_file *file_priv,
> -				struct drm_mode_fb_cmd2 *mode_cmd)
> +				const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct nouveau_framebuffer *nouveau_fb;
>  	struct drm_gem_object *gem;
> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h
> index 856abe0..5a57d8b 100644
> --- a/drivers/gpu/drm/nouveau/nouveau_display.h
> +++ b/drivers/gpu/drm/nouveau/nouveau_display.h
> @@ -23,7 +23,7 @@ nouveau_framebuffer(struct drm_framebuffer *fb)
>  }
>  
>  int nouveau_framebuffer_init(struct drm_device *, struct nouveau_framebuffer *,
> -			     struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
> +			     const struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
>  
>  struct nouveau_page_flip_state {
>  	struct list_head head;
> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
> index 5c367aa..130fca7 100644
> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
> @@ -172,9 +172,9 @@ void copy_timings_drm_to_omap(struct omap_video_timings *timings,
>  uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
>  		uint32_t max_formats, enum omap_color_mode supported_modes);
>  struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
>  struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>  struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p);
>  int omap_framebuffer_pin(struct drm_framebuffer *fb);
>  void omap_framebuffer_unpin(struct drm_framebuffer *fb);
> @@ -248,7 +248,7 @@ struct omap_dss_device *omap_encoder_get_dssdev(struct drm_encoder *encoder);
>  
>  static inline int objects_lookup(struct drm_device *dev,
>  		struct drm_file *filp, uint32_t pixel_format,
> -		struct drm_gem_object **bos, uint32_t *handles)
> +		struct drm_gem_object **bos, const uint32_t *handles)
>  {
>  	int i, n = drm_format_num_planes(pixel_format);
>  
> diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
> index 636a1f9..ad202df 100644
> --- a/drivers/gpu/drm/omapdrm/omap_fb.c
> +++ b/drivers/gpu/drm/omapdrm/omap_fb.c
> @@ -364,7 +364,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
>  #endif
>  
>  struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *bos[4];
>  	struct drm_framebuffer *fb;
> @@ -386,7 +386,7 @@ struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>  }
>  
>  struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>  {
>  	struct omap_framebuffer *omap_fb = NULL;
>  	struct drm_framebuffer *fb = NULL;
> diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
> index 183aea1..cddba07 100644
> --- a/drivers/gpu/drm/qxl/qxl_display.c
> +++ b/drivers/gpu/drm/qxl/qxl_display.c
> @@ -521,7 +521,7 @@ static const struct drm_framebuffer_funcs qxl_fb_funcs = {
>  int
>  qxl_framebuffer_init(struct drm_device *dev,
>  		     struct qxl_framebuffer *qfb,
> -		     struct drm_mode_fb_cmd2 *mode_cmd,
> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>  		     struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -1003,7 +1003,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
>  static struct drm_framebuffer *
>  qxl_user_framebuffer_create(struct drm_device *dev,
>  			    struct drm_file *file_priv,
> -			    struct drm_mode_fb_cmd2 *mode_cmd)
> +			    const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj;
>  	struct qxl_framebuffer *qxl_fb;
> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
> index 01a8694..6e6b9b1 100644
> --- a/drivers/gpu/drm/qxl/qxl_drv.h
> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
> @@ -390,7 +390,7 @@ void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state);
>  int
>  qxl_framebuffer_init(struct drm_device *dev,
>  		     struct qxl_framebuffer *rfb,
> -		     struct drm_mode_fb_cmd2 *mode_cmd,
> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>  		     struct drm_gem_object *obj);
>  void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
>  void qxl_send_monitors_config(struct qxl_device *qdev);
> diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
> index c4a5526..11f543b 100644
> --- a/drivers/gpu/drm/qxl/qxl_fb.c
> +++ b/drivers/gpu/drm/qxl/qxl_fb.c
> @@ -283,7 +283,7 @@ int qxl_get_handle_for_primary_fb(struct qxl_device *qdev,
>  }
>  
>  static int qxlfb_create_pinned_object(struct qxl_fbdev *qfbdev,
> -				      struct drm_mode_fb_cmd2 *mode_cmd,
> +				      const struct drm_mode_fb_cmd2 *mode_cmd,
>  				      struct drm_gem_object **gobj_p)
>  {
>  	struct qxl_device *qdev = qfbdev->qdev;
> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
> index a8d9927..ded51fb 100644
> --- a/drivers/gpu/drm/radeon/radeon_display.c
> +++ b/drivers/gpu/drm/radeon/radeon_display.c
> @@ -1292,7 +1292,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
>  int
>  radeon_framebuffer_init(struct drm_device *dev,
>  			struct radeon_framebuffer *rfb,
> -			struct drm_mode_fb_cmd2 *mode_cmd,
> +			const struct drm_mode_fb_cmd2 *mode_cmd,
>  			struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -1309,7 +1309,7 @@ radeon_framebuffer_init(struct drm_device *dev,
>  static struct drm_framebuffer *
>  radeon_user_framebuffer_create(struct drm_device *dev,
>  			       struct drm_file *file_priv,
> -			       struct drm_mode_fb_cmd2 *mode_cmd)
> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj;
>  	struct radeon_framebuffer *radeon_fb;
> diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
> index 830e171..b8e3c27 100644
> --- a/drivers/gpu/drm/radeon/radeon_mode.h
> +++ b/drivers/gpu/drm/radeon/radeon_mode.h
> @@ -929,7 +929,7 @@ extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green
>  				     u16 *blue, int regno);
>  int radeon_framebuffer_init(struct drm_device *dev,
>  			     struct radeon_framebuffer *rfb,
> -			     struct drm_mode_fb_cmd2 *mode_cmd,
> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>  			     struct drm_gem_object *obj);
>  
>  int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> index ca12e8c..43bce69 100644
> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
> @@ -136,7 +136,7 @@ int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
>  
>  static struct drm_framebuffer *
>  rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
> -		  struct drm_mode_fb_cmd2 *mode_cmd)
> +		  const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct rcar_du_device *rcdu = dev->dev_private;
>  	const struct rcar_du_format_info *format;
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> index 002645b..b8ac591 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
> @@ -72,7 +72,7 @@ static struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
>  };
>  
>  static struct rockchip_drm_fb *
> -rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
> +rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
>  		  struct drm_gem_object **obj, unsigned int num_planes)
>  {
>  	struct rockchip_drm_fb *rockchip_fb;
> @@ -102,7 +102,7 @@ rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
>  
>  static struct drm_framebuffer *
>  rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
> -			struct drm_mode_fb_cmd2 *mode_cmd)
> +			const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct rockchip_drm_fb *rockchip_fb;
>  	struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER];
> @@ -173,7 +173,7 @@ static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
>  
>  struct drm_framebuffer *
>  rockchip_drm_framebuffer_init(struct drm_device *dev,
> -			      struct drm_mode_fb_cmd2 *mode_cmd,
> +			      const struct drm_mode_fb_cmd2 *mode_cmd,
>  			      struct drm_gem_object *obj)
>  {
>  	struct rockchip_drm_fb *rockchip_fb;
> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
> index 09574d4..2fe47f1 100644
> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
> @@ -17,7 +17,7 @@
>  
>  struct drm_framebuffer *
>  rockchip_drm_framebuffer_init(struct drm_device *dev,
> -			      struct drm_mode_fb_cmd2 *mode_cmd,
> +			      const struct drm_mode_fb_cmd2 *mode_cmd,
>  			      struct drm_gem_object *obj);
>  void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb);
>  
> diff --git a/drivers/gpu/drm/shmobile/shmob_drm_kms.c b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
> index aaf98ac..388a0fc 100644
> --- a/drivers/gpu/drm/shmobile/shmob_drm_kms.c
> +++ b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
> @@ -104,7 +104,7 @@ const struct shmob_drm_format_info *shmob_drm_format_info(u32 fourcc)
>  
>  static struct drm_framebuffer *
>  shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
> -		    struct drm_mode_fb_cmd2 *mode_cmd)
> +		    const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	const struct shmob_drm_format_info *format;
>  
> diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
> index 942cad9..d88a2d1 100644
> --- a/drivers/gpu/drm/tegra/drm.h
> +++ b/drivers/gpu/drm/tegra/drm.h
> @@ -268,7 +268,7 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
>  			struct tegra_bo_tiling *tiling);
>  struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>  					struct drm_file *file,
> -					struct drm_mode_fb_cmd2 *cmd);
> +					const struct drm_mode_fb_cmd2 *cmd);
>  int tegra_drm_fb_prepare(struct drm_device *drm);
>  void tegra_drm_fb_free(struct drm_device *drm);
>  int tegra_drm_fb_init(struct drm_device *drm);
> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
> index bec07d9..ede9e94 100644
> --- a/drivers/gpu/drm/tegra/fb.c
> +++ b/drivers/gpu/drm/tegra/fb.c
> @@ -92,7 +92,7 @@ static struct drm_framebuffer_funcs tegra_fb_funcs = {
>  };
>  
>  static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
> -				       struct drm_mode_fb_cmd2 *mode_cmd,
> +				       const struct drm_mode_fb_cmd2 *mode_cmd,
>  				       struct tegra_bo **planes,
>  				       unsigned int num_planes)
>  {
> @@ -131,7 +131,7 @@ static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
>  
>  struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>  					struct drm_file *file,
> -					struct drm_mode_fb_cmd2 *cmd)
> +					const struct drm_mode_fb_cmd2 *cmd)
>  {
>  	unsigned int hsub, vsub, i;
>  	struct tegra_bo *planes[4];
> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
> index 876cad5..4ddb21e 100644
> --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
> +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
> @@ -46,7 +46,7 @@ void tilcdc_module_cleanup(struct tilcdc_module *mod)
>  static struct of_device_id tilcdc_of_match[];
>  
>  static struct drm_framebuffer *tilcdc_fb_create(struct drm_device *dev,
> -		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
> +		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	return drm_fb_cma_create(dev, file_priv, mode_cmd);
>  }
> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
> index 80adbac..4a064ef 100644
> --- a/drivers/gpu/drm/udl/udl_drv.h
> +++ b/drivers/gpu/drm/udl/udl_drv.h
> @@ -108,7 +108,7 @@ void udl_fbdev_unplug(struct drm_device *dev);
>  struct drm_framebuffer *
>  udl_fb_user_fb_create(struct drm_device *dev,
>  		      struct drm_file *file,
> -		      struct drm_mode_fb_cmd2 *mode_cmd);
> +		      const struct drm_mode_fb_cmd2 *mode_cmd);
>  
>  int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr,
>  		     const char *front, char **urb_buf_ptr,
> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
> index 62c7b1d..f09b11a 100644
> --- a/drivers/gpu/drm/udl/udl_fb.c
> +++ b/drivers/gpu/drm/udl/udl_fb.c
> @@ -456,7 +456,7 @@ static const struct drm_framebuffer_funcs udlfb_funcs = {
>  static int
>  udl_framebuffer_init(struct drm_device *dev,
>  		     struct udl_framebuffer *ufb,
> -		     struct drm_mode_fb_cmd2 *mode_cmd,
> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>  		     struct udl_gem_object *obj)
>  {
>  	int ret;
> @@ -624,7 +624,7 @@ void udl_fbdev_unplug(struct drm_device *dev)
>  struct drm_framebuffer *
>  udl_fb_user_fb_create(struct drm_device *dev,
>  		   struct drm_file *file,
> -		   struct drm_mode_fb_cmd2 *mode_cmd)
> +		   const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj;
>  	struct udl_framebuffer *ufb;
> diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
> index f545913..306a7df 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_display.c
> +++ b/drivers/gpu/drm/virtio/virtgpu_display.c
> @@ -215,7 +215,7 @@ static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = {
>  int
>  virtio_gpu_framebuffer_init(struct drm_device *dev,
>  			    struct virtio_gpu_framebuffer *vgfb,
> -			    struct drm_mode_fb_cmd2 *mode_cmd,
> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>  			    struct drm_gem_object *obj)
>  {
>  	int ret;
> @@ -465,7 +465,7 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
>  static struct drm_framebuffer *
>  virtio_gpu_user_framebuffer_create(struct drm_device *dev,
>  				   struct drm_file *file_priv,
> -				   struct drm_mode_fb_cmd2 *mode_cmd)
> +				   const struct drm_mode_fb_cmd2 *mode_cmd)
>  {
>  	struct drm_gem_object *obj = NULL;
>  	struct virtio_gpu_framebuffer *virtio_gpu_fb;
> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
> index 79f0abe..8f486f4 100644
> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
> @@ -328,7 +328,7 @@ void virtio_gpu_dequeue_fence_func(struct work_struct *work);
>  /* virtio_gpu_display.c */
>  int virtio_gpu_framebuffer_init(struct drm_device *dev,
>  				struct virtio_gpu_framebuffer *vgfb,
> -				struct drm_mode_fb_cmd2 *mode_cmd,
> +				const struct drm_mode_fb_cmd2 *mode_cmd,
>  				struct drm_gem_object *obj);
>  int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
>  void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> index 9fcd7f8..e38db351 100644
> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
> @@ -930,7 +930,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
>  
>  static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
>  						 struct drm_file *file_priv,
> -						 struct drm_mode_fb_cmd2 *mode_cmd2)
> +						 const struct drm_mode_fb_cmd2 *mode_cmd2)
>  {
>  	struct vmw_private *dev_priv = vmw_priv(dev);
>  	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
> index 3f0c690..bd27364 100644
> --- a/include/drm/drm_crtc.h
> +++ b/include/drm/drm_crtc.h
> @@ -992,7 +992,7 @@ struct drm_mode_set {
>  struct drm_mode_config_funcs {
>  	struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
>  					     struct drm_file *file_priv,
> -					     struct drm_mode_fb_cmd2 *mode_cmd);
> +					     const struct drm_mode_fb_cmd2 *mode_cmd);
>  	void (*output_poll_changed)(struct drm_device *dev);
>  
>  	int (*atomic_check)(struct drm_device *dev,
> diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
> index 3febb4b..e22ab29 100644
> --- a/include/drm/drm_crtc_helper.h
> +++ b/include/drm/drm_crtc_helper.h
> @@ -197,7 +197,7 @@ extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
>  extern void drm_helper_move_panel_connectors_to_head(struct drm_device *);
>  
>  extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
> -					   struct drm_mode_fb_cmd2 *mode_cmd);
> +					   const struct drm_mode_fb_cmd2 *mode_cmd);
>  
>  static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
>  				       const struct drm_crtc_helper_funcs *funcs)
> diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h
> index c54cf3d..be62bd3 100644
> --- a/include/drm/drm_fb_cma_helper.h
> +++ b/include/drm/drm_fb_cma_helper.h
> @@ -18,7 +18,7 @@ void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
>  void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
>  
>  struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
> -	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd);
> +	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
>  
>  struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
>  	unsigned int plane);
> -- 
> 2.4.10
> 
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
  2015-11-17  9:47   ` Daniel Vetter
@ 2015-11-17 11:04     ` Ville Syrjälä
  -1 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjälä @ 2015-11-17 11:04 UTC (permalink / raw)
  To: Daniel Vetter
  Cc: intel-gfx, dri-devel, stable, Daniel Vetter, Tvrtko Ursulin, Jani Nikula

On Tue, Nov 17, 2015 at 10:47:06AM +0100, Daniel Vetter wrote:
> On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> > 
> > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > into the new fb modifiers. We store the result in the passed in mode_cmd
> > structure. But that structure comes directly from the addfb2 ioctl, and
> > gets copied back out to userspace, which means we're clobbering the
> > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > flag wasn't even set by the user). Hence if the user reuses the struct
> > for another addfb2, the ioctl will be rejected since it's now asking for
> > some modifiers w/o the flag set.
> > 
> > Fix the problem by making a copy of the user provided structure. We can
> > play any games we want with the copy.
> > 
> > Cc: stable@vger.kernel.org
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
> > Testcase: igt/kms_addfb_basic/clobbered-modifier
> > Signed-off-by: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> 
> Out of curiosity: Where does this blow up? That should be added to the
> commit message (so that people affected can match it up with this fix).

I don't know that it affects any actual users. The way I caught this was
running kms_addfb_basic. One of the subtests failed when I ran the full
test, but if I ran only the specific subtest it was fine. So the
modifiers got clobbered by the previous subtest. I already forgot which
subtest it was, but it's easy enough to track it down again.

> With that:
> 
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> 
> 
> > ---
> >  drivers/gpu/drm/i915/intel_display.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index b5f7493..c3aa6f5 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -14578,17 +14578,18 @@ static int intel_framebuffer_init(struct drm_device *dev,
> >  static struct drm_framebuffer *
> >  intel_user_framebuffer_create(struct drm_device *dev,
> >  			      struct drm_file *filp,
> > -			      struct drm_mode_fb_cmd2 *mode_cmd)
> > +			      struct drm_mode_fb_cmd2 *user_mode_cmd)
> >  {
> >  	struct drm_framebuffer *fb;
> >  	struct drm_i915_gem_object *obj;
> > +	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
> >  
> >  	obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
> > -						mode_cmd->handles[0]));
> > +						mode_cmd.handles[0]));
> >  	if (&obj->base == NULL)
> >  		return ERR_PTR(-ENOENT);
> >  
> > -	fb = intel_framebuffer_create(dev, mode_cmd, obj);
> > +	fb = intel_framebuffer_create(dev, &mode_cmd, obj);
> >  	if (IS_ERR(fb))
> >  		drm_gem_object_unreference_unlocked(&obj->base);
> >  
> > -- 
> > 2.4.10
> > 
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch

-- 
Ville Syrj�l�
Intel OTC

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
@ 2015-11-17 11:04     ` Ville Syrjälä
  0 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjälä @ 2015-11-17 11:04 UTC (permalink / raw)
  To: Daniel Vetter
  Cc: intel-gfx, dri-devel, stable, Daniel Vetter, Tvrtko Ursulin, Jani Nikula

On Tue, Nov 17, 2015 at 10:47:06AM +0100, Daniel Vetter wrote:
> On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > 
> > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > into the new fb modifiers. We store the result in the passed in mode_cmd
> > structure. But that structure comes directly from the addfb2 ioctl, and
> > gets copied back out to userspace, which means we're clobbering the
> > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > flag wasn't even set by the user). Hence if the user reuses the struct
> > for another addfb2, the ioctl will be rejected since it's now asking for
> > some modifiers w/o the flag set.
> > 
> > Fix the problem by making a copy of the user provided structure. We can
> > play any games we want with the copy.
> > 
> > Cc: stable@vger.kernel.org
> > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
> > Testcase: igt/kms_addfb_basic/clobbered-modifier
> > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> 
> Out of curiosity: Where does this blow up? That should be added to the
> commit message (so that people affected can match it up with this fix).

I don't know that it affects any actual users. The way I caught this was
running kms_addfb_basic. One of the subtests failed when I ran the full
test, but if I ran only the specific subtest it was fine. So the
modifiers got clobbered by the previous subtest. I already forgot which
subtest it was, but it's easy enough to track it down again.

> With that:
> 
> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> 
> 
> > ---
> >  drivers/gpu/drm/i915/intel_display.c | 7 ++++---
> >  1 file changed, 4 insertions(+), 3 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > index b5f7493..c3aa6f5 100644
> > --- a/drivers/gpu/drm/i915/intel_display.c
> > +++ b/drivers/gpu/drm/i915/intel_display.c
> > @@ -14578,17 +14578,18 @@ static int intel_framebuffer_init(struct drm_device *dev,
> >  static struct drm_framebuffer *
> >  intel_user_framebuffer_create(struct drm_device *dev,
> >  			      struct drm_file *filp,
> > -			      struct drm_mode_fb_cmd2 *mode_cmd)
> > +			      struct drm_mode_fb_cmd2 *user_mode_cmd)
> >  {
> >  	struct drm_framebuffer *fb;
> >  	struct drm_i915_gem_object *obj;
> > +	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
> >  
> >  	obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
> > -						mode_cmd->handles[0]));
> > +						mode_cmd.handles[0]));
> >  	if (&obj->base == NULL)
> >  		return ERR_PTR(-ENOENT);
> >  
> > -	fb = intel_framebuffer_create(dev, mode_cmd, obj);
> > +	fb = intel_framebuffer_create(dev, &mode_cmd, obj);
> >  	if (IS_ERR(fb))
> >  		drm_gem_object_unreference_unlocked(&obj->base);
> >  
> > -- 
> > 2.4.10
> > 
> 
> -- 
> Daniel Vetter
> Software Engineer, Intel Corporation
> http://blog.ffwll.ch

-- 
Ville Syrjälä
Intel OTC

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Intel-gfx] [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
  2015-11-17 11:04     ` Ville Syrjälä
@ 2015-11-17 13:00       ` Ville Syrjälä
  -1 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjälä @ 2015-11-17 13:00 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: dri-devel, Daniel Vetter, intel-gfx, stable

On Tue, Nov 17, 2015 at 01:04:21PM +0200, Ville Syrj�l� wrote:
> On Tue, Nov 17, 2015 at 10:47:06AM +0100, Daniel Vetter wrote:
> > On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > > From: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> > > 
> > > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > > into the new fb modifiers. We store the result in the passed in mode_cmd
> > > structure. But that structure comes directly from the addfb2 ioctl, and
> > > gets copied back out to userspace, which means we're clobbering the
> > > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > > flag wasn't even set by the user). Hence if the user reuses the struct
> > > for another addfb2, the ioctl will be rejected since it's now asking for
> > > some modifiers w/o the flag set.
> > > 
> > > Fix the problem by making a copy of the user provided structure. We can
> > > play any games we want with the copy.
> > > 
> > > Cc: stable@vger.kernel.org
> > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > > Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
> > > Testcase: igt/kms_addfb_basic/clobbered-modifier
> > > Signed-off-by: Ville Syrj�l� <ville.syrjala@linux.intel.com>
> > 
> > Out of curiosity: Where does this blow up? That should be added to the
> > commit message (so that people affected can match it up with this fix).
> 
> I don't know that it affects any actual users. The way I caught this was
> running kms_addfb_basic. One of the subtests failed when I ran the full
> test, but if I ran only the specific subtest it was fine. So the
> modifiers got clobbered by the previous subtest. I already forgot which
> subtest it was, but it's easy enough to track it down again.

# ./tests/kms_addfb_basic 
IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
...
Subtest basic-X-tiled: SUCCESS (0.001s)
Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
Last errno: 22, Invalid argument
Stack trace:
  #0 [__igt_fail_assert+0x101]
  #1 [pitch_tests+0x619]
  #2 [__real_main426+0x2f]
  #3 [main+0x23]
  #4 [__libc_start_main+0xf0]
  #5 [_start+0x29]
  #6 [<unknown>+0x29]
Subtest framebuffer-vs-set-tiling failed.
**** DEBUG ****
Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
Last errno: 22, Invalid argument
****  END  ****
Subtest framebuffer-vs-set-tiling: FAIL (0.003s)
...

# ./tests/kms_addfb_basic --r framebuffer-vs-set-tiling
IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
Subtest framebuffer-vs-set-tiling: SUCCESS (0.000s)

> 
> > With that:
> > 
> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> > 
> > 
> > > ---
> > >  drivers/gpu/drm/i915/intel_display.c | 7 ++++---
> > >  1 file changed, 4 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > > index b5f7493..c3aa6f5 100644
> > > --- a/drivers/gpu/drm/i915/intel_display.c
> > > +++ b/drivers/gpu/drm/i915/intel_display.c
> > > @@ -14578,17 +14578,18 @@ static int intel_framebuffer_init(struct drm_device *dev,
> > >  static struct drm_framebuffer *
> > >  intel_user_framebuffer_create(struct drm_device *dev,
> > >  			      struct drm_file *filp,
> > > -			      struct drm_mode_fb_cmd2 *mode_cmd)
> > > +			      struct drm_mode_fb_cmd2 *user_mode_cmd)
> > >  {
> > >  	struct drm_framebuffer *fb;
> > >  	struct drm_i915_gem_object *obj;
> > > +	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
> > >  
> > >  	obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
> > > -						mode_cmd->handles[0]));
> > > +						mode_cmd.handles[0]));
> > >  	if (&obj->base == NULL)
> > >  		return ERR_PTR(-ENOENT);
> > >  
> > > -	fb = intel_framebuffer_create(dev, mode_cmd, obj);
> > > +	fb = intel_framebuffer_create(dev, &mode_cmd, obj);
> > >  	if (IS_ERR(fb))
> > >  		drm_gem_object_unreference_unlocked(&obj->base);
> > >  
> > > -- 
> > > 2.4.10
> > > 
> > 
> > -- 
> > Daniel Vetter
> > Software Engineer, Intel Corporation
> > http://blog.ffwll.ch
> 
> -- 
> Ville Syrj�l�
> Intel OTC
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrj�l�
Intel OTC

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Intel-gfx] [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
@ 2015-11-17 13:00       ` Ville Syrjälä
  0 siblings, 0 replies; 20+ messages in thread
From: Ville Syrjälä @ 2015-11-17 13:00 UTC (permalink / raw)
  To: Daniel Vetter; +Cc: dri-devel, Daniel Vetter, intel-gfx, stable

On Tue, Nov 17, 2015 at 01:04:21PM +0200, Ville Syrjälä wrote:
> On Tue, Nov 17, 2015 at 10:47:06AM +0100, Daniel Vetter wrote:
> > On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
> > > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > > 
> > > We try to convert the old way of of specifying fb tiling (obj->tiling)
> > > into the new fb modifiers. We store the result in the passed in mode_cmd
> > > structure. But that structure comes directly from the addfb2 ioctl, and
> > > gets copied back out to userspace, which means we're clobbering the
> > > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
> > > flag wasn't even set by the user). Hence if the user reuses the struct
> > > for another addfb2, the ioctl will be rejected since it's now asking for
> > > some modifiers w/o the flag set.
> > > 
> > > Fix the problem by making a copy of the user provided structure. We can
> > > play any games we want with the copy.
> > > 
> > > Cc: stable@vger.kernel.org
> > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
> > > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
> > > Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
> > > Testcase: igt/kms_addfb_basic/clobbered-modifier
> > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
> > 
> > Out of curiosity: Where does this blow up? That should be added to the
> > commit message (so that people affected can match it up with this fix).
> 
> I don't know that it affects any actual users. The way I caught this was
> running kms_addfb_basic. One of the subtests failed when I ran the full
> test, but if I ran only the specific subtest it was fine. So the
> modifiers got clobbered by the previous subtest. I already forgot which
> subtest it was, but it's easy enough to track it down again.

# ./tests/kms_addfb_basic 
IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
...
Subtest basic-X-tiled: SUCCESS (0.001s)
Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
Last errno: 22, Invalid argument
Stack trace:
  #0 [__igt_fail_assert+0x101]
  #1 [pitch_tests+0x619]
  #2 [__real_main426+0x2f]
  #3 [main+0x23]
  #4 [__libc_start_main+0xf0]
  #5 [_start+0x29]
  #6 [<unknown>+0x29]
Subtest framebuffer-vs-set-tiling failed.
**** DEBUG ****
Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
Last errno: 22, Invalid argument
****  END  ****
Subtest framebuffer-vs-set-tiling: FAIL (0.003s)
...

# ./tests/kms_addfb_basic --r framebuffer-vs-set-tiling
IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
Subtest framebuffer-vs-set-tiling: SUCCESS (0.000s)

> 
> > With that:
> > 
> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
> > 
> > 
> > > ---
> > >  drivers/gpu/drm/i915/intel_display.c | 7 ++++---
> > >  1 file changed, 4 insertions(+), 3 deletions(-)
> > > 
> > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
> > > index b5f7493..c3aa6f5 100644
> > > --- a/drivers/gpu/drm/i915/intel_display.c
> > > +++ b/drivers/gpu/drm/i915/intel_display.c
> > > @@ -14578,17 +14578,18 @@ static int intel_framebuffer_init(struct drm_device *dev,
> > >  static struct drm_framebuffer *
> > >  intel_user_framebuffer_create(struct drm_device *dev,
> > >  			      struct drm_file *filp,
> > > -			      struct drm_mode_fb_cmd2 *mode_cmd)
> > > +			      struct drm_mode_fb_cmd2 *user_mode_cmd)
> > >  {
> > >  	struct drm_framebuffer *fb;
> > >  	struct drm_i915_gem_object *obj;
> > > +	struct drm_mode_fb_cmd2 mode_cmd = *user_mode_cmd;
> > >  
> > >  	obj = to_intel_bo(drm_gem_object_lookup(dev, filp,
> > > -						mode_cmd->handles[0]));
> > > +						mode_cmd.handles[0]));
> > >  	if (&obj->base == NULL)
> > >  		return ERR_PTR(-ENOENT);
> > >  
> > > -	fb = intel_framebuffer_create(dev, mode_cmd, obj);
> > > +	fb = intel_framebuffer_create(dev, &mode_cmd, obj);
> > >  	if (IS_ERR(fb))
> > >  		drm_gem_object_unreference_unlocked(&obj->base);
> > >  
> > > -- 
> > > 2.4.10
> > > 
> > 
> > -- 
> > Daniel Vetter
> > Software Engineer, Intel Corporation
> > http://blog.ffwll.ch
> 
> -- 
> Ville Syrjälä
> Intel OTC
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Ville Syrjälä
Intel OTC

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create()
  2015-11-17  9:48   ` [Intel-gfx] " Daniel Vetter
@ 2015-11-17 13:30     ` John Harrison
  2015-11-17 14:45       ` [Intel-gfx] " Jani Nikula
  0 siblings, 1 reply; 20+ messages in thread
From: John Harrison @ 2015-11-17 13:30 UTC (permalink / raw)
  To: Daniel Vetter, ville.syrjala; +Cc: intel-gfx, dri-devel

This seems to have caused a warning to appear. I generally build with 
-Werror which means my build is broken :(.

intel_display.c: In function 'intel_user_framebuffer_create':
i915/intel_display.c(14593)2: warning: passing argument 2 of 
'intel_framebuffer_create' discards 'const' qualifier from pointer 
target type [enabled by default]
   fb = intel_framebuffer_create(dev, mode_cmd, obj);
   ^
intel_display.c(10128)1: note: expected 'struct drm_mode_fb_cmd2 *' but 
argument is of type 'const struct drm_mode_fb_cmd2 *'




On 17/11/2015 09:48, Daniel Vetter wrote:
> On Wed, Nov 11, 2015 at 07:11:29PM +0200, ville.syrjala@linux.intel.com wrote:
>> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>>
>> Drivers shouldn't clobber the passed in addfb ioctl parameters.
>> i915 was doing just that. To prevent it from happening again,
>> pass the struct around as const, starting all the way from
>> internal_framebuffer_create().
>>
>> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> ---
>> I tried to cross-compile everything, and didn't get any failures,
>> but I'm not 100% sure I caught every driver.
> Applied to drm-misc. With a bit of soaking that should catch anything
> missed.
> -Daniel
>
>> ---
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_display.c  | 4 ++--
>>   drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h     | 2 +-
>>   drivers/gpu/drm/armada/armada_fb.c           | 4 ++--
>>   drivers/gpu/drm/armada/armada_fb.h           | 2 +-
>>   drivers/gpu/drm/ast/ast_drv.h                | 2 +-
>>   drivers/gpu/drm/ast/ast_fb.c                 | 2 +-
>>   drivers/gpu/drm/ast/ast_main.c               | 4 ++--
>>   drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 2 +-
>>   drivers/gpu/drm/bochs/bochs.h                | 2 +-
>>   drivers/gpu/drm/bochs/bochs_fbdev.c          | 2 +-
>>   drivers/gpu/drm/bochs/bochs_mm.c             | 4 ++--
>>   drivers/gpu/drm/cirrus/cirrus_drv.h          | 2 +-
>>   drivers/gpu/drm/cirrus/cirrus_fbdev.c        | 2 +-
>>   drivers/gpu/drm/cirrus/cirrus_main.c         | 4 ++--
>>   drivers/gpu/drm/drm_crtc.c                   | 4 ++--
>>   drivers/gpu/drm/drm_crtc_helper.c            | 2 +-
>>   drivers/gpu/drm/drm_fb_cma_helper.c          | 4 ++--
>>   drivers/gpu/drm/exynos/exynos_drm_fb.c       | 4 ++--
>>   drivers/gpu/drm/exynos/exynos_drm_fb.h       | 2 +-
>>   drivers/gpu/drm/gma500/framebuffer.c         | 6 +++---
>>   drivers/gpu/drm/i915/intel_display.c         | 2 +-
>>   drivers/gpu/drm/mgag200/mgag200_drv.h        | 2 +-
>>   drivers/gpu/drm/mgag200/mgag200_fb.c         | 2 +-
>>   drivers/gpu/drm/mgag200/mgag200_main.c       | 4 ++--
>>   drivers/gpu/drm/msm/msm_drv.h                | 4 ++--
>>   drivers/gpu/drm/msm/msm_fb.c                 | 4 ++--
>>   drivers/gpu/drm/nouveau/nouveau_display.c    | 4 ++--
>>   drivers/gpu/drm/nouveau/nouveau_display.h    | 2 +-
>>   drivers/gpu/drm/omapdrm/omap_drv.h           | 6 +++---
>>   drivers/gpu/drm/omapdrm/omap_fb.c            | 4 ++--
>>   drivers/gpu/drm/qxl/qxl_display.c            | 4 ++--
>>   drivers/gpu/drm/qxl/qxl_drv.h                | 2 +-
>>   drivers/gpu/drm/qxl/qxl_fb.c                 | 2 +-
>>   drivers/gpu/drm/radeon/radeon_display.c      | 4 ++--
>>   drivers/gpu/drm/radeon/radeon_mode.h         | 2 +-
>>   drivers/gpu/drm/rcar-du/rcar_du_kms.c        | 2 +-
>>   drivers/gpu/drm/rockchip/rockchip_drm_fb.c   | 6 +++---
>>   drivers/gpu/drm/rockchip/rockchip_drm_fb.h   | 2 +-
>>   drivers/gpu/drm/shmobile/shmob_drm_kms.c     | 2 +-
>>   drivers/gpu/drm/tegra/drm.h                  | 2 +-
>>   drivers/gpu/drm/tegra/fb.c                   | 4 ++--
>>   drivers/gpu/drm/tilcdc/tilcdc_drv.c          | 2 +-
>>   drivers/gpu/drm/udl/udl_drv.h                | 2 +-
>>   drivers/gpu/drm/udl/udl_fb.c                 | 4 ++--
>>   drivers/gpu/drm/virtio/virtgpu_display.c     | 4 ++--
>>   drivers/gpu/drm/virtio/virtgpu_drv.h         | 2 +-
>>   drivers/gpu/drm/vmwgfx/vmwgfx_kms.c          | 2 +-
>>   include/drm/drm_crtc.h                       | 2 +-
>>   include/drm/drm_crtc_helper.h                | 2 +-
>>   include/drm/drm_fb_cma_helper.h              | 2 +-
>>   50 files changed, 74 insertions(+), 74 deletions(-)
>>
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>> index e173a5a..7d5e058 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>> @@ -481,7 +481,7 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
>>   int
>>   amdgpu_framebuffer_init(struct drm_device *dev,
>>   			struct amdgpu_framebuffer *rfb,
>> -			struct drm_mode_fb_cmd2 *mode_cmd,
>> +			const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -498,7 +498,7 @@ amdgpu_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   amdgpu_user_framebuffer_create(struct drm_device *dev,
>>   			       struct drm_file *file_priv,
>> -			       struct drm_mode_fb_cmd2 *mode_cmd)
>> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj;
>>   	struct amdgpu_framebuffer *amdgpu_fb;
>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
>> index b62c171..de452996 100644
>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
>> @@ -551,7 +551,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
>>   
>>   int amdgpu_framebuffer_init(struct drm_device *dev,
>>   			     struct amdgpu_framebuffer *rfb,
>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			     struct drm_gem_object *obj);
>>   
>>   int amdgpufb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
>> diff --git a/drivers/gpu/drm/armada/armada_fb.c b/drivers/gpu/drm/armada/armada_fb.c
>> index 1c90969..5fa4bf2 100644
>> --- a/drivers/gpu/drm/armada/armada_fb.c
>> +++ b/drivers/gpu/drm/armada/armada_fb.c
>> @@ -35,7 +35,7 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
>>   };
>>   
>>   struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
>> -	struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
>> +	const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
>>   {
>>   	struct armada_framebuffer *dfb;
>>   	uint8_t format, config;
>> @@ -101,7 +101,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
>>   }
>>   
>>   static struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
>> -	struct drm_file *dfile, struct drm_mode_fb_cmd2 *mode)
>> +	struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
>>   {
>>   	struct armada_gem_object *obj;
>>   	struct armada_framebuffer *dfb;
>> diff --git a/drivers/gpu/drm/armada/armada_fb.h b/drivers/gpu/drm/armada/armada_fb.h
>> index ce3f12e..48073c4 100644
>> --- a/drivers/gpu/drm/armada/armada_fb.h
>> +++ b/drivers/gpu/drm/armada/armada_fb.h
>> @@ -19,6 +19,6 @@ struct armada_framebuffer {
>>   #define drm_fb_obj(fb) drm_fb_to_armada_fb(fb)->obj
>>   
>>   struct armada_framebuffer *armada_framebuffer_create(struct drm_device *,
>> -	struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
>> +	const struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
>>   
>>   #endif
>> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
>> index 05f6522..e227f8a 100644
>> --- a/drivers/gpu/drm/ast/ast_drv.h
>> +++ b/drivers/gpu/drm/ast/ast_drv.h
>> @@ -309,7 +309,7 @@ extern void ast_mode_fini(struct drm_device *dev);
>>   
>>   int ast_framebuffer_init(struct drm_device *dev,
>>   			 struct ast_framebuffer *ast_fb,
>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			 struct drm_gem_object *obj);
>>   
>>   int ast_fbdev_init(struct drm_device *dev);
>> diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
>> index a37e7ea..5320f8c 100644
>> --- a/drivers/gpu/drm/ast/ast_fb.c
>> +++ b/drivers/gpu/drm/ast/ast_fb.c
>> @@ -163,7 +163,7 @@ static struct fb_ops astfb_ops = {
>>   };
>>   
>>   static int astfb_create_object(struct ast_fbdev *afbdev,
>> -			       struct drm_mode_fb_cmd2 *mode_cmd,
>> +			       const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			       struct drm_gem_object **gobj_p)
>>   {
>>   	struct drm_device *dev = afbdev->helper.dev;
>> diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
>> index 541a610..9759009 100644
>> --- a/drivers/gpu/drm/ast/ast_main.c
>> +++ b/drivers/gpu/drm/ast/ast_main.c
>> @@ -309,7 +309,7 @@ static const struct drm_framebuffer_funcs ast_fb_funcs = {
>>   
>>   int ast_framebuffer_init(struct drm_device *dev,
>>   			 struct ast_framebuffer *ast_fb,
>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			 struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -327,7 +327,7 @@ int ast_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   ast_user_framebuffer_create(struct drm_device *dev,
>>   	       struct drm_file *filp,
>> -	       struct drm_mode_fb_cmd2 *mode_cmd)
>> +	       const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj;
>>   	struct ast_framebuffer *ast_fb;
>> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
>> index 244df0a..8168954 100644
>> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
>> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
>> @@ -402,7 +402,7 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data)
>>   }
>>   
>>   static struct drm_framebuffer *atmel_hlcdc_fb_create(struct drm_device *dev,
>> -		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
>> +		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	return drm_fb_cma_create(dev, file_priv, mode_cmd);
>>   }
>> diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
>> index 71f2687..19b5ada 100644
>> --- a/drivers/gpu/drm/bochs/bochs.h
>> +++ b/drivers/gpu/drm/bochs/bochs.h
>> @@ -149,7 +149,7 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
>>   
>>   int bochs_framebuffer_init(struct drm_device *dev,
>>   			   struct bochs_framebuffer *gfb,
>> -			   struct drm_mode_fb_cmd2 *mode_cmd,
>> +			   const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			   struct drm_gem_object *obj);
>>   int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr);
>>   int bochs_bo_unpin(struct bochs_bo *bo);
>> diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
>> index 09a0637..7520bf8 100644
>> --- a/drivers/gpu/drm/bochs/bochs_fbdev.c
>> +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
>> @@ -34,7 +34,7 @@ static struct fb_ops bochsfb_ops = {
>>   };
>>   
>>   static int bochsfb_create_object(struct bochs_device *bochs,
>> -				 struct drm_mode_fb_cmd2 *mode_cmd,
>> +				 const struct drm_mode_fb_cmd2 *mode_cmd,
>>   				 struct drm_gem_object **gobj_p)
>>   {
>>   	struct drm_device *dev = bochs->dev;
>> diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
>> index f69e6bf..d812ad0 100644
>> --- a/drivers/gpu/drm/bochs/bochs_mm.c
>> +++ b/drivers/gpu/drm/bochs/bochs_mm.c
>> @@ -484,7 +484,7 @@ static const struct drm_framebuffer_funcs bochs_fb_funcs = {
>>   
>>   int bochs_framebuffer_init(struct drm_device *dev,
>>   			   struct bochs_framebuffer *gfb,
>> -			   struct drm_mode_fb_cmd2 *mode_cmd,
>> +			   const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			   struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -502,7 +502,7 @@ int bochs_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   bochs_user_framebuffer_create(struct drm_device *dev,
>>   			      struct drm_file *filp,
>> -			      struct drm_mode_fb_cmd2 *mode_cmd)
>> +			      const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj;
>>   	struct bochs_framebuffer *bochs_fb;
>> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
>> index 7050615..1370a51 100644
>> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
>> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
>> @@ -207,7 +207,7 @@ int cirrus_dumb_create(struct drm_file *file,
>>   
>>   int cirrus_framebuffer_init(struct drm_device *dev,
>>   			   struct cirrus_framebuffer *gfb,
>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			    struct drm_gem_object *obj);
>>   
>>   bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height,
>> diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
>> index 589103b..3b5be72 100644
>> --- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
>> +++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
>> @@ -135,7 +135,7 @@ static struct fb_ops cirrusfb_ops = {
>>   };
>>   
>>   static int cirrusfb_create_object(struct cirrus_fbdev *afbdev,
>> -			       struct drm_mode_fb_cmd2 *mode_cmd,
>> +			       const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			       struct drm_gem_object **gobj_p)
>>   {
>>   	struct drm_device *dev = afbdev->helper.dev;
>> diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
>> index 055fd86..0907715 100644
>> --- a/drivers/gpu/drm/cirrus/cirrus_main.c
>> +++ b/drivers/gpu/drm/cirrus/cirrus_main.c
>> @@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
>>   
>>   int cirrus_framebuffer_init(struct drm_device *dev,
>>   			    struct cirrus_framebuffer *gfb,
>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			    struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -47,7 +47,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   cirrus_user_framebuffer_create(struct drm_device *dev,
>>   			       struct drm_file *filp,
>> -			       struct drm_mode_fb_cmd2 *mode_cmd)
>> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct cirrus_device *cdev = dev->dev_private;
>>   	struct drm_gem_object *obj;
>> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
>> index 24c5434..32dd134 100644
>> --- a/drivers/gpu/drm/drm_crtc.c
>> +++ b/drivers/gpu/drm/drm_crtc.c
>> @@ -45,7 +45,7 @@
>>   
>>   static struct drm_framebuffer *
>>   internal_framebuffer_create(struct drm_device *dev,
>> -			    struct drm_mode_fb_cmd2 *r,
>> +			    const struct drm_mode_fb_cmd2 *r,
>>   			    struct drm_file *file_priv);
>>   
>>   /* Avoid boilerplate.  I'm tired of typing. */
>> @@ -3235,7 +3235,7 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
>>   
>>   static struct drm_framebuffer *
>>   internal_framebuffer_create(struct drm_device *dev,
>> -			    struct drm_mode_fb_cmd2 *r,
>> +			    const struct drm_mode_fb_cmd2 *r,
>>   			    struct drm_file *file_priv)
>>   {
>>   	struct drm_mode_config *config = &dev->mode_config;
>> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
>> index ef53475..6b4cf25 100644
>> --- a/drivers/gpu/drm/drm_crtc_helper.c
>> +++ b/drivers/gpu/drm/drm_crtc_helper.c
>> @@ -818,7 +818,7 @@ EXPORT_SYMBOL(drm_helper_connector_dpms);
>>    * metadata fields.
>>    */
>>   void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
>> -				    struct drm_mode_fb_cmd2 *mode_cmd)
>> +				    const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	int i;
>>   
>> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
>> index c19a625..b7d5b84 100644
>> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
>> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
>> @@ -74,7 +74,7 @@ static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
>>   };
>>   
>>   static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
>> -	struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
>> +	const const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
>>   	unsigned int num_planes)
>>   {
>>   	struct drm_fb_cma *fb_cma;
>> @@ -107,7 +107,7 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
>>    * checked before calling this function.
>>    */
>>   struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
>> -	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
>> +	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_fb_cma *fb_cma;
>>   	struct drm_gem_cma_object *objs[4];
>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>> index fcea28b..49b9bc3 100644
>> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>> @@ -117,7 +117,7 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
>>   
>>   struct drm_framebuffer *
>>   exynos_drm_framebuffer_init(struct drm_device *dev,
>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			    struct exynos_drm_gem **exynos_gem,
>>   			    int count)
>>   {
>> @@ -154,7 +154,7 @@ err:
>>   
>>   static struct drm_framebuffer *
>>   exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>> -		      struct drm_mode_fb_cmd2 *mode_cmd)
>> +		      const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
>>   	struct drm_gem_object *obj;
>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h
>> index 726a2d4..a8a75ac 100644
>> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h
>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h
>> @@ -18,7 +18,7 @@
>>   
>>   struct drm_framebuffer *
>>   exynos_drm_framebuffer_init(struct drm_device *dev,
>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			    struct exynos_drm_gem **exynos_gem,
>>   			    int count);
>>   
>> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
>> index 2eaf1b3..dc0508d 100644
>> --- a/drivers/gpu/drm/gma500/framebuffer.c
>> +++ b/drivers/gpu/drm/gma500/framebuffer.c
>> @@ -241,7 +241,7 @@ static struct fb_ops psbfb_unaccel_ops = {
>>    */
>>   static int psb_framebuffer_init(struct drm_device *dev,
>>   					struct psb_framebuffer *fb,
>> -					struct drm_mode_fb_cmd2 *mode_cmd,
>> +					const struct drm_mode_fb_cmd2 *mode_cmd,
>>   					struct gtt_range *gt)
>>   {
>>   	u32 bpp, depth;
>> @@ -284,7 +284,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
>>   
>>   static struct drm_framebuffer *psb_framebuffer_create
>>   			(struct drm_device *dev,
>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			 struct gtt_range *gt)
>>   {
>>   	struct psb_framebuffer *fb;
>> @@ -488,7 +488,7 @@ out_err1:
>>    */
>>   static struct drm_framebuffer *psb_user_framebuffer_create
>>   			(struct drm_device *dev, struct drm_file *filp,
>> -			 struct drm_mode_fb_cmd2 *cmd)
>> +			 const struct drm_mode_fb_cmd2 *cmd)
>>   {
>>   	struct gtt_range *r;
>>   	struct drm_gem_object *obj;
>> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
>> index c3aa6f5..58dbac7 100644
>> --- a/drivers/gpu/drm/i915/intel_display.c
>> +++ b/drivers/gpu/drm/i915/intel_display.c
>> @@ -14578,7 +14578,7 @@ static int intel_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   intel_user_framebuffer_create(struct drm_device *dev,
>>   			      struct drm_file *filp,
>> -			      struct drm_mode_fb_cmd2 *user_mode_cmd)
>> +			      const struct drm_mode_fb_cmd2 *user_mode_cmd)
>>   {
>>   	struct drm_framebuffer *fb;
>>   	struct drm_i915_gem_object *obj;
>> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
>> index 912151c..205b280 100644
>> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
>> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
>> @@ -252,7 +252,7 @@ void mgag200_fbdev_fini(struct mga_device *mdev);
>>   				/* mgag200_main.c */
>>   int mgag200_framebuffer_init(struct drm_device *dev,
>>   			     struct mga_framebuffer *mfb,
>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			     struct drm_gem_object *obj);
>>   
>>   
>> diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
>> index b35b5b2..d9b04b0 100644
>> --- a/drivers/gpu/drm/mgag200/mgag200_fb.c
>> +++ b/drivers/gpu/drm/mgag200/mgag200_fb.c
>> @@ -138,7 +138,7 @@ static struct fb_ops mgag200fb_ops = {
>>   };
>>   
>>   static int mgag200fb_create_object(struct mga_fbdev *afbdev,
>> -				   struct drm_mode_fb_cmd2 *mode_cmd,
>> +				   const struct drm_mode_fb_cmd2 *mode_cmd,
>>   				   struct drm_gem_object **gobj_p)
>>   {
>>   	struct drm_device *dev = afbdev->helper.dev;
>> diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
>> index b1a0f56..9147444 100644
>> --- a/drivers/gpu/drm/mgag200/mgag200_main.c
>> +++ b/drivers/gpu/drm/mgag200/mgag200_main.c
>> @@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs mga_fb_funcs = {
>>   
>>   int mgag200_framebuffer_init(struct drm_device *dev,
>>   			     struct mga_framebuffer *gfb,
>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			     struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -47,7 +47,7 @@ int mgag200_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   mgag200_user_framebuffer_create(struct drm_device *dev,
>>   				struct drm_file *filp,
>> -				struct drm_mode_fb_cmd2 *mode_cmd)
>> +				const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj;
>>   	struct mga_framebuffer *mga_fb;
>> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
>> index 3be7a56..9a713b7 100644
>> --- a/drivers/gpu/drm/msm/msm_drv.h
>> +++ b/drivers/gpu/drm/msm/msm_drv.h
>> @@ -240,9 +240,9 @@ uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane);
>>   struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
>>   const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
>>   struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>>   struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
>>   
>>   struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
>>   
>> diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
>> index 12171328..a474d6c 100644
>> --- a/drivers/gpu/drm/msm/msm_fb.c
>> +++ b/drivers/gpu/drm/msm/msm_fb.c
>> @@ -138,7 +138,7 @@ const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb)
>>   }
>>   
>>   struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *bos[4] = {0};
>>   	struct drm_framebuffer *fb;
>> @@ -168,7 +168,7 @@ out_unref:
>>   }
>>   
>>   struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>>   {
>>   	struct msm_drm_private *priv = dev->dev_private;
>>   	struct msm_kms *kms = priv->kms;
>> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
>> index db6bc67..ea9d3bc 100644
>> --- a/drivers/gpu/drm/nouveau/nouveau_display.c
>> +++ b/drivers/gpu/drm/nouveau/nouveau_display.c
>> @@ -246,7 +246,7 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
>>   int
>>   nouveau_framebuffer_init(struct drm_device *dev,
>>   			 struct nouveau_framebuffer *nv_fb,
>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			 struct nouveau_bo *nvbo)
>>   {
>>   	struct nouveau_display *disp = nouveau_display(dev);
>> @@ -272,7 +272,7 @@ nouveau_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   nouveau_user_framebuffer_create(struct drm_device *dev,
>>   				struct drm_file *file_priv,
>> -				struct drm_mode_fb_cmd2 *mode_cmd)
>> +				const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct nouveau_framebuffer *nouveau_fb;
>>   	struct drm_gem_object *gem;
>> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h
>> index 856abe0..5a57d8b 100644
>> --- a/drivers/gpu/drm/nouveau/nouveau_display.h
>> +++ b/drivers/gpu/drm/nouveau/nouveau_display.h
>> @@ -23,7 +23,7 @@ nouveau_framebuffer(struct drm_framebuffer *fb)
>>   }
>>   
>>   int nouveau_framebuffer_init(struct drm_device *, struct nouveau_framebuffer *,
>> -			     struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
>> +			     const struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
>>   
>>   struct nouveau_page_flip_state {
>>   	struct list_head head;
>> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
>> index 5c367aa..130fca7 100644
>> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
>> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
>> @@ -172,9 +172,9 @@ void copy_timings_drm_to_omap(struct omap_video_timings *timings,
>>   uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
>>   		uint32_t max_formats, enum omap_color_mode supported_modes);
>>   struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
>>   struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>>   struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p);
>>   int omap_framebuffer_pin(struct drm_framebuffer *fb);
>>   void omap_framebuffer_unpin(struct drm_framebuffer *fb);
>> @@ -248,7 +248,7 @@ struct omap_dss_device *omap_encoder_get_dssdev(struct drm_encoder *encoder);
>>   
>>   static inline int objects_lookup(struct drm_device *dev,
>>   		struct drm_file *filp, uint32_t pixel_format,
>> -		struct drm_gem_object **bos, uint32_t *handles)
>> +		struct drm_gem_object **bos, const uint32_t *handles)
>>   {
>>   	int i, n = drm_format_num_planes(pixel_format);
>>   
>> diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
>> index 636a1f9..ad202df 100644
>> --- a/drivers/gpu/drm/omapdrm/omap_fb.c
>> +++ b/drivers/gpu/drm/omapdrm/omap_fb.c
>> @@ -364,7 +364,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
>>   #endif
>>   
>>   struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *bos[4];
>>   	struct drm_framebuffer *fb;
>> @@ -386,7 +386,7 @@ struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>>   }
>>   
>>   struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>>   {
>>   	struct omap_framebuffer *omap_fb = NULL;
>>   	struct drm_framebuffer *fb = NULL;
>> diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
>> index 183aea1..cddba07 100644
>> --- a/drivers/gpu/drm/qxl/qxl_display.c
>> +++ b/drivers/gpu/drm/qxl/qxl_display.c
>> @@ -521,7 +521,7 @@ static const struct drm_framebuffer_funcs qxl_fb_funcs = {
>>   int
>>   qxl_framebuffer_init(struct drm_device *dev,
>>   		     struct qxl_framebuffer *qfb,
>> -		     struct drm_mode_fb_cmd2 *mode_cmd,
>> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>>   		     struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -1003,7 +1003,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
>>   static struct drm_framebuffer *
>>   qxl_user_framebuffer_create(struct drm_device *dev,
>>   			    struct drm_file *file_priv,
>> -			    struct drm_mode_fb_cmd2 *mode_cmd)
>> +			    const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj;
>>   	struct qxl_framebuffer *qxl_fb;
>> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
>> index 01a8694..6e6b9b1 100644
>> --- a/drivers/gpu/drm/qxl/qxl_drv.h
>> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
>> @@ -390,7 +390,7 @@ void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state);
>>   int
>>   qxl_framebuffer_init(struct drm_device *dev,
>>   		     struct qxl_framebuffer *rfb,
>> -		     struct drm_mode_fb_cmd2 *mode_cmd,
>> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>>   		     struct drm_gem_object *obj);
>>   void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
>>   void qxl_send_monitors_config(struct qxl_device *qdev);
>> diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
>> index c4a5526..11f543b 100644
>> --- a/drivers/gpu/drm/qxl/qxl_fb.c
>> +++ b/drivers/gpu/drm/qxl/qxl_fb.c
>> @@ -283,7 +283,7 @@ int qxl_get_handle_for_primary_fb(struct qxl_device *qdev,
>>   }
>>   
>>   static int qxlfb_create_pinned_object(struct qxl_fbdev *qfbdev,
>> -				      struct drm_mode_fb_cmd2 *mode_cmd,
>> +				      const struct drm_mode_fb_cmd2 *mode_cmd,
>>   				      struct drm_gem_object **gobj_p)
>>   {
>>   	struct qxl_device *qdev = qfbdev->qdev;
>> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
>> index a8d9927..ded51fb 100644
>> --- a/drivers/gpu/drm/radeon/radeon_display.c
>> +++ b/drivers/gpu/drm/radeon/radeon_display.c
>> @@ -1292,7 +1292,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
>>   int
>>   radeon_framebuffer_init(struct drm_device *dev,
>>   			struct radeon_framebuffer *rfb,
>> -			struct drm_mode_fb_cmd2 *mode_cmd,
>> +			const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -1309,7 +1309,7 @@ radeon_framebuffer_init(struct drm_device *dev,
>>   static struct drm_framebuffer *
>>   radeon_user_framebuffer_create(struct drm_device *dev,
>>   			       struct drm_file *file_priv,
>> -			       struct drm_mode_fb_cmd2 *mode_cmd)
>> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj;
>>   	struct radeon_framebuffer *radeon_fb;
>> diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
>> index 830e171..b8e3c27 100644
>> --- a/drivers/gpu/drm/radeon/radeon_mode.h
>> +++ b/drivers/gpu/drm/radeon/radeon_mode.h
>> @@ -929,7 +929,7 @@ extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green
>>   				     u16 *blue, int regno);
>>   int radeon_framebuffer_init(struct drm_device *dev,
>>   			     struct radeon_framebuffer *rfb,
>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			     struct drm_gem_object *obj);
>>   
>>   int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> index ca12e8c..43bce69 100644
>> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>> @@ -136,7 +136,7 @@ int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
>>   
>>   static struct drm_framebuffer *
>>   rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>> -		  struct drm_mode_fb_cmd2 *mode_cmd)
>> +		  const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct rcar_du_device *rcdu = dev->dev_private;
>>   	const struct rcar_du_format_info *format;
>> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
>> index 002645b..b8ac591 100644
>> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
>> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
>> @@ -72,7 +72,7 @@ static struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
>>   };
>>   
>>   static struct rockchip_drm_fb *
>> -rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
>> +rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
>>   		  struct drm_gem_object **obj, unsigned int num_planes)
>>   {
>>   	struct rockchip_drm_fb *rockchip_fb;
>> @@ -102,7 +102,7 @@ rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
>>   
>>   static struct drm_framebuffer *
>>   rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>> -			struct drm_mode_fb_cmd2 *mode_cmd)
>> +			const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct rockchip_drm_fb *rockchip_fb;
>>   	struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER];
>> @@ -173,7 +173,7 @@ static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
>>   
>>   struct drm_framebuffer *
>>   rockchip_drm_framebuffer_init(struct drm_device *dev,
>> -			      struct drm_mode_fb_cmd2 *mode_cmd,
>> +			      const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			      struct drm_gem_object *obj)
>>   {
>>   	struct rockchip_drm_fb *rockchip_fb;
>> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
>> index 09574d4..2fe47f1 100644
>> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
>> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
>> @@ -17,7 +17,7 @@
>>   
>>   struct drm_framebuffer *
>>   rockchip_drm_framebuffer_init(struct drm_device *dev,
>> -			      struct drm_mode_fb_cmd2 *mode_cmd,
>> +			      const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			      struct drm_gem_object *obj);
>>   void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb);
>>   
>> diff --git a/drivers/gpu/drm/shmobile/shmob_drm_kms.c b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
>> index aaf98ac..388a0fc 100644
>> --- a/drivers/gpu/drm/shmobile/shmob_drm_kms.c
>> +++ b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
>> @@ -104,7 +104,7 @@ const struct shmob_drm_format_info *shmob_drm_format_info(u32 fourcc)
>>   
>>   static struct drm_framebuffer *
>>   shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>> -		    struct drm_mode_fb_cmd2 *mode_cmd)
>> +		    const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	const struct shmob_drm_format_info *format;
>>   
>> diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
>> index 942cad9..d88a2d1 100644
>> --- a/drivers/gpu/drm/tegra/drm.h
>> +++ b/drivers/gpu/drm/tegra/drm.h
>> @@ -268,7 +268,7 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
>>   			struct tegra_bo_tiling *tiling);
>>   struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>>   					struct drm_file *file,
>> -					struct drm_mode_fb_cmd2 *cmd);
>> +					const struct drm_mode_fb_cmd2 *cmd);
>>   int tegra_drm_fb_prepare(struct drm_device *drm);
>>   void tegra_drm_fb_free(struct drm_device *drm);
>>   int tegra_drm_fb_init(struct drm_device *drm);
>> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
>> index bec07d9..ede9e94 100644
>> --- a/drivers/gpu/drm/tegra/fb.c
>> +++ b/drivers/gpu/drm/tegra/fb.c
>> @@ -92,7 +92,7 @@ static struct drm_framebuffer_funcs tegra_fb_funcs = {
>>   };
>>   
>>   static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
>> -				       struct drm_mode_fb_cmd2 *mode_cmd,
>> +				       const struct drm_mode_fb_cmd2 *mode_cmd,
>>   				       struct tegra_bo **planes,
>>   				       unsigned int num_planes)
>>   {
>> @@ -131,7 +131,7 @@ static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
>>   
>>   struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>>   					struct drm_file *file,
>> -					struct drm_mode_fb_cmd2 *cmd)
>> +					const struct drm_mode_fb_cmd2 *cmd)
>>   {
>>   	unsigned int hsub, vsub, i;
>>   	struct tegra_bo *planes[4];
>> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
>> index 876cad5..4ddb21e 100644
>> --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
>> +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
>> @@ -46,7 +46,7 @@ void tilcdc_module_cleanup(struct tilcdc_module *mod)
>>   static struct of_device_id tilcdc_of_match[];
>>   
>>   static struct drm_framebuffer *tilcdc_fb_create(struct drm_device *dev,
>> -		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
>> +		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	return drm_fb_cma_create(dev, file_priv, mode_cmd);
>>   }
>> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
>> index 80adbac..4a064ef 100644
>> --- a/drivers/gpu/drm/udl/udl_drv.h
>> +++ b/drivers/gpu/drm/udl/udl_drv.h
>> @@ -108,7 +108,7 @@ void udl_fbdev_unplug(struct drm_device *dev);
>>   struct drm_framebuffer *
>>   udl_fb_user_fb_create(struct drm_device *dev,
>>   		      struct drm_file *file,
>> -		      struct drm_mode_fb_cmd2 *mode_cmd);
>> +		      const struct drm_mode_fb_cmd2 *mode_cmd);
>>   
>>   int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr,
>>   		     const char *front, char **urb_buf_ptr,
>> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
>> index 62c7b1d..f09b11a 100644
>> --- a/drivers/gpu/drm/udl/udl_fb.c
>> +++ b/drivers/gpu/drm/udl/udl_fb.c
>> @@ -456,7 +456,7 @@ static const struct drm_framebuffer_funcs udlfb_funcs = {
>>   static int
>>   udl_framebuffer_init(struct drm_device *dev,
>>   		     struct udl_framebuffer *ufb,
>> -		     struct drm_mode_fb_cmd2 *mode_cmd,
>> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>>   		     struct udl_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -624,7 +624,7 @@ void udl_fbdev_unplug(struct drm_device *dev)
>>   struct drm_framebuffer *
>>   udl_fb_user_fb_create(struct drm_device *dev,
>>   		   struct drm_file *file,
>> -		   struct drm_mode_fb_cmd2 *mode_cmd)
>> +		   const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj;
>>   	struct udl_framebuffer *ufb;
>> diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
>> index f545913..306a7df 100644
>> --- a/drivers/gpu/drm/virtio/virtgpu_display.c
>> +++ b/drivers/gpu/drm/virtio/virtgpu_display.c
>> @@ -215,7 +215,7 @@ static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = {
>>   int
>>   virtio_gpu_framebuffer_init(struct drm_device *dev,
>>   			    struct virtio_gpu_framebuffer *vgfb,
>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>   			    struct drm_gem_object *obj)
>>   {
>>   	int ret;
>> @@ -465,7 +465,7 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
>>   static struct drm_framebuffer *
>>   virtio_gpu_user_framebuffer_create(struct drm_device *dev,
>>   				   struct drm_file *file_priv,
>> -				   struct drm_mode_fb_cmd2 *mode_cmd)
>> +				   const struct drm_mode_fb_cmd2 *mode_cmd)
>>   {
>>   	struct drm_gem_object *obj = NULL;
>>   	struct virtio_gpu_framebuffer *virtio_gpu_fb;
>> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
>> index 79f0abe..8f486f4 100644
>> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
>> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
>> @@ -328,7 +328,7 @@ void virtio_gpu_dequeue_fence_func(struct work_struct *work);
>>   /* virtio_gpu_display.c */
>>   int virtio_gpu_framebuffer_init(struct drm_device *dev,
>>   				struct virtio_gpu_framebuffer *vgfb,
>> -				struct drm_mode_fb_cmd2 *mode_cmd,
>> +				const struct drm_mode_fb_cmd2 *mode_cmd,
>>   				struct drm_gem_object *obj);
>>   int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
>>   void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>> index 9fcd7f8..e38db351 100644
>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>> @@ -930,7 +930,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
>>   
>>   static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
>>   						 struct drm_file *file_priv,
>> -						 struct drm_mode_fb_cmd2 *mode_cmd2)
>> +						 const struct drm_mode_fb_cmd2 *mode_cmd2)
>>   {
>>   	struct vmw_private *dev_priv = vmw_priv(dev);
>>   	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
>> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
>> index 3f0c690..bd27364 100644
>> --- a/include/drm/drm_crtc.h
>> +++ b/include/drm/drm_crtc.h
>> @@ -992,7 +992,7 @@ struct drm_mode_set {
>>   struct drm_mode_config_funcs {
>>   	struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
>>   					     struct drm_file *file_priv,
>> -					     struct drm_mode_fb_cmd2 *mode_cmd);
>> +					     const struct drm_mode_fb_cmd2 *mode_cmd);
>>   	void (*output_poll_changed)(struct drm_device *dev);
>>   
>>   	int (*atomic_check)(struct drm_device *dev,
>> diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
>> index 3febb4b..e22ab29 100644
>> --- a/include/drm/drm_crtc_helper.h
>> +++ b/include/drm/drm_crtc_helper.h
>> @@ -197,7 +197,7 @@ extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
>>   extern void drm_helper_move_panel_connectors_to_head(struct drm_device *);
>>   
>>   extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
>> -					   struct drm_mode_fb_cmd2 *mode_cmd);
>> +					   const struct drm_mode_fb_cmd2 *mode_cmd);
>>   
>>   static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
>>   				       const struct drm_crtc_helper_funcs *funcs)
>> diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h
>> index c54cf3d..be62bd3 100644
>> --- a/include/drm/drm_fb_cma_helper.h
>> +++ b/include/drm/drm_fb_cma_helper.h
>> @@ -18,7 +18,7 @@ void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
>>   void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
>>   
>>   struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
>> -	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd);
>> +	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
>>   
>>   struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
>>   	unsigned int plane);
>> -- 
>> 2.4.10
>>
>> _______________________________________________
>> Intel-gfx mailing list
>> Intel-gfx@lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Intel-gfx] [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params
  2015-11-17 13:00       ` Ville Syrjälä
  (?)
@ 2015-11-17 14:45       ` Jani Nikula
  -1 siblings, 0 replies; 20+ messages in thread
From: Jani Nikula @ 2015-11-17 14:45 UTC (permalink / raw)
  To: Ville Syrjälä, Daniel Vetter
  Cc: Daniel Vetter, intel-gfx, stable, dri-devel

On Tue, 17 Nov 2015, Ville Syrjälä <ville.syrjala@linux.intel.com> wrote:
> On Tue, Nov 17, 2015 at 01:04:21PM +0200, Ville Syrjälä wrote:
>> On Tue, Nov 17, 2015 at 10:47:06AM +0100, Daniel Vetter wrote:
>> > On Wed, Nov 11, 2015 at 07:11:28PM +0200, ville.syrjala@linux.intel.com wrote:
>> > > From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> > > 
>> > > We try to convert the old way of of specifying fb tiling (obj->tiling)
>> > > into the new fb modifiers. We store the result in the passed in mode_cmd
>> > > structure. But that structure comes directly from the addfb2 ioctl, and
>> > > gets copied back out to userspace, which means we're clobbering the
>> > > modifiers that the user provided (all 0 since the DRM_MODE_FB_MODIFIERS
>> > > flag wasn't even set by the user). Hence if the user reuses the struct
>> > > for another addfb2, the ioctl will be rejected since it's now asking for
>> > > some modifiers w/o the flag set.
>> > > 
>> > > Fix the problem by making a copy of the user provided structure. We can
>> > > play any games we want with the copy.
>> > > 
>> > > Cc: stable@vger.kernel.org
>> > > Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
>> > > Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>> > > Fixes: 2a80eada326f ("drm/i915: Add fb format modifier support")
>> > > Testcase: igt/kms_addfb_basic/clobbered-modifier
>> > > Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>> > 
>> > Out of curiosity: Where does this blow up? That should be added to the
>> > commit message (so that people affected can match it up with this fix).
>> 
>> I don't know that it affects any actual users. The way I caught this was
>> running kms_addfb_basic. One of the subtests failed when I ran the full
>> test, but if I ran only the specific subtest it was fine. So the
>> modifiers got clobbered by the previous subtest. I already forgot which
>> subtest it was, but it's easy enough to track it down again.
>
> # ./tests/kms_addfb_basic 
> IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
> ...
> Subtest basic-X-tiled: SUCCESS (0.001s)
> Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
> Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
> Last errno: 22, Invalid argument
> Stack trace:
>   #0 [__igt_fail_assert+0x101]
>   #1 [pitch_tests+0x619]
>   #2 [__real_main426+0x2f]
>   #3 [main+0x23]
>   #4 [__libc_start_main+0xf0]
>   #5 [_start+0x29]
>   #6 [<unknown>+0x29]
> Subtest framebuffer-vs-set-tiling failed.
> **** DEBUG ****
> Test assertion failure function pitch_tests, file kms_addfb_basic.c:167:
> Failed assertion: drmIoctl(fd, DRM_IOCTL_MODE_ADDFB2, &f) == 0
> Last errno: 22, Invalid argument
> ****  END  ****
> Subtest framebuffer-vs-set-tiling: FAIL (0.003s)
> ...
>
> # ./tests/kms_addfb_basic --r framebuffer-vs-set-tiling
> IGT-Version: 1.12-git (x86_64) (Linux: 4.4.0-rc1-stereo+ x86_64)
> Subtest framebuffer-vs-set-tiling: SUCCESS (0.000s)
>
>> 
>> > With that:
>> > 
>> > Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>

Pushed to drm-intel-fixes, thanks for the patch and review.

I had to do a trivial rebase, and resolve conflicts for nightly. Ville,
please check the commit in -fixes and yell if it's not right.


BR,
Jani.


-- 
Jani Nikula, Intel Open Source Technology Center

^ permalink raw reply	[flat|nested] 20+ messages in thread

* Re: [Intel-gfx] [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create()
  2015-11-17 13:30     ` John Harrison
@ 2015-11-17 14:45       ` Jani Nikula
  0 siblings, 0 replies; 20+ messages in thread
From: Jani Nikula @ 2015-11-17 14:45 UTC (permalink / raw)
  To: John Harrison, Daniel Vetter, ville.syrjala; +Cc: intel-gfx, dri-devel

On Tue, 17 Nov 2015, John Harrison <John.C.Harrison@Intel.com> wrote:
> This seems to have caused a warning to appear. I generally build with 
> -Werror which means my build is broken :(.
>
> intel_display.c: In function 'intel_user_framebuffer_create':
> i915/intel_display.c(14593)2: warning: passing argument 2 of 
> 'intel_framebuffer_create' discards 'const' qualifier from pointer 
> target type [enabled by default]
>    fb = intel_framebuffer_create(dev, mode_cmd, obj);
>    ^
> intel_display.c(10128)1: note: expected 'struct drm_mode_fb_cmd2 *' but 
> argument is of type 'const struct drm_mode_fb_cmd2 *'

This is now fixed in drm-intel-nightly.

BR,
Jani.


>
>
>
>
> On 17/11/2015 09:48, Daniel Vetter wrote:
>> On Wed, Nov 11, 2015 at 07:11:29PM +0200, ville.syrjala@linux.intel.com wrote:
>>> From: Ville Syrjälä <ville.syrjala@linux.intel.com>
>>>
>>> Drivers shouldn't clobber the passed in addfb ioctl parameters.
>>> i915 was doing just that. To prevent it from happening again,
>>> pass the struct around as const, starting all the way from
>>> internal_framebuffer_create().
>>>
>>> Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
>>> ---
>>> I tried to cross-compile everything, and didn't get any failures,
>>> but I'm not 100% sure I caught every driver.
>> Applied to drm-misc. With a bit of soaking that should catch anything
>> missed.
>> -Daniel
>>
>>> ---
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_display.c  | 4 ++--
>>>   drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h     | 2 +-
>>>   drivers/gpu/drm/armada/armada_fb.c           | 4 ++--
>>>   drivers/gpu/drm/armada/armada_fb.h           | 2 +-
>>>   drivers/gpu/drm/ast/ast_drv.h                | 2 +-
>>>   drivers/gpu/drm/ast/ast_fb.c                 | 2 +-
>>>   drivers/gpu/drm/ast/ast_main.c               | 4 ++--
>>>   drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c | 2 +-
>>>   drivers/gpu/drm/bochs/bochs.h                | 2 +-
>>>   drivers/gpu/drm/bochs/bochs_fbdev.c          | 2 +-
>>>   drivers/gpu/drm/bochs/bochs_mm.c             | 4 ++--
>>>   drivers/gpu/drm/cirrus/cirrus_drv.h          | 2 +-
>>>   drivers/gpu/drm/cirrus/cirrus_fbdev.c        | 2 +-
>>>   drivers/gpu/drm/cirrus/cirrus_main.c         | 4 ++--
>>>   drivers/gpu/drm/drm_crtc.c                   | 4 ++--
>>>   drivers/gpu/drm/drm_crtc_helper.c            | 2 +-
>>>   drivers/gpu/drm/drm_fb_cma_helper.c          | 4 ++--
>>>   drivers/gpu/drm/exynos/exynos_drm_fb.c       | 4 ++--
>>>   drivers/gpu/drm/exynos/exynos_drm_fb.h       | 2 +-
>>>   drivers/gpu/drm/gma500/framebuffer.c         | 6 +++---
>>>   drivers/gpu/drm/i915/intel_display.c         | 2 +-
>>>   drivers/gpu/drm/mgag200/mgag200_drv.h        | 2 +-
>>>   drivers/gpu/drm/mgag200/mgag200_fb.c         | 2 +-
>>>   drivers/gpu/drm/mgag200/mgag200_main.c       | 4 ++--
>>>   drivers/gpu/drm/msm/msm_drv.h                | 4 ++--
>>>   drivers/gpu/drm/msm/msm_fb.c                 | 4 ++--
>>>   drivers/gpu/drm/nouveau/nouveau_display.c    | 4 ++--
>>>   drivers/gpu/drm/nouveau/nouveau_display.h    | 2 +-
>>>   drivers/gpu/drm/omapdrm/omap_drv.h           | 6 +++---
>>>   drivers/gpu/drm/omapdrm/omap_fb.c            | 4 ++--
>>>   drivers/gpu/drm/qxl/qxl_display.c            | 4 ++--
>>>   drivers/gpu/drm/qxl/qxl_drv.h                | 2 +-
>>>   drivers/gpu/drm/qxl/qxl_fb.c                 | 2 +-
>>>   drivers/gpu/drm/radeon/radeon_display.c      | 4 ++--
>>>   drivers/gpu/drm/radeon/radeon_mode.h         | 2 +-
>>>   drivers/gpu/drm/rcar-du/rcar_du_kms.c        | 2 +-
>>>   drivers/gpu/drm/rockchip/rockchip_drm_fb.c   | 6 +++---
>>>   drivers/gpu/drm/rockchip/rockchip_drm_fb.h   | 2 +-
>>>   drivers/gpu/drm/shmobile/shmob_drm_kms.c     | 2 +-
>>>   drivers/gpu/drm/tegra/drm.h                  | 2 +-
>>>   drivers/gpu/drm/tegra/fb.c                   | 4 ++--
>>>   drivers/gpu/drm/tilcdc/tilcdc_drv.c          | 2 +-
>>>   drivers/gpu/drm/udl/udl_drv.h                | 2 +-
>>>   drivers/gpu/drm/udl/udl_fb.c                 | 4 ++--
>>>   drivers/gpu/drm/virtio/virtgpu_display.c     | 4 ++--
>>>   drivers/gpu/drm/virtio/virtgpu_drv.h         | 2 +-
>>>   drivers/gpu/drm/vmwgfx/vmwgfx_kms.c          | 2 +-
>>>   include/drm/drm_crtc.h                       | 2 +-
>>>   include/drm/drm_crtc_helper.h                | 2 +-
>>>   include/drm/drm_fb_cma_helper.h              | 2 +-
>>>   50 files changed, 74 insertions(+), 74 deletions(-)
>>>
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>> index e173a5a..7d5e058 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
>>> @@ -481,7 +481,7 @@ static const struct drm_framebuffer_funcs amdgpu_fb_funcs = {
>>>   int
>>>   amdgpu_framebuffer_init(struct drm_device *dev,
>>>   			struct amdgpu_framebuffer *rfb,
>>> -			struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -498,7 +498,7 @@ amdgpu_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   amdgpu_user_framebuffer_create(struct drm_device *dev,
>>>   			       struct drm_file *file_priv,
>>> -			       struct drm_mode_fb_cmd2 *mode_cmd)
>>> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj;
>>>   	struct amdgpu_framebuffer *amdgpu_fb;
>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
>>> index b62c171..de452996 100644
>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h
>>> @@ -551,7 +551,7 @@ int amdgpu_get_crtc_scanoutpos(struct drm_device *dev, unsigned int pipe,
>>>   
>>>   int amdgpu_framebuffer_init(struct drm_device *dev,
>>>   			     struct amdgpu_framebuffer *rfb,
>>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			     struct drm_gem_object *obj);
>>>   
>>>   int amdgpufb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
>>> diff --git a/drivers/gpu/drm/armada/armada_fb.c b/drivers/gpu/drm/armada/armada_fb.c
>>> index 1c90969..5fa4bf2 100644
>>> --- a/drivers/gpu/drm/armada/armada_fb.c
>>> +++ b/drivers/gpu/drm/armada/armada_fb.c
>>> @@ -35,7 +35,7 @@ static const struct drm_framebuffer_funcs armada_fb_funcs = {
>>>   };
>>>   
>>>   struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
>>> -	struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
>>> +	const struct drm_mode_fb_cmd2 *mode, struct armada_gem_object *obj)
>>>   {
>>>   	struct armada_framebuffer *dfb;
>>>   	uint8_t format, config;
>>> @@ -101,7 +101,7 @@ struct armada_framebuffer *armada_framebuffer_create(struct drm_device *dev,
>>>   }
>>>   
>>>   static struct drm_framebuffer *armada_fb_create(struct drm_device *dev,
>>> -	struct drm_file *dfile, struct drm_mode_fb_cmd2 *mode)
>>> +	struct drm_file *dfile, const struct drm_mode_fb_cmd2 *mode)
>>>   {
>>>   	struct armada_gem_object *obj;
>>>   	struct armada_framebuffer *dfb;
>>> diff --git a/drivers/gpu/drm/armada/armada_fb.h b/drivers/gpu/drm/armada/armada_fb.h
>>> index ce3f12e..48073c4 100644
>>> --- a/drivers/gpu/drm/armada/armada_fb.h
>>> +++ b/drivers/gpu/drm/armada/armada_fb.h
>>> @@ -19,6 +19,6 @@ struct armada_framebuffer {
>>>   #define drm_fb_obj(fb) drm_fb_to_armada_fb(fb)->obj
>>>   
>>>   struct armada_framebuffer *armada_framebuffer_create(struct drm_device *,
>>> -	struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
>>> +	const struct drm_mode_fb_cmd2 *, struct armada_gem_object *);
>>>   
>>>   #endif
>>> diff --git a/drivers/gpu/drm/ast/ast_drv.h b/drivers/gpu/drm/ast/ast_drv.h
>>> index 05f6522..e227f8a 100644
>>> --- a/drivers/gpu/drm/ast/ast_drv.h
>>> +++ b/drivers/gpu/drm/ast/ast_drv.h
>>> @@ -309,7 +309,7 @@ extern void ast_mode_fini(struct drm_device *dev);
>>>   
>>>   int ast_framebuffer_init(struct drm_device *dev,
>>>   			 struct ast_framebuffer *ast_fb,
>>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			 struct drm_gem_object *obj);
>>>   
>>>   int ast_fbdev_init(struct drm_device *dev);
>>> diff --git a/drivers/gpu/drm/ast/ast_fb.c b/drivers/gpu/drm/ast/ast_fb.c
>>> index a37e7ea..5320f8c 100644
>>> --- a/drivers/gpu/drm/ast/ast_fb.c
>>> +++ b/drivers/gpu/drm/ast/ast_fb.c
>>> @@ -163,7 +163,7 @@ static struct fb_ops astfb_ops = {
>>>   };
>>>   
>>>   static int astfb_create_object(struct ast_fbdev *afbdev,
>>> -			       struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			       const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			       struct drm_gem_object **gobj_p)
>>>   {
>>>   	struct drm_device *dev = afbdev->helper.dev;
>>> diff --git a/drivers/gpu/drm/ast/ast_main.c b/drivers/gpu/drm/ast/ast_main.c
>>> index 541a610..9759009 100644
>>> --- a/drivers/gpu/drm/ast/ast_main.c
>>> +++ b/drivers/gpu/drm/ast/ast_main.c
>>> @@ -309,7 +309,7 @@ static const struct drm_framebuffer_funcs ast_fb_funcs = {
>>>   
>>>   int ast_framebuffer_init(struct drm_device *dev,
>>>   			 struct ast_framebuffer *ast_fb,
>>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			 struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -327,7 +327,7 @@ int ast_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   ast_user_framebuffer_create(struct drm_device *dev,
>>>   	       struct drm_file *filp,
>>> -	       struct drm_mode_fb_cmd2 *mode_cmd)
>>> +	       const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj;
>>>   	struct ast_framebuffer *ast_fb;
>>> diff --git a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
>>> index 244df0a..8168954 100644
>>> --- a/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
>>> +++ b/drivers/gpu/drm/atmel-hlcdc/atmel_hlcdc_dc.c
>>> @@ -402,7 +402,7 @@ static irqreturn_t atmel_hlcdc_dc_irq_handler(int irq, void *data)
>>>   }
>>>   
>>>   static struct drm_framebuffer *atmel_hlcdc_fb_create(struct drm_device *dev,
>>> -		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	return drm_fb_cma_create(dev, file_priv, mode_cmd);
>>>   }
>>> diff --git a/drivers/gpu/drm/bochs/bochs.h b/drivers/gpu/drm/bochs/bochs.h
>>> index 71f2687..19b5ada 100644
>>> --- a/drivers/gpu/drm/bochs/bochs.h
>>> +++ b/drivers/gpu/drm/bochs/bochs.h
>>> @@ -149,7 +149,7 @@ int bochs_dumb_mmap_offset(struct drm_file *file, struct drm_device *dev,
>>>   
>>>   int bochs_framebuffer_init(struct drm_device *dev,
>>>   			   struct bochs_framebuffer *gfb,
>>> -			   struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			   const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			   struct drm_gem_object *obj);
>>>   int bochs_bo_pin(struct bochs_bo *bo, u32 pl_flag, u64 *gpu_addr);
>>>   int bochs_bo_unpin(struct bochs_bo *bo);
>>> diff --git a/drivers/gpu/drm/bochs/bochs_fbdev.c b/drivers/gpu/drm/bochs/bochs_fbdev.c
>>> index 09a0637..7520bf8 100644
>>> --- a/drivers/gpu/drm/bochs/bochs_fbdev.c
>>> +++ b/drivers/gpu/drm/bochs/bochs_fbdev.c
>>> @@ -34,7 +34,7 @@ static struct fb_ops bochsfb_ops = {
>>>   };
>>>   
>>>   static int bochsfb_create_object(struct bochs_device *bochs,
>>> -				 struct drm_mode_fb_cmd2 *mode_cmd,
>>> +				 const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   				 struct drm_gem_object **gobj_p)
>>>   {
>>>   	struct drm_device *dev = bochs->dev;
>>> diff --git a/drivers/gpu/drm/bochs/bochs_mm.c b/drivers/gpu/drm/bochs/bochs_mm.c
>>> index f69e6bf..d812ad0 100644
>>> --- a/drivers/gpu/drm/bochs/bochs_mm.c
>>> +++ b/drivers/gpu/drm/bochs/bochs_mm.c
>>> @@ -484,7 +484,7 @@ static const struct drm_framebuffer_funcs bochs_fb_funcs = {
>>>   
>>>   int bochs_framebuffer_init(struct drm_device *dev,
>>>   			   struct bochs_framebuffer *gfb,
>>> -			   struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			   const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			   struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -502,7 +502,7 @@ int bochs_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   bochs_user_framebuffer_create(struct drm_device *dev,
>>>   			      struct drm_file *filp,
>>> -			      struct drm_mode_fb_cmd2 *mode_cmd)
>>> +			      const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj;
>>>   	struct bochs_framebuffer *bochs_fb;
>>> diff --git a/drivers/gpu/drm/cirrus/cirrus_drv.h b/drivers/gpu/drm/cirrus/cirrus_drv.h
>>> index 7050615..1370a51 100644
>>> --- a/drivers/gpu/drm/cirrus/cirrus_drv.h
>>> +++ b/drivers/gpu/drm/cirrus/cirrus_drv.h
>>> @@ -207,7 +207,7 @@ int cirrus_dumb_create(struct drm_file *file,
>>>   
>>>   int cirrus_framebuffer_init(struct drm_device *dev,
>>>   			   struct cirrus_framebuffer *gfb,
>>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			    struct drm_gem_object *obj);
>>>   
>>>   bool cirrus_check_framebuffer(struct cirrus_device *cdev, int width, int height,
>>> diff --git a/drivers/gpu/drm/cirrus/cirrus_fbdev.c b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
>>> index 589103b..3b5be72 100644
>>> --- a/drivers/gpu/drm/cirrus/cirrus_fbdev.c
>>> +++ b/drivers/gpu/drm/cirrus/cirrus_fbdev.c
>>> @@ -135,7 +135,7 @@ static struct fb_ops cirrusfb_ops = {
>>>   };
>>>   
>>>   static int cirrusfb_create_object(struct cirrus_fbdev *afbdev,
>>> -			       struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			       const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			       struct drm_gem_object **gobj_p)
>>>   {
>>>   	struct drm_device *dev = afbdev->helper.dev;
>>> diff --git a/drivers/gpu/drm/cirrus/cirrus_main.c b/drivers/gpu/drm/cirrus/cirrus_main.c
>>> index 055fd86..0907715 100644
>>> --- a/drivers/gpu/drm/cirrus/cirrus_main.c
>>> +++ b/drivers/gpu/drm/cirrus/cirrus_main.c
>>> @@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs cirrus_fb_funcs = {
>>>   
>>>   int cirrus_framebuffer_init(struct drm_device *dev,
>>>   			    struct cirrus_framebuffer *gfb,
>>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			    struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -47,7 +47,7 @@ int cirrus_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   cirrus_user_framebuffer_create(struct drm_device *dev,
>>>   			       struct drm_file *filp,
>>> -			       struct drm_mode_fb_cmd2 *mode_cmd)
>>> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct cirrus_device *cdev = dev->dev_private;
>>>   	struct drm_gem_object *obj;
>>> diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
>>> index 24c5434..32dd134 100644
>>> --- a/drivers/gpu/drm/drm_crtc.c
>>> +++ b/drivers/gpu/drm/drm_crtc.c
>>> @@ -45,7 +45,7 @@
>>>   
>>>   static struct drm_framebuffer *
>>>   internal_framebuffer_create(struct drm_device *dev,
>>> -			    struct drm_mode_fb_cmd2 *r,
>>> +			    const struct drm_mode_fb_cmd2 *r,
>>>   			    struct drm_file *file_priv);
>>>   
>>>   /* Avoid boilerplate.  I'm tired of typing. */
>>> @@ -3235,7 +3235,7 @@ static int framebuffer_check(const struct drm_mode_fb_cmd2 *r)
>>>   
>>>   static struct drm_framebuffer *
>>>   internal_framebuffer_create(struct drm_device *dev,
>>> -			    struct drm_mode_fb_cmd2 *r,
>>> +			    const struct drm_mode_fb_cmd2 *r,
>>>   			    struct drm_file *file_priv)
>>>   {
>>>   	struct drm_mode_config *config = &dev->mode_config;
>>> diff --git a/drivers/gpu/drm/drm_crtc_helper.c b/drivers/gpu/drm/drm_crtc_helper.c
>>> index ef53475..6b4cf25 100644
>>> --- a/drivers/gpu/drm/drm_crtc_helper.c
>>> +++ b/drivers/gpu/drm/drm_crtc_helper.c
>>> @@ -818,7 +818,7 @@ EXPORT_SYMBOL(drm_helper_connector_dpms);
>>>    * metadata fields.
>>>    */
>>>   void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
>>> -				    struct drm_mode_fb_cmd2 *mode_cmd)
>>> +				    const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	int i;
>>>   
>>> diff --git a/drivers/gpu/drm/drm_fb_cma_helper.c b/drivers/gpu/drm/drm_fb_cma_helper.c
>>> index c19a625..b7d5b84 100644
>>> --- a/drivers/gpu/drm/drm_fb_cma_helper.c
>>> +++ b/drivers/gpu/drm/drm_fb_cma_helper.c
>>> @@ -74,7 +74,7 @@ static struct drm_framebuffer_funcs drm_fb_cma_funcs = {
>>>   };
>>>   
>>>   static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
>>> -	struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
>>> +	const const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_cma_object **obj,
>>>   	unsigned int num_planes)
>>>   {
>>>   	struct drm_fb_cma *fb_cma;
>>> @@ -107,7 +107,7 @@ static struct drm_fb_cma *drm_fb_cma_alloc(struct drm_device *dev,
>>>    * checked before calling this function.
>>>    */
>>>   struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
>>> -	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
>>> +	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_fb_cma *fb_cma;
>>>   	struct drm_gem_cma_object *objs[4];
>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.c b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>> index fcea28b..49b9bc3 100644
>>> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.c
>>> @@ -117,7 +117,7 @@ static struct drm_framebuffer_funcs exynos_drm_fb_funcs = {
>>>   
>>>   struct drm_framebuffer *
>>>   exynos_drm_framebuffer_init(struct drm_device *dev,
>>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			    struct exynos_drm_gem **exynos_gem,
>>>   			    int count)
>>>   {
>>> @@ -154,7 +154,7 @@ err:
>>>   
>>>   static struct drm_framebuffer *
>>>   exynos_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>>> -		      struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		      const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct exynos_drm_gem *exynos_gem[MAX_FB_BUFFER];
>>>   	struct drm_gem_object *obj;
>>> diff --git a/drivers/gpu/drm/exynos/exynos_drm_fb.h b/drivers/gpu/drm/exynos/exynos_drm_fb.h
>>> index 726a2d4..a8a75ac 100644
>>> --- a/drivers/gpu/drm/exynos/exynos_drm_fb.h
>>> +++ b/drivers/gpu/drm/exynos/exynos_drm_fb.h
>>> @@ -18,7 +18,7 @@
>>>   
>>>   struct drm_framebuffer *
>>>   exynos_drm_framebuffer_init(struct drm_device *dev,
>>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			    struct exynos_drm_gem **exynos_gem,
>>>   			    int count);
>>>   
>>> diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c
>>> index 2eaf1b3..dc0508d 100644
>>> --- a/drivers/gpu/drm/gma500/framebuffer.c
>>> +++ b/drivers/gpu/drm/gma500/framebuffer.c
>>> @@ -241,7 +241,7 @@ static struct fb_ops psbfb_unaccel_ops = {
>>>    */
>>>   static int psb_framebuffer_init(struct drm_device *dev,
>>>   					struct psb_framebuffer *fb,
>>> -					struct drm_mode_fb_cmd2 *mode_cmd,
>>> +					const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   					struct gtt_range *gt)
>>>   {
>>>   	u32 bpp, depth;
>>> @@ -284,7 +284,7 @@ static int psb_framebuffer_init(struct drm_device *dev,
>>>   
>>>   static struct drm_framebuffer *psb_framebuffer_create
>>>   			(struct drm_device *dev,
>>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			 struct gtt_range *gt)
>>>   {
>>>   	struct psb_framebuffer *fb;
>>> @@ -488,7 +488,7 @@ out_err1:
>>>    */
>>>   static struct drm_framebuffer *psb_user_framebuffer_create
>>>   			(struct drm_device *dev, struct drm_file *filp,
>>> -			 struct drm_mode_fb_cmd2 *cmd)
>>> +			 const struct drm_mode_fb_cmd2 *cmd)
>>>   {
>>>   	struct gtt_range *r;
>>>   	struct drm_gem_object *obj;
>>> diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
>>> index c3aa6f5..58dbac7 100644
>>> --- a/drivers/gpu/drm/i915/intel_display.c
>>> +++ b/drivers/gpu/drm/i915/intel_display.c
>>> @@ -14578,7 +14578,7 @@ static int intel_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   intel_user_framebuffer_create(struct drm_device *dev,
>>>   			      struct drm_file *filp,
>>> -			      struct drm_mode_fb_cmd2 *user_mode_cmd)
>>> +			      const struct drm_mode_fb_cmd2 *user_mode_cmd)
>>>   {
>>>   	struct drm_framebuffer *fb;
>>>   	struct drm_i915_gem_object *obj;
>>> diff --git a/drivers/gpu/drm/mgag200/mgag200_drv.h b/drivers/gpu/drm/mgag200/mgag200_drv.h
>>> index 912151c..205b280 100644
>>> --- a/drivers/gpu/drm/mgag200/mgag200_drv.h
>>> +++ b/drivers/gpu/drm/mgag200/mgag200_drv.h
>>> @@ -252,7 +252,7 @@ void mgag200_fbdev_fini(struct mga_device *mdev);
>>>   				/* mgag200_main.c */
>>>   int mgag200_framebuffer_init(struct drm_device *dev,
>>>   			     struct mga_framebuffer *mfb,
>>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			     struct drm_gem_object *obj);
>>>   
>>>   
>>> diff --git a/drivers/gpu/drm/mgag200/mgag200_fb.c b/drivers/gpu/drm/mgag200/mgag200_fb.c
>>> index b35b5b2..d9b04b0 100644
>>> --- a/drivers/gpu/drm/mgag200/mgag200_fb.c
>>> +++ b/drivers/gpu/drm/mgag200/mgag200_fb.c
>>> @@ -138,7 +138,7 @@ static struct fb_ops mgag200fb_ops = {
>>>   };
>>>   
>>>   static int mgag200fb_create_object(struct mga_fbdev *afbdev,
>>> -				   struct drm_mode_fb_cmd2 *mode_cmd,
>>> +				   const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   				   struct drm_gem_object **gobj_p)
>>>   {
>>>   	struct drm_device *dev = afbdev->helper.dev;
>>> diff --git a/drivers/gpu/drm/mgag200/mgag200_main.c b/drivers/gpu/drm/mgag200/mgag200_main.c
>>> index b1a0f56..9147444 100644
>>> --- a/drivers/gpu/drm/mgag200/mgag200_main.c
>>> +++ b/drivers/gpu/drm/mgag200/mgag200_main.c
>>> @@ -29,7 +29,7 @@ static const struct drm_framebuffer_funcs mga_fb_funcs = {
>>>   
>>>   int mgag200_framebuffer_init(struct drm_device *dev,
>>>   			     struct mga_framebuffer *gfb,
>>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			     struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -47,7 +47,7 @@ int mgag200_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   mgag200_user_framebuffer_create(struct drm_device *dev,
>>>   				struct drm_file *filp,
>>> -				struct drm_mode_fb_cmd2 *mode_cmd)
>>> +				const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj;
>>>   	struct mga_framebuffer *mga_fb;
>>> diff --git a/drivers/gpu/drm/msm/msm_drv.h b/drivers/gpu/drm/msm/msm_drv.h
>>> index 3be7a56..9a713b7 100644
>>> --- a/drivers/gpu/drm/msm/msm_drv.h
>>> +++ b/drivers/gpu/drm/msm/msm_drv.h
>>> @@ -240,9 +240,9 @@ uint32_t msm_framebuffer_iova(struct drm_framebuffer *fb, int id, int plane);
>>>   struct drm_gem_object *msm_framebuffer_bo(struct drm_framebuffer *fb, int plane);
>>>   const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb);
>>>   struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
>>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>>>   struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
>>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
>>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
>>>   
>>>   struct drm_fb_helper *msm_fbdev_init(struct drm_device *dev);
>>>   
>>> diff --git a/drivers/gpu/drm/msm/msm_fb.c b/drivers/gpu/drm/msm/msm_fb.c
>>> index 12171328..a474d6c 100644
>>> --- a/drivers/gpu/drm/msm/msm_fb.c
>>> +++ b/drivers/gpu/drm/msm/msm_fb.c
>>> @@ -138,7 +138,7 @@ const struct msm_format *msm_framebuffer_format(struct drm_framebuffer *fb)
>>>   }
>>>   
>>>   struct drm_framebuffer *msm_framebuffer_create(struct drm_device *dev,
>>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *bos[4] = {0};
>>>   	struct drm_framebuffer *fb;
>>> @@ -168,7 +168,7 @@ out_unref:
>>>   }
>>>   
>>>   struct drm_framebuffer *msm_framebuffer_init(struct drm_device *dev,
>>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>>>   {
>>>   	struct msm_drm_private *priv = dev->dev_private;
>>>   	struct msm_kms *kms = priv->kms;
>>> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c b/drivers/gpu/drm/nouveau/nouveau_display.c
>>> index db6bc67..ea9d3bc 100644
>>> --- a/drivers/gpu/drm/nouveau/nouveau_display.c
>>> +++ b/drivers/gpu/drm/nouveau/nouveau_display.c
>>> @@ -246,7 +246,7 @@ static const struct drm_framebuffer_funcs nouveau_framebuffer_funcs = {
>>>   int
>>>   nouveau_framebuffer_init(struct drm_device *dev,
>>>   			 struct nouveau_framebuffer *nv_fb,
>>> -			 struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			 const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			 struct nouveau_bo *nvbo)
>>>   {
>>>   	struct nouveau_display *disp = nouveau_display(dev);
>>> @@ -272,7 +272,7 @@ nouveau_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   nouveau_user_framebuffer_create(struct drm_device *dev,
>>>   				struct drm_file *file_priv,
>>> -				struct drm_mode_fb_cmd2 *mode_cmd)
>>> +				const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct nouveau_framebuffer *nouveau_fb;
>>>   	struct drm_gem_object *gem;
>>> diff --git a/drivers/gpu/drm/nouveau/nouveau_display.h b/drivers/gpu/drm/nouveau/nouveau_display.h
>>> index 856abe0..5a57d8b 100644
>>> --- a/drivers/gpu/drm/nouveau/nouveau_display.h
>>> +++ b/drivers/gpu/drm/nouveau/nouveau_display.h
>>> @@ -23,7 +23,7 @@ nouveau_framebuffer(struct drm_framebuffer *fb)
>>>   }
>>>   
>>>   int nouveau_framebuffer_init(struct drm_device *, struct nouveau_framebuffer *,
>>> -			     struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
>>> +			     const struct drm_mode_fb_cmd2 *, struct nouveau_bo *);
>>>   
>>>   struct nouveau_page_flip_state {
>>>   	struct list_head head;
>>> diff --git a/drivers/gpu/drm/omapdrm/omap_drv.h b/drivers/gpu/drm/omapdrm/omap_drv.h
>>> index 5c367aa..130fca7 100644
>>> --- a/drivers/gpu/drm/omapdrm/omap_drv.h
>>> +++ b/drivers/gpu/drm/omapdrm/omap_drv.h
>>> @@ -172,9 +172,9 @@ void copy_timings_drm_to_omap(struct omap_video_timings *timings,
>>>   uint32_t omap_framebuffer_get_formats(uint32_t *pixel_formats,
>>>   		uint32_t max_formats, enum omap_color_mode supported_modes);
>>>   struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd);
>>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd);
>>>   struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
>>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos);
>>>   struct drm_gem_object *omap_framebuffer_bo(struct drm_framebuffer *fb, int p);
>>>   int omap_framebuffer_pin(struct drm_framebuffer *fb);
>>>   void omap_framebuffer_unpin(struct drm_framebuffer *fb);
>>> @@ -248,7 +248,7 @@ struct omap_dss_device *omap_encoder_get_dssdev(struct drm_encoder *encoder);
>>>   
>>>   static inline int objects_lookup(struct drm_device *dev,
>>>   		struct drm_file *filp, uint32_t pixel_format,
>>> -		struct drm_gem_object **bos, uint32_t *handles)
>>> +		struct drm_gem_object **bos, const uint32_t *handles)
>>>   {
>>>   	int i, n = drm_format_num_planes(pixel_format);
>>>   
>>> diff --git a/drivers/gpu/drm/omapdrm/omap_fb.c b/drivers/gpu/drm/omapdrm/omap_fb.c
>>> index 636a1f9..ad202df 100644
>>> --- a/drivers/gpu/drm/omapdrm/omap_fb.c
>>> +++ b/drivers/gpu/drm/omapdrm/omap_fb.c
>>> @@ -364,7 +364,7 @@ void omap_framebuffer_describe(struct drm_framebuffer *fb, struct seq_file *m)
>>>   #endif
>>>   
>>>   struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>>> -		struct drm_file *file, struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		struct drm_file *file, const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *bos[4];
>>>   	struct drm_framebuffer *fb;
>>> @@ -386,7 +386,7 @@ struct drm_framebuffer *omap_framebuffer_create(struct drm_device *dev,
>>>   }
>>>   
>>>   struct drm_framebuffer *omap_framebuffer_init(struct drm_device *dev,
>>> -		struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>>> +		const struct drm_mode_fb_cmd2 *mode_cmd, struct drm_gem_object **bos)
>>>   {
>>>   	struct omap_framebuffer *omap_fb = NULL;
>>>   	struct drm_framebuffer *fb = NULL;
>>> diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
>>> index 183aea1..cddba07 100644
>>> --- a/drivers/gpu/drm/qxl/qxl_display.c
>>> +++ b/drivers/gpu/drm/qxl/qxl_display.c
>>> @@ -521,7 +521,7 @@ static const struct drm_framebuffer_funcs qxl_fb_funcs = {
>>>   int
>>>   qxl_framebuffer_init(struct drm_device *dev,
>>>   		     struct qxl_framebuffer *qfb,
>>> -		     struct drm_mode_fb_cmd2 *mode_cmd,
>>> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   		     struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -1003,7 +1003,7 @@ static int qdev_output_init(struct drm_device *dev, int num_output)
>>>   static struct drm_framebuffer *
>>>   qxl_user_framebuffer_create(struct drm_device *dev,
>>>   			    struct drm_file *file_priv,
>>> -			    struct drm_mode_fb_cmd2 *mode_cmd)
>>> +			    const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj;
>>>   	struct qxl_framebuffer *qxl_fb;
>>> diff --git a/drivers/gpu/drm/qxl/qxl_drv.h b/drivers/gpu/drm/qxl/qxl_drv.h
>>> index 01a8694..6e6b9b1 100644
>>> --- a/drivers/gpu/drm/qxl/qxl_drv.h
>>> +++ b/drivers/gpu/drm/qxl/qxl_drv.h
>>> @@ -390,7 +390,7 @@ void qxl_fbdev_set_suspend(struct qxl_device *qdev, int state);
>>>   int
>>>   qxl_framebuffer_init(struct drm_device *dev,
>>>   		     struct qxl_framebuffer *rfb,
>>> -		     struct drm_mode_fb_cmd2 *mode_cmd,
>>> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   		     struct drm_gem_object *obj);
>>>   void qxl_display_read_client_monitors_config(struct qxl_device *qdev);
>>>   void qxl_send_monitors_config(struct qxl_device *qdev);
>>> diff --git a/drivers/gpu/drm/qxl/qxl_fb.c b/drivers/gpu/drm/qxl/qxl_fb.c
>>> index c4a5526..11f543b 100644
>>> --- a/drivers/gpu/drm/qxl/qxl_fb.c
>>> +++ b/drivers/gpu/drm/qxl/qxl_fb.c
>>> @@ -283,7 +283,7 @@ int qxl_get_handle_for_primary_fb(struct qxl_device *qdev,
>>>   }
>>>   
>>>   static int qxlfb_create_pinned_object(struct qxl_fbdev *qfbdev,
>>> -				      struct drm_mode_fb_cmd2 *mode_cmd,
>>> +				      const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   				      struct drm_gem_object **gobj_p)
>>>   {
>>>   	struct qxl_device *qdev = qfbdev->qdev;
>>> diff --git a/drivers/gpu/drm/radeon/radeon_display.c b/drivers/gpu/drm/radeon/radeon_display.c
>>> index a8d9927..ded51fb 100644
>>> --- a/drivers/gpu/drm/radeon/radeon_display.c
>>> +++ b/drivers/gpu/drm/radeon/radeon_display.c
>>> @@ -1292,7 +1292,7 @@ static const struct drm_framebuffer_funcs radeon_fb_funcs = {
>>>   int
>>>   radeon_framebuffer_init(struct drm_device *dev,
>>>   			struct radeon_framebuffer *rfb,
>>> -			struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -1309,7 +1309,7 @@ radeon_framebuffer_init(struct drm_device *dev,
>>>   static struct drm_framebuffer *
>>>   radeon_user_framebuffer_create(struct drm_device *dev,
>>>   			       struct drm_file *file_priv,
>>> -			       struct drm_mode_fb_cmd2 *mode_cmd)
>>> +			       const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj;
>>>   	struct radeon_framebuffer *radeon_fb;
>>> diff --git a/drivers/gpu/drm/radeon/radeon_mode.h b/drivers/gpu/drm/radeon/radeon_mode.h
>>> index 830e171..b8e3c27 100644
>>> --- a/drivers/gpu/drm/radeon/radeon_mode.h
>>> +++ b/drivers/gpu/drm/radeon/radeon_mode.h
>>> @@ -929,7 +929,7 @@ extern void radeon_crtc_fb_gamma_get(struct drm_crtc *crtc, u16 *red, u16 *green
>>>   				     u16 *blue, int regno);
>>>   int radeon_framebuffer_init(struct drm_device *dev,
>>>   			     struct radeon_framebuffer *rfb,
>>> -			     struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			     const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			     struct drm_gem_object *obj);
>>>   
>>>   int radeonfb_remove(struct drm_device *dev, struct drm_framebuffer *fb);
>>> diff --git a/drivers/gpu/drm/rcar-du/rcar_du_kms.c b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>>> index ca12e8c..43bce69 100644
>>> --- a/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>>> +++ b/drivers/gpu/drm/rcar-du/rcar_du_kms.c
>>> @@ -136,7 +136,7 @@ int rcar_du_dumb_create(struct drm_file *file, struct drm_device *dev,
>>>   
>>>   static struct drm_framebuffer *
>>>   rcar_du_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>>> -		  struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		  const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct rcar_du_device *rcdu = dev->dev_private;
>>>   	const struct rcar_du_format_info *format;
>>> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
>>> index 002645b..b8ac591 100644
>>> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
>>> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.c
>>> @@ -72,7 +72,7 @@ static struct drm_framebuffer_funcs rockchip_drm_fb_funcs = {
>>>   };
>>>   
>>>   static struct rockchip_drm_fb *
>>> -rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
>>> +rockchip_fb_alloc(struct drm_device *dev, const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   		  struct drm_gem_object **obj, unsigned int num_planes)
>>>   {
>>>   	struct rockchip_drm_fb *rockchip_fb;
>>> @@ -102,7 +102,7 @@ rockchip_fb_alloc(struct drm_device *dev, struct drm_mode_fb_cmd2 *mode_cmd,
>>>   
>>>   static struct drm_framebuffer *
>>>   rockchip_user_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>>> -			struct drm_mode_fb_cmd2 *mode_cmd)
>>> +			const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct rockchip_drm_fb *rockchip_fb;
>>>   	struct drm_gem_object *objs[ROCKCHIP_MAX_FB_BUFFER];
>>> @@ -173,7 +173,7 @@ static const struct drm_mode_config_funcs rockchip_drm_mode_config_funcs = {
>>>   
>>>   struct drm_framebuffer *
>>>   rockchip_drm_framebuffer_init(struct drm_device *dev,
>>> -			      struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			      const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			      struct drm_gem_object *obj)
>>>   {
>>>   	struct rockchip_drm_fb *rockchip_fb;
>>> diff --git a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
>>> index 09574d4..2fe47f1 100644
>>> --- a/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
>>> +++ b/drivers/gpu/drm/rockchip/rockchip_drm_fb.h
>>> @@ -17,7 +17,7 @@
>>>   
>>>   struct drm_framebuffer *
>>>   rockchip_drm_framebuffer_init(struct drm_device *dev,
>>> -			      struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			      const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			      struct drm_gem_object *obj);
>>>   void rockchip_drm_framebuffer_fini(struct drm_framebuffer *fb);
>>>   
>>> diff --git a/drivers/gpu/drm/shmobile/shmob_drm_kms.c b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
>>> index aaf98ac..388a0fc 100644
>>> --- a/drivers/gpu/drm/shmobile/shmob_drm_kms.c
>>> +++ b/drivers/gpu/drm/shmobile/shmob_drm_kms.c
>>> @@ -104,7 +104,7 @@ const struct shmob_drm_format_info *shmob_drm_format_info(u32 fourcc)
>>>   
>>>   static struct drm_framebuffer *
>>>   shmob_drm_fb_create(struct drm_device *dev, struct drm_file *file_priv,
>>> -		    struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		    const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	const struct shmob_drm_format_info *format;
>>>   
>>> diff --git a/drivers/gpu/drm/tegra/drm.h b/drivers/gpu/drm/tegra/drm.h
>>> index 942cad9..d88a2d1 100644
>>> --- a/drivers/gpu/drm/tegra/drm.h
>>> +++ b/drivers/gpu/drm/tegra/drm.h
>>> @@ -268,7 +268,7 @@ int tegra_fb_get_tiling(struct drm_framebuffer *framebuffer,
>>>   			struct tegra_bo_tiling *tiling);
>>>   struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>>>   					struct drm_file *file,
>>> -					struct drm_mode_fb_cmd2 *cmd);
>>> +					const struct drm_mode_fb_cmd2 *cmd);
>>>   int tegra_drm_fb_prepare(struct drm_device *drm);
>>>   void tegra_drm_fb_free(struct drm_device *drm);
>>>   int tegra_drm_fb_init(struct drm_device *drm);
>>> diff --git a/drivers/gpu/drm/tegra/fb.c b/drivers/gpu/drm/tegra/fb.c
>>> index bec07d9..ede9e94 100644
>>> --- a/drivers/gpu/drm/tegra/fb.c
>>> +++ b/drivers/gpu/drm/tegra/fb.c
>>> @@ -92,7 +92,7 @@ static struct drm_framebuffer_funcs tegra_fb_funcs = {
>>>   };
>>>   
>>>   static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
>>> -				       struct drm_mode_fb_cmd2 *mode_cmd,
>>> +				       const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   				       struct tegra_bo **planes,
>>>   				       unsigned int num_planes)
>>>   {
>>> @@ -131,7 +131,7 @@ static struct tegra_fb *tegra_fb_alloc(struct drm_device *drm,
>>>   
>>>   struct drm_framebuffer *tegra_fb_create(struct drm_device *drm,
>>>   					struct drm_file *file,
>>> -					struct drm_mode_fb_cmd2 *cmd)
>>> +					const struct drm_mode_fb_cmd2 *cmd)
>>>   {
>>>   	unsigned int hsub, vsub, i;
>>>   	struct tegra_bo *planes[4];
>>> diff --git a/drivers/gpu/drm/tilcdc/tilcdc_drv.c b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
>>> index 876cad5..4ddb21e 100644
>>> --- a/drivers/gpu/drm/tilcdc/tilcdc_drv.c
>>> +++ b/drivers/gpu/drm/tilcdc/tilcdc_drv.c
>>> @@ -46,7 +46,7 @@ void tilcdc_module_cleanup(struct tilcdc_module *mod)
>>>   static struct of_device_id tilcdc_of_match[];
>>>   
>>>   static struct drm_framebuffer *tilcdc_fb_create(struct drm_device *dev,
>>> -		struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	return drm_fb_cma_create(dev, file_priv, mode_cmd);
>>>   }
>>> diff --git a/drivers/gpu/drm/udl/udl_drv.h b/drivers/gpu/drm/udl/udl_drv.h
>>> index 80adbac..4a064ef 100644
>>> --- a/drivers/gpu/drm/udl/udl_drv.h
>>> +++ b/drivers/gpu/drm/udl/udl_drv.h
>>> @@ -108,7 +108,7 @@ void udl_fbdev_unplug(struct drm_device *dev);
>>>   struct drm_framebuffer *
>>>   udl_fb_user_fb_create(struct drm_device *dev,
>>>   		      struct drm_file *file,
>>> -		      struct drm_mode_fb_cmd2 *mode_cmd);
>>> +		      const struct drm_mode_fb_cmd2 *mode_cmd);
>>>   
>>>   int udl_render_hline(struct drm_device *dev, int bpp, struct urb **urb_ptr,
>>>   		     const char *front, char **urb_buf_ptr,
>>> diff --git a/drivers/gpu/drm/udl/udl_fb.c b/drivers/gpu/drm/udl/udl_fb.c
>>> index 62c7b1d..f09b11a 100644
>>> --- a/drivers/gpu/drm/udl/udl_fb.c
>>> +++ b/drivers/gpu/drm/udl/udl_fb.c
>>> @@ -456,7 +456,7 @@ static const struct drm_framebuffer_funcs udlfb_funcs = {
>>>   static int
>>>   udl_framebuffer_init(struct drm_device *dev,
>>>   		     struct udl_framebuffer *ufb,
>>> -		     struct drm_mode_fb_cmd2 *mode_cmd,
>>> +		     const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   		     struct udl_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -624,7 +624,7 @@ void udl_fbdev_unplug(struct drm_device *dev)
>>>   struct drm_framebuffer *
>>>   udl_fb_user_fb_create(struct drm_device *dev,
>>>   		   struct drm_file *file,
>>> -		   struct drm_mode_fb_cmd2 *mode_cmd)
>>> +		   const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj;
>>>   	struct udl_framebuffer *ufb;
>>> diff --git a/drivers/gpu/drm/virtio/virtgpu_display.c b/drivers/gpu/drm/virtio/virtgpu_display.c
>>> index f545913..306a7df 100644
>>> --- a/drivers/gpu/drm/virtio/virtgpu_display.c
>>> +++ b/drivers/gpu/drm/virtio/virtgpu_display.c
>>> @@ -215,7 +215,7 @@ static const struct drm_framebuffer_funcs virtio_gpu_fb_funcs = {
>>>   int
>>>   virtio_gpu_framebuffer_init(struct drm_device *dev,
>>>   			    struct virtio_gpu_framebuffer *vgfb,
>>> -			    struct drm_mode_fb_cmd2 *mode_cmd,
>>> +			    const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   			    struct drm_gem_object *obj)
>>>   {
>>>   	int ret;
>>> @@ -465,7 +465,7 @@ static int vgdev_output_init(struct virtio_gpu_device *vgdev, int index)
>>>   static struct drm_framebuffer *
>>>   virtio_gpu_user_framebuffer_create(struct drm_device *dev,
>>>   				   struct drm_file *file_priv,
>>> -				   struct drm_mode_fb_cmd2 *mode_cmd)
>>> +				   const struct drm_mode_fb_cmd2 *mode_cmd)
>>>   {
>>>   	struct drm_gem_object *obj = NULL;
>>>   	struct virtio_gpu_framebuffer *virtio_gpu_fb;
>>> diff --git a/drivers/gpu/drm/virtio/virtgpu_drv.h b/drivers/gpu/drm/virtio/virtgpu_drv.h
>>> index 79f0abe..8f486f4 100644
>>> --- a/drivers/gpu/drm/virtio/virtgpu_drv.h
>>> +++ b/drivers/gpu/drm/virtio/virtgpu_drv.h
>>> @@ -328,7 +328,7 @@ void virtio_gpu_dequeue_fence_func(struct work_struct *work);
>>>   /* virtio_gpu_display.c */
>>>   int virtio_gpu_framebuffer_init(struct drm_device *dev,
>>>   				struct virtio_gpu_framebuffer *vgfb,
>>> -				struct drm_mode_fb_cmd2 *mode_cmd,
>>> +				const struct drm_mode_fb_cmd2 *mode_cmd,
>>>   				struct drm_gem_object *obj);
>>>   int virtio_gpu_modeset_init(struct virtio_gpu_device *vgdev);
>>>   void virtio_gpu_modeset_fini(struct virtio_gpu_device *vgdev);
>>> diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>>> index 9fcd7f8..e38db351 100644
>>> --- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>>> +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
>>> @@ -930,7 +930,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
>>>   
>>>   static struct drm_framebuffer *vmw_kms_fb_create(struct drm_device *dev,
>>>   						 struct drm_file *file_priv,
>>> -						 struct drm_mode_fb_cmd2 *mode_cmd2)
>>> +						 const struct drm_mode_fb_cmd2 *mode_cmd2)
>>>   {
>>>   	struct vmw_private *dev_priv = vmw_priv(dev);
>>>   	struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
>>> diff --git a/include/drm/drm_crtc.h b/include/drm/drm_crtc.h
>>> index 3f0c690..bd27364 100644
>>> --- a/include/drm/drm_crtc.h
>>> +++ b/include/drm/drm_crtc.h
>>> @@ -992,7 +992,7 @@ struct drm_mode_set {
>>>   struct drm_mode_config_funcs {
>>>   	struct drm_framebuffer *(*fb_create)(struct drm_device *dev,
>>>   					     struct drm_file *file_priv,
>>> -					     struct drm_mode_fb_cmd2 *mode_cmd);
>>> +					     const struct drm_mode_fb_cmd2 *mode_cmd);
>>>   	void (*output_poll_changed)(struct drm_device *dev);
>>>   
>>>   	int (*atomic_check)(struct drm_device *dev,
>>> diff --git a/include/drm/drm_crtc_helper.h b/include/drm/drm_crtc_helper.h
>>> index 3febb4b..e22ab29 100644
>>> --- a/include/drm/drm_crtc_helper.h
>>> +++ b/include/drm/drm_crtc_helper.h
>>> @@ -197,7 +197,7 @@ extern int drm_helper_connector_dpms(struct drm_connector *connector, int mode);
>>>   extern void drm_helper_move_panel_connectors_to_head(struct drm_device *);
>>>   
>>>   extern void drm_helper_mode_fill_fb_struct(struct drm_framebuffer *fb,
>>> -					   struct drm_mode_fb_cmd2 *mode_cmd);
>>> +					   const struct drm_mode_fb_cmd2 *mode_cmd);
>>>   
>>>   static inline void drm_crtc_helper_add(struct drm_crtc *crtc,
>>>   				       const struct drm_crtc_helper_funcs *funcs)
>>> diff --git a/include/drm/drm_fb_cma_helper.h b/include/drm/drm_fb_cma_helper.h
>>> index c54cf3d..be62bd3 100644
>>> --- a/include/drm/drm_fb_cma_helper.h
>>> +++ b/include/drm/drm_fb_cma_helper.h
>>> @@ -18,7 +18,7 @@ void drm_fbdev_cma_restore_mode(struct drm_fbdev_cma *fbdev_cma);
>>>   void drm_fbdev_cma_hotplug_event(struct drm_fbdev_cma *fbdev_cma);
>>>   
>>>   struct drm_framebuffer *drm_fb_cma_create(struct drm_device *dev,
>>> -	struct drm_file *file_priv, struct drm_mode_fb_cmd2 *mode_cmd);
>>> +	struct drm_file *file_priv, const struct drm_mode_fb_cmd2 *mode_cmd);
>>>   
>>>   struct drm_gem_cma_object *drm_fb_cma_get_gem_obj(struct drm_framebuffer *fb,
>>>   	unsigned int plane);
>>> -- 
>>> 2.4.10
>>>
>>> _______________________________________________
>>> Intel-gfx mailing list
>>> Intel-gfx@lists.freedesktop.org
>>> http://lists.freedesktop.org/mailman/listinfo/intel-gfx
>
> _______________________________________________
> Intel-gfx mailing list
> Intel-gfx@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/intel-gfx

-- 
Jani Nikula, Intel Open Source Technology Center
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/dri-devel

^ permalink raw reply	[flat|nested] 20+ messages in thread

end of thread, other threads:[~2015-11-17 14:45 UTC | newest]

Thread overview: 20+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-11-11 17:11 [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params ville.syrjala
2015-11-11 17:11 ` [PATCH 2/2] drm: Pass the user drm_mode_fb_cmd2 as const to .fb_create() ville.syrjala
2015-11-16 15:20   ` Tvrtko Ursulin
2015-11-17  9:48   ` [Intel-gfx] " Daniel Vetter
2015-11-17 13:30     ` John Harrison
2015-11-17 14:45       ` [Intel-gfx] " Jani Nikula
2015-11-11 17:11 ` [PATCH i-g-t] tests/kms_addfb_basic: Add clobbered-modifier subtest ville.syrjala
2015-11-11 17:20 ` [PATCH 1/2] drm/i915: Don't clobber the addfb2 ioctl params Chris Wilson
2015-11-11 17:20   ` Chris Wilson
2015-11-11 17:24   ` Ville Syrjälä
2015-11-11 17:24     ` Ville Syrjälä
2015-11-11 17:36     ` Chris Wilson
2015-11-11 17:36       ` Chris Wilson
2015-11-17  9:47 ` Daniel Vetter
2015-11-17  9:47   ` Daniel Vetter
2015-11-17 11:04   ` Ville Syrjälä
2015-11-17 11:04     ` Ville Syrjälä
2015-11-17 13:00     ` [Intel-gfx] " Ville Syrjälä
2015-11-17 13:00       ` Ville Syrjälä
2015-11-17 14:45       ` Jani Nikula

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.