One defect below otherwise: Reviewed-by: Sinclair Yeh <syeh@xxxxxxxxxx> On Wed, Nov 30, 2016 at 06:00:04PM +0100, Daniel Vetter wrote: > 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. > > Cc: ville.syrjala@xxxxxxxxxxxxxxx > Cc: Laurent Pinchart <laurent.pinchart@xxxxxxxxxxxxxxxx> > Cc: linux-graphics-maintainer@xxxxxxxxxx > Cc: Sinclair Yeh <syeh@xxxxxxxxxx> > Cc: Thomas Hellstrom <thellstrom@xxxxxxxxxx> > Signed-off-by: Daniel Vetter <daniel.vetter@xxxxxxxxx> > --- > drivers/gpu/drm/vmwgfx/vmwgfx_fb.c | 18 +++--- > drivers/gpu/drm/vmwgfx/vmwgfx_kms.c | 116 +++++++++++++----------------------- > drivers/gpu/drm/vmwgfx/vmwgfx_kms.h | 2 +- > 3 files changed, 52 insertions(+), 84 deletions(-) > > diff --git a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c > index d2d93959b119..4b1defc7aa6d 100644 > --- a/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c > +++ b/drivers/gpu/drm/vmwgfx/vmwgfx_fb.c > @@ -465,33 +465,33 @@ 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] needs to be initialized before being used below. Maybe something like: 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 > _______________________________________________ dri-devel mailing list dri-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/dri-devel