Re: [PATCH 2/4] drm/i915: Support appending to the rotated pages mapping

Joonas Lahtinen
2015-09-21T11:08:08Z

Hi,

On ma, 2015-09-21 at 10:45 +0100, Tvrtko Ursulin wrote:
> From: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
>
> By providing a start offset into the source array of pages, and
> returning the
> end position in the scatter-gather table, we will be able to append
> the UV
> plane to the rotated mapping in later patches.
>
> v2: Rebase.
>
> Signed-off-by: Tvrtko Ursulin <tvrtko.ursulin@intel.com>

Reviewed-by: Joonas Lahtinen <joonas.lahtinen@linux.intel.com>

> ---
> drivers/gpu/drm/i915/i915_gem_gtt.c | 21 +++++++++++++--------
> 1 file changed, 13 insertions(+), 8 deletions(-)
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c
> b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index 87862813cfde..59c934fb9230 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -3234,15 +3234,18 @@ i915_gem_obj_lookup_or_create_ggtt_vma(struct
> drm_i915_gem_object *obj,
>
> }
>
> -static void
> -rotate_pages(dma_addr_t *in, unsigned int width, unsigned int
> height,
> - struct sg_table *st)
> +static struct scatterlist *
> +rotate_pages(dma_addr_t *in, unsigned int offset,
> + unsigned int width, unsigned int height,
> + struct sg_table *st, struct scatterlist *sg)
> {
> unsigned int column, row;
> unsigned int src_idx;
> - struct scatterlist *sg = st->sgl;
>
> - st->nents = 0;
> + if (!sg) {
> + st->nents = 0;
> + sg = st->sgl;
> + }
>
> for (column = 0; column < width; column++) {
> src_idx = width * (height - 1) + column;
> @@ -3253,12 +3256,14 @@ rotate_pages(dma_addr_t *in, unsigned int
> width, unsigned int height,
> * The only thing we need are DMA addresses.
> */
> sg_set_page(sg, NULL, PAGE_SIZE, 0);
> - sg_dma_address(sg) = in[src_idx];
> + sg_dma_address(sg) = in[offset + src_idx];
> sg_dma_len(sg) = PAGE_SIZE;
> sg = sg_next(sg);
> src_idx -= width;
> }
> }
> +
> + return sg;
> }
>
> static struct sg_table *
> @@ -3296,9 +3301,9 @@ intel_rotate_fb_obj_pages(struct i915_ggtt_view
> *ggtt_view,
> }
>
> /* Rotate the pages. */
> - rotate_pages(page_addr_list,
> + rotate_pages(page_addr_list, 0,
> rot_info->width_pages, rot_info->height_pages,
> - st);
> + st, NULL);
>
> 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",