Here's a diff I can roll in if it looks ok.  It adds the ability to
specify multiple handles for a single fb to better accommodate planar
configs.  I think Rob has convinced me that this is a good idea...
comments appreciated.

Thanks,
Jesse

diff --git a/drivers/gpu/drm/drm_crtc.c b/drivers/gpu/drm/drm_crtc.c
index a30b9d4..0cc2077 100644
--- a/drivers/gpu/drm/drm_crtc.c
+++ b/drivers/gpu/drm/drm_crtc.c
@@ -1923,7 +1923,8 @@ int drm_mode_addfb(struct drm_device *dev,
        r.bpp = or->bpp;
        r.depth = or->depth;
        r.pixel_format = 0;
-       r.handle = or->handle;
+       r.handle_count = 1;
+       r.handles = (u64)&or->handle;

        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return -EINVAL;
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index cd7e04d..2c7f200 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -7619,8 +7619,9 @@ intel_user_framebuffer_create(struct drm_device *dev,
                              struct drm_mode_fb_cmd2 *mode_cmd)
 {
        struct drm_i915_gem_object *obj;
+       u32 *handles = (u32 *)mode_cmd->handles;

-       obj = to_intel_bo(drm_gem_object_lookup(dev, filp, mode_cmd->handle));
+       obj = to_intel_bo(drm_gem_object_lookup(dev, filp, handles[0]));
        if (&obj->base == NULL)
                return ERR_PTR(-ENOENT);

diff --git a/drivers/gpu/drm/nouveau/nouveau_display.c 
b/drivers/gpu/drm/nouveau/nouveau_display.c
index 7a428a9..cb9b868 100644
--- a/drivers/gpu/drm/nouveau/nouveau_display.c
+++ b/drivers/gpu/drm/nouveau/nouveau_display.c
@@ -128,9 +128,10 @@ nouveau_user_framebuffer_create(struct drm_device *dev,
 {
        struct nouveau_framebuffer *nouveau_fb;
        struct drm_gem_object *gem;
+       u32 *handles = (u32 *)mode_cmd->handles;
        int ret;

-       gem = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
+       gem = drm_gem_object_lookup(dev, file_priv, handles);
        if (!gem)
                return ERR_PTR(-ENOENT);

diff --git a/drivers/gpu/drm/radeon/radeon_display.c 
b/drivers/gpu/drm/radeon/radeon_display.c
index ae803f8..63a6d91 100644
--- a/drivers/gpu/drm/radeon/radeon_display.c
+++ b/drivers/gpu/drm/radeon/radeon_display.c
@@ -1128,11 +1128,12 @@ radeon_user_framebuffer_create(struct drm_device *dev,
 {
        struct drm_gem_object *obj;
        struct radeon_framebuffer *radeon_fb;
+       u32 *handles = (u32 *)mode_cmd->handles;

-       obj = drm_gem_object_lookup(dev, file_priv, mode_cmd->handle);
+       obj = drm_gem_object_lookup(dev, file_priv, handles[0]);
        if (obj ==  NULL) {
                dev_err(&dev->pdev->dev, "No GEM object associated to handle 
0x%08X, "
-                       "can't create framebuffer\n", mode_cmd->handle);
+                       "can't create framebuffer\n", handles[0]);
                return ERR_PTR(-ENOENT);
        }

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index 2a1b802..0ad7456 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -866,7 +866,7 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct 
drm_device *dev,
         */

        ret = vmw_user_surface_lookup_handle(dev_priv, tfile,
-                                            mode_cmd->handle, &surface);
+                                            mode_cmd->handles[0], &surface);
        if (ret)
                goto try_dmabuf;

diff --git a/drivers/staging/gma500/framebuffer.c 
b/drivers/staging/gma500/framebuffer.c
index 85f47d5..ee91ffe 100644
--- a/drivers/staging/gma500/framebuffer.c
+++ b/drivers/staging/gma500/framebuffer.c
@@ -496,7 +496,7 @@ static struct drm_framebuffer *psb_user_framebuffer_create
         *      Find the GEM object and thus the gtt range object that is
         *      to back this space
         */
-       obj = drm_gem_object_lookup(dev, filp, cmd->handle);
+       obj = drm_gem_object_lookup(dev, filp, cmd->handles[0]);
        if (obj == NULL)
                return ERR_PTR(-ENOENT);

diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h
index 34a0d22..dafe8df 100644
--- a/include/drm/drm_mode.h
+++ b/include/drm/drm_mode.h
@@ -272,8 +272,9 @@ struct drm_mode_fb_cmd2 {
        __u32 bpp;
        __u32 depth;
        __u32 pixel_format; /* fourcc code from videodev2.h */
-       /* driver specific handle */
-       __u32 handle;
+       __u32 handle_count;
+       /* driver specific buffer object handle array */
+       __u64 handles;
 };

 #define DRM_MODE_FB_DIRTY_ANNOTATE_COPY 0x01

Reply via email to