On Fri, 12 Apr 2019 at 09:54, Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> wrote: > > Out scatterlist utility routines can be pulled out of i915_gem.h for a > bit more decluttering. > > Signed-off-by: Chris Wilson <chris@xxxxxxxxxxxxxxxxxx> > --- > 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@+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@+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@xxxxxxxxx> _______________________________________________ Intel-gfx mailing list Intel-gfx@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/intel-gfx