[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