Surprisingly few changes needed to make it happen. Compile-tested
only. The idea is that this replaces the 2 patches from Ville's big
fb->format patch series as a prep patch. Only impact to later patches
should be the one instace added in this patch where we look at
fb->pixel_format (instead of fb->bpp and fb->depth), so minor
adjustements in the cocci-generated patches needed.

v2: Restore pitch computation in vmw_fb_kms_framebuffer (Sinclair).

Cc: ville.syrjala at linux.intel.com
Cc: Laurent Pinchart <laurent.pinchart at ideasonboard.com>
Cc: linux-graphics-maintainer at vmware.com
Cc: Sinclair Yeh <syeh at vmware.com>
Cc: Thomas Hellstrom <thellstrom at vmware.com>
Reviewed-by: Sinclair Yeh <syeh at vmware.com>
Signed-off-by: Daniel Vetter <daniel.vetter at intel.com>
---
 drivers/gpu/drm/vmwgfx/vmwgfx_fb.c  |  19 +++---
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 116 +++++++++++++-----------------------
 drivers/gpu/drm/vmwgfx/vmwgfx_kms.h |   2 +-
 3 files changed, 53 insertions(+), 84 deletions(-)

diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
index d2d93959b119..723fd763da8e 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c
@@ -465,33 +465,34 @@ static int vmw_fb_kms_detach(struct vmw_fb_par *par,

 static int vmw_fb_kms_framebuffer(struct fb_info *info)
 {
-       struct drm_mode_fb_cmd mode_cmd;
+       struct drm_mode_fb_cmd2 mode_cmd;
        struct vmw_fb_par *par = info->par;
        struct fb_var_screeninfo *var = &info->var;
        struct drm_framebuffer *cur_fb;
        struct vmw_framebuffer *vfb;
-       int ret = 0;
+       int ret = 0, depth;
        size_t new_bo_size;

-       ret = vmw_fb_compute_depth(var, &mode_cmd.depth);
+       ret = vmw_fb_compute_depth(var, &depth);
        if (ret)
                return ret;

        mode_cmd.width = var->xres;
        mode_cmd.height = var->yres;
-       mode_cmd.bpp = var->bits_per_pixel;
-       mode_cmd.pitch = ((mode_cmd.bpp + 7) / 8) * mode_cmd.width;
+       mode_cmd.pitches[0] = ((var->bits_per_pixel + 7) / 8) * mode_cmd.width;
+       mode_cmd.pixel_format =
+               drm_mode_legacy_fb_format(var->bits_per_pixel,
+                       ((var->bits_per_pixel + 7) / 8) * mode_cmd.width);

        cur_fb = par->set_fb;
        if (cur_fb && cur_fb->width == mode_cmd.width &&
            cur_fb->height == mode_cmd.height &&
-           cur_fb->bits_per_pixel == mode_cmd.bpp &&
-           cur_fb->depth == mode_cmd.depth &&
-           cur_fb->pitches[0] == mode_cmd.pitch)
+           cur_fb->pixel_format == mode_cmd.pixel_format &&
+           cur_fb->pitches[0] == mode_cmd.pitches[0])
                return 0;

        /* Need new buffer object ? */
-       new_bo_size = (size_t) mode_cmd.pitch * (size_t) mode_cmd.height;
+       new_bo_size = (size_t) mode_cmd.pitches[0] * (size_t) mode_cmd.height;
        ret = vmw_fb_kms_detach(par,
                                par->bo_size < new_bo_size ||
                                par->bo_size > 2*new_bo_size,
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c 
b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
index e3f68cc9bb4b..e7daf59bac80 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.c
@@ -516,7 +516,7 @@ static const struct drm_framebuffer_funcs 
vmw_framebuffer_surface_funcs = {
 static int vmw_kms_new_framebuffer_surface(struct vmw_private *dev_priv,
                                           struct vmw_surface *surface,
                                           struct vmw_framebuffer **out,
-                                          const struct drm_mode_fb_cmd
+                                          const struct drm_mode_fb_cmd2
                                           *mode_cmd,
                                           bool is_dmabuf_proxy)

@@ -525,6 +525,7 @@ static int vmw_kms_new_framebuffer_surface(struct 
vmw_private *dev_priv,
        struct vmw_framebuffer_surface *vfbs;
        enum SVGA3dSurfaceFormat format;
        int ret;
+       struct drm_format_name_buf format_name;

        /* 3D is only supported on HWv8 and newer hosts */
        if (dev_priv->active_display_unit == vmw_du_legacy)
@@ -548,21 +549,22 @@ static int vmw_kms_new_framebuffer_surface(struct 
vmw_private *dev_priv,
                return -EINVAL;
        }

-       switch (mode_cmd->depth) {
-       case 32:
+       switch (mode_cmd->pixel_format) {
+       case DRM_FORMAT_ARGB8888:
                format = SVGA3D_A8R8G8B8;
                break;
-       case 24:
+       case DRM_FORMAT_XRGB8888:
                format = SVGA3D_X8R8G8B8;
                break;
-       case 16:
+       case DRM_FORMAT_RGB565:
                format = SVGA3D_R5G6B5;
                break;
-       case 15:
+       case DRM_FORMAT_XRGB1555:
                format = SVGA3D_A1R5G5B5;
                break;
        default:
-               DRM_ERROR("Invalid color depth: %d\n", mode_cmd->depth);
+               DRM_ERROR("Invalid pixel format: %s\n",
+                         drm_get_format_name(mode_cmd->pixel_format, 
&format_name));
                return -EINVAL;
        }

@@ -581,14 +583,9 @@ static int vmw_kms_new_framebuffer_surface(struct 
vmw_private *dev_priv,
                goto out_err1;
        }

-       /* XXX get the first 3 from the surface info */
-       vfbs->base.base.bits_per_pixel = mode_cmd->bpp;
-       vfbs->base.base.pitches[0] = mode_cmd->pitch;
-       vfbs->base.base.depth = mode_cmd->depth;
-       vfbs->base.base.width = mode_cmd->width;
-       vfbs->base.base.height = mode_cmd->height;
+       drm_helper_mode_fill_fb_struct(&vfbs->base.base, mode_cmd);
        vfbs->surface = vmw_surface_reference(surface);
-       vfbs->base.user_handle = mode_cmd->handle;
+       vfbs->base.user_handle = mode_cmd->handles[0];
        vfbs->is_dmabuf_proxy = is_dmabuf_proxy;

        *out = &vfbs->base;
@@ -755,7 +752,7 @@ static int vmw_framebuffer_unpin(struct vmw_framebuffer 
*vfb)
  * 0 on success, error code otherwise
  */
 static int vmw_create_dmabuf_proxy(struct drm_device *dev,
-                                  const struct drm_mode_fb_cmd *mode_cmd,
+                                  const struct drm_mode_fb_cmd2 *mode_cmd,
                                   struct vmw_dma_buffer *dmabuf_mob,
                                   struct vmw_surface **srf_out)
 {
@@ -763,17 +760,18 @@ static int vmw_create_dmabuf_proxy(struct drm_device *dev,
        struct drm_vmw_size content_base_size;
        struct vmw_resource *res;
        unsigned int bytes_pp;
+       struct drm_format_name_buf format_name;
        int ret;

-       switch (mode_cmd->depth) {
-       case 32:
-       case 24:
+       switch (mode_cmd->pixel_format) {
+       case DRM_FORMAT_ARGB8888:
+       case DRM_FORMAT_XRGB8888:
                format = SVGA3D_X8R8G8B8;
                bytes_pp = 4;
                break;

-       case 16:
-       case 15:
+       case DRM_FORMAT_RGB565:
+       case DRM_FORMAT_XRGB1555:
                format = SVGA3D_R5G6B5;
                bytes_pp = 2;
                break;
@@ -784,11 +782,12 @@ static int vmw_create_dmabuf_proxy(struct drm_device *dev,
                break;

        default:
-               DRM_ERROR("Invalid framebuffer format %d\n", mode_cmd->depth);
+               DRM_ERROR("Invalid framebuffer format %s\n",
+                         drm_get_format_name(mode_cmd->pixel_format, 
&format_name));
                return -EINVAL;
        }

-       content_base_size.width  = mode_cmd->pitch / bytes_pp;
+       content_base_size.width  = mode_cmd->pitches[0] / bytes_pp;
        content_base_size.height = mode_cmd->height;
        content_base_size.depth  = 1;

@@ -826,16 +825,17 @@ static int vmw_create_dmabuf_proxy(struct drm_device *dev,
 static int vmw_kms_new_framebuffer_dmabuf(struct vmw_private *dev_priv,
                                          struct vmw_dma_buffer *dmabuf,
                                          struct vmw_framebuffer **out,
-                                         const struct drm_mode_fb_cmd
+                                         const struct drm_mode_fb_cmd2
                                          *mode_cmd)

 {
        struct drm_device *dev = dev_priv->dev;
        struct vmw_framebuffer_dmabuf *vfbd;
        unsigned int requested_size;
+       struct drm_format_name_buf format_name;
        int ret;

-       requested_size = mode_cmd->height * mode_cmd->pitch;
+       requested_size = mode_cmd->height * mode_cmd->pitches[0];
        if (unlikely(requested_size > dmabuf->base.num_pages * PAGE_SIZE)) {
                DRM_ERROR("Screen buffer object size is too small "
                          "for requested mode.\n");
@@ -844,27 +844,16 @@ static int vmw_kms_new_framebuffer_dmabuf(struct 
vmw_private *dev_priv,

        /* Limited framebuffer color depth support for screen objects */
        if (dev_priv->active_display_unit == vmw_du_screen_object) {
-               switch (mode_cmd->depth) {
-               case 32:
-               case 24:
-                       /* Only support 32 bpp for 32 and 24 depth fbs */
-                       if (mode_cmd->bpp == 32)
-                               break;
-
-                       DRM_ERROR("Invalid color depth/bbp: %d %d\n",
-                                 mode_cmd->depth, mode_cmd->bpp);
-                       return -EINVAL;
-               case 16:
-               case 15:
-                       /* Only support 16 bpp for 16 and 15 depth fbs */
-                       if (mode_cmd->bpp == 16)
-                               break;
-
-                       DRM_ERROR("Invalid color depth/bbp: %d %d\n",
-                                 mode_cmd->depth, mode_cmd->bpp);
-                       return -EINVAL;
+               switch (mode_cmd->pixel_format) {
+               case DRM_FORMAT_XRGB8888:
+               case DRM_FORMAT_ARGB8888:
+                       break;
+               case DRM_FORMAT_XRGB1555:
+               case DRM_FORMAT_RGB565:
+                       break;
                default:
-                       DRM_ERROR("Invalid color depth: %d\n", mode_cmd->depth);
+                       DRM_ERROR("Invalid pixel format: %s\n",
+                                 drm_get_format_name(mode_cmd->pixel_format, 
&format_name));
                        return -EINVAL;
                }
        }
@@ -875,14 +864,10 @@ static int vmw_kms_new_framebuffer_dmabuf(struct 
vmw_private *dev_priv,
                goto out_err1;
        }

-       vfbd->base.base.bits_per_pixel = mode_cmd->bpp;
-       vfbd->base.base.pitches[0] = mode_cmd->pitch;
-       vfbd->base.base.depth = mode_cmd->depth;
-       vfbd->base.base.width = mode_cmd->width;
-       vfbd->base.base.height = mode_cmd->height;
+       drm_helper_mode_fill_fb_struct(&vfbd->base.base, mode_cmd);
        vfbd->base.dmabuf = true;
        vfbd->buffer = vmw_dmabuf_reference(dmabuf);
-       vfbd->base.user_handle = mode_cmd->handle;
+       vfbd->base.user_handle = mode_cmd->handles[0];
        *out = &vfbd->base;

        ret = drm_framebuffer_init(dev, &vfbd->base.base,
@@ -916,7 +901,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
                        struct vmw_dma_buffer *dmabuf,
                        struct vmw_surface *surface,
                        bool only_2d,
-                       const struct drm_mode_fb_cmd *mode_cmd)
+                       const struct drm_mode_fb_cmd2 *mode_cmd)
 {
        struct vmw_framebuffer *vfb = NULL;
        bool is_dmabuf_proxy = false;
@@ -971,7 +956,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,
-                                                const struct drm_mode_fb_cmd2 
*mode_cmd2)
+                                                const struct drm_mode_fb_cmd2 
*mode_cmd)
 {
        struct vmw_private *dev_priv = vmw_priv(dev);
        struct ttm_object_file *tfile = vmw_fpriv(file_priv)->tfile;
@@ -979,25 +964,8 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct 
drm_device *dev,
        struct vmw_surface *surface = NULL;
        struct vmw_dma_buffer *bo = NULL;
        struct ttm_base_object *user_obj;
-       struct drm_mode_fb_cmd mode_cmd;
-       const struct drm_format_info *info;
        int ret;

-       info = drm_format_info(mode_cmd2->pixel_format);
-       if (!info || !info->depth) {
-               struct drm_format_name_buf format_name;
-               DRM_ERROR("Unsupported framebuffer format %s\n",
-                         drm_get_format_name(mode_cmd2->pixel_format, 
&format_name));
-               return ERR_PTR(-EINVAL);
-       }
-
-       mode_cmd.width = mode_cmd2->width;
-       mode_cmd.height = mode_cmd2->height;
-       mode_cmd.pitch = mode_cmd2->pitches[0];
-       mode_cmd.handle = mode_cmd2->handles[0];
-       mode_cmd.depth = info->depth;
-       mode_cmd.bpp = info->cpp[0] * 8;
-
        /**
         * This code should be conditioned on Screen Objects not being used.
         * If screen objects are used, we can allocate a GMR to hold the
@@ -1005,8 +973,8 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct 
drm_device *dev,
         */

        if (!vmw_kms_validate_mode_vram(dev_priv,
-                                       mode_cmd.pitch,
-                                       mode_cmd.height)) {
+                                       mode_cmd->pitches[0],
+                                       mode_cmd->height)) {
                DRM_ERROR("Requested mode exceed bounding box limit.\n");
                return ERR_PTR(-ENOMEM);
        }
@@ -1020,7 +988,7 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct 
drm_device *dev,
         * command stream using user-space handles.
         */

-       user_obj = ttm_base_object_lookup(tfile, mode_cmd.handle);
+       user_obj = ttm_base_object_lookup(tfile, mode_cmd->handles[0]);
        if (unlikely(user_obj == NULL)) {
                DRM_ERROR("Could not locate requested kms frame buffer.\n");
                return ERR_PTR(-ENOENT);
@@ -1032,14 +1000,14 @@ static struct drm_framebuffer *vmw_kms_fb_create(struct 
drm_device *dev,

        /* returns either a dmabuf or surface */
        ret = vmw_user_lookup_handle(dev_priv, tfile,
-                                    mode_cmd.handle,
+                                    mode_cmd->handles[0],
                                     &surface, &bo);
        if (ret)
                goto err_out;

        vfb = vmw_kms_new_framebuffer(dev_priv, bo, surface,
                                      !(dev_priv->capabilities & SVGA_CAP_3D),
-                                     &mode_cmd);
+                                     mode_cmd);
        if (IS_ERR(vfb)) {
                ret = PTR_ERR(vfb);
                goto err_out;
diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h 
b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
index ff4803c107bc..f42ce9a1c3ac 100644
--- a/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
+++ b/drivers/gpu/drm/vmwgfx/vmwgfx_kms.h
@@ -248,7 +248,7 @@ vmw_kms_new_framebuffer(struct vmw_private *dev_priv,
                        struct vmw_dma_buffer *dmabuf,
                        struct vmw_surface *surface,
                        bool only_2d,
-                       const struct drm_mode_fb_cmd *mode_cmd);
+                       const struct drm_mode_fb_cmd2 *mode_cmd);
 int vmw_kms_fbdev_init_data(struct vmw_private *dev_priv,
                            unsigned unit,
                            u32 max_width,
-- 
2.10.2

Reply via email to