Commit 84fe03f7 authored by Tvrtko Ursulin's avatar Tvrtko Ursulin Committed by Daniel Vetter

drm/i915: Move rotated geometry calculations into the fill helper

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)

v3: Use uint64_t instead of size_t. (Daniel Vetter)
Signed-off-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Cc: Daniel Vetter <daniel.vetter@ffwll.ch>
Cc: Chris Wilson <chris@chris-wilson.co.uk>
Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com> (v2)
Signed-off-by: default avatarDaniel Vetter <daniel.vetter@ffwll.ch>
parent c9f8fd2d
...@@ -2700,29 +2700,17 @@ static struct sg_table * ...@@ -2700,29 +2700,17 @@ static struct sg_table *
intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
struct drm_i915_gem_object *obj) struct drm_i915_gem_object *obj)
{ {
struct drm_device *dev = obj->base.dev;
struct intel_rotation_info *rot_info = &ggtt_view->rotation_info; 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; struct sg_page_iter sg_iter;
unsigned long i; unsigned long i;
dma_addr_t *page_addr_list; dma_addr_t *page_addr_list;
struct sg_table *st; struct sg_table *st;
unsigned int tile_pitch, tile_height;
unsigned int width_pages, height_pages;
int ret = -ENOMEM; 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. */ /* 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) if (!page_addr_list)
return ERR_PTR(ret); return ERR_PTR(ret);
...@@ -2731,7 +2719,7 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, ...@@ -2731,7 +2719,7 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
if (!st) if (!st)
goto err_st_alloc; goto err_st_alloc;
ret = sg_alloc_table(st, rot_pages, GFP_KERNEL); ret = sg_alloc_table(st, size_pages, GFP_KERNEL);
if (ret) if (ret)
goto err_sg_alloc; goto err_sg_alloc;
...@@ -2743,13 +2731,15 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, ...@@ -2743,13 +2731,15 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
} }
/* Rotate the pages. */ /* 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( DRM_DEBUG_KMS(
"Created rotated page mapping for object size %zu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %lu pages).\n", "Created rotated page mapping for object size %zu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages).\n",
obj->base.size, rot_info->pitch, rot_info->height, obj->base.size, rot_info->pitch, rot_info->height,
rot_info->pixel_format, width_pages, height_pages, rot_info->pixel_format, rot_info->width_pages,
rot_pages); rot_info->height_pages, size_pages);
drm_free_large(page_addr_list); drm_free_large(page_addr_list);
...@@ -2761,10 +2751,10 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view, ...@@ -2761,10 +2751,10 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view *ggtt_view,
drm_free_large(page_addr_list); drm_free_large(page_addr_list);
DRM_DEBUG_KMS( DRM_DEBUG_KMS(
"Failed to create rotated mapping for object size %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %lu 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)\n",
obj->base.size, ret, rot_info->pitch, rot_info->height, obj->base.size, ret, rot_info->pitch, rot_info->height,
rot_info->pixel_format, width_pages, height_pages, rot_info->pixel_format, rot_info->width_pages,
rot_pages); rot_info->height_pages, size_pages);
return ERR_PTR(ret); return ERR_PTR(ret);
} }
......
...@@ -126,6 +126,8 @@ struct intel_rotation_info { ...@@ -126,6 +126,8 @@ struct intel_rotation_info {
unsigned int pitch; unsigned int pitch;
uint32_t pixel_format; uint32_t pixel_format;
uint64_t fb_modifier; uint64_t fb_modifier;
unsigned int width_pages, height_pages;
uint64_t size;
}; };
struct i915_ggtt_view { struct i915_ggtt_view {
......
...@@ -2268,6 +2268,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb, ...@@ -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) const struct drm_plane_state *plane_state)
{ {
struct intel_rotation_info *info = &view->rotation_info; struct intel_rotation_info *info = &view->rotation_info;
unsigned int tile_height, tile_pitch;
*view = i915_ggtt_view_normal; *view = i915_ggtt_view_normal;
...@@ -2284,6 +2285,13 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb, ...@@ -2284,6 +2285,13 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
info->pitch = fb->pitches[0]; info->pitch = fb->pitches[0];
info->fb_modifier = fb->modifier[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; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment