0001
0002
0003
0004
0005
0006
0007 #include "gt/intel_gt.h"
0008 #include "i915_drv.h"
0009 #include "i915_selftest.h"
0010
0011 #include "selftests/intel_scheduler_helpers.h"
0012
0013 #define REDUCED_TIMESLICE 5
0014 #define REDUCED_PREEMPT 10
0015 #define WAIT_FOR_RESET_TIME 10000
0016
0017 struct intel_engine_cs *intel_selftest_find_any_engine(struct intel_gt *gt)
0018 {
0019 struct intel_engine_cs *engine;
0020 enum intel_engine_id id;
0021
0022 for_each_engine(engine, gt, id)
0023 return engine;
0024
0025 pr_err("No valid engine found!\n");
0026 return NULL;
0027 }
0028
0029 int intel_selftest_modify_policy(struct intel_engine_cs *engine,
0030 struct intel_selftest_saved_policy *saved,
0031 u32 modify_type)
0032
0033 {
0034 int err;
0035
0036 saved->reset = engine->i915->params.reset;
0037 saved->flags = engine->flags;
0038 saved->timeslice = engine->props.timeslice_duration_ms;
0039 saved->preempt_timeout = engine->props.preempt_timeout_ms;
0040
0041 switch (modify_type) {
0042 case SELFTEST_SCHEDULER_MODIFY_FAST_RESET:
0043
0044
0045
0046
0047
0048
0049
0050
0051 engine->i915->params.reset = 2;
0052 engine->flags |= I915_ENGINE_WANT_FORCED_PREEMPTION;
0053 engine->props.timeslice_duration_ms = REDUCED_TIMESLICE;
0054 engine->props.preempt_timeout_ms = REDUCED_PREEMPT;
0055 break;
0056
0057 case SELFTEST_SCHEDULER_MODIFY_NO_HANGCHECK:
0058 engine->props.preempt_timeout_ms = 0;
0059 break;
0060
0061 default:
0062 pr_err("Invalid scheduler policy modification type: %d!\n", modify_type);
0063 return -EINVAL;
0064 }
0065
0066 if (!intel_engine_uses_guc(engine))
0067 return 0;
0068
0069 err = intel_guc_global_policies_update(&engine->gt->uc.guc);
0070 if (err)
0071 intel_selftest_restore_policy(engine, saved);
0072
0073 return err;
0074 }
0075
0076 int intel_selftest_restore_policy(struct intel_engine_cs *engine,
0077 struct intel_selftest_saved_policy *saved)
0078 {
0079
0080 engine->i915->params.reset = saved->reset;
0081 engine->flags = saved->flags;
0082 engine->props.timeslice_duration_ms = saved->timeslice;
0083 engine->props.preempt_timeout_ms = saved->preempt_timeout;
0084
0085 if (!intel_engine_uses_guc(engine))
0086 return 0;
0087
0088 return intel_guc_global_policies_update(&engine->gt->uc.guc);
0089 }
0090
0091 int intel_selftest_wait_for_rq(struct i915_request *rq)
0092 {
0093 long ret;
0094
0095 ret = i915_request_wait(rq, 0, WAIT_FOR_RESET_TIME);
0096 if (ret < 0)
0097 return ret;
0098
0099 return 0;
0100 }