intel_scheduler_helpers.c 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. // SPDX-License-Identifier: MIT
  2. /*
  3. * Copyright © 2021 Intel Corporation
  4. */
  5. #include <linux/jiffies.h>
  6. //#include "gt/intel_engine_user.h"
  7. #include "gt/intel_gt.h"
  8. #include "i915_drv.h"
  9. #include "i915_selftest.h"
  10. #include "selftests/intel_scheduler_helpers.h"
  11. #define REDUCED_TIMESLICE 5
  12. #define REDUCED_PREEMPT 10
  13. #define WAIT_FOR_RESET_TIME_MS 10000
  14. struct intel_engine_cs *intel_selftest_find_any_engine(struct intel_gt *gt)
  15. {
  16. struct intel_engine_cs *engine;
  17. enum intel_engine_id id;
  18. for_each_engine(engine, gt, id)
  19. return engine;
  20. pr_err("No valid engine found!\n");
  21. return NULL;
  22. }
  23. int intel_selftest_modify_policy(struct intel_engine_cs *engine,
  24. struct intel_selftest_saved_policy *saved,
  25. enum selftest_scheduler_modify modify_type)
  26. {
  27. int err;
  28. saved->reset = engine->i915->params.reset;
  29. saved->flags = engine->flags;
  30. saved->timeslice = engine->props.timeslice_duration_ms;
  31. saved->preempt_timeout = engine->props.preempt_timeout_ms;
  32. switch (modify_type) {
  33. case SELFTEST_SCHEDULER_MODIFY_FAST_RESET:
  34. /*
  35. * Enable force pre-emption on time slice expiration
  36. * together with engine reset on pre-emption timeout.
  37. * This is required to make the GuC notice and reset
  38. * the single hanging context.
  39. * Also, reduce the preemption timeout to something
  40. * small to speed the test up.
  41. */
  42. engine->i915->params.reset = 2;
  43. engine->flags |= I915_ENGINE_WANT_FORCED_PREEMPTION;
  44. engine->props.timeslice_duration_ms = REDUCED_TIMESLICE;
  45. engine->props.preempt_timeout_ms = REDUCED_PREEMPT;
  46. break;
  47. case SELFTEST_SCHEDULER_MODIFY_NO_HANGCHECK:
  48. engine->props.preempt_timeout_ms = 0;
  49. break;
  50. default:
  51. pr_err("Invalid scheduler policy modification type: %d!\n", modify_type);
  52. return -EINVAL;
  53. }
  54. if (!intel_engine_uses_guc(engine))
  55. return 0;
  56. err = intel_guc_global_policies_update(&engine->gt->uc.guc);
  57. if (err)
  58. intel_selftest_restore_policy(engine, saved);
  59. return err;
  60. }
  61. int intel_selftest_restore_policy(struct intel_engine_cs *engine,
  62. struct intel_selftest_saved_policy *saved)
  63. {
  64. /* Restore the original policies */
  65. engine->i915->params.reset = saved->reset;
  66. engine->flags = saved->flags;
  67. engine->props.timeslice_duration_ms = saved->timeslice;
  68. engine->props.preempt_timeout_ms = saved->preempt_timeout;
  69. if (!intel_engine_uses_guc(engine))
  70. return 0;
  71. return intel_guc_global_policies_update(&engine->gt->uc.guc);
  72. }
  73. int intel_selftest_wait_for_rq(struct i915_request *rq)
  74. {
  75. long ret;
  76. ret = i915_request_wait(rq, 0, msecs_to_jiffies(WAIT_FOR_RESET_TIME_MS));
  77. if (ret < 0)
  78. return ret;
  79. return 0;
  80. }