1 1.1 riastrad /* $NetBSD: igt_reset.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $ */ 2 1.1 riastrad 3 1.1 riastrad /* 4 1.1 riastrad * SPDX-License-Identifier: MIT 5 1.1 riastrad * 6 1.1 riastrad * Copyright 2018 Intel Corporation 7 1.1 riastrad */ 8 1.1 riastrad 9 1.1 riastrad #include <sys/cdefs.h> 10 1.1 riastrad __KERNEL_RCSID(0, "$NetBSD: igt_reset.c,v 1.2 2021/12/18 23:45:31 riastradh Exp $"); 11 1.1 riastrad 12 1.1 riastrad #include "igt_reset.h" 13 1.1 riastrad 14 1.1 riastrad #include "gt/intel_engine.h" 15 1.1 riastrad #include "gt/intel_gt.h" 16 1.1 riastrad 17 1.1 riastrad #include "../i915_drv.h" 18 1.1 riastrad 19 1.1 riastrad void igt_global_reset_lock(struct intel_gt *gt) 20 1.1 riastrad { 21 1.1 riastrad struct intel_engine_cs *engine; 22 1.1 riastrad enum intel_engine_id id; 23 1.1 riastrad 24 1.1 riastrad pr_debug("%s: current gpu_error=%08lx\n", __func__, gt->reset.flags); 25 1.1 riastrad 26 1.1 riastrad while (test_and_set_bit(I915_RESET_BACKOFF, >->reset.flags)) 27 1.1 riastrad wait_event(gt->reset.queue, 28 1.1 riastrad !test_bit(I915_RESET_BACKOFF, >->reset.flags)); 29 1.1 riastrad 30 1.1 riastrad for_each_engine(engine, gt, id) { 31 1.1 riastrad while (test_and_set_bit(I915_RESET_ENGINE + id, 32 1.1 riastrad >->reset.flags)) 33 1.1 riastrad wait_on_bit(>->reset.flags, I915_RESET_ENGINE + id, 34 1.1 riastrad TASK_UNINTERRUPTIBLE); 35 1.1 riastrad } 36 1.1 riastrad } 37 1.1 riastrad 38 1.1 riastrad void igt_global_reset_unlock(struct intel_gt *gt) 39 1.1 riastrad { 40 1.1 riastrad struct intel_engine_cs *engine; 41 1.1 riastrad enum intel_engine_id id; 42 1.1 riastrad 43 1.1 riastrad for_each_engine(engine, gt, id) 44 1.1 riastrad clear_bit(I915_RESET_ENGINE + id, >->reset.flags); 45 1.1 riastrad 46 1.1 riastrad clear_bit(I915_RESET_BACKOFF, >->reset.flags); 47 1.1 riastrad wake_up_all(>->reset.queue); 48 1.1 riastrad } 49 1.1 riastrad 50 1.1 riastrad bool igt_force_reset(struct intel_gt *gt) 51 1.1 riastrad { 52 1.1 riastrad intel_gt_set_wedged(gt); 53 1.1 riastrad intel_gt_reset(gt, 0, NULL); 54 1.1 riastrad 55 1.1 riastrad return !intel_gt_is_wedged(gt); 56 1.1 riastrad } 57