Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: MIT
0002 /*
0003  * Copyright © 2021 Intel Corporation
0004  */
0005 
0006 //#include "gt/intel_engine_user.h"
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          * Enable force pre-emption on time slice expiration
0045          * together with engine reset on pre-emption timeout.
0046          * This is required to make the GuC notice and reset
0047          * the single hanging context.
0048          * Also, reduce the preemption timeout to something
0049          * small to speed the test up.
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     /* Restore the original policies */
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 }