[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