* [PATCH] drm/vmwgfx: Switch to mode_cmd2
@ 2016-12-02 7:07 Daniel Vetter
2016-12-02 10:03 ` Ville Syrjälä
0 siblings, 1 reply; 6+ messages in thread
From: Daniel Vetter @ 2016-12-02 7:07 UTC (permalink / raw)
To: DRI Development
Cc: Thomas Hellstrom, Daniel Vetter, linux-graphics-maintainer,
Laurent Pinchart, Daniel Vetter
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@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>
Reviewed-by: Sinclair Yeh <syeh@vmware.com>
Signed-off-by: Daniel Vetter <daniel.vetter@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
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/vmwgfx: Switch to mode_cmd2
2016-12-02 7:07 [PATCH] drm/vmwgfx: Switch to mode_cmd2 Daniel Vetter
@ 2016-12-02 10:03 ` Ville Syrjälä
0 siblings, 0 replies; 6+ messages in thread
From: Ville Syrjälä @ 2016-12-02 10:03 UTC (permalink / raw)
To: Daniel Vetter
Cc: Thomas Hellstrom, DRI Development, linux-graphics-maintainer,
Laurent Pinchart, Daniel Vetter
On Fri, Dec 02, 2016 at 08:07:40AM +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.
>
> v2: Restore pitch computation in vmw_fb_kms_framebuffer (Sinclair).
>
> 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>
> Reviewed-by: Sinclair Yeh <syeh@vmware.com>
> Signed-off-by: Daniel Vetter <daniel.vetter@intel.com>
Ack from my side to merge this before my format dedup stuff. Means I can
just drop the vmwgfx patches from that series.
Acked-by: Ville Syrjälä <ville.syrjala@linux.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
--
Ville Syrjälä
Intel OTC
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/vmwgfx: Switch to mode_cmd2
2016-12-02 7:00 ` Daniel Vetter
@ 2016-12-02 17:50 ` Sinclair Yeh
0 siblings, 0 replies; 6+ messages in thread
From: Sinclair Yeh @ 2016-12-02 17:50 UTC (permalink / raw)
To: Daniel Vetter
Cc: Thomas Hellstrom, Daniel Vetter, DRI Development,
linux-graphics-maintainer, Laurent Pinchart, Daniel Vetter
On Fri, Dec 02, 2016 at 08:00:22AM +0100, Daniel Vetter wrote:
> On Thu, Dec 01, 2016 at 03:09:40PM -0800, Sinclair Yeh wrote:
> > 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;
>
> Oh right, I deleted a bit too much here. Once fixed, ok if I merge this
> through drm-misc so that Ville can throw his fb->format conversion on top?
Sure, thanks for doing this!
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/vmwgfx: Switch to mode_cmd2
2016-12-01 23:09 ` Sinclair Yeh
@ 2016-12-02 7:00 ` Daniel Vetter
2016-12-02 17:50 ` Sinclair Yeh
0 siblings, 1 reply; 6+ messages in thread
From: Daniel Vetter @ 2016-12-02 7:00 UTC (permalink / raw)
To: Sinclair Yeh
Cc: Thomas Hellstrom, Daniel Vetter, DRI Development,
linux-graphics-maintainer, Laurent Pinchart, Daniel Vetter
On Thu, Dec 01, 2016 at 03:09:40PM -0800, Sinclair Yeh wrote:
> 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;
Oh right, I deleted a bit too much here. Once fixed, ok if I merge this
through drm-misc so that Ville can throw his fb->format conversion on top?
-Daniel
--
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
^ permalink raw reply [flat|nested] 6+ messages in thread
* Re: [PATCH] drm/vmwgfx: Switch to mode_cmd2
2016-11-30 17:00 Daniel Vetter
@ 2016-12-01 23:09 ` Sinclair Yeh
2016-12-02 7:00 ` Daniel Vetter
0 siblings, 1 reply; 6+ messages in thread
From: Sinclair Yeh @ 2016-12-01 23:09 UTC (permalink / raw)
To: Daniel Vetter
Cc: Thomas Hellstrom, DRI Development, linux-graphics-maintainer,
Laurent Pinchart, Daniel Vetter
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
^ permalink raw reply [flat|nested] 6+ messages in thread
* [PATCH] drm/vmwgfx: Switch to mode_cmd2
@ 2016-11-30 17:00 Daniel Vetter
2016-12-01 23:09 ` Sinclair Yeh
0 siblings, 1 reply; 6+ messages in thread
From: Daniel Vetter @ 2016-11-30 17:00 UTC (permalink / raw)
To: DRI Development
Cc: Thomas Hellstrom, Daniel Vetter, linux-graphics-maintainer,
Laurent Pinchart, Daniel Vetter
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.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
^ permalink raw reply related [flat|nested] 6+ messages in thread
end of thread, other threads:[~2016-12-02 17:50 UTC | newest]
Thread overview: 6+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2016-12-02 7:07 [PATCH] drm/vmwgfx: Switch to mode_cmd2 Daniel Vetter
2016-12-02 10:03 ` Ville Syrjälä
-- strict thread matches above, loose matches on Subject: below --
2016-11-30 17:00 Daniel Vetter
2016-12-01 23:09 ` Sinclair Yeh
2016-12-02 7:00 ` Daniel Vetter
2016-12-02 17:50 ` Sinclair Yeh
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.