1 // SPDX-License-Identifier: MIT
3 * Copyright © 2019 Intel Corporation
6 #include <linux/kobject.h>
7 #include <linux/sysfs.h>
10 #include "intel_engine.h"
11 #include "intel_engine_heartbeat.h"
12 #include "sysfs_engines.h"
16 struct intel_engine_cs
*engine
;
19 static struct intel_engine_cs
*kobj_to_engine(struct kobject
*kobj
)
21 return container_of(kobj
, struct kobj_engine
, base
)->engine
;
25 name_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
27 return sprintf(buf
, "%s\n", kobj_to_engine(kobj
)->name
);
30 static struct kobj_attribute name_attr
=
31 __ATTR(name
, 0444, name_show
, NULL
);
34 class_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
36 return sprintf(buf
, "%d\n", kobj_to_engine(kobj
)->uabi_class
);
39 static struct kobj_attribute class_attr
=
40 __ATTR(class, 0444, class_show
, NULL
);
43 inst_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
45 return sprintf(buf
, "%d\n", kobj_to_engine(kobj
)->uabi_instance
);
48 static struct kobj_attribute inst_attr
=
49 __ATTR(instance
, 0444, inst_show
, NULL
);
52 mmio_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
54 return sprintf(buf
, "0x%x\n", kobj_to_engine(kobj
)->mmio_base
);
57 static struct kobj_attribute mmio_attr
=
58 __ATTR(mmio_base
, 0444, mmio_show
, NULL
);
60 static const char * const vcs_caps
[] = {
61 [ilog2(I915_VIDEO_CLASS_CAPABILITY_HEVC
)] = "hevc",
62 [ilog2(I915_VIDEO_AND_ENHANCE_CLASS_CAPABILITY_SFC
)] = "sfc",
65 static const char * const vecs_caps
[] = {
66 [ilog2(I915_VIDEO_AND_ENHANCE_CLASS_CAPABILITY_SFC
)] = "sfc",
69 static ssize_t
repr_trim(char *buf
, ssize_t len
)
71 /* Trim off the trailing space and replace with a newline */
81 __caps_show(struct intel_engine_cs
*engine
,
82 unsigned long caps
, char *buf
, bool show_unknown
)
84 const char * const *repr
;
88 switch (engine
->class) {
89 case VIDEO_DECODE_CLASS
:
91 count
= ARRAY_SIZE(vcs_caps
);
94 case VIDEO_ENHANCEMENT_CLASS
:
96 count
= ARRAY_SIZE(vecs_caps
);
104 GEM_BUG_ON(count
> BITS_PER_LONG
);
107 for_each_set_bit(n
, &caps
, show_unknown
? BITS_PER_LONG
: count
) {
108 if (n
>= count
|| !repr
[n
]) {
109 if (GEM_WARN_ON(show_unknown
))
110 len
+= snprintf(buf
+ len
, PAGE_SIZE
- len
,
113 len
+= snprintf(buf
+ len
, PAGE_SIZE
- len
,
116 if (GEM_WARN_ON(len
>= PAGE_SIZE
))
119 return repr_trim(buf
, len
);
123 caps_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
125 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
127 return __caps_show(engine
, engine
->uabi_capabilities
, buf
, true);
130 static struct kobj_attribute caps_attr
=
131 __ATTR(capabilities
, 0444, caps_show
, NULL
);
134 all_caps_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
136 return __caps_show(kobj_to_engine(kobj
), -1, buf
, false);
139 static struct kobj_attribute all_caps_attr
=
140 __ATTR(known_capabilities
, 0444, all_caps_show
, NULL
);
143 max_spin_store(struct kobject
*kobj
, struct kobj_attribute
*attr
,
144 const char *buf
, size_t count
)
146 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
147 unsigned long long duration
;
151 * When waiting for a request, if is it currently being executed
152 * on the GPU, we busywait for a short while before sleeping. The
153 * premise is that most requests are short, and if it is already
154 * executing then there is a good chance that it will complete
155 * before we can setup the interrupt handler and go to sleep.
156 * We try to offset the cost of going to sleep, by first spinning
157 * on the request -- if it completed in less time than it would take
158 * to go sleep, process the interrupt and return back to the client,
159 * then we have saved the client some latency, albeit at the cost
160 * of spinning on an expensive CPU core.
162 * While we try to avoid waiting at all for a request that is unlikely
163 * to complete, deciding how long it is worth spinning is for is an
164 * arbitrary decision: trading off power vs latency.
167 err
= kstrtoull(buf
, 0, &duration
);
171 if (duration
> jiffies_to_nsecs(2))
174 WRITE_ONCE(engine
->props
.max_busywait_duration_ns
, duration
);
180 max_spin_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
182 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
184 return sprintf(buf
, "%lu\n", engine
->props
.max_busywait_duration_ns
);
187 static struct kobj_attribute max_spin_attr
=
188 __ATTR(max_busywait_duration_ns
, 0644, max_spin_show
, max_spin_store
);
191 max_spin_default(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
193 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
195 return sprintf(buf
, "%lu\n", engine
->defaults
.max_busywait_duration_ns
);
198 static struct kobj_attribute max_spin_def
=
199 __ATTR(max_busywait_duration_ns
, 0444, max_spin_default
, NULL
);
202 timeslice_store(struct kobject
*kobj
, struct kobj_attribute
*attr
,
203 const char *buf
, size_t count
)
205 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
206 unsigned long long duration
;
210 * Execlists uses a scheduling quantum (a timeslice) to alternate
211 * execution between ready-to-run contexts of equal priority. This
212 * ensures that all users (though only if they of equal importance)
213 * have the opportunity to run and prevents livelocks where contexts
214 * may have implicit ordering due to userspace semaphores.
217 err
= kstrtoull(buf
, 0, &duration
);
221 if (duration
> jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT
))
224 WRITE_ONCE(engine
->props
.timeslice_duration_ms
, duration
);
226 if (execlists_active(&engine
->execlists
))
227 set_timer_ms(&engine
->execlists
.timer
, duration
);
233 timeslice_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
235 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
237 return sprintf(buf
, "%lu\n", engine
->props
.timeslice_duration_ms
);
240 static struct kobj_attribute timeslice_duration_attr
=
241 __ATTR(timeslice_duration_ms
, 0644, timeslice_show
, timeslice_store
);
244 timeslice_default(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
246 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
248 return sprintf(buf
, "%lu\n", engine
->defaults
.timeslice_duration_ms
);
251 static struct kobj_attribute timeslice_duration_def
=
252 __ATTR(timeslice_duration_ms
, 0444, timeslice_default
, NULL
);
255 stop_store(struct kobject
*kobj
, struct kobj_attribute
*attr
,
256 const char *buf
, size_t count
)
258 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
259 unsigned long long duration
;
263 * When we allow ourselves to sleep before a GPU reset after disabling
264 * submission, even for a few milliseconds, gives an innocent context
265 * the opportunity to clear the GPU before the reset occurs. However,
266 * how long to sleep depends on the typical non-preemptible duration
267 * (a similar problem to determining the ideal preempt-reset timeout
268 * or even the heartbeat interval).
271 err
= kstrtoull(buf
, 0, &duration
);
275 if (duration
> jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT
))
278 WRITE_ONCE(engine
->props
.stop_timeout_ms
, duration
);
283 stop_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
285 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
287 return sprintf(buf
, "%lu\n", engine
->props
.stop_timeout_ms
);
290 static struct kobj_attribute stop_timeout_attr
=
291 __ATTR(stop_timeout_ms
, 0644, stop_show
, stop_store
);
294 stop_default(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
296 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
298 return sprintf(buf
, "%lu\n", engine
->defaults
.stop_timeout_ms
);
301 static struct kobj_attribute stop_timeout_def
=
302 __ATTR(stop_timeout_ms
, 0444, stop_default
, NULL
);
305 preempt_timeout_store(struct kobject
*kobj
, struct kobj_attribute
*attr
,
306 const char *buf
, size_t count
)
308 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
309 unsigned long long timeout
;
313 * After initialising a preemption request, we give the current
314 * resident a small amount of time to vacate the GPU. The preemption
315 * request is for a higher priority context and should be immediate to
316 * maintain high quality of service (and avoid priority inversion).
317 * However, the preemption granularity of the GPU can be quite coarse
318 * and so we need a compromise.
321 err
= kstrtoull(buf
, 0, &timeout
);
325 if (timeout
> jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT
))
328 WRITE_ONCE(engine
->props
.preempt_timeout_ms
, timeout
);
330 if (READ_ONCE(engine
->execlists
.pending
[0]))
331 set_timer_ms(&engine
->execlists
.preempt
, timeout
);
337 preempt_timeout_show(struct kobject
*kobj
, struct kobj_attribute
*attr
,
340 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
342 return sprintf(buf
, "%lu\n", engine
->props
.preempt_timeout_ms
);
345 static struct kobj_attribute preempt_timeout_attr
=
346 __ATTR(preempt_timeout_ms
, 0644, preempt_timeout_show
, preempt_timeout_store
);
349 preempt_timeout_default(struct kobject
*kobj
, struct kobj_attribute
*attr
,
352 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
354 return sprintf(buf
, "%lu\n", engine
->defaults
.preempt_timeout_ms
);
357 static struct kobj_attribute preempt_timeout_def
=
358 __ATTR(preempt_timeout_ms
, 0444, preempt_timeout_default
, NULL
);
361 heartbeat_store(struct kobject
*kobj
, struct kobj_attribute
*attr
,
362 const char *buf
, size_t count
)
364 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
365 unsigned long long delay
;
369 * We monitor the health of the system via periodic heartbeat pulses.
370 * The pulses also provide the opportunity to perform garbage
371 * collection. However, we interpret an incomplete pulse (a missed
372 * heartbeat) as an indication that the system is no longer responsive,
373 * i.e. hung, and perform an engine or full GPU reset. Given that the
374 * preemption granularity can be very coarse on a system, the optimal
375 * value for any workload is unknowable!
378 err
= kstrtoull(buf
, 0, &delay
);
382 if (delay
>= jiffies_to_msecs(MAX_SCHEDULE_TIMEOUT
))
385 err
= intel_engine_set_heartbeat(engine
, delay
);
393 heartbeat_show(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
395 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
397 return sprintf(buf
, "%lu\n", engine
->props
.heartbeat_interval_ms
);
400 static struct kobj_attribute heartbeat_interval_attr
=
401 __ATTR(heartbeat_interval_ms
, 0644, heartbeat_show
, heartbeat_store
);
404 heartbeat_default(struct kobject
*kobj
, struct kobj_attribute
*attr
, char *buf
)
406 struct intel_engine_cs
*engine
= kobj_to_engine(kobj
);
408 return sprintf(buf
, "%lu\n", engine
->defaults
.heartbeat_interval_ms
);
411 static struct kobj_attribute heartbeat_interval_def
=
412 __ATTR(heartbeat_interval_ms
, 0444, heartbeat_default
, NULL
);
414 static void kobj_engine_release(struct kobject
*kobj
)
419 static struct kobj_type kobj_engine_type
= {
420 .release
= kobj_engine_release
,
421 .sysfs_ops
= &kobj_sysfs_ops
424 static struct kobject
*
425 kobj_engine(struct kobject
*dir
, struct intel_engine_cs
*engine
)
427 struct kobj_engine
*ke
;
429 ke
= kzalloc(sizeof(*ke
), GFP_KERNEL
);
433 kobject_init(&ke
->base
, &kobj_engine_type
);
436 if (kobject_add(&ke
->base
, dir
, "%s", engine
->name
)) {
437 kobject_put(&ke
->base
);
441 /* xfer ownership to sysfs tree */
445 static void add_defaults(struct kobj_engine
*parent
)
447 static const struct attribute
*files
[] = {
449 &stop_timeout_def
.attr
,
450 #if CONFIG_DRM_I915_HEARTBEAT_INTERVAL
451 &heartbeat_interval_def
.attr
,
455 struct kobj_engine
*ke
;
457 ke
= kzalloc(sizeof(*ke
), GFP_KERNEL
);
461 kobject_init(&ke
->base
, &kobj_engine_type
);
462 ke
->engine
= parent
->engine
;
464 if (kobject_add(&ke
->base
, &parent
->base
, "%s", ".defaults")) {
465 kobject_put(&ke
->base
);
469 if (sysfs_create_files(&ke
->base
, files
))
472 if (intel_engine_has_timeslices(ke
->engine
) &&
473 sysfs_create_file(&ke
->base
, ×lice_duration_def
.attr
))
476 if (intel_engine_has_preempt_reset(ke
->engine
) &&
477 sysfs_create_file(&ke
->base
, &preempt_timeout_def
.attr
))
481 void intel_engines_add_sysfs(struct drm_i915_private
*i915
)
483 static const struct attribute
*files
[] = {
491 &stop_timeout_attr
.attr
,
492 #if CONFIG_DRM_I915_HEARTBEAT_INTERVAL
493 &heartbeat_interval_attr
.attr
,
498 struct device
*kdev
= i915
->drm
.primary
->kdev
;
499 struct intel_engine_cs
*engine
;
502 dir
= kobject_create_and_add("engine", &kdev
->kobj
);
506 for_each_uabi_engine(engine
, i915
) {
507 struct kobject
*kobj
;
509 kobj
= kobj_engine(dir
, engine
);
513 if (sysfs_create_files(kobj
, files
))
516 if (intel_engine_has_timeslices(engine
) &&
517 sysfs_create_file(kobj
, ×lice_duration_attr
.attr
))
520 if (intel_engine_has_preempt_reset(engine
) &&
521 sysfs_create_file(kobj
, &preempt_timeout_attr
.attr
))
524 add_defaults(container_of(kobj
, struct kobj_engine
, base
));
530 dev_err(kdev
, "Failed to add sysfs engine '%s'\n",