[Intel-gfx] [PATCH 38/50] drm/i915: Pull scatterlist utils out of i915_gem.h
Matthew Auld
matthew.william.auld at gmail.com
Wed Apr 17 11:11:21 UTC 2019
On Fri, 12 Apr 2019 at 09:54, Chris Wilson <chris at chris-wilson.co.uk> wrote:
>
> Out scatterlist utility routines can be pulled out of i915_gem.h for a
> bit more decluttering.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
> drivers/gpu/drm/i915/Makefile | 1 +
> drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c | 1 +
> drivers/gpu/drm/i915/gem/i915_gem_internal.c | 1 +
> drivers/gpu/drm/i915/gem/i915_gem_pages.c | 1 +
> drivers/gpu/drm/i915/gem/i915_gem_phys.c | 1 +
> drivers/gpu/drm/i915/gem/i915_gem_shmem.c | 1 +
> drivers/gpu/drm/i915/gem/i915_gem_userptr.c | 1 +
> .../drm/i915/gem/selftests/huge_gem_object.c | 2 +
> .../drm/i915/gem/selftests/i915_gem_dmabuf.c | 2 +
> drivers/gpu/drm/i915/i915_drv.h | 110 ---------------
> drivers/gpu/drm/i915/i915_gem.c | 30 +---
> drivers/gpu/drm/i915/i915_gem_fence_reg.c | 2 +
> drivers/gpu/drm/i915/i915_gem_gtt.c | 3 +-
> drivers/gpu/drm/i915/i915_gpu_error.c | 1 +
> drivers/gpu/drm/i915/i915_scatterlist.c | 39 ++++++
> drivers/gpu/drm/i915/i915_scatterlist.h | 128 ++++++++++++++++++
> drivers/gpu/drm/i915/selftests/i915_vma.c | 1 +
> drivers/gpu/drm/i915/selftests/scatterlist.c | 1 +
> 18 files changed, 186 insertions(+), 140 deletions(-)
> create mode 100644 drivers/gpu/drm/i915/i915_scatterlist.c
> create mode 100644 drivers/gpu/drm/i915/i915_scatterlist.h
>
> diff --git a/drivers/gpu/drm/i915/Makefile b/drivers/gpu/drm/i915/Makefile
> index cfefb544b613..8e70d5972195 100644
> --- a/drivers/gpu/drm/i915/Makefile
> +++ b/drivers/gpu/drm/i915/Makefile
> @@ -44,6 +44,7 @@ i915-y += i915_drv.o \
> i915_irq.o \
> i915_params.o \
> i915_pci.o \
> + i915_scatterlist.o \
> i915_suspend.o \
> i915_sysfs.o \
> intel_csr.o \
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
> index 9b75dd8c267d..4e7efe159531 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_dmabuf.c
> @@ -11,6 +11,7 @@
> #include "i915_gem_object.h"
>
> #include "../i915_drv.h"
> +#include "../i915_scatterlist.h"
>
> static struct drm_i915_gem_object *dma_buf_to_obj(struct dma_buf *buf)
> {
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_internal.c b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
> index d40adb3bbe29..d072d0cbce06 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_internal.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_internal.c
> @@ -14,6 +14,7 @@
>
> #include "../i915_drv.h"
> #include "../i915_gem.h"
> +#include "../i915_scatterlist.h"
> #include "../i915_utils.h"
>
> #define QUIET (__GFP_NORETRY | __GFP_NOWARN)
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_pages.c b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> index 8e20b8efb3da..c0a4ed1b07e9 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_pages.c
> @@ -7,6 +7,7 @@
> #include "i915_gem_object.h"
>
> #include "../i915_drv.h"
> +#include "../i915_scatterlist.h"
>
> void __i915_gem_object_set_pages(struct drm_i915_gem_object *obj,
> struct sg_table *pages,
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_phys.c b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
> index 1bf3e0afcba2..22d185301578 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_phys.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_phys.c
> @@ -16,6 +16,7 @@
> #include "i915_gem_object.h"
>
> #include "../i915_drv.h"
> +#include "../i915_scatterlist.h"
>
> static int i915_gem_object_get_pages_phys(struct drm_i915_gem_object *obj)
> {
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> index 70ae24855127..7f35ee321b51 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_shmem.c
> @@ -10,6 +10,7 @@
> #include "i915_gem_object.h"
>
> #include "../i915_drv.h"
> +#include "../i915_scatterlist.h"
>
> /*
> * Move pages to appropriate lru and release the pagevec, decrementing the
> diff --git a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
> index 007a2b8cac8b..0137baa409e1 100644
> --- a/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
> +++ b/drivers/gpu/drm/i915/gem/i915_gem_userptr.c
> @@ -15,6 +15,7 @@
> #include "i915_gem_ioctls.h"
> #include "i915_gem_object.h"
>
> +#include "../i915_scatterlist.h"
> #include "../i915_trace.h"
> #include "../intel_drv.h"
>
> diff --git a/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c b/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
> index 824f3761314c..c03781f8b435 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/huge_gem_object.c
> @@ -4,6 +4,8 @@
> * Copyright © 2016 Intel Corporation
> */
>
> +#include "../../i915_scatterlist.h"
> +
> #include "huge_gem_object.h"
>
> static void huge_free_pages(struct drm_i915_gem_object *obj,
> diff --git a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> index fc4dd92f4496..da6eb6ecdf68 100644
> --- a/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> +++ b/drivers/gpu/drm/i915/gem/selftests/i915_gem_dmabuf.c
> @@ -9,6 +9,8 @@
> #include "../../selftests/mock_gem_device.h"
> #include "mock_dmabuf.h"
>
> +#include "../../i915_drv.h"
> +
> static int igt_dmabuf_export(void *arg)
> {
> struct drm_i915_private *i915 = arg;
> diff --git a/drivers/gpu/drm/i915/i915_drv.h b/drivers/gpu/drm/i915/i915_drv.h
> index 6958de46825a..be2f95d4a763 100644
> --- a/drivers/gpu/drm/i915/i915_drv.h
> +++ b/drivers/gpu/drm/i915/i915_drv.h
> @@ -2169,111 +2169,6 @@ enum hdmi_force_audio {
> GENMASK(INTEL_FRONTBUFFER_BITS_PER_PIPE * ((pipe) + 1) - 1, \
> INTEL_FRONTBUFFER_BITS_PER_PIPE * (pipe))
>
> -/*
> - * Optimised SGL iterator for GEM objects
> - */
> -static __always_inline struct sgt_iter {
> - struct scatterlist *sgp;
> - union {
> - unsigned long pfn;
> - dma_addr_t dma;
> - };
> - unsigned int curr;
> - unsigned int max;
> -} __sgt_iter(struct scatterlist *sgl, bool dma) {
> - struct sgt_iter s = { .sgp = sgl };
> -
> - if (s.sgp) {
> - s.max = s.curr = s.sgp->offset;
> - s.max += s.sgp->length;
> - if (dma)
> - s.dma = sg_dma_address(s.sgp);
> - else
> - s.pfn = page_to_pfn(sg_page(s.sgp));
> - }
> -
> - return s;
> -}
> -
> -static inline struct scatterlist *____sg_next(struct scatterlist *sg)
> -{
> - ++sg;
> - if (unlikely(sg_is_chain(sg)))
> - sg = sg_chain_ptr(sg);
> - return sg;
> -}
> -
> -/**
> - * __sg_next - return the next scatterlist entry in a list
> - * @sg: The current sg entry
> - *
> - * Description:
> - * If the entry is the last, return NULL; otherwise, step to the next
> - * element in the array (@sg at +1). If that's a chain pointer, follow it;
> - * otherwise just return the pointer to the current element.
> - **/
> -static inline struct scatterlist *__sg_next(struct scatterlist *sg)
> -{
> - return sg_is_last(sg) ? NULL : ____sg_next(sg);
> -}
> -
> -/**
> - * for_each_sgt_dma - iterate over the DMA addresses of the given sg_table
> - * @__dmap: DMA address (output)
> - * @__iter: 'struct sgt_iter' (iterator state, internal)
> - * @__sgt: sg_table to iterate over (input)
> - */
> -#define for_each_sgt_dma(__dmap, __iter, __sgt) \
> - for ((__iter) = __sgt_iter((__sgt)->sgl, true); \
> - ((__dmap) = (__iter).dma + (__iter).curr); \
> - (((__iter).curr += I915_GTT_PAGE_SIZE) >= (__iter).max) ? \
> - (__iter) = __sgt_iter(__sg_next((__iter).sgp), true), 0 : 0)
> -
> -/**
> - * for_each_sgt_page - iterate over the pages of the given sg_table
> - * @__pp: page pointer (output)
> - * @__iter: 'struct sgt_iter' (iterator state, internal)
> - * @__sgt: sg_table to iterate over (input)
> - */
> -#define for_each_sgt_page(__pp, __iter, __sgt) \
> - for ((__iter) = __sgt_iter((__sgt)->sgl, false); \
> - ((__pp) = (__iter).pfn == 0 ? NULL : \
> - pfn_to_page((__iter).pfn + ((__iter).curr >> PAGE_SHIFT))); \
> - (((__iter).curr += PAGE_SIZE) >= (__iter).max) ? \
> - (__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0 : 0)
> -
> -bool i915_sg_trim(struct sg_table *orig_st);
> -
> -static inline unsigned int i915_sg_page_sizes(struct scatterlist *sg)
> -{
> - unsigned int page_sizes;
> -
> - page_sizes = 0;
> - while (sg) {
> - GEM_BUG_ON(sg->offset);
> - GEM_BUG_ON(!IS_ALIGNED(sg->length, PAGE_SIZE));
> - page_sizes |= sg->length;
> - sg = __sg_next(sg);
> - }
> -
> - return page_sizes;
> -}
> -
> -static inline unsigned int i915_sg_segment_size(void)
> -{
> - unsigned int size = swiotlb_max_segment();
> -
> - if (size == 0)
> - return SCATTERLIST_MAX_SEGMENT;
> -
> - size = rounddown(size, PAGE_SIZE);
> - /* swiotlb_max_segment_size can return 1 byte when it means one page. */
> - if (size < PAGE_SIZE)
> - size = PAGE_SIZE;
> -
> - return size;
> -}
> -
> #define INTEL_INFO(dev_priv) (&(dev_priv)->__info)
> #define RUNTIME_INFO(dev_priv) (&(dev_priv)->__runtime)
> #define DRIVER_CAPS(dev_priv) (&(dev_priv)->caps)
> @@ -2884,11 +2779,6 @@ int i915_gem_object_unbind(struct drm_i915_gem_object *obj);
>
> void i915_gem_runtime_suspend(struct drm_i915_private *dev_priv);
>
> -static inline int __sg_page_count(const struct scatterlist *sg)
> -{
> - return sg->length >> PAGE_SHIFT;
> -}
> -
> static inline int __must_check
> i915_mutex_lock_interruptible(struct drm_device *dev)
> {
> diff --git a/drivers/gpu/drm/i915/i915_gem.c b/drivers/gpu/drm/i915/i915_gem.c
> index c9caa51be7ee..dd5f644fce01 100644
> --- a/drivers/gpu/drm/i915/i915_gem.c
> +++ b/drivers/gpu/drm/i915/i915_gem.c
> @@ -50,6 +50,7 @@
> #include "gt/intel_workarounds.h"
>
> #include "i915_drv.h"
> +#include "i915_scatterlist.h"
> #include "i915_trace.h"
> #include "i915_vgpu.h"
>
> @@ -1061,34 +1062,6 @@ void i915_gem_runtime_suspend(struct drm_i915_private *dev_priv)
> }
> }
>
> -bool i915_sg_trim(struct sg_table *orig_st)
> -{
> - struct sg_table new_st;
> - struct scatterlist *sg, *new_sg;
> - unsigned int i;
> -
> - if (orig_st->nents == orig_st->orig_nents)
> - return false;
> -
> - if (sg_alloc_table(&new_st, orig_st->nents, GFP_KERNEL | __GFP_NOWARN))
> - return false;
> -
> - new_sg = new_st.sgl;
> - for_each_sg(orig_st->sgl, sg, orig_st->nents, i) {
> - sg_set_page(new_sg, sg_page(sg), sg->length, 0);
> - sg_dma_address(new_sg) = sg_dma_address(sg);
> - sg_dma_len(new_sg) = sg_dma_len(sg);
> -
> - new_sg = sg_next(new_sg);
> - }
> - GEM_BUG_ON(new_sg); /* Should walk exactly nents and hit the end */
> -
> - sg_free_table(orig_st);
> -
> - *orig_st = new_st;
> - return true;
> -}
> -
> static unsigned long to_wait_timeout(s64 timeout_ns)
> {
> if (timeout_ns < 0)
> @@ -2336,7 +2309,6 @@ void i915_gem_track_fb(struct drm_i915_gem_object *old,
> }
>
> #if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
> -#include "selftests/scatterlist.c"
> #include "selftests/mock_gem_device.c"
> #include "selftests/i915_gem.c"
> #endif
> diff --git a/drivers/gpu/drm/i915/i915_gem_fence_reg.c b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
> index 3084f52e3372..2e9e32330aaa 100644
> --- a/drivers/gpu/drm/i915/i915_gem_fence_reg.c
> +++ b/drivers/gpu/drm/i915/i915_gem_fence_reg.c
> @@ -22,7 +22,9 @@
> */
>
> #include <drm/i915_drm.h>
> +
> #include "i915_drv.h"
> +#include "i915_scatterlist.h"
>
> /**
> * DOC: fence register handling
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index aab778728ea2..9af55a4f5c8a 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -36,8 +36,9 @@
> #include <drm/i915_drm.h>
>
> #include "i915_drv.h"
> -#include "i915_vgpu.h"
> +#include "i915_scatterlist.h"
> #include "i915_trace.h"
> +#include "i915_vgpu.h"
> #include "intel_drv.h"
> #include "intel_frontbuffer.h"
>
> diff --git a/drivers/gpu/drm/i915/i915_gpu_error.c b/drivers/gpu/drm/i915/i915_gpu_error.c
> index c9cf5eb2fa0e..144e51ce36bc 100644
> --- a/drivers/gpu/drm/i915/i915_gpu_error.c
> +++ b/drivers/gpu/drm/i915/i915_gpu_error.c
> @@ -40,6 +40,7 @@
>
> #include "i915_gpu_error.h"
> #include "i915_drv.h"
> +#include "i915_scatterlist.h"
>
> static inline const struct intel_engine_cs *
> engine_lookup(const struct drm_i915_private *i915, unsigned int id)
> diff --git a/drivers/gpu/drm/i915/i915_scatterlist.c b/drivers/gpu/drm/i915/i915_scatterlist.c
> new file mode 100644
> index 000000000000..cc6b3846a8c7
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/i915_scatterlist.c
> @@ -0,0 +1,39 @@
> +/*
> + * SPDX-License-Identifier: MIT
> + *
> + * Copyright © 2016 Intel Corporation
> + */
> +
> +#include "i915_scatterlist.h"
> +
> +bool i915_sg_trim(struct sg_table *orig_st)
> +{
> + struct sg_table new_st;
> + struct scatterlist *sg, *new_sg;
> + unsigned int i;
> +
> + if (orig_st->nents == orig_st->orig_nents)
> + return false;
> +
> + if (sg_alloc_table(&new_st, orig_st->nents, GFP_KERNEL | __GFP_NOWARN))
> + return false;
> +
> + new_sg = new_st.sgl;
> + for_each_sg(orig_st->sgl, sg, orig_st->nents, i) {
> + sg_set_page(new_sg, sg_page(sg), sg->length, 0);
> + sg_dma_address(new_sg) = sg_dma_address(sg);
> + sg_dma_len(new_sg) = sg_dma_len(sg);
> +
> + new_sg = sg_next(new_sg);
> + }
> + GEM_BUG_ON(new_sg); /* Should walk exactly nents and hit the end */
> +
> + sg_free_table(orig_st);
> +
> + *orig_st = new_st;
> + return true;
> +}
> +
> +#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
> +#include "selftests/scatterlist.c"
> +#endif
> diff --git a/drivers/gpu/drm/i915/i915_scatterlist.h b/drivers/gpu/drm/i915/i915_scatterlist.h
> new file mode 100644
> index 000000000000..ca9ddee41e88
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/i915_scatterlist.h
> @@ -0,0 +1,128 @@
> +/*
> + * SPDX-License-Identifier: MIT
> + *
> + * Copyright © 2016 Intel Corporation
> + */
> +
> +#ifndef I915_SCATTERLIST_H
> +#define I915_SCATTERLIST_H
I915_SCATTERLIST_H
__I915_SCATTERLIST_H
__I915_SCATTERLIST_H__
What is the proper style for that? Or just meh?
> +
> +#include <linux/pfn.h>
> +#include <linux/scatterlist.h>
> +#include <linux/swiotlb.h>
> +
> +#include "i915_gem.h"
> +
> +/*
> + * Optimised SGL iterator for GEM objects
> + */
> +static __always_inline struct sgt_iter {
> + struct scatterlist *sgp;
> + union {
> + unsigned long pfn;
> + dma_addr_t dma;
> + };
> + unsigned int curr;
> + unsigned int max;
> +} __sgt_iter(struct scatterlist *sgl, bool dma) {
> + struct sgt_iter s = { .sgp = sgl };
> +
> + if (s.sgp) {
> + s.max = s.curr = s.sgp->offset;
> + s.max += s.sgp->length;
> + if (dma)
> + s.dma = sg_dma_address(s.sgp);
> + else
> + s.pfn = page_to_pfn(sg_page(s.sgp));
> + }
> +
> + return s;
> +}
> +
> +static inline int __sg_page_count(const struct scatterlist *sg)
> +{
> + return sg->length >> PAGE_SHIFT;
> +}
> +
> +static inline struct scatterlist *____sg_next(struct scatterlist *sg)
> +{
> + ++sg;
> + if (unlikely(sg_is_chain(sg)))
> + sg = sg_chain_ptr(sg);
> + return sg;
> +}
> +
> +/**
> + * __sg_next - return the next scatterlist entry in a list
> + * @sg: The current sg entry
> + *
> + * Description:
> + * If the entry is the last, return NULL; otherwise, step to the next
> + * element in the array (@sg at +1). If that's a chain pointer, follow it;
> + * otherwise just return the pointer to the current element.
> + **/
> +static inline struct scatterlist *__sg_next(struct scatterlist *sg)
> +{
> + return sg_is_last(sg) ? NULL : ____sg_next(sg);
> +}
> +
> +/**
> + * for_each_sgt_dma - iterate over the DMA addresses of the given sg_table
> + * @__dmap: DMA address (output)
> + * @__iter: 'struct sgt_iter' (iterator state, internal)
> + * @__sgt: sg_table to iterate over (input)
> + */
> +#define for_each_sgt_dma(__dmap, __iter, __sgt) \
> + for ((__iter) = __sgt_iter((__sgt)->sgl, true); \
> + ((__dmap) = (__iter).dma + (__iter).curr); \
> + (((__iter).curr += I915_GTT_PAGE_SIZE) >= (__iter).max) ? \
Do we need an #include "i915_gem_gtt.h" somewhere, or meh?
> + (__iter) = __sgt_iter(__sg_next((__iter).sgp), true), 0 : 0)
> +
> +/**
> + * for_each_sgt_page - iterate over the pages of the given sg_table
> + * @__pp: page pointer (output)
> + * @__iter: 'struct sgt_iter' (iterator state, internal)
> + * @__sgt: sg_table to iterate over (input)
> + */
> +#define for_each_sgt_page(__pp, __iter, __sgt) \
> + for ((__iter) = __sgt_iter((__sgt)->sgl, false); \
> + ((__pp) = (__iter).pfn == 0 ? NULL : \
> + pfn_to_page((__iter).pfn + ((__iter).curr >> PAGE_SHIFT))); \
> + (((__iter).curr += PAGE_SIZE) >= (__iter).max) ? \
> + (__iter) = __sgt_iter(__sg_next((__iter).sgp), false), 0 : 0)
> +
> +bool i915_sg_trim(struct sg_table *orig_st);
> +
> +static inline unsigned int i915_sg_page_sizes(struct scatterlist *sg)
> +{
> + unsigned int page_sizes;
> +
> + page_sizes = 0;
> + while (sg) {
> + GEM_BUG_ON(sg->offset);
> + GEM_BUG_ON(!IS_ALIGNED(sg->length, PAGE_SIZE));
> + page_sizes |= sg->length;
> + sg = __sg_next(sg);
> + }
> +
> + return page_sizes;
> +}
> +
> +static inline unsigned int i915_sg_segment_size(void)
> +{
> + unsigned int size = swiotlb_max_segment();
> +
> + if (size == 0)
> + return SCATTERLIST_MAX_SEGMENT;
> +
> + size = rounddown(size, PAGE_SIZE);
> + /* swiotlb_max_segment_size can return 1 byte when it means one page. */
> + if (size < PAGE_SIZE)
> + size = PAGE_SIZE;
> +
> + return size;
> +}
> +
> +bool i915_sg_trim(struct sg_table *orig_st);
Already declared above.
Reviewed-by: Matthew Auld <matthew.auld at intel.com>
More information about the Intel-gfx
mailing list