Message ID | 1442828735-9448-3-git-send-email-tvrtko.ursulin@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
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",
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",