1 // SPDX-License-Identifier: MIT
3 * Copyright © 2018 Intel Corporation
6 #include <linux/sort.h>
10 #include "intel_gt_requests.h"
11 #include "i915_selftest.h"
12 #include "selftest_engine_heartbeat.h"
14 static void reset_heartbeat(struct intel_engine_cs *engine)
16 intel_engine_set_heartbeat(engine,
17 engine->defaults.heartbeat_interval_ms);
20 static int timeline_sync(struct intel_timeline *tl)
22 struct dma_fence *fence;
25 fence = i915_active_fence_get(&tl->last_request);
29 timeout = dma_fence_wait_timeout(fence, true, HZ / 2);
37 static int engine_sync_barrier(struct intel_engine_cs *engine)
39 return timeline_sync(engine->kernel_context->timeline);
43 struct i915_active active;
47 static int pulse_active(struct i915_active *active)
49 kref_get(&container_of(active, struct pulse, active)->kref);
53 static void pulse_free(struct kref *kref)
55 struct pulse *p = container_of(kref, typeof(*p), kref);
57 i915_active_fini(&p->active);
61 static void pulse_put(struct pulse *p)
63 kref_put(&p->kref, pulse_free);
66 static void pulse_retire(struct i915_active *active)
68 pulse_put(container_of(active, struct pulse, active));
71 static struct pulse *pulse_create(void)
75 p = kmalloc(sizeof(*p), GFP_KERNEL);
80 i915_active_init(&p->active, pulse_active, pulse_retire, 0);
85 static void pulse_unlock_wait(struct pulse *p)
87 wait_var_event_timeout(&p->active, i915_active_is_idle(&p->active), HZ);
90 static int __live_idle_pulse(struct intel_engine_cs *engine,
91 int (*fn)(struct intel_engine_cs *cs))
96 GEM_BUG_ON(!intel_engine_pm_is_awake(engine));
102 err = i915_active_acquire(&p->active);
106 err = i915_active_acquire_preallocate_barrier(&p->active, engine);
108 i915_active_release(&p->active);
112 i915_active_acquire_barrier(&p->active);
113 i915_active_release(&p->active);
115 GEM_BUG_ON(i915_active_is_idle(&p->active));
116 GEM_BUG_ON(llist_empty(&engine->barrier_tasks));
122 GEM_BUG_ON(!llist_empty(&engine->barrier_tasks));
124 if (engine_sync_barrier(engine)) {
125 struct drm_printer m = drm_err_printer(&engine->i915->drm, "pulse");
127 drm_printf(&m, "%s: no heartbeat pulse?\n", engine->name);
128 intel_engine_dump(engine, &m, "%s", engine->name);
134 GEM_BUG_ON(READ_ONCE(engine->serial) != engine->wakeref_serial);
136 pulse_unlock_wait(p); /* synchronize with the retirement callback */
138 if (!i915_active_is_idle(&p->active)) {
139 struct drm_printer m = drm_err_printer(&engine->i915->drm, "pulse");
141 drm_printf(&m, "%s: heartbeat pulse did not flush idle tasks\n",
143 i915_active_print(&p->active, &m);
154 static int live_idle_flush(void *arg)
156 struct intel_gt *gt = arg;
157 struct intel_engine_cs *engine;
158 enum intel_engine_id id;
161 /* Check that we can flush the idle barriers */
163 for_each_engine(engine, gt, id) {
164 st_engine_heartbeat_disable(engine);
165 err = __live_idle_pulse(engine, intel_engine_flush_barriers);
166 st_engine_heartbeat_enable(engine);
174 static int live_idle_pulse(void *arg)
176 struct intel_gt *gt = arg;
177 struct intel_engine_cs *engine;
178 enum intel_engine_id id;
181 /* Check that heartbeat pulses flush the idle barriers */
183 for_each_engine(engine, gt, id) {
184 st_engine_heartbeat_disable(engine);
185 err = __live_idle_pulse(engine, intel_engine_pulse);
186 st_engine_heartbeat_enable(engine);
187 if (err && err != -ENODEV)
196 static int __live_heartbeat_off(struct intel_engine_cs *engine)
200 intel_engine_pm_get(engine);
203 flush_delayed_work(&engine->heartbeat.work);
204 if (!delayed_work_pending(&engine->heartbeat.work)) {
205 pr_err("%s: heartbeat not running\n",
211 err = intel_engine_set_heartbeat(engine, 0);
216 flush_delayed_work(&engine->heartbeat.work);
217 if (delayed_work_pending(&engine->heartbeat.work)) {
218 pr_err("%s: heartbeat still running\n",
224 if (READ_ONCE(engine->heartbeat.systole)) {
225 pr_err("%s: heartbeat still allocated\n",
232 reset_heartbeat(engine);
234 intel_engine_pm_put(engine);
238 static int live_heartbeat_off(void *arg)
240 struct intel_gt *gt = arg;
241 struct intel_engine_cs *engine;
242 enum intel_engine_id id;
245 /* Check that we can turn off heartbeat and not interrupt VIP */
246 if (!CONFIG_DRM_I915_HEARTBEAT_INTERVAL)
249 for_each_engine(engine, gt, id) {
250 if (!intel_engine_has_preemption(engine))
253 err = __live_heartbeat_off(engine);
261 int intel_heartbeat_live_selftests(struct drm_i915_private *i915)
263 static const struct i915_subtest tests[] = {
264 SUBTEST(live_idle_flush),
265 SUBTEST(live_idle_pulse),
266 SUBTEST(live_heartbeat_off),
271 if (intel_gt_is_wedged(to_gt(i915)))
274 saved_hangcheck = i915->params.enable_hangcheck;
275 i915->params.enable_hangcheck = INT_MAX;
277 err = intel_gt_live_subtests(tests, to_gt(i915));
279 i915->params.enable_hangcheck = saved_hangcheck;
283 void st_engine_heartbeat_disable(struct intel_engine_cs *engine)
285 engine->props.heartbeat_interval_ms = 0;
287 intel_engine_pm_get(engine);
288 intel_engine_park_heartbeat(engine);
291 void st_engine_heartbeat_enable(struct intel_engine_cs *engine)
293 intel_engine_pm_put(engine);
295 engine->props.heartbeat_interval_ms =
296 engine->defaults.heartbeat_interval_ms;
299 void st_engine_heartbeat_disable_no_pm(struct intel_engine_cs *engine)
301 engine->props.heartbeat_interval_ms = 0;
304 * Park the heartbeat but without holding the PM lock as that
305 * makes the engines appear not-idle. Note that if/when unpark
306 * is called due to the PM lock being acquired later the
307 * heartbeat still won't be enabled because of the above = 0.
309 if (intel_engine_pm_get_if_awake(engine)) {
310 intel_engine_park_heartbeat(engine);
311 intel_engine_pm_put(engine);
315 void st_engine_heartbeat_enable_no_pm(struct intel_engine_cs *engine)
317 engine->props.heartbeat_interval_ms =
318 engine->defaults.heartbeat_interval_ms;