All of lore.kernel.org
 help / color / mirror / Atom feed
From: Sinclair Yeh <syeh@vmware.com>
To: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Thomas Hellstrom <thellstrom@vmware.com>,
	DRI Development <dri-devel@lists.freedesktop.org>,
	linux-graphics-maintainer@vmware.com,
	Laurent Pinchart <laurent.pinchart@ideasonboard.com>,
	Daniel Vetter <daniel.vetter@intel.com>
Subject: Re: [PATCH] drm/vmwgfx: Switch to mode_cmd2
Date: Thu, 1 Dec 2016 15:09:40 -0800	[thread overview]
Message-ID: <20161201230939.GB8891@vmware.com> (raw)
In-Reply-To: <20161130170004.29477-1-daniel.vetter@ffwll.ch>

One defect below otherwise:  Reviewed-by: Sinclair Yeh <syeh@vmware.com>

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@linux.intel.com
> Cc: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
> Cc: linux-graphics-maintainer@vmware.com
> Cc: Sinclair Yeh <syeh@vmware.com>
> Cc: Thomas Hellstrom <thellstrom@vmware.com>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
> ---
>  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@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel

  reply	other threads:[~2016-12-02  0:44 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2016-11-30 17:00 [PATCH] drm/vmwgfx: Switch to mode_cmd2 Daniel Vetter
2016-12-01 23:09 ` Sinclair Yeh [this message]
2016-12-02  7:00   ` Daniel Vetter
2016-12-02 17:50     ` Sinclair Yeh
  -- strict thread matches above, loose matches on Subject: below --
2016-12-02  7:07 Daniel Vetter
2016-12-02 10:03 ` Ville Syrjälä

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20161201230939.GB8891@vmware.com \
    --to=syeh@vmware.com \
    --cc=daniel.vetter@ffwll.ch \
    --cc=daniel.vetter@intel.com \
    --cc=dri-devel@lists.freedesktop.org \
    --cc=laurent.pinchart@ideasonboard.com \
    --cc=linux-graphics-maintainer@vmware.com \
    --cc=thellstrom@vmware.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
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.