On Mon, Jan 25, 2016 at 06:38:57PM +0100, Daniel Vetter wrote: > On Wed, Jan 20, 2016 at 09:05:33PM +0200, ville.syrjala@xxxxxxxxxxxxxxx wrote: > > From: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > > > Throw out a bunch of unnecessary stuff from struct intel_rotation_info, > > and pull most of the remaining stuff to live under an array of > > per-color plane sub-structures. > > > > What still remains outside the sub-structure will be reorgranized later > > as well, but that requires more work elsewhere so leave it be for now. > > > > Signed-off-by: Ville Syrjälä <ville.syrjala@xxxxxxxxxxxxxxx> > > --- > > drivers/gpu/drm/i915/i915_gem_gtt.c | 35 +++++++++++++++-------------------- > > drivers/gpu/drm/i915/i915_gem_gtt.h | 11 ++++------- > > drivers/gpu/drm/i915/intel_display.c | 25 +++++++++++++++---------- > > drivers/gpu/drm/i915/intel_drv.h | 1 + > > 4 files changed, 35 insertions(+), 37 deletions(-) > > > > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c > > index b3d8e2b0948c..f95468cd0470 100644 > > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c > > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c > > @@ -3367,7 +3367,7 @@ static struct sg_table * > > intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info, > > struct drm_i915_gem_object *obj) > > { > > - unsigned int size_pages = rot_info->size >> PAGE_SHIFT; > > + unsigned int size_pages = rot_info->plane[0].width * rot_info->plane[0].height; > > unsigned int size_pages_uv; > > struct sg_page_iter sg_iter; > > unsigned long i; > > @@ -3385,7 +3385,7 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info, > > > > /* Account for UV plane with NV12. */ > > if (rot_info->pixel_format == DRM_FORMAT_NV12) > > - size_pages_uv = rot_info->size_uv >> PAGE_SHIFT; > > + size_pages_uv = rot_info->plane[1].width * rot_info->plane[1].height; > > else > > size_pages_uv = 0; > > > > @@ -3407,9 +3407,9 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info, > > > > /* Rotate the pages. */ > > sg = rotate_pages(page_addr_list, 0, > > - rot_info->width_pages, rot_info->height_pages, > > - rot_info->width_pages, > > - st, NULL); > > + rot_info->plane[0].width, rot_info->plane[0].height, > > + rot_info->plane[0].width, > > + st, NULL); > > > > /* Append the UV plane if NV12. */ > > if (rot_info->pixel_format == DRM_FORMAT_NV12) { > > @@ -3421,18 +3421,15 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info, > > > > rot_info->uv_start_page = uv_start_page; > > > > - rotate_pages(page_addr_list, uv_start_page, > > - rot_info->width_pages_uv, > > - rot_info->height_pages_uv, > > - rot_info->width_pages_uv, > > + rotate_pages(page_addr_list, rot_info->uv_start_page, > > + rot_info->plane[1].width, rot_info->plane[1].height, > > + rot_info->plane[1].width, > > 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 (%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 + size_pages_uv, > > + DRM_DEBUG_KMS("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages (%u plane 0)).\n", > > + obj->base.size, rot_info->plane[0].width, > > + rot_info->plane[0].height, size_pages + size_pages_uv, > > size_pages); > > > > drm_free_large(page_addr_list); > > @@ -3444,11 +3441,9 @@ err_sg_alloc: > > 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 (%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 + size_pages_uv, > > + DRM_DEBUG_KMS("Failed to create rotated mapping for object size %zu! (%d) (%ux%u tiles, %u pages (%u plane 0))\n", > > + obj->base.size, ret, rot_info->plane[0].width, > > + rot_info->plane[0].height, size_pages + size_pages_uv, > > size_pages); > > return ERR_PTR(ret); > > } > > @@ -3600,7 +3595,7 @@ i915_ggtt_view_size(struct drm_i915_gem_object *obj, > > if (view->type == I915_GGTT_VIEW_NORMAL) { > > return obj->base.size; > > } else if (view->type == I915_GGTT_VIEW_ROTATED) { > > - return view->params.rotated.size; > > + return intel_rotation_info_size(&view->params.rotated) << PAGE_SHIFT; > > Isn't this a hidden bugfix? before this was size, now it's size+size_uv. Hmm. I suppose. TBH didn't even notice that myself. > > If you agree then please add a blurb to the commit message (or better, > split this out into a tiny prep patch). Otherwise didn't spot anything, > with either approach > > Reviewed-by: Daniel Vetter <daniel.vetter@xxxxxxxx> > > > } else if (view->type == I915_GGTT_VIEW_PARTIAL) { > > return view->params.partial.size << PAGE_SHIFT; > > } else { > > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.h b/drivers/gpu/drm/i915/i915_gem_gtt.h > > index f520c90e5377..4b8a378b9d3f 100644 > > --- a/drivers/gpu/drm/i915/i915_gem_gtt.h > > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h > > @@ -135,16 +135,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; > > unsigned int uv_start_page; > > + struct { > > + /* tiles */ > > + unsigned int width, height; > > + } plane[2]; > > }; > > > > struct i915_ggtt_view { > > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > > index 084c8ae3668f..899ffb1a9b10 100644 > > --- a/drivers/gpu/drm/i915/intel_display.c > > +++ b/drivers/gpu/drm/i915/intel_display.c > > @@ -2291,6 +2291,17 @@ intel_fb_align_height(struct drm_device *dev, unsigned int height, > > return ALIGN(height, tile_height); > > } > > > > +unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info) > > +{ > > + unsigned int size = 0; > > + int i; > > + > > + for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++) > > + size += rot_info->plane[i].width * rot_info->plane[i].height; > > + > > + return size; > > +} > > + > > static void > > intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, > > const struct drm_framebuffer *fb, > > @@ -2307,11 +2318,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, > > > > *view = i915_ggtt_view_rotated; > > > > - info->height = fb->height; > > - info->pixel_format = fb->pixel_format; > > - info->pitch = fb->pitches[0]; > > info->uv_offset = fb->offsets[1]; > > - info->fb_modifier = fb->modifier[0]; > > > > tile_size = intel_tile_size(dev_priv); > > > > @@ -2319,18 +2326,16 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, > > intel_tile_dims(dev_priv, &tile_width, &tile_height, > > fb->modifier[0], cpp); > > > > - info->width_pages = DIV_ROUND_UP(fb->pitches[0], tile_width * cpp); > > - info->height_pages = DIV_ROUND_UP(fb->height, tile_height); > > - info->size = info->width_pages * info->height_pages * tile_size; > > + info->plane[0].width = DIV_ROUND_UP(fb->pitches[0], tile_width * cpp); > > + info->plane[0].height = DIV_ROUND_UP(fb->height, tile_height); > > > > if (info->pixel_format == DRM_FORMAT_NV12) { > > cpp = drm_format_plane_cpp(fb->pixel_format, 1); > > intel_tile_dims(dev_priv, &tile_width, &tile_height, > > fb->modifier[1], cpp); > > > > - info->width_pages_uv = DIV_ROUND_UP(fb->pitches[1], tile_width * cpp); > > - info->height_pages_uv = DIV_ROUND_UP(fb->height / 2, tile_height); > > - info->size_uv = info->width_pages_uv * info->height_pages_uv * tile_size; > > + info->plane[1].width = DIV_ROUND_UP(fb->pitches[1], tile_width * cpp); > > + info->plane[1].height = DIV_ROUND_UP(fb->height / 2, tile_height); > > } > > } > > > > diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h > > index b9ef9d5f1041..f251f253cc99 100644 > > --- a/drivers/gpu/drm/i915/intel_drv.h > > +++ b/drivers/gpu/drm/i915/intel_drv.h > > @@ -1059,6 +1059,7 @@ void i915_audio_component_cleanup(struct drm_i915_private *dev_priv); > > > > /* intel_display.c */ > > extern const struct drm_plane_funcs intel_plane_funcs; > > +unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info); > > bool intel_has_pending_fb_unpin(struct drm_device *dev); > > int intel_pch_rawclk(struct drm_device *dev); > > int intel_hrawclk(struct drm_device *dev); > > -- > > 2.4.10 > > > > _______________________________________________ > > Intel-gfx mailing list > > Intel-gfx@xxxxxxxxxxxxxxxxxxxxx > > http://lists.freedesktop.org/mailman/listinfo/intel-gfx > > -- > Daniel Vetter > Software Engineer, Intel Corporation > http://blog.ffwll.ch -- Ville Syrjälä Intel OTC _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx