On ti, 2015-06-23 at 12:57 +0100, Tvrtko Ursulin wrote: > From: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > > This way data is available as soon as the view is passed into the call chain. > > v2: Store size in bytes instead of pages under the appropriate name. (Chris Wilson) > Reviewed-by: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@xxxxxxxxx> > Cc: Joonas Lahtinen <joonas.lahtinen@xxxxxxxxxxxxxxx> > Cc: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > --- > This will be needed in the following patch which fixes i915_ggtt_view_size. > --- > drivers/gpu/drm/i915/i915_gem_gtt.c | 36 +++++++++++++----------------------- > drivers/gpu/drm/i915/i915_gem_gtt.h | 2 ++ > drivers/gpu/drm/i915/intel_display.c | 8 ++++++++ > 3 files changed, 23 insertions(+), 23 deletions(-) > > diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c > index c1c16b0..9777ef4 100644 > --- a/drivers/gpu/drm/i915/i915_gem_gtt.c > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c > @@ -2700,29 +2700,17 @@ static struct sg_table * > intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, > struct drm_i915_gem_object *obj) > { > - struct drm_device *dev = obj->base.dev; > struct intel_rotation_info *rot_info = &ggtt_view->rotation_info; > - unsigned long pages, rot_pages; > + unsigned int size_pages = rot_info->size >> PAGE_SHIFT; > struct sg_page_iter sg_iter; > unsigned long i; > dma_addr_t *page_addr_list; > struct sg_table *st; > - unsigned int tile_pitch, tile_height; > - unsigned int width_pages, height_pages; > int ret = -ENOMEM; > > - pages = obj->base.size / PAGE_SIZE; > - > - /* Calculate tiling geometry. */ > - tile_height = intel_tile_height(dev, rot_info->pixel_format, > - rot_info->fb_modifier); > - tile_pitch = PAGE_SIZE / tile_height; > - width_pages = DIV_ROUND_UP(rot_info->pitch, tile_pitch); > - height_pages = DIV_ROUND_UP(rot_info->height, tile_height); > - rot_pages = width_pages * height_pages; > - > /* Allocate a temporary list of source pages for random access. */ > - page_addr_list = drm_malloc_ab(pages, sizeof(dma_addr_t)); > + page_addr_list = drm_malloc_ab(obj->base.size / PAGE_SIZE, > + sizeof(dma_addr_t)); > if (!page_addr_list) > return ERR_PTR(ret); > > @@ -2731,7 +2719,7 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, > if (!st) > goto err_st_alloc; > > - ret = sg_alloc_table(st, rot_pages, GFP_KERNEL); > + ret = sg_alloc_table(st, size_pages, GFP_KERNEL); > if (ret) > goto err_sg_alloc; > > @@ -2743,13 +2731,15 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, > } > > /* Rotate the pages. */ > - rotate_pages(page_addr_list, width_pages, height_pages, st); > + rotate_pages(page_addr_list, > + rot_info->width_pages, rot_info->height_pages, > + st); > > DRM_DEBUG_KMS( > - "Created rotated page mapping for object size %lu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %lu pages).\n", > + "Created rotated page mapping for object size %lu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n", > obj->base.size, rot_info->pitch, rot_info->height, > - rot_info->pixel_format, width_pages, height_pages, > - rot_pages); > + rot_info->pixel_format, rot_info->width_pages, > + rot_info->height_pages, size_pages); > > drm_free_large(page_addr_list); > > @@ -2761,10 +2751,10 @@ err_st_alloc: > drm_free_large(page_addr_list); > > DRM_DEBUG_KMS( > - "Failed to create rotated mapping for object size %lu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %lu pages)\n", > + "Failed to create rotated mapping for object size %lu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages)\n", > obj->base.size, ret, rot_info->pitch, rot_info->height, > - rot_info->pixel_format, width_pages, height_pages, > - rot_pages); > + rot_info->pixel_format, rot_info->width_pages, > + rot_info->height_pages, 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 735f119..3f9fc17 100644 > --- a/drivers/gpu/drm/i915/i915_gem_gtt.h > +++ b/drivers/gpu/drm/i915/i915_gem_gtt.h > @@ -126,6 +126,8 @@ struct intel_rotation_info { > unsigned int pitch; > uint32_t pixel_format; > uint64_t fb_modifier; > + unsigned int width_pages, height_pages; > + size_t size; > }; > > struct i915_ggtt_view { > diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c > index 1bc217a..54315aa 100644 > --- a/drivers/gpu/drm/i915/intel_display.c > +++ b/drivers/gpu/drm/i915/intel_display.c > @@ -2268,6 +2268,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb, > const struct drm_plane_state *plane_state) > { > struct intel_rotation_info *info = &view->rotation_info; > + unsigned int tile_height, tile_pitch; > > *view = i915_ggtt_view_normal; > > @@ -2284,6 +2285,13 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb, > info->pitch = fb->pitches[0]; > info->fb_modifier = fb->modifier[0]; > > + tile_height = intel_tile_height(fb->dev, fb->pixel_format, > + fb->modifier[0]); > + tile_pitch = PAGE_SIZE / tile_height; > + info->width_pages = DIV_ROUND_UP(fb->pitches[0], tile_pitch); > + info->height_pages = DIV_ROUND_UP(fb->height, tile_height); > + info->size = info->width_pages * info->height_pages * PAGE_SIZE; > + > return 0; > } > _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx http://lists.freedesktop.org/mailman/listinfo/intel-gfx