[Intel-gfx] [RFCv2 08/19] drm/i915: Mock a GGTT for self-testing

Matthew Auld matthew.william.auld at gmail.com
Mon Jan 9 15:16:19 UTC 2017


On 20 December 2016 at 13:08, Chris Wilson <chris at chris-wilson.co.uk> wrote:
> A very simple mockery, just a random manager and timeline. Useful for
> inserting objects and ordering retirement; and not much else.
>
> Signed-off-by: Chris Wilson <chris at chris-wilson.co.uk>
> ---
>  drivers/gpu/drm/i915/i915_gem_gtt.c              |  4 ++
>  drivers/gpu/drm/i915/selftests/mock_gem_device.c | 22 +++++++
>  drivers/gpu/drm/i915/selftests/mock_gem_device.h |  1 +
>  drivers/gpu/drm/i915/selftests/mock_ggtt.c       | 79 ++++++++++++++++++++++++
>  4 files changed, 106 insertions(+)
>  create mode 100644 drivers/gpu/drm/i915/selftests/mock_ggtt.c
>
> diff --git a/drivers/gpu/drm/i915/i915_gem_gtt.c b/drivers/gpu/drm/i915/i915_gem_gtt.c
> index d35c46b477a6..5a98e2ca5a53 100644
> --- a/drivers/gpu/drm/i915/i915_gem_gtt.c
> +++ b/drivers/gpu/drm/i915/i915_gem_gtt.c
> @@ -3576,3 +3576,7 @@ int i915_gem_gtt_insert(struct i915_address_space *vm,
>                                            size, alignment, colour,
>                                            start, end, DRM_MM_INSERT_EVICT);
>  }
> +
> +#if IS_ENABLED(CONFIG_DRM_I915_SELFTEST)
> +#include "selftests/mock_ggtt.c"
> +#endif
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.c b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> index 95cf1d845bf1..025012ba92eb 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.c
> @@ -35,6 +35,7 @@ static void mock_device_release(struct drm_device *dev)
>         while (flush_work(&i915->mm.free_work))
>                 rcu_barrier();
>
> +       kmem_cache_destroy(i915->vmas);
i915_gem_timeline_fini also.

>         kmem_cache_destroy(i915->objects);
>         put_device(&i915->drm.pdev->dev);
>  }
> @@ -90,19 +91,40 @@ struct drm_i915_private *mock_gem_device(void)
>         i915->drm.pdev = pdev;
>         i915->drm.dev_private = i915;
>
> +       drm_mode_config_init(&i915->drm);
> +
Why do we need this for mocking the ggtt ?

>         mkwrite_device_info(i915)->gen = -1;
>
>         spin_lock_init(&i915->mm.object_stat_lock);
>
>         INIT_WORK(&i915->mm.free_work, __i915_gem_free_work);
>         init_llist_head(&i915->mm.free_list);
> +       INIT_LIST_HEAD(&i915->mm.unbound_list);
> +       INIT_LIST_HEAD(&i915->mm.bound_list);
>
>         i915->objects = KMEM_CACHE(mock_object, SLAB_HWCACHE_ALIGN);
>         if (!i915->objects)
>                 goto err_device;
>
> +       i915->vmas = KMEM_CACHE(i915_vma, SLAB_HWCACHE_ALIGN);
> +       if (!i915->vmas)
> +               goto err_objects;
> +
> +       mutex_lock(&i915->drm.struct_mutex);
> +       INIT_LIST_HEAD(&i915->gt.timelines);
> +       err = i915_gem_timeline_init__global(i915);
> +       if (err)
mutex_unlock(&i915->drm.struct_mutex);

> +               goto err_vmas;
> +
> +       mock_init_ggtt(i915);
> +       mutex_unlock(&i915->drm.struct_mutex);
> +
>         return i915;
>
> +err_vmas:
> +       kmem_cache_destroy(i915->vmas);
> +err_objects:
> +       kmem_cache_destroy(i915->objects);
>  err_device:
>         kfree(i915);
>         return NULL;
> diff --git a/drivers/gpu/drm/i915/selftests/mock_gem_device.h b/drivers/gpu/drm/i915/selftests/mock_gem_device.h
> index 7ff7c848f731..5189f684a17e 100644
> --- a/drivers/gpu/drm/i915/selftests/mock_gem_device.h
> +++ b/drivers/gpu/drm/i915/selftests/mock_gem_device.h
> @@ -4,5 +4,6 @@
>  #include "i915_drv.h"
>
>  struct drm_i915_private *mock_gem_device(void);
> +void mock_init_ggtt(struct drm_i915_private *i915);
>
>  #endif /* !__MOCK_GEM_DEVICE_H__ */
> diff --git a/drivers/gpu/drm/i915/selftests/mock_ggtt.c b/drivers/gpu/drm/i915/selftests/mock_ggtt.c
> new file mode 100644
> index 000000000000..d5f2811bc220
> --- /dev/null
> +++ b/drivers/gpu/drm/i915/selftests/mock_ggtt.c
> @@ -0,0 +1,79 @@
> +/*
> + * Copyright © 2016 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + */
> +
> +#include "mock_gem_device.h"
> +
> +static void mock_insert_page(struct i915_address_space *vm,
> +                            dma_addr_t addr,
> +                            uint64_t offset,
> +                            enum i915_cache_level level,
> +                            u32 flags)
> +{
> +}
> +
> +static void mock_insert_entries(struct i915_address_space *vm,
> +                               struct sg_table *st,
> +                               uint64_t start,
> +                               enum i915_cache_level level, u32 flags)
> +{
> +}
> +
> +static int mock_bind_vma(struct i915_vma *vma,
> +                        enum i915_cache_level cache_level,
> +                        u32 flags)
> +{
> +       vma->pages = vma->obj->mm.pages;
> +       vma->flags |= I915_VMA_GLOBAL_BIND | I915_VMA_LOCAL_BIND;
> +       return 0;
> +}
> +
> +static void mock_unbind_vma(struct i915_vma *vma)
> +{
> +}
> +
> +static void mock_remove(struct i915_address_space *vm)
> +{
> +}
> +
> +void mock_init_ggtt(struct drm_i915_private *i915)
> +{
> +       struct i915_ggtt *ggtt = &i915->ggtt;
> +
> +       INIT_LIST_HEAD(&i915->vm_list);
> +
> +       ggtt->base.i915 = i915;
> +
> +       ggtt->mappable_base = 0;
> +       ggtt->mappable_end = 2048 * PAGE_SIZE;
> +       ggtt->base.total = 4096 * PAGE_SIZE;
> +
> +       ggtt->base.clear_range = nop_clear_range;
> +       ggtt->base.insert_page = mock_insert_page;
> +       ggtt->base.insert_entries = mock_insert_entries;
> +       ggtt->base.bind_vma = mock_bind_vma;
> +       ggtt->base.unbind_vma = mock_unbind_vma;
> +       ggtt->base.cleanup = mock_remove;
> +
> +       i915_address_space_init(&ggtt->base, i915, "global");
> +}
Perhaps add a mock_fini_ggtt for device_release, with a call to
i915_address_space_fini ?

With that:
Reviewed-by: Matthew Auld <matthew.auld at intel.com>


More information about the Intel-gfx mailing list