1#ifndef _INTEL_RINGBUFFER_H_
2#define _INTEL_RINGBUFFER_H_
3
4#include <linux/hashtable.h>
5#include "i915_gem_batch_pool.h"
6#include "i915_gem_request.h"
7#include "i915_gem_timeline.h"
8
9#define I915_CMD_HASH_ORDER 9
10
11
12
13
14
15
16#define CACHELINE_BYTES 64
17#define CACHELINE_DWORDS (CACHELINE_BYTES / sizeof(uint32_t))
18
19
20
21
22
23
24
25
26
27
28#define I915_RING_FREE_SPACE 64
29
30struct intel_hw_status_page {
31 struct i915_vma *vma;
32 u32 *page_addr;
33 u32 ggtt_offset;
34};
35
36#define I915_READ_TAIL(engine) I915_READ(RING_TAIL((engine)->mmio_base))
37#define I915_WRITE_TAIL(engine, val) I915_WRITE(RING_TAIL((engine)->mmio_base), val)
38
39#define I915_READ_START(engine) I915_READ(RING_START((engine)->mmio_base))
40#define I915_WRITE_START(engine, val) I915_WRITE(RING_START((engine)->mmio_base), val)
41
42#define I915_READ_HEAD(engine) I915_READ(RING_HEAD((engine)->mmio_base))
43#define I915_WRITE_HEAD(engine, val) I915_WRITE(RING_HEAD((engine)->mmio_base), val)
44
45#define I915_READ_CTL(engine) I915_READ(RING_CTL((engine)->mmio_base))
46#define I915_WRITE_CTL(engine, val) I915_WRITE(RING_CTL((engine)->mmio_base), val)
47
48#define I915_READ_IMR(engine) I915_READ(RING_IMR((engine)->mmio_base))
49#define I915_WRITE_IMR(engine, val) I915_WRITE(RING_IMR((engine)->mmio_base), val)
50
51#define I915_READ_MODE(engine) I915_READ(RING_MI_MODE((engine)->mmio_base))
52#define I915_WRITE_MODE(engine, val) I915_WRITE(RING_MI_MODE((engine)->mmio_base), val)
53
54
55
56
57#define gen8_semaphore_seqno_size sizeof(uint64_t)
58#define GEN8_SEMAPHORE_OFFSET(__from, __to) \
59 (((__from) * I915_NUM_ENGINES + (__to)) * gen8_semaphore_seqno_size)
60#define GEN8_SIGNAL_OFFSET(__ring, to) \
61 (dev_priv->semaphore->node.start + \
62 GEN8_SEMAPHORE_OFFSET((__ring)->id, (to)))
63#define GEN8_WAIT_OFFSET(__ring, from) \
64 (dev_priv->semaphore->node.start + \
65 GEN8_SEMAPHORE_OFFSET(from, (__ring)->id))
66
67enum intel_engine_hangcheck_action {
68 ENGINE_IDLE = 0,
69 ENGINE_WAIT,
70 ENGINE_ACTIVE_SEQNO,
71 ENGINE_ACTIVE_HEAD,
72 ENGINE_ACTIVE_SUBUNITS,
73 ENGINE_WAIT_KICK,
74 ENGINE_DEAD,
75};
76
77static inline const char *
78hangcheck_action_to_str(const enum intel_engine_hangcheck_action a)
79{
80 switch (a) {
81 case ENGINE_IDLE:
82 return "idle";
83 case ENGINE_WAIT:
84 return "wait";
85 case ENGINE_ACTIVE_SEQNO:
86 return "active seqno";
87 case ENGINE_ACTIVE_HEAD:
88 return "active head";
89 case ENGINE_ACTIVE_SUBUNITS:
90 return "active subunits";
91 case ENGINE_WAIT_KICK:
92 return "wait kick";
93 case ENGINE_DEAD:
94 return "dead";
95 }
96
97 return "unknown";
98}
99
100#define I915_MAX_SLICES 3
101#define I915_MAX_SUBSLICES 3
102
103#define instdone_slice_mask(dev_priv__) \
104 (INTEL_GEN(dev_priv__) == 7 ? \
105 1 : INTEL_INFO(dev_priv__)->sseu.slice_mask)
106
107#define instdone_subslice_mask(dev_priv__) \
108 (INTEL_GEN(dev_priv__) == 7 ? \
109 1 : INTEL_INFO(dev_priv__)->sseu.subslice_mask)
110
111#define for_each_instdone_slice_subslice(dev_priv__, slice__, subslice__) \
112 for ((slice__) = 0, (subslice__) = 0; \
113 (slice__) < I915_MAX_SLICES; \
114 (subslice__) = ((subslice__) + 1) < I915_MAX_SUBSLICES ? (subslice__) + 1 : 0, \
115 (slice__) += ((subslice__) == 0)) \
116 for_each_if((BIT(slice__) & instdone_slice_mask(dev_priv__)) && \
117 (BIT(subslice__) & instdone_subslice_mask(dev_priv__)))
118
119struct intel_instdone {
120 u32 instdone;
121
122 u32 slice_common;
123 u32 sampler[I915_MAX_SLICES][I915_MAX_SUBSLICES];
124 u32 row[I915_MAX_SLICES][I915_MAX_SUBSLICES];
125};
126
127struct intel_engine_hangcheck {
128 u64 acthd;
129 u32 seqno;
130 enum intel_engine_hangcheck_action action;
131 unsigned long action_timestamp;
132 int deadlock;
133 struct intel_instdone instdone;
134 bool stalled;
135};
136
137struct intel_ring {
138 struct i915_vma *vma;
139 void *vaddr;
140
141 struct intel_engine_cs *engine;
142
143 struct list_head request_list;
144
145 u32 head;
146 u32 tail;
147 int space;
148 int size;
149 int effective_size;
150
151
152
153
154
155
156
157
158
159 u32 last_retired_head;
160};
161
162struct i915_gem_context;
163struct drm_i915_reg_table;
164
165
166
167
168
169
170
171
172
173
174
175
176struct i915_ctx_workarounds {
177 struct i915_wa_ctx_bb {
178 u32 offset;
179 u32 size;
180 } indirect_ctx, per_ctx;
181 struct i915_vma *vma;
182};
183
184struct drm_i915_gem_request;
185struct intel_render_state;
186
187struct intel_engine_cs {
188 struct drm_i915_private *i915;
189 const char *name;
190 enum intel_engine_id {
191 RCS = 0,
192 BCS,
193 VCS,
194 VCS2,
195 VECS
196 } id;
197#define _VCS(n) (VCS + (n))
198 unsigned int exec_id;
199 enum intel_engine_hw_id {
200 RCS_HW = 0,
201 VCS_HW,
202 BCS_HW,
203 VECS_HW,
204 VCS2_HW
205 } hw_id;
206 enum intel_engine_hw_id guc_id;
207 u32 mmio_base;
208 unsigned int irq_shift;
209 struct intel_ring *buffer;
210 struct intel_timeline *timeline;
211
212 struct intel_render_state *render_state;
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230 struct intel_breadcrumbs {
231 struct task_struct __rcu *irq_seqno_bh;
232 bool irq_posted;
233
234 spinlock_t lock;
235 struct rb_root waiters;
236 struct rb_root signals;
237 struct intel_wait *first_wait;
238 struct task_struct *signaler;
239 struct drm_i915_gem_request *first_signal;
240 struct timer_list fake_irq;
241 struct timer_list hangcheck;
242
243 unsigned long timeout;
244
245 bool irq_enabled : 1;
246 bool rpm_wakelock : 1;
247 } breadcrumbs;
248
249
250
251
252
253
254 struct i915_gem_batch_pool batch_pool;
255
256 struct intel_hw_status_page status_page;
257 struct i915_ctx_workarounds wa_ctx;
258 struct i915_vma *scratch;
259
260 u32 irq_keep_mask;
261 u32 irq_enable_mask;
262 void (*irq_enable)(struct intel_engine_cs *engine);
263 void (*irq_disable)(struct intel_engine_cs *engine);
264
265 int (*init_hw)(struct intel_engine_cs *engine);
266 void (*reset_hw)(struct intel_engine_cs *engine,
267 struct drm_i915_gem_request *req);
268
269 int (*context_pin)(struct intel_engine_cs *engine,
270 struct i915_gem_context *ctx);
271 void (*context_unpin)(struct intel_engine_cs *engine,
272 struct i915_gem_context *ctx);
273 int (*request_alloc)(struct drm_i915_gem_request *req);
274 int (*init_context)(struct drm_i915_gem_request *req);
275
276 int (*emit_flush)(struct drm_i915_gem_request *request,
277 u32 mode);
278#define EMIT_INVALIDATE BIT(0)
279#define EMIT_FLUSH BIT(1)
280#define EMIT_BARRIER (EMIT_INVALIDATE | EMIT_FLUSH)
281 int (*emit_bb_start)(struct drm_i915_gem_request *req,
282 u64 offset, u32 length,
283 unsigned int dispatch_flags);
284#define I915_DISPATCH_SECURE BIT(0)
285#define I915_DISPATCH_PINNED BIT(1)
286#define I915_DISPATCH_RS BIT(2)
287 void (*emit_breadcrumb)(struct drm_i915_gem_request *req,
288 u32 *out);
289 int emit_breadcrumb_sz;
290
291
292
293
294
295
296
297 void (*submit_request)(struct drm_i915_gem_request *req);
298
299
300
301
302
303
304
305 void (*schedule)(struct drm_i915_gem_request *request,
306 int priority);
307
308
309
310
311
312
313
314 void (*irq_seqno_barrier)(struct intel_engine_cs *engine);
315 void (*cleanup)(struct intel_engine_cs *engine);
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354 struct {
355 union {
356#define GEN6_SEMAPHORE_LAST VECS_HW
357#define GEN6_NUM_SEMAPHORES (GEN6_SEMAPHORE_LAST + 1)
358#define GEN6_SEMAPHORES_MASK GENMASK(GEN6_SEMAPHORE_LAST, 0)
359 struct {
360
361 u32 wait[GEN6_NUM_SEMAPHORES];
362
363 i915_reg_t signal[GEN6_NUM_SEMAPHORES];
364 } mbox;
365 u64 signal_ggtt[I915_NUM_ENGINES];
366 };
367
368
369 int (*sync_to)(struct drm_i915_gem_request *req,
370 struct drm_i915_gem_request *signal);
371 u32 *(*signal)(struct drm_i915_gem_request *req, u32 *out);
372 } semaphore;
373
374
375 struct tasklet_struct irq_tasklet;
376 struct execlist_port {
377 struct drm_i915_gem_request *request;
378 unsigned int count;
379 } execlist_port[2];
380 struct rb_root execlist_queue;
381 struct rb_node *execlist_first;
382 unsigned int fw_domains;
383 bool disable_lite_restore_wa;
384 bool preempt_wa;
385 u32 ctx_desc_template;
386
387
388
389
390
391
392
393
394
395
396 struct i915_gem_context *last_retired_context;
397
398
399
400
401
402
403
404 struct i915_gem_context *legacy_active_context;
405
406
407 struct atomic_notifier_head context_status_notifier;
408
409 struct intel_engine_hangcheck hangcheck;
410
411 bool needs_cmd_parser;
412
413
414
415
416
417 DECLARE_HASHTABLE(cmd_hash, I915_CMD_HASH_ORDER);
418
419
420
421
422 const struct drm_i915_reg_table *reg_tables;
423 int reg_table_count;
424
425
426
427
428
429
430
431
432
433
434
435 u32 (*get_cmd_length_mask)(u32 cmd_header);
436};
437
438static inline unsigned
439intel_engine_flag(const struct intel_engine_cs *engine)
440{
441 return 1 << engine->id;
442}
443
444static inline void
445intel_flush_status_page(struct intel_engine_cs *engine, int reg)
446{
447 mb();
448 clflush(&engine->status_page.page_addr[reg]);
449 mb();
450}
451
452static inline u32
453intel_read_status_page(struct intel_engine_cs *engine, int reg)
454{
455
456 return READ_ONCE(engine->status_page.page_addr[reg]);
457}
458
459static inline void
460intel_write_status_page(struct intel_engine_cs *engine,
461 int reg, u32 value)
462{
463 engine->status_page.page_addr[reg] = value;
464}
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482#define I915_GEM_HWS_INDEX 0x30
483#define I915_GEM_HWS_INDEX_ADDR (I915_GEM_HWS_INDEX << MI_STORE_DWORD_INDEX_SHIFT)
484#define I915_GEM_HWS_SCRATCH_INDEX 0x40
485#define I915_GEM_HWS_SCRATCH_ADDR (I915_GEM_HWS_SCRATCH_INDEX << MI_STORE_DWORD_INDEX_SHIFT)
486
487struct intel_ring *
488intel_engine_create_ring(struct intel_engine_cs *engine, int size);
489int intel_ring_pin(struct intel_ring *ring, unsigned int offset_bias);
490void intel_ring_unpin(struct intel_ring *ring);
491void intel_ring_free(struct intel_ring *ring);
492
493void intel_engine_stop(struct intel_engine_cs *engine);
494void intel_engine_cleanup(struct intel_engine_cs *engine);
495
496void intel_legacy_submission_resume(struct drm_i915_private *dev_priv);
497
498int __must_check intel_ring_begin(struct drm_i915_gem_request *req, int n);
499int __must_check intel_ring_cacheline_align(struct drm_i915_gem_request *req);
500
501static inline void intel_ring_emit(struct intel_ring *ring, u32 data)
502{
503 *(uint32_t *)(ring->vaddr + ring->tail) = data;
504 ring->tail += 4;
505}
506
507static inline void intel_ring_emit_reg(struct intel_ring *ring, i915_reg_t reg)
508{
509 intel_ring_emit(ring, i915_mmio_reg_offset(reg));
510}
511
512static inline void intel_ring_advance(struct intel_ring *ring)
513{
514
515
516
517
518
519
520
521
522}
523
524static inline u32
525intel_ring_wrap(const struct intel_ring *ring, u32 pos)
526{
527 return pos & (ring->size - 1);
528}
529
530static inline u32 intel_ring_offset(struct intel_ring *ring, void *addr)
531{
532
533 u32 offset = addr - ring->vaddr;
534 return intel_ring_wrap(ring, offset);
535}
536
537int __intel_ring_space(int head, int tail, int size);
538void intel_ring_update_space(struct intel_ring *ring);
539
540void intel_engine_init_global_seqno(struct intel_engine_cs *engine, u32 seqno);
541
542void intel_engine_setup_common(struct intel_engine_cs *engine);
543int intel_engine_init_common(struct intel_engine_cs *engine);
544int intel_engine_create_scratch(struct intel_engine_cs *engine, int size);
545void intel_engine_cleanup_common(struct intel_engine_cs *engine);
546
547int intel_init_render_ring_buffer(struct intel_engine_cs *engine);
548int intel_init_bsd_ring_buffer(struct intel_engine_cs *engine);
549int intel_init_bsd2_ring_buffer(struct intel_engine_cs *engine);
550int intel_init_blt_ring_buffer(struct intel_engine_cs *engine);
551int intel_init_vebox_ring_buffer(struct intel_engine_cs *engine);
552
553u64 intel_engine_get_active_head(struct intel_engine_cs *engine);
554u64 intel_engine_get_last_batch_head(struct intel_engine_cs *engine);
555
556static inline u32 intel_engine_get_seqno(struct intel_engine_cs *engine)
557{
558 return intel_read_status_page(engine, I915_GEM_HWS_INDEX);
559}
560
561static inline u32 intel_engine_last_submit(struct intel_engine_cs *engine)
562{
563
564
565
566
567
568
569
570 return READ_ONCE(engine->timeline->last_submitted_seqno);
571}
572
573int init_workarounds_ring(struct intel_engine_cs *engine);
574
575void intel_engine_get_instdone(struct intel_engine_cs *engine,
576 struct intel_instdone *instdone);
577
578
579
580
581
582
583
584
585#define MIN_SPACE_FOR_ADD_REQUEST 336
586
587static inline u32 intel_hws_seqno_address(struct intel_engine_cs *engine)
588{
589 return engine->status_page.ggtt_offset + I915_GEM_HWS_INDEX_ADDR;
590}
591
592
593int intel_engine_init_breadcrumbs(struct intel_engine_cs *engine);
594
595static inline void intel_wait_init(struct intel_wait *wait, u32 seqno)
596{
597 wait->tsk = current;
598 wait->seqno = seqno;
599}
600
601static inline bool intel_wait_complete(const struct intel_wait *wait)
602{
603 return RB_EMPTY_NODE(&wait->node);
604}
605
606bool intel_engine_add_wait(struct intel_engine_cs *engine,
607 struct intel_wait *wait);
608void intel_engine_remove_wait(struct intel_engine_cs *engine,
609 struct intel_wait *wait);
610void intel_engine_enable_signaling(struct drm_i915_gem_request *request);
611
612static inline bool intel_engine_has_waiter(const struct intel_engine_cs *engine)
613{
614 return rcu_access_pointer(engine->breadcrumbs.irq_seqno_bh);
615}
616
617static inline bool intel_engine_wakeup(const struct intel_engine_cs *engine)
618{
619 bool wakeup = false;
620
621
622
623
624
625
626
627
628 if (intel_engine_has_waiter(engine)) {
629 struct task_struct *tsk;
630
631 rcu_read_lock();
632 tsk = rcu_dereference(engine->breadcrumbs.irq_seqno_bh);
633 if (tsk)
634 wakeup = wake_up_process(tsk);
635 rcu_read_unlock();
636 }
637
638 return wakeup;
639}
640
641void intel_engine_reset_breadcrumbs(struct intel_engine_cs *engine);
642void intel_engine_fini_breadcrumbs(struct intel_engine_cs *engine);
643unsigned int intel_breadcrumbs_busy(struct drm_i915_private *i915);
644
645#endif
646