|
@@ -24,14 +24,46 @@
|
|
|
|
|
|
#include <linux/pm_runtime.h>
|
|
#include <linux/pm_runtime.h>
|
|
|
|
|
|
|
|
+#include "mock_engine.h"
|
|
|
|
+#include "mock_context.h"
|
|
|
|
+#include "mock_request.h"
|
|
#include "mock_gem_device.h"
|
|
#include "mock_gem_device.h"
|
|
#include "mock_gem_object.h"
|
|
#include "mock_gem_object.h"
|
|
#include "mock_gtt.h"
|
|
#include "mock_gtt.h"
|
|
|
|
|
|
|
|
+void mock_device_flush(struct drm_i915_private *i915)
|
|
|
|
+{
|
|
|
|
+ struct intel_engine_cs *engine;
|
|
|
|
+ enum intel_engine_id id;
|
|
|
|
+
|
|
|
|
+ lockdep_assert_held(&i915->drm.struct_mutex);
|
|
|
|
+
|
|
|
|
+ for_each_engine(engine, i915, id)
|
|
|
|
+ mock_engine_flush(engine);
|
|
|
|
+
|
|
|
|
+ i915_gem_retire_requests(i915);
|
|
|
|
+}
|
|
|
|
+
|
|
static void mock_device_release(struct drm_device *dev)
|
|
static void mock_device_release(struct drm_device *dev)
|
|
{
|
|
{
|
|
struct drm_i915_private *i915 = to_i915(dev);
|
|
struct drm_i915_private *i915 = to_i915(dev);
|
|
|
|
+ struct intel_engine_cs *engine;
|
|
|
|
+ enum intel_engine_id id;
|
|
|
|
+
|
|
|
|
+ mutex_lock(&i915->drm.struct_mutex);
|
|
|
|
+ mock_device_flush(i915);
|
|
|
|
+ mutex_unlock(&i915->drm.struct_mutex);
|
|
|
|
|
|
|
|
+ cancel_delayed_work_sync(&i915->gt.retire_work);
|
|
|
|
+ cancel_delayed_work_sync(&i915->gt.idle_work);
|
|
|
|
+
|
|
|
|
+ mutex_lock(&i915->drm.struct_mutex);
|
|
|
|
+ for_each_engine(engine, i915, id)
|
|
|
|
+ mock_engine_free(engine);
|
|
|
|
+ i915_gem_context_fini(i915);
|
|
|
|
+ mutex_unlock(&i915->drm.struct_mutex);
|
|
|
|
+
|
|
|
|
+ drain_workqueue(i915->wq);
|
|
i915_gem_drain_freed_objects(i915);
|
|
i915_gem_drain_freed_objects(i915);
|
|
|
|
|
|
mutex_lock(&i915->drm.struct_mutex);
|
|
mutex_lock(&i915->drm.struct_mutex);
|
|
@@ -39,6 +71,10 @@ static void mock_device_release(struct drm_device *dev)
|
|
i915_gem_timeline_fini(&i915->gt.global_timeline);
|
|
i915_gem_timeline_fini(&i915->gt.global_timeline);
|
|
mutex_unlock(&i915->drm.struct_mutex);
|
|
mutex_unlock(&i915->drm.struct_mutex);
|
|
|
|
|
|
|
|
+ destroy_workqueue(i915->wq);
|
|
|
|
+
|
|
|
|
+ kmem_cache_destroy(i915->dependencies);
|
|
|
|
+ kmem_cache_destroy(i915->requests);
|
|
kmem_cache_destroy(i915->vmas);
|
|
kmem_cache_destroy(i915->vmas);
|
|
kmem_cache_destroy(i915->objects);
|
|
kmem_cache_destroy(i915->objects);
|
|
|
|
|
|
@@ -62,9 +98,19 @@ static void release_dev(struct device *dev)
|
|
kfree(pdev);
|
|
kfree(pdev);
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+static void mock_retire_work_handler(struct work_struct *work)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+static void mock_idle_work_handler(struct work_struct *work)
|
|
|
|
+{
|
|
|
|
+}
|
|
|
|
+
|
|
struct drm_i915_private *mock_gem_device(void)
|
|
struct drm_i915_private *mock_gem_device(void)
|
|
{
|
|
{
|
|
struct drm_i915_private *i915;
|
|
struct drm_i915_private *i915;
|
|
|
|
+ struct intel_engine_cs *engine;
|
|
|
|
+ enum intel_engine_id id;
|
|
struct pci_dev *pdev;
|
|
struct pci_dev *pdev;
|
|
int err;
|
|
int err;
|
|
|
|
|
|
@@ -98,36 +144,81 @@ struct drm_i915_private *mock_gem_device(void)
|
|
|
|
|
|
spin_lock_init(&i915->mm.object_stat_lock);
|
|
spin_lock_init(&i915->mm.object_stat_lock);
|
|
|
|
|
|
|
|
+ init_waitqueue_head(&i915->gpu_error.wait_queue);
|
|
|
|
+ init_waitqueue_head(&i915->gpu_error.reset_queue);
|
|
|
|
+
|
|
|
|
+ i915->wq = alloc_ordered_workqueue("mock", 0);
|
|
|
|
+ if (!i915->wq)
|
|
|
|
+ goto put_device;
|
|
|
|
+
|
|
INIT_WORK(&i915->mm.free_work, __i915_gem_free_work);
|
|
INIT_WORK(&i915->mm.free_work, __i915_gem_free_work);
|
|
init_llist_head(&i915->mm.free_list);
|
|
init_llist_head(&i915->mm.free_list);
|
|
INIT_LIST_HEAD(&i915->mm.unbound_list);
|
|
INIT_LIST_HEAD(&i915->mm.unbound_list);
|
|
INIT_LIST_HEAD(&i915->mm.bound_list);
|
|
INIT_LIST_HEAD(&i915->mm.bound_list);
|
|
|
|
|
|
|
|
+ ida_init(&i915->context_hw_ida);
|
|
|
|
+
|
|
|
|
+ INIT_DELAYED_WORK(&i915->gt.retire_work, mock_retire_work_handler);
|
|
|
|
+ INIT_DELAYED_WORK(&i915->gt.idle_work, mock_idle_work_handler);
|
|
|
|
+
|
|
|
|
+ i915->gt.awake = true;
|
|
|
|
+
|
|
i915->objects = KMEM_CACHE(mock_object, SLAB_HWCACHE_ALIGN);
|
|
i915->objects = KMEM_CACHE(mock_object, SLAB_HWCACHE_ALIGN);
|
|
if (!i915->objects)
|
|
if (!i915->objects)
|
|
- goto put_device;
|
|
|
|
|
|
+ goto err_wq;
|
|
|
|
|
|
i915->vmas = KMEM_CACHE(i915_vma, SLAB_HWCACHE_ALIGN);
|
|
i915->vmas = KMEM_CACHE(i915_vma, SLAB_HWCACHE_ALIGN);
|
|
if (!i915->vmas)
|
|
if (!i915->vmas)
|
|
goto err_objects;
|
|
goto err_objects;
|
|
|
|
|
|
|
|
+ i915->requests = KMEM_CACHE(mock_request,
|
|
|
|
+ SLAB_HWCACHE_ALIGN |
|
|
|
|
+ SLAB_RECLAIM_ACCOUNT |
|
|
|
|
+ SLAB_DESTROY_BY_RCU);
|
|
|
|
+ if (!i915->requests)
|
|
|
|
+ goto err_vmas;
|
|
|
|
+
|
|
|
|
+ i915->dependencies = KMEM_CACHE(i915_dependency,
|
|
|
|
+ SLAB_HWCACHE_ALIGN |
|
|
|
|
+ SLAB_RECLAIM_ACCOUNT);
|
|
|
|
+ if (!i915->dependencies)
|
|
|
|
+ goto err_requests;
|
|
|
|
+
|
|
mutex_lock(&i915->drm.struct_mutex);
|
|
mutex_lock(&i915->drm.struct_mutex);
|
|
INIT_LIST_HEAD(&i915->gt.timelines);
|
|
INIT_LIST_HEAD(&i915->gt.timelines);
|
|
err = i915_gem_timeline_init__global(i915);
|
|
err = i915_gem_timeline_init__global(i915);
|
|
if (err) {
|
|
if (err) {
|
|
mutex_unlock(&i915->drm.struct_mutex);
|
|
mutex_unlock(&i915->drm.struct_mutex);
|
|
- goto err_vmas;
|
|
|
|
|
|
+ goto err_dependencies;
|
|
}
|
|
}
|
|
|
|
|
|
mock_init_ggtt(i915);
|
|
mock_init_ggtt(i915);
|
|
mutex_unlock(&i915->drm.struct_mutex);
|
|
mutex_unlock(&i915->drm.struct_mutex);
|
|
|
|
|
|
|
|
+ mkwrite_device_info(i915)->ring_mask = BIT(0);
|
|
|
|
+ i915->engine[RCS] = mock_engine(i915, "mock");
|
|
|
|
+ if (!i915->engine[RCS])
|
|
|
|
+ goto err_dependencies;
|
|
|
|
+
|
|
|
|
+ i915->kernel_context = mock_context(i915, NULL);
|
|
|
|
+ if (!i915->kernel_context)
|
|
|
|
+ goto err_engine;
|
|
|
|
+
|
|
return i915;
|
|
return i915;
|
|
|
|
|
|
|
|
+err_engine:
|
|
|
|
+ for_each_engine(engine, i915, id)
|
|
|
|
+ mock_engine_free(engine);
|
|
|
|
+err_dependencies:
|
|
|
|
+ kmem_cache_destroy(i915->dependencies);
|
|
|
|
+err_requests:
|
|
|
|
+ kmem_cache_destroy(i915->requests);
|
|
err_vmas:
|
|
err_vmas:
|
|
kmem_cache_destroy(i915->vmas);
|
|
kmem_cache_destroy(i915->vmas);
|
|
err_objects:
|
|
err_objects:
|
|
kmem_cache_destroy(i915->objects);
|
|
kmem_cache_destroy(i915->objects);
|
|
|
|
+err_wq:
|
|
|
|
+ destroy_workqueue(i915->wq);
|
|
put_device:
|
|
put_device:
|
|
put_device(&pdev->dev);
|
|
put_device(&pdev->dev);
|
|
err:
|
|
err:
|