mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2026-05-02 10:59:18 -04:00
drm/i915/fb: Factor out functions to remap contiguous FB obj pages
Factor out functions needed to map contiguous FB obj pages to a GTT/DPT VMA view in the next patch. While at it s/4096/I915_GTT_PAGE_SIZE/ in add_padding_pages(). No functional changes. v2: s/4096/I915_GTT_PAGE_SIZE/ (Matthew) Signed-off-by: Imre Deak <imre.deak@intel.com> Reviewed-by: Matthew Auld <matthew.auld@intel.com> Reviewed-by: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com> Link: https://patchwork.freedesktop.org/patch/msgid/20211026225105.2783797-4-imre.deak@intel.com
This commit is contained in:
@@ -1387,6 +1387,25 @@ intel_rotate_pages(struct intel_rotation_info *rot_info,
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
||||
static struct scatterlist *
|
||||
add_padding_pages(unsigned int count,
|
||||
struct sg_table *st, struct scatterlist *sg)
|
||||
{
|
||||
st->nents++;
|
||||
|
||||
/*
|
||||
* The DE ignores the PTEs for the padding tiles, the sg entry
|
||||
* here is just a convenience to indicate how many padding PTEs
|
||||
* to insert at this spot.
|
||||
*/
|
||||
sg_set_page(sg, NULL, count * I915_GTT_PAGE_SIZE, 0);
|
||||
sg_dma_address(sg) = 0;
|
||||
sg_dma_len(sg) = count * I915_GTT_PAGE_SIZE;
|
||||
sg = sg_next(sg);
|
||||
|
||||
return sg;
|
||||
}
|
||||
|
||||
static struct scatterlist *
|
||||
remap_pages(struct drm_i915_gem_object *obj,
|
||||
unsigned int offset, unsigned int alignment_pad,
|
||||
@@ -1399,19 +1418,8 @@ remap_pages(struct drm_i915_gem_object *obj,
|
||||
if (!width || !height)
|
||||
return sg;
|
||||
|
||||
if (alignment_pad) {
|
||||
st->nents++;
|
||||
|
||||
/*
|
||||
* The DE ignores the PTEs for the padding tiles, the sg entry
|
||||
* here is just a convenience to indicate how many padding PTEs
|
||||
* to insert at this spot.
|
||||
*/
|
||||
sg_set_page(sg, NULL, alignment_pad * 4096, 0);
|
||||
sg_dma_address(sg) = 0;
|
||||
sg_dma_len(sg) = alignment_pad * 4096;
|
||||
sg = sg_next(sg);
|
||||
}
|
||||
if (alignment_pad)
|
||||
sg = add_padding_pages(alignment_pad, st, sg);
|
||||
|
||||
for (row = 0; row < height; row++) {
|
||||
unsigned int left = width * I915_GTT_PAGE_SIZE;
|
||||
@@ -1448,22 +1456,45 @@ remap_pages(struct drm_i915_gem_object *obj,
|
||||
if (!left)
|
||||
continue;
|
||||
|
||||
st->nents++;
|
||||
|
||||
/*
|
||||
* The DE ignores the PTEs for the padding tiles, the sg entry
|
||||
* here is just a conenience to indicate how many padding PTEs
|
||||
* to insert at this spot.
|
||||
*/
|
||||
sg_set_page(sg, NULL, left, 0);
|
||||
sg_dma_address(sg) = 0;
|
||||
sg_dma_len(sg) = left;
|
||||
sg = sg_next(sg);
|
||||
sg = add_padding_pages(left >> PAGE_SHIFT, st, sg);
|
||||
}
|
||||
|
||||
return sg;
|
||||
}
|
||||
|
||||
static struct scatterlist *
|
||||
remap_contiguous_pages(struct drm_i915_gem_object *obj,
|
||||
unsigned int obj_offset,
|
||||
unsigned int count,
|
||||
struct sg_table *st, struct scatterlist *sg)
|
||||
{
|
||||
struct scatterlist *iter;
|
||||
unsigned int offset;
|
||||
|
||||
iter = i915_gem_object_get_sg_dma(obj, obj_offset, &offset);
|
||||
GEM_BUG_ON(!iter);
|
||||
|
||||
do {
|
||||
unsigned int len;
|
||||
|
||||
len = min(sg_dma_len(iter) - (offset << PAGE_SHIFT),
|
||||
count << PAGE_SHIFT);
|
||||
sg_set_page(sg, NULL, len, 0);
|
||||
sg_dma_address(sg) =
|
||||
sg_dma_address(iter) + (offset << PAGE_SHIFT);
|
||||
sg_dma_len(sg) = len;
|
||||
|
||||
st->nents++;
|
||||
count -= len >> PAGE_SHIFT;
|
||||
if (count == 0)
|
||||
return sg;
|
||||
|
||||
sg = __sg_next(sg);
|
||||
iter = __sg_next(iter);
|
||||
offset = 0;
|
||||
} while (1);
|
||||
}
|
||||
|
||||
static noinline struct sg_table *
|
||||
intel_remap_pages(struct intel_remapped_info *rem_info,
|
||||
struct drm_i915_gem_object *obj)
|
||||
@@ -1524,9 +1555,8 @@ intel_partial_pages(const struct i915_ggtt_view *view,
|
||||
struct drm_i915_gem_object *obj)
|
||||
{
|
||||
struct sg_table *st;
|
||||
struct scatterlist *sg, *iter;
|
||||
struct scatterlist *sg;
|
||||
unsigned int count = view->partial.size;
|
||||
unsigned int offset;
|
||||
int ret = -ENOMEM;
|
||||
|
||||
st = kmalloc(sizeof(*st), GFP_KERNEL);
|
||||
@@ -1537,34 +1567,14 @@ intel_partial_pages(const struct i915_ggtt_view *view,
|
||||
if (ret)
|
||||
goto err_sg_alloc;
|
||||
|
||||
iter = i915_gem_object_get_sg_dma(obj, view->partial.offset, &offset);
|
||||
GEM_BUG_ON(!iter);
|
||||
|
||||
sg = st->sgl;
|
||||
st->nents = 0;
|
||||
do {
|
||||
unsigned int len;
|
||||
|
||||
len = min(sg_dma_len(iter) - (offset << PAGE_SHIFT),
|
||||
count << PAGE_SHIFT);
|
||||
sg_set_page(sg, NULL, len, 0);
|
||||
sg_dma_address(sg) =
|
||||
sg_dma_address(iter) + (offset << PAGE_SHIFT);
|
||||
sg_dma_len(sg) = len;
|
||||
sg = remap_contiguous_pages(obj, view->partial.offset, count, st, st->sgl);
|
||||
|
||||
st->nents++;
|
||||
count -= len >> PAGE_SHIFT;
|
||||
if (count == 0) {
|
||||
sg_mark_end(sg);
|
||||
i915_sg_trim(st); /* Drop any unused tail entries. */
|
||||
sg_mark_end(sg);
|
||||
i915_sg_trim(st); /* Drop any unused tail entries. */
|
||||
|
||||
return st;
|
||||
}
|
||||
|
||||
sg = __sg_next(sg);
|
||||
iter = __sg_next(iter);
|
||||
offset = 0;
|
||||
} while (1);
|
||||
return st;
|
||||
|
||||
err_sg_alloc:
|
||||
kfree(st);
|
||||
|
||||
Reference in New Issue
Block a user