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