drm/i915: Fix i915_sg_page_sizes to record dma segments rather than physical pages
authorThomas Hellström <thomas.hellstrom@linux.intel.com>
Tue, 1 Jun 2021 07:46:42 +0000 (09:46 +0200)
committerMatthew Auld <matthew.auld@intel.com>
Tue, 1 Jun 2021 08:33:08 +0000 (09:33 +0100)
All users of this function actually want the dma segment sizes, but that's
not what's calculated. Fix that and rename the function to
i915_sg_dma_sizes to reflect what's calculated.

Signed-off-by: Thomas Hellström <thomas.hellstrom@linux.intel.com>
Reviewed-by: Matthew Auld <matthew.auld@intel.com>
Signed-off-by: Matthew Auld <matthew.auld@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210601074654.3103-4-thomas.hellstrom@linux.intel.com
drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
drivers/gpu/drm/i915/gem/i915_gem_phys.c
drivers/gpu/drm/i915/gem/i915_gem_userptr.c
drivers/gpu/drm/i915/i915_scatterlist.h

index ccede73..616c3a2 100644 (file)
@@ -209,7 +209,7 @@ static int i915_gem_object_get_pages_dmabuf(struct drm_i915_gem_object *obj)
        if (IS_ERR(pages))
                return PTR_ERR(pages);
 
-       sg_page_sizes = i915_sg_page_sizes(pages->sgl);
+       sg_page_sizes = i915_sg_dma_sizes(pages->sgl);
 
        __i915_gem_object_set_pages(obj, pages, sg_page_sizes);
 
index 81dc2bf..36f373d 100644 (file)
@@ -208,7 +208,7 @@ static int i915_gem_object_shmem_to_phys(struct drm_i915_gem_object *obj)
 
 err_xfer:
        if (!IS_ERR_OR_NULL(pages)) {
-               unsigned int sg_page_sizes = i915_sg_page_sizes(pages->sgl);
+               unsigned int sg_page_sizes = i915_sg_dma_sizes(pages->sgl);
 
                __i915_gem_object_set_pages(obj, pages, sg_page_sizes);
        }
index a657b99..602f0ed 100644 (file)
@@ -173,7 +173,7 @@ alloc_table:
                goto err;
        }
 
-       sg_page_sizes = i915_sg_page_sizes(st->sgl);
+       sg_page_sizes = i915_sg_dma_sizes(st->sgl);
 
        __i915_gem_object_set_pages(obj, st, sg_page_sizes);
 
index 9cb26a2..b96baad 100644 (file)
@@ -101,15 +101,23 @@ static inline struct scatterlist *__sg_next(struct scatterlist *sg)
             (((__iter).curr += PAGE_SIZE) >= (__iter).max) ?           \
             (__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0 : 0)
 
-static inline unsigned int i915_sg_page_sizes(struct scatterlist *sg)
+/**
+ * i915_sg_dma_sizes - Record the dma segment sizes of a scatterlist
+ * @sg: The scatterlist
+ *
+ * Return: An unsigned int with segment sizes logically or'ed together.
+ * A caller can use this information to determine what hardware page table
+ * entry sizes can be used to map the memory represented by the scatterlist.
+ */
+static inline unsigned int i915_sg_dma_sizes(struct scatterlist *sg)
 {
        unsigned int page_sizes;
 
        page_sizes = 0;
-       while (sg) {
+       while (sg && sg_dma_len(sg)) {
                GEM_BUG_ON(sg->offset);
-               GEM_BUG_ON(!IS_ALIGNED(sg->length, PAGE_SIZE));
-               page_sizes |= sg->length;
+               GEM_BUG_ON(!IS_ALIGNED(sg_dma_len(sg), PAGE_SIZE));
+               page_sizes |= sg_dma_len(sg);
                sg = __sg_next(sg);
        }