From: Tvrtko Ursulin <tvrtko.ursu...@intel.com>

This way data is available as soon as the view is passed into the call chain.

Signed-off-by: Tvrtko Ursulin <tvrtko.ursu...@intel.com>
Cc: Joonas Lahtinen <joonas.lahti...@linux.intel.com>
---
This will be needed in the following patch which fixes i915_ggtt_view_size.
---
 drivers/gpu/drm/i915/i915_gem_gtt.c  | 35 ++++++++++++-----------------------
 drivers/gpu/drm/i915/i915_gem_gtt.h  |  2 ++
 drivers/gpu/drm/i915/intel_display.c |  8 ++++++++
 3 files changed, 22 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..43472c4 100644
--- a/drivers/gpu/drm/i915/i915_gem_gtt.c
+++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
@@ -2700,29 +2700,16 @@ 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;
        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 +2718,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, rot_info->pages, GFP_KERNEL);
        if (ret)
                goto err_sg_alloc;
 
@@ -2743,13 +2730,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, rot_info->pages);
 
        drm_free_large(page_addr_list);
 
@@ -2761,10 +2750,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, rot_info->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..33b9580 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;
+       unsigned int pages;
 };
 
 struct i915_ggtt_view {
diff --git a/drivers/gpu/drm/i915/intel_display.c 
b/drivers/gpu/drm/i915/intel_display.c
index 1bc217a..d86406c 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->pages = info->width_pages * info->height_pages;
+
        return 0;
 }
 
-- 
2.4.2

_______________________________________________
Intel-gfx mailing list
Intel-gfx@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/intel-gfx

Reply via email to