Re: [Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-28 Thread Ville Syrjälä
On Mon, Sep 28, 2015 at 10:37:24AM +0200, Daniel Vetter wrote:
> On Fri, Sep 25, 2015 at 02:29:59PM +0300, Ville Syrjälä wrote:
> > On Fri, Sep 25, 2015 at 10:44:44AM +0100, Tvrtko Ursulin wrote:
> > > 
> > > On 09/24/2015 05:35 PM, Ville Syrjälä wrote:
> > > > On Mon, Sep 21, 2015 at 10:45:34AM +0100, Tvrtko Ursulin wrote:
> > > >> From: Tvrtko Ursulin 
> > > >>
> > > >> Just adding the rotated UV plane at the end of the rotated Y plane.
> > > >>
> > > >> v2: Rebase.
> > > >>
> > > >> Signed-off-by: Tvrtko Ursulin 
> > > >> ---
> > > >>   drivers/gpu/drm/i915/i915_gem_gtt.c  | 37 
> > > >> ++--
> > > >>   drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
> > > >>   drivers/gpu/drm/i915/intel_display.c | 12 
> > > >>   3 files changed, 46 insertions(+), 6 deletions(-)
> > > >>
> > > >> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
> > > >> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > > >> index 59c934fb9230..2df9d16dcefd 100644
> > > >> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> > > >> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > > >> @@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct 
> > > >> i915_ggtt_view *ggtt_view,
> > > >>   {
> > > >>struct intel_rotation_info *rot_info = 
> > > >> &ggtt_view->rotation_info;
> > > >>unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
> > > >> +  unsigned int size_pages_uv;
> > > >>struct sg_page_iter sg_iter;
> > > >>unsigned long i;
> > > >>dma_addr_t *page_addr_list;
> > > >>struct sg_table *st;
> > > >> +  unsigned int uv_start_page;
> > > >> +  struct scatterlist *sg;
> > > >>int ret = -ENOMEM;
> > > >>
> > > >>/* Allocate a temporary list of source pages for random access. 
> > > >> */
> > > >> @@ -3284,12 +3287,18 @@ intel_rotate_fb_obj_pages(struct 
> > > >> i915_ggtt_view *ggtt_view,
> > > >>if (!page_addr_list)
> > > >>return ERR_PTR(ret);
> > > >>
> > > >> +  /* Account for UV plane with NV12. */
> > > >> +  if (rot_info->pixel_format == DRM_FORMAT_NV12)
> > > >> +  size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
> > > >> +  else
> > > >> +  size_pages_uv = 0;
> > > >> +
> > > >>/* Allocate target SG list. */
> > > >>st = kmalloc(sizeof(*st), GFP_KERNEL);
> > > >>if (!st)
> > > >>goto err_st_alloc;
> > > >>
> > > >> -  ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
> > > >> +  ret = sg_alloc_table(st, size_pages + size_pages_uv, 
> > > >> GFP_KERNEL);
> > > >>if (ret)
> > > >>goto err_sg_alloc;
> > > >>
> > > >> @@ -3301,15 +3310,30 @@ intel_rotate_fb_obj_pages(struct 
> > > >> i915_ggtt_view *ggtt_view,
> > > >>}
> > > >>
> > > >>/* Rotate the pages. */
> > > >> -  rotate_pages(page_addr_list, 0,
> > > >> +  sg = rotate_pages(page_addr_list, 0,
> > > >> rot_info->width_pages, rot_info->height_pages,
> > > >> st, NULL);
> > > >>
> > > >> +  /* Append the UV plane if NV12. */
> > > >> +  if (rot_info->pixel_format == DRM_FORMAT_NV12) {
> > > >> +  uv_start_page = size_pages;
> > > >> +
> > > >> +  /* Check for tile-row un-alignment. */
> > > >> +  if (offset_in_page(rot_info->uv_offset))
> > > >> +  uv_start_page--;
> > > >> +
> > > >> +  rotate_pages(page_addr_list, uv_start_page,
> > > >> +   rot_info->width_pages_uv,
> > > >> +   rot_info->height_pages_uv,
> > > >> +   st, sg);
> > > >> +  }
> > > >> +
> > > >>DRM_DEBUG_KMS(
> > > >> -"Created rotated page mapping for object size %zu 
> > > >> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
> > > >> +"Created rotated page mapping for object size %zu 
> > > >> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u 
> > > >> plane 0)).\n",
> > > >>  obj->base.size, rot_info->pitch, rot_info->height,
> > > >>  rot_info->pixel_format, rot_info->width_pages,
> > > >> -rot_info->height_pages, size_pages);
> > > >> +rot_info->height_pages, size_pages + 
> > > >> size_pages_uv,
> > > >> +size_pages);
> > > >>
> > > >>drm_free_large(page_addr_list);
> > > >>
> > > >> @@ -3321,10 +3345,11 @@ err_st_alloc:
> > > >>drm_free_large(page_addr_list);
> > > >>
> > > >>DRM_DEBUG_KMS(
> > > >> -"Failed to create rotated mapping for object size 
> > > >> %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u 
> > > >> pages)\n",
> > > >> +"Failed to create rotated mapping for object size 
> > > >> %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u 
> > > >> pages (%u plane 0))\n",
> 

Re: [Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-28 Thread Daniel Vetter
On Fri, Sep 25, 2015 at 02:29:59PM +0300, Ville Syrjälä wrote:
> On Fri, Sep 25, 2015 at 10:44:44AM +0100, Tvrtko Ursulin wrote:
> > 
> > On 09/24/2015 05:35 PM, Ville Syrjälä wrote:
> > > On Mon, Sep 21, 2015 at 10:45:34AM +0100, Tvrtko Ursulin wrote:
> > >> From: Tvrtko Ursulin 
> > >>
> > >> Just adding the rotated UV plane at the end of the rotated Y plane.
> > >>
> > >> v2: Rebase.
> > >>
> > >> Signed-off-by: Tvrtko Ursulin 
> > >> ---
> > >>   drivers/gpu/drm/i915/i915_gem_gtt.c  | 37 
> > >> ++--
> > >>   drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
> > >>   drivers/gpu/drm/i915/intel_display.c | 12 
> > >>   3 files changed, 46 insertions(+), 6 deletions(-)
> > >>
> > >> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
> > >> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > >> index 59c934fb9230..2df9d16dcefd 100644
> > >> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> > >> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > >> @@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> > >> *ggtt_view,
> > >>   {
> > >>  struct intel_rotation_info *rot_info = 
> > >> &ggtt_view->rotation_info;
> > >>  unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
> > >> +unsigned int size_pages_uv;
> > >>  struct sg_page_iter sg_iter;
> > >>  unsigned long i;
> > >>  dma_addr_t *page_addr_list;
> > >>  struct sg_table *st;
> > >> +unsigned int uv_start_page;
> > >> +struct scatterlist *sg;
> > >>  int ret = -ENOMEM;
> > >>
> > >>  /* Allocate a temporary list of source pages for random access. 
> > >> */
> > >> @@ -3284,12 +3287,18 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> > >> *ggtt_view,
> > >>  if (!page_addr_list)
> > >>  return ERR_PTR(ret);
> > >>
> > >> +/* Account for UV plane with NV12. */
> > >> +if (rot_info->pixel_format == DRM_FORMAT_NV12)
> > >> +size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
> > >> +else
> > >> +size_pages_uv = 0;
> > >> +
> > >>  /* Allocate target SG list. */
> > >>  st = kmalloc(sizeof(*st), GFP_KERNEL);
> > >>  if (!st)
> > >>  goto err_st_alloc;
> > >>
> > >> -ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
> > >> +ret = sg_alloc_table(st, size_pages + size_pages_uv, 
> > >> GFP_KERNEL);
> > >>  if (ret)
> > >>  goto err_sg_alloc;
> > >>
> > >> @@ -3301,15 +3310,30 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> > >> *ggtt_view,
> > >>  }
> > >>
> > >>  /* Rotate the pages. */
> > >> -rotate_pages(page_addr_list, 0,
> > >> +sg = rotate_pages(page_addr_list, 0,
> > >>   rot_info->width_pages, rot_info->height_pages,
> > >>   st, NULL);
> > >>
> > >> +/* Append the UV plane if NV12. */
> > >> +if (rot_info->pixel_format == DRM_FORMAT_NV12) {
> > >> +uv_start_page = size_pages;
> > >> +
> > >> +/* Check for tile-row un-alignment. */
> > >> +if (offset_in_page(rot_info->uv_offset))
> > >> +uv_start_page--;
> > >> +
> > >> +rotate_pages(page_addr_list, uv_start_page,
> > >> + rot_info->width_pages_uv,
> > >> + rot_info->height_pages_uv,
> > >> + st, sg);
> > >> +}
> > >> +
> > >>  DRM_DEBUG_KMS(
> > >> -  "Created rotated page mapping for object size %zu 
> > >> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
> > >> +  "Created rotated page mapping for object size %zu 
> > >> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
> > >> 0)).\n",
> > >>obj->base.size, rot_info->pitch, rot_info->height,
> > >>rot_info->pixel_format, rot_info->width_pages,
> > >> -  rot_info->height_pages, size_pages);
> > >> +  rot_info->height_pages, size_pages + 
> > >> size_pages_uv,
> > >> +  size_pages);
> > >>
> > >>  drm_free_large(page_addr_list);
> > >>
> > >> @@ -3321,10 +3345,11 @@ err_st_alloc:
> > >>  drm_free_large(page_addr_list);
> > >>
> > >>  DRM_DEBUG_KMS(
> > >> -  "Failed to create rotated mapping for object size 
> > >> %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u 
> > >> pages)\n",
> > >> +  "Failed to create rotated mapping for object size 
> > >> %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages 
> > >> (%u plane 0))\n",
> > >>obj->base.size, ret, rot_info->pitch, 
> > >> rot_info->height,
> > >>rot_info->pixel_format, rot_info->width_pages,
> > >>

Re: [Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-25 Thread Ville Syrjälä
On Fri, Sep 25, 2015 at 10:44:44AM +0100, Tvrtko Ursulin wrote:
> 
> On 09/24/2015 05:35 PM, Ville Syrjälä wrote:
> > On Mon, Sep 21, 2015 at 10:45:34AM +0100, Tvrtko Ursulin wrote:
> >> From: Tvrtko Ursulin 
> >>
> >> Just adding the rotated UV plane at the end of the rotated Y plane.
> >>
> >> v2: Rebase.
> >>
> >> Signed-off-by: Tvrtko Ursulin 
> >> ---
> >>   drivers/gpu/drm/i915/i915_gem_gtt.c  | 37 
> >> ++--
> >>   drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
> >>   drivers/gpu/drm/i915/intel_display.c | 12 
> >>   3 files changed, 46 insertions(+), 6 deletions(-)
> >>
> >> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
> >> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> >> index 59c934fb9230..2df9d16dcefd 100644
> >> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> >> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> >> @@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> >> *ggtt_view,
> >>   {
> >>struct intel_rotation_info *rot_info = &ggtt_view->rotation_info;
> >>unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
> >> +  unsigned int size_pages_uv;
> >>struct sg_page_iter sg_iter;
> >>unsigned long i;
> >>dma_addr_t *page_addr_list;
> >>struct sg_table *st;
> >> +  unsigned int uv_start_page;
> >> +  struct scatterlist *sg;
> >>int ret = -ENOMEM;
> >>
> >>/* Allocate a temporary list of source pages for random access. */
> >> @@ -3284,12 +3287,18 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> >> *ggtt_view,
> >>if (!page_addr_list)
> >>return ERR_PTR(ret);
> >>
> >> +  /* Account for UV plane with NV12. */
> >> +  if (rot_info->pixel_format == DRM_FORMAT_NV12)
> >> +  size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
> >> +  else
> >> +  size_pages_uv = 0;
> >> +
> >>/* Allocate target SG list. */
> >>st = kmalloc(sizeof(*st), GFP_KERNEL);
> >>if (!st)
> >>goto err_st_alloc;
> >>
> >> -  ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
> >> +  ret = sg_alloc_table(st, size_pages + size_pages_uv, GFP_KERNEL);
> >>if (ret)
> >>goto err_sg_alloc;
> >>
> >> @@ -3301,15 +3310,30 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> >> *ggtt_view,
> >>}
> >>
> >>/* Rotate the pages. */
> >> -  rotate_pages(page_addr_list, 0,
> >> +  sg = rotate_pages(page_addr_list, 0,
> >> rot_info->width_pages, rot_info->height_pages,
> >> st, NULL);
> >>
> >> +  /* Append the UV plane if NV12. */
> >> +  if (rot_info->pixel_format == DRM_FORMAT_NV12) {
> >> +  uv_start_page = size_pages;
> >> +
> >> +  /* Check for tile-row un-alignment. */
> >> +  if (offset_in_page(rot_info->uv_offset))
> >> +  uv_start_page--;
> >> +
> >> +  rotate_pages(page_addr_list, uv_start_page,
> >> +   rot_info->width_pages_uv,
> >> +   rot_info->height_pages_uv,
> >> +   st, sg);
> >> +  }
> >> +
> >>DRM_DEBUG_KMS(
> >> -"Created rotated page mapping for object size %zu 
> >> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
> >> +"Created rotated page mapping for object size %zu 
> >> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
> >> 0)).\n",
> >>  obj->base.size, rot_info->pitch, rot_info->height,
> >>  rot_info->pixel_format, rot_info->width_pages,
> >> -rot_info->height_pages, size_pages);
> >> +rot_info->height_pages, size_pages + size_pages_uv,
> >> +size_pages);
> >>
> >>drm_free_large(page_addr_list);
> >>
> >> @@ -3321,10 +3345,11 @@ err_st_alloc:
> >>drm_free_large(page_addr_list);
> >>
> >>DRM_DEBUG_KMS(
> >> -"Failed to create rotated mapping for object size %zu! 
> >> (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages)\n",
> >> +"Failed to create rotated mapping for object size %zu! 
> >> (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u 
> >> plane 0))\n",
> >>  obj->base.size, ret, rot_info->pitch, rot_info->height,
> >>  rot_info->pixel_format, rot_info->width_pages,
> >> -rot_info->height_pages, size_pages);
> >> +rot_info->height_pages, size_pages + size_pages_uv,
> >> +size_pages);
> >>return ERR_PTR(ret);
> >>   }
> >>
> >> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h 
> >> b/drivers/gpu/drm/i915/i915_gem_gtt.h
> >> index 82750073d5b3..197183d5c543 100644
> >> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> >> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> >> @@ -138,10 +138,13 @@ enum i915_ggtt_view_type {
> >>   struct intel_rotation_info {
> >>unsigned int height;
> >>unsigned int pitch;
> >> +  unsigned int uv_offset;
> >>uint32_t pixel_format;
> >>uint64_t fb_mod

Re: [Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-25 Thread Tvrtko Ursulin


On 09/24/2015 05:35 PM, Ville Syrjälä wrote:

On Mon, Sep 21, 2015 at 10:45:34AM +0100, Tvrtko Ursulin wrote:

From: Tvrtko Ursulin 

Just adding the rotated UV plane at the end of the rotated Y plane.

v2: Rebase.

Signed-off-by: Tvrtko Ursulin 
---
  drivers/gpu/drm/i915/i915_gem_gtt.c  | 37 ++--
  drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
  drivers/gpu/drm/i915/intel_display.c | 12 
  3 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 59c934fb9230..2df9d16dcefd 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
  {
struct intel_rotation_info *rot_info = &ggtt_view->rotation_info;
unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
+   unsigned int size_pages_uv;
struct sg_page_iter sg_iter;
unsigned long i;
dma_addr_t *page_addr_list;
struct sg_table *st;
+   unsigned int uv_start_page;
+   struct scatterlist *sg;
int ret = -ENOMEM;

/* Allocate a temporary list of source pages for random access. */
@@ -3284,12 +3287,18 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
if (!page_addr_list)
return ERR_PTR(ret);

+   /* Account for UV plane with NV12. */
+   if (rot_info->pixel_format == DRM_FORMAT_NV12)
+   size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
+   else
+   size_pages_uv = 0;
+
/* Allocate target SG list. */
st = kmalloc(sizeof(*st), GFP_KERNEL);
if (!st)
goto err_st_alloc;

-   ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
+   ret = sg_alloc_table(st, size_pages + size_pages_uv, GFP_KERNEL);
if (ret)
goto err_sg_alloc;

@@ -3301,15 +3310,30 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
}

/* Rotate the pages. */
-   rotate_pages(page_addr_list, 0,
+   sg = rotate_pages(page_addr_list, 0,
 rot_info->width_pages, rot_info->height_pages,
 st, NULL);

+   /* Append the UV plane if NV12. */
+   if (rot_info->pixel_format == DRM_FORMAT_NV12) {
+   uv_start_page = size_pages;
+
+   /* Check for tile-row un-alignment. */
+   if (offset_in_page(rot_info->uv_offset))
+   uv_start_page--;
+
+   rotate_pages(page_addr_list, uv_start_page,
+rot_info->width_pages_uv,
+rot_info->height_pages_uv,
+st, sg);
+   }
+
DRM_DEBUG_KMS(
- "Created rotated page mapping for object size %zu (pitch=%u, 
height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
+ "Created rotated page mapping for object size %zu (pitch=%u, 
height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 0)).\n",
  obj->base.size, rot_info->pitch, rot_info->height,
  rot_info->pixel_format, rot_info->width_pages,
- rot_info->height_pages, size_pages);
+ rot_info->height_pages, size_pages + size_pages_uv,
+ size_pages);

drm_free_large(page_addr_list);

@@ -3321,10 +3345,11 @@ err_st_alloc:
drm_free_large(page_addr_list);

DRM_DEBUG_KMS(
- "Failed to create rotated mapping for object size %zu! (%d) 
(pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages)\n",
+ "Failed to create rotated mapping for object size %zu! (%d) 
(pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 0))\n",
  obj->base.size, ret, rot_info->pitch, rot_info->height,
  rot_info->pixel_format, rot_info->width_pages,
- rot_info->height_pages, size_pages);
+ rot_info->height_pages, size_pages + size_pages_uv,
+ size_pages);
return ERR_PTR(ret);
  }

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h 
b/drivers/gpu/drm/i915/i915_gem_gtt.h
index 82750073d5b3..197183d5c543 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -138,10 +138,13 @@ enum i915_ggtt_view_type {
  struct intel_rotation_info {
unsigned int height;
unsigned int pitch;
+   unsigned int uv_offset;
uint32_t pixel_format;
uint64_t fb_modifier;
unsigned int width_pages, height_pages;
uint64_t size;
+   unsigned int width_pages_uv, height_pages_uv;
+   uint64_t size_uv;
  };

  struct i915_ggtt_view {
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index e19b8e699c00..2db7cc42539c 100644
--- a/drivers

Re: [Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-24 Thread Ville Syrjälä
On Mon, Sep 21, 2015 at 10:45:34AM +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin 
> 
> Just adding the rotated UV plane at the end of the rotated Y plane.
> 
> v2: Rebase.
> 
> Signed-off-by: Tvrtko Ursulin 
> ---
>  drivers/gpu/drm/i915/i915_gem_gtt.c  | 37 
> ++--
>  drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
>  drivers/gpu/drm/i915/intel_display.c | 12 
>  3 files changed, 46 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 59c934fb9230..2df9d16dcefd 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> *ggtt_view,
>  {
>   struct intel_rotation_info *rot_info = &ggtt_view->rotation_info;
>   unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
> + unsigned int size_pages_uv;
>   struct sg_page_iter sg_iter;
>   unsigned long i;
>   dma_addr_t *page_addr_list;
>   struct sg_table *st;
> + unsigned int uv_start_page;
> + struct scatterlist *sg;
>   int ret = -ENOMEM;
>  
>   /* Allocate a temporary list of source pages for random access. */
> @@ -3284,12 +3287,18 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> *ggtt_view,
>   if (!page_addr_list)
>   return ERR_PTR(ret);
>  
> + /* Account for UV plane with NV12. */
> + if (rot_info->pixel_format == DRM_FORMAT_NV12)
> + size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
> + else
> + size_pages_uv = 0;
> +
>   /* Allocate target SG list. */
>   st = kmalloc(sizeof(*st), GFP_KERNEL);
>   if (!st)
>   goto err_st_alloc;
>  
> - ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
> + ret = sg_alloc_table(st, size_pages + size_pages_uv, GFP_KERNEL);
>   if (ret)
>   goto err_sg_alloc;
>  
> @@ -3301,15 +3310,30 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
> *ggtt_view,
>   }
>  
>   /* Rotate the pages. */
> - rotate_pages(page_addr_list, 0,
> + sg = rotate_pages(page_addr_list, 0,
>rot_info->width_pages, rot_info->height_pages,
>st, NULL);
>  
> + /* Append the UV plane if NV12. */
> + if (rot_info->pixel_format == DRM_FORMAT_NV12) {
> + uv_start_page = size_pages;
> +
> + /* Check for tile-row un-alignment. */
> + if (offset_in_page(rot_info->uv_offset))
> + uv_start_page--;
> +
> + rotate_pages(page_addr_list, uv_start_page,
> +  rot_info->width_pages_uv,
> +  rot_info->height_pages_uv,
> +  st, sg);
> + }
> +
>   DRM_DEBUG_KMS(
> -   "Created rotated page mapping for object size %zu 
> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
> +   "Created rotated page mapping for object size %zu 
> (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
> 0)).\n",
> obj->base.size, rot_info->pitch, rot_info->height,
> rot_info->pixel_format, rot_info->width_pages,
> -   rot_info->height_pages, size_pages);
> +   rot_info->height_pages, size_pages + size_pages_uv,
> +   size_pages);
>  
>   drm_free_large(page_addr_list);
>  
> @@ -3321,10 +3345,11 @@ err_st_alloc:
>   drm_free_large(page_addr_list);
>  
>   DRM_DEBUG_KMS(
> -   "Failed to create rotated mapping for object size %zu! 
> (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages)\n",
> +   "Failed to create rotated mapping for object size %zu! 
> (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
> 0))\n",
> obj->base.size, ret, rot_info->pitch, rot_info->height,
> rot_info->pixel_format, rot_info->width_pages,
> -   rot_info->height_pages, size_pages);
> +   rot_info->height_pages, size_pages + size_pages_uv,
> +   size_pages);
>   return ERR_PTR(ret);
>  }
>  
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h 
> b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 82750073d5b3..197183d5c543 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -138,10 +138,13 @@ enum i915_ggtt_view_type {
>  struct intel_rotation_info {
>   unsigned int height;
>   unsigned int pitch;
> + unsigned int uv_offset;
>   uint32_t pixel_format;
>   uint64_t fb_modifier;
>   unsigned int width_pages, height_pages;
>   uint64_t size;
> + unsigned int width_pages_uv, height_pages_uv;
> + uint64_t size_uv;
>  };
>  
>  struct i915_ggtt_view {
> diff --git a/drivers/gpu/drm/i915/intel_display.c 
> b/drivers/gpu/dr

Re: [Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-23 Thread Daniel Vetter
On Mon, Sep 21, 2015 at 02:14:47PM +0300, Joonas Lahtinen wrote:
> On ma, 2015-09-21 at 10:45 +0100, Tvrtko Ursulin wrote:
> > From: Tvrtko Ursulin 
> > 
> > Just adding the rotated UV plane at the end of the rotated Y plane.
> > 
> > v2: Rebase.
> > 
> > 
> > Signed-off-by: Tvrtko Ursulin 
> > 
> 
> One comment below, otherwise.
> 
> Reviewed-by: Joonas Lahtinen 
> 
> > ---
> >  drivers/gpu/drm/i915/i915_gem_gtt.c  | 37
> > ++--
> >  drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
> >  drivers/gpu/drm/i915/intel_display.c | 12 
> >  3 files changed, 46 insertions(+), 6 deletions(-)
> > 
> > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c
> > b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > index 59c934fb9230..2df9d16dcefd 100644
> > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> > @@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct
> > i915_ggtt_view *ggtt_view,
> >  {
> >  >  > struct intel_rotation_info *rot_info = &ggtt_view
> > ->rotation_info;
> >  >  > unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
> > +>  > unsigned int size_pages_uv;
> 
> Could be initialized to zero here already as majority of the time it'll
> be unchanged.

Personally (and this is really pretty clearly in bikeshed territory) I
prefer it like Tvrtko has done since if you ever rework the code for new
platform support and forget one case gcc will complain about potentially
uninitialized variable. But if you initialize it at first that will paper
over such a bug. And gcc will optimize this anyway for you (besides that
generally performance in modeset code just doesn't really matter all that
much).

And something funny is going on with your mail replies, you insert piles
of spurious > even though it's just one reply level ...
-Daniel
-- 
Daniel Vetter
Software Engineer, Intel Corporation
http://blog.ffwll.ch
___
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx


Re: [Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-21 Thread Joonas Lahtinen
On ma, 2015-09-21 at 10:45 +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin 
> 
> Just adding the rotated UV plane at the end of the rotated Y plane.
> 
> v2: Rebase.
> 
> 
> Signed-off-by: Tvrtko Ursulin 
> 

One comment below, otherwise.

Reviewed-by: Joonas Lahtinen 

> ---
>  drivers/gpu/drm/i915/i915_gem_gtt.c  | 37
> ++--
>  drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
>  drivers/gpu/drm/i915/intel_display.c | 12 
>  3 files changed, 46 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c
> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 59c934fb9230..2df9d16dcefd 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct
> i915_ggtt_view *ggtt_view,
>  {
>  >> struct intel_rotation_info *rot_info = &ggtt_view
> ->rotation_info;
>  >> unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
> +>> unsigned int size_pages_uv;

Could be initialized to zero here already as majority of the time it'll
be unchanged.

>  >> struct sg_page_iter sg_iter;
>  >> unsigned long i;
>  >> dma_addr_t *page_addr_list;
>  >> struct sg_table *st;
> +>> unsigned int uv_start_page;
> +>> struct scatterlist *sg;
>  >> int ret = -ENOMEM;
>  
>  >> /* Allocate a temporary list of source pages for random
> access. */
> @@ -3284,12 +3287,18 @@ intel_rotate_fb_obj_pages(struct
> i915_ggtt_view *ggtt_view,
>  >> if (!page_addr_list)
>  >>   > return ERR_PTR(ret);
>  
> +>> /* Account for UV plane with NV12. */
> +>> if (rot_info->pixel_format == DRM_FORMAT_NV12)
> +>>   > size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
> +>> else
> +>>   > size_pages_uv = 0;
> +
>  >> /* Allocate target SG list. */
>  >> st = kmalloc(sizeof(*st), GFP_KERNEL);
>  >> if (!st)
>  >>   > goto err_st_alloc;
>  
> ->> ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
> +>> ret = sg_alloc_table(st, size_pages + size_pages_uv,
> GFP_KERNEL);
>  >> if (ret)
>  >>   > goto err_sg_alloc;
>  
> @@ -3301,15 +3310,30 @@ intel_rotate_fb_obj_pages(struct
> i915_ggtt_view *ggtt_view,
>  >> }
>  
>  >> /* Rotate the pages. */
> ->> rotate_pages(page_addr_list, 0,
> +>> sg = rotate_pages(page_addr_list, 0,
>  >>   >  rot_info->width_pages, rot_info->height_pages,
>  >>   >  st, NULL);
>  
> +>> /* Append the UV plane if NV12. */
> +>> if (rot_info->pixel_format == DRM_FORMAT_NV12) {
> +>>   > uv_start_page = size_pages;
> +
> +>>   > /* Check for tile-row un-alignment. */
> +>>   > if (offset_in_page(rot_info->uv_offset))
> +>>   >   > uv_start_page--;
> +
> +>>   > rotate_pages(page_addr_list, uv_start_page,
> +>>   >   >  rot_info->width_pages_uv,
> +>>   >   >  rot_info->height_pages_uv,
> +>>   >   >  st, sg);
> +>> }
> +
>  >> DRM_DEBUG_KMS(
> ->>   >   "Created rotated page mapping for object size
> %zu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u
> pages).\n",
> +>>   >   "Created rotated page mapping for object size
> %zu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages
> (%u plane 0)).\n",
>  >>   >   obj->base.size, rot_info->pitch, rot_info
> ->height,
>  >>   >   rot_info->pixel_format, rot_info->width_pages,
> ->>   >   rot_info->height_pages, size_pages);
> +>>   >   rot_info->height_pages, size_pages +
> size_pages_uv,
> +>>   >   size_pages);
>  
>  >> drm_free_large(page_addr_list);
>  
> @@ -3321,10 +3345,11 @@ err_st_alloc:
>  >> drm_free_large(page_addr_list);
>  
>  >> DRM_DEBUG_KMS(
> ->>   >   "Failed to create rotated mapping for object
> size %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles,
> %u pages)\n",
> +>>   >   "Failed to create rotated mapping for object
> size %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles,
> %u pages (%u plane 0))\n",
>  >>   >   obj->base.size, ret, rot_info->pitch, rot_info
> ->height,
>  >>   >   rot_info->pixel_format, rot_info->width_pages,
> ->>   >   rot_info->height_pages, size_pages);
> +>>   >   rot_info->height_pages, size_pages +
> size_pages_uv,
> +>>   >   size_pages);
>  >> return ERR_PTR(ret);
>  }
>  
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h
> b/drivers/gpu/drm/i915/i915_gem_gtt.h
> index 82750073d5b3..197183d5c543 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.h
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
> @@ -138,10 +138,13 @@ enum i915_ggtt_view_type {
>  struct intel_rotation_info {
>  >> unsigned int height;
>  >> unsigned int pitch;
> +>> unsigned int uv_offset;
>  >> uint32_t pixel_format;

[Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-09-21 Thread Tvrtko Ursulin
From: Tvrtko Ursulin 

Just adding the rotated UV plane at the end of the rotated Y plane.

v2: Rebase.

Signed-off-by: Tvrtko Ursulin 
---
 drivers/gpu/drm/i915/i915_gem_gtt.c  | 37 ++--
 drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
 drivers/gpu/drm/i915/intel_display.c | 12 
 3 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
b/drivers/gpu/drm/i915/i915_gem_gtt.c
index 59c934fb9230..2df9d16dcefd 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -3272,10 +3272,13 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
 {
struct intel_rotation_info *rot_info = &ggtt_view->rotation_info;
unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
+   unsigned int size_pages_uv;
struct sg_page_iter sg_iter;
unsigned long i;
dma_addr_t *page_addr_list;
struct sg_table *st;
+   unsigned int uv_start_page;
+   struct scatterlist *sg;
int ret = -ENOMEM;
 
/* Allocate a temporary list of source pages for random access. */
@@ -3284,12 +3287,18 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
if (!page_addr_list)
return ERR_PTR(ret);
 
+   /* Account for UV plane with NV12. */
+   if (rot_info->pixel_format == DRM_FORMAT_NV12)
+   size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
+   else
+   size_pages_uv = 0;
+
/* Allocate target SG list. */
st = kmalloc(sizeof(*st), GFP_KERNEL);
if (!st)
goto err_st_alloc;
 
-   ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
+   ret = sg_alloc_table(st, size_pages + size_pages_uv, GFP_KERNEL);
if (ret)
goto err_sg_alloc;
 
@@ -3301,15 +3310,30 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
}
 
/* Rotate the pages. */
-   rotate_pages(page_addr_list, 0,
+   sg = rotate_pages(page_addr_list, 0,
 rot_info->width_pages, rot_info->height_pages,
 st, NULL);
 
+   /* Append the UV plane if NV12. */
+   if (rot_info->pixel_format == DRM_FORMAT_NV12) {
+   uv_start_page = size_pages;
+
+   /* Check for tile-row un-alignment. */
+   if (offset_in_page(rot_info->uv_offset))
+   uv_start_page--;
+
+   rotate_pages(page_addr_list, uv_start_page,
+rot_info->width_pages_uv,
+rot_info->height_pages_uv,
+st, sg);
+   }
+
DRM_DEBUG_KMS(
- "Created rotated page mapping for object size %zu 
(pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
+ "Created rotated page mapping for object size %zu 
(pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
0)).\n",
  obj->base.size, rot_info->pitch, rot_info->height,
  rot_info->pixel_format, rot_info->width_pages,
- rot_info->height_pages, size_pages);
+ rot_info->height_pages, size_pages + size_pages_uv,
+ size_pages);
 
drm_free_large(page_addr_list);
 
@@ -3321,10 +3345,11 @@ err_st_alloc:
drm_free_large(page_addr_list);
 
DRM_DEBUG_KMS(
- "Failed to create rotated mapping for object size %zu! 
(%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages)\n",
+ "Failed to create rotated mapping for object size %zu! 
(%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
0))\n",
  obj->base.size, ret, rot_info->pitch, rot_info->height,
  rot_info->pixel_format, rot_info->width_pages,
- rot_info->height_pages, size_pages);
+ rot_info->height_pages, size_pages + size_pages_uv,
+ size_pages);
return ERR_PTR(ret);
 }
 
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h 
b/drivers/gpu/drm/i915/i915_gem_gtt.h
index 82750073d5b3..197183d5c543 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -138,10 +138,13 @@ enum i915_ggtt_view_type {
 struct intel_rotation_info {
unsigned int height;
unsigned int pitch;
+   unsigned int uv_offset;
uint32_t pixel_format;
uint64_t fb_modifier;
unsigned int width_pages, height_pages;
uint64_t size;
+   unsigned int width_pages_uv, height_pages_uv;
+   uint64_t size_uv;
 };
 
 struct i915_ggtt_view {
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index e19b8e699c00..2db7cc42539c 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2263,6 +2263,7 @@ intel_fill_fb_

[Intel-gfx] [PATCH 3/4] drm/i915: Support NV12 in rotated GGTT mapping

2015-08-03 Thread Tvrtko Ursulin
From: Tvrtko Ursulin 

Just adding the rotated UV plane at the end of the rotated Y plane.

v2: Rebase.

Signed-off-by: Tvrtko Ursulin 
---
 drivers/gpu/drm/i915/i915_gem_gtt.c  | 37 ++--
 drivers/gpu/drm/i915/i915_gem_gtt.h  |  3 +++
 drivers/gpu/drm/i915/intel_display.c | 12 
 3 files changed, 46 insertions(+), 6 deletions(-)

diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c 
b/drivers/gpu/drm/i915/i915_gem_gtt.c
index b4c6ed5d02dd..6495996c285e 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -2760,10 +2760,13 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
 {
struct intel_rotation_info *rot_info = &ggtt_view->rotation_info;
unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
+   unsigned int size_pages_uv;
struct sg_page_iter sg_iter;
unsigned long i;
dma_addr_t *page_addr_list;
struct sg_table *st;
+   unsigned int uv_start_page;
+   struct scatterlist *sg;
int ret = -ENOMEM;
 
/* Allocate a temporary list of source pages for random access. */
@@ -2772,12 +2775,18 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
if (!page_addr_list)
return ERR_PTR(ret);
 
+   /* Account for UV plane with NV12. */
+   if (rot_info->pixel_format == DRM_FORMAT_NV12)
+   size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
+   else
+   size_pages_uv = 0;
+
/* Allocate target SG list. */
st = kmalloc(sizeof(*st), GFP_KERNEL);
if (!st)
goto err_st_alloc;
 
-   ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
+   ret = sg_alloc_table(st, size_pages + size_pages_uv, GFP_KERNEL);
if (ret)
goto err_sg_alloc;
 
@@ -2789,15 +2798,30 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view 
*ggtt_view,
}
 
/* Rotate the pages. */
-   rotate_pages(page_addr_list, 0,
+   sg = rotate_pages(page_addr_list, 0,
 rot_info->width_pages, rot_info->height_pages,
 st, NULL);
 
+   /* Append the UV plane if NV12. */
+   if (rot_info->pixel_format == DRM_FORMAT_NV12) {
+   uv_start_page = size_pages;
+
+   /* Check for tile-row un-alignment. */
+   if (offset_in_page(rot_info->uv_offset))
+   uv_start_page--;
+
+   rotate_pages(page_addr_list, uv_start_page,
+rot_info->width_pages_uv,
+rot_info->height_pages_uv,
+st, sg);
+   }
+
DRM_DEBUG_KMS(
- "Created rotated page mapping for object size %zu 
(pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
+ "Created rotated page mapping for object size %zu 
(pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
0)).\n",
  obj->base.size, rot_info->pitch, rot_info->height,
  rot_info->pixel_format, rot_info->width_pages,
- rot_info->height_pages, size_pages);
+ rot_info->height_pages, size_pages + size_pages_uv,
+ size_pages);
 
drm_free_large(page_addr_list);
 
@@ -2809,10 +2833,11 @@ err_st_alloc:
drm_free_large(page_addr_list);
 
DRM_DEBUG_KMS(
- "Failed to create rotated mapping for object size %zu! 
(%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages)\n",
+ "Failed to create rotated mapping for object size %zu! 
(%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 
0))\n",
  obj->base.size, ret, rot_info->pitch, rot_info->height,
  rot_info->pixel_format, rot_info->width_pages,
- rot_info->height_pages, size_pages);
+ rot_info->height_pages, size_pages + size_pages_uv,
+ size_pages);
return ERR_PTR(ret);
 }
 
diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h 
b/drivers/gpu/drm/i915/i915_gem_gtt.h
index e1cfa292f9ad..3daa60332e28 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.h
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.h
@@ -124,10 +124,13 @@ enum i915_ggtt_view_type {
 struct intel_rotation_info {
unsigned int height;
unsigned int pitch;
+   unsigned int uv_offset;
uint32_t pixel_format;
uint64_t fb_modifier;
unsigned int width_pages, height_pages;
uint64_t size;
+   unsigned int width_pages_uv, height_pages_uv;
+   uint64_t size_uv;
 };
 
 struct i915_ggtt_view {
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 03e550874aec..342d96553a7b 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -2297,6 +2297,7 @@ intel_fill_fb_