xref: /linux/drivers/gpu/drm/i915/gem/selftests/i915_gem_object.c (revision 9a87ffc99ec8eb8d35eed7c4f816d75f5cc9662e)
110be98a7SChris Wilson /*
210be98a7SChris Wilson  * SPDX-License-Identifier: MIT
310be98a7SChris Wilson  *
410be98a7SChris Wilson  * Copyright © 2016 Intel Corporation
510be98a7SChris Wilson  */
610be98a7SChris Wilson 
710be98a7SChris Wilson #include "i915_selftest.h"
810be98a7SChris Wilson 
910be98a7SChris Wilson #include "huge_gem_object.h"
1010be98a7SChris Wilson #include "selftests/igt_flush_test.h"
1110be98a7SChris Wilson #include "selftests/mock_gem_device.h"
1210be98a7SChris Wilson 
igt_gem_object(void * arg)1310be98a7SChris Wilson static int igt_gem_object(void *arg)
1410be98a7SChris Wilson {
1510be98a7SChris Wilson 	struct drm_i915_private *i915 = arg;
1610be98a7SChris Wilson 	struct drm_i915_gem_object *obj;
17538c329fSColin Ian King 	int err;
1810be98a7SChris Wilson 
1910be98a7SChris Wilson 	/* Basic test to ensure we can create an object */
2010be98a7SChris Wilson 
2110be98a7SChris Wilson 	obj = i915_gem_object_create_shmem(i915, PAGE_SIZE);
2210be98a7SChris Wilson 	if (IS_ERR(obj)) {
2310be98a7SChris Wilson 		err = PTR_ERR(obj);
2410be98a7SChris Wilson 		pr_err("i915_gem_object_create failed, err=%d\n", err);
2510be98a7SChris Wilson 		goto out;
2610be98a7SChris Wilson 	}
2710be98a7SChris Wilson 
2810be98a7SChris Wilson 	err = 0;
2910be98a7SChris Wilson 	i915_gem_object_put(obj);
3010be98a7SChris Wilson out:
3110be98a7SChris Wilson 	return err;
3210be98a7SChris Wilson }
3310be98a7SChris Wilson 
igt_gem_huge(void * arg)3410be98a7SChris Wilson static int igt_gem_huge(void *arg)
3510be98a7SChris Wilson {
36*f47e6306SChris Wilson 	const unsigned long nreal = 509; /* just to be awkward */
3710be98a7SChris Wilson 	struct drm_i915_private *i915 = arg;
3810be98a7SChris Wilson 	struct drm_i915_gem_object *obj;
39*f47e6306SChris Wilson 	unsigned long n;
4010be98a7SChris Wilson 	int err;
4110be98a7SChris Wilson 
4210be98a7SChris Wilson 	/* Basic sanitycheck of our huge fake object allocation */
4310be98a7SChris Wilson 
4410be98a7SChris Wilson 	obj = huge_gem_object(i915,
4510be98a7SChris Wilson 			      nreal * PAGE_SIZE,
465c24c9d2SMichał Winiarski 			      to_gt(i915)->ggtt->vm.total + PAGE_SIZE);
4710be98a7SChris Wilson 	if (IS_ERR(obj))
4810be98a7SChris Wilson 		return PTR_ERR(obj);
4910be98a7SChris Wilson 
5030272919SMaarten Lankhorst 	err = i915_gem_object_pin_pages_unlocked(obj);
5110be98a7SChris Wilson 	if (err) {
52*f47e6306SChris Wilson 		pr_err("Failed to allocate %lu pages (%lu total), err=%d\n",
5310be98a7SChris Wilson 		       nreal, obj->base.size / PAGE_SIZE, err);
5410be98a7SChris Wilson 		goto out;
5510be98a7SChris Wilson 	}
5610be98a7SChris Wilson 
5710be98a7SChris Wilson 	for (n = 0; n < obj->base.size / PAGE_SIZE; n++) {
5810be98a7SChris Wilson 		if (i915_gem_object_get_page(obj, n) !=
5910be98a7SChris Wilson 		    i915_gem_object_get_page(obj, n % nreal)) {
60*f47e6306SChris Wilson 			pr_err("Page lookup mismatch at index %lu [%lu]\n",
6110be98a7SChris Wilson 			       n, n % nreal);
6210be98a7SChris Wilson 			err = -EINVAL;
6310be98a7SChris Wilson 			goto out_unpin;
6410be98a7SChris Wilson 		}
6510be98a7SChris Wilson 	}
6610be98a7SChris Wilson 
6710be98a7SChris Wilson out_unpin:
6810be98a7SChris Wilson 	i915_gem_object_unpin_pages(obj);
6910be98a7SChris Wilson out:
7010be98a7SChris Wilson 	i915_gem_object_put(obj);
7110be98a7SChris Wilson 	return err;
7210be98a7SChris Wilson }
7310be98a7SChris Wilson 
i915_gem_object_mock_selftests(void)7410be98a7SChris Wilson int i915_gem_object_mock_selftests(void)
7510be98a7SChris Wilson {
7610be98a7SChris Wilson 	static const struct i915_subtest tests[] = {
7710be98a7SChris Wilson 		SUBTEST(igt_gem_object),
7810be98a7SChris Wilson 	};
7910be98a7SChris Wilson 	struct drm_i915_private *i915;
8010be98a7SChris Wilson 	int err;
8110be98a7SChris Wilson 
8210be98a7SChris Wilson 	i915 = mock_gem_device();
8310be98a7SChris Wilson 	if (!i915)
8410be98a7SChris Wilson 		return -ENOMEM;
8510be98a7SChris Wilson 
8610be98a7SChris Wilson 	err = i915_subtests(tests, i915);
8710be98a7SChris Wilson 
8882be0d75SDaniel Vetter 	mock_destroy_device(i915);
8910be98a7SChris Wilson 	return err;
9010be98a7SChris Wilson }
9110be98a7SChris Wilson 
i915_gem_object_live_selftests(struct drm_i915_private * i915)9210be98a7SChris Wilson int i915_gem_object_live_selftests(struct drm_i915_private *i915)
9310be98a7SChris Wilson {
9410be98a7SChris Wilson 	static const struct i915_subtest tests[] = {
9510be98a7SChris Wilson 		SUBTEST(igt_gem_huge),
9610be98a7SChris Wilson 	};
9710be98a7SChris Wilson 
9861faec5fSMatthew Brost 	return i915_live_subtests(tests, i915);
9910be98a7SChris Wilson }
100