This source file includes following definitions.
- gen8_canonical_addr
- gen8_noncanonical_addr
- eb_use_cmdparser
- eb_create
- eb_vma_misplaced
- eb_pin_vma
- __eb_unreserve_vma
- eb_unreserve_vma
- eb_validate_vma
- eb_add_vma
- use_cpu_reloc
- eb_reserve_vma
- eb_reserve
- eb_batch_index
- eb_select_context
- eb_lookup_vmas
- eb_get_vma
- eb_release_vmas
- eb_reset_vmas
- eb_destroy
- relocation_target
- reloc_cache_init
- unmask_page
- unmask_flags
- cache_to_ggtt
- reloc_gpu_flush
- reloc_cache_reset
- reloc_kmap
- reloc_iomap
- reloc_vaddr
- clflush_write32
- reloc_move_to_gpu
- __reloc_gpu_alloc
- reloc_gpu
- relocate_entry
- eb_relocate_entry
- eb_relocate_vma
- eb_relocate_vma_slow
- check_relocations
- eb_copy_relocations
- eb_prefault_relocations
- eb_relocate_slow
- eb_relocate
- eb_move_to_gpu
- i915_gem_check_execbuffer
- i915_reset_gen7_sol_offsets
- shadow_batch_pin
- eb_parse
- add_to_client
- eb_submit
- num_vcs_engines
- gen8_dispatch_bsd_engine
- eb_throttle
- __eb_pin_context
- __eb_unpin_context
- __eb_pin_engine
- eb_unpin_engine
- eb_select_legacy_ring
- eb_pin_engine
- __free_fence_array
- get_fence_array
- put_fence_array
- await_fence_array
- signal_fence_array
- i915_gem_do_execbuffer
- eb_element_size
- check_buffer_count
- i915_gem_execbuffer_ioctl
- i915_gem_execbuffer2_ioctl
1
2
3
4
5
6
7 #include <linux/intel-iommu.h>
8 #include <linux/dma-resv.h>
9 #include <linux/sync_file.h>
10 #include <linux/uaccess.h>
11
12 #include <drm/drm_syncobj.h>
13 #include <drm/i915_drm.h>
14
15 #include "display/intel_frontbuffer.h"
16
17 #include "gem/i915_gem_ioctls.h"
18 #include "gt/intel_context.h"
19 #include "gt/intel_engine_pool.h"
20 #include "gt/intel_gt.h"
21 #include "gt/intel_gt_pm.h"
22
23 #include "i915_drv.h"
24 #include "i915_gem_clflush.h"
25 #include "i915_gem_context.h"
26 #include "i915_gem_ioctls.h"
27 #include "i915_trace.h"
28
29 enum {
30 FORCE_CPU_RELOC = 1,
31 FORCE_GTT_RELOC,
32 FORCE_GPU_RELOC,
33 #define DBG_FORCE_RELOC 0
34 };
35
36 #define __EXEC_OBJECT_HAS_REF BIT(31)
37 #define __EXEC_OBJECT_HAS_PIN BIT(30)
38 #define __EXEC_OBJECT_HAS_FENCE BIT(29)
39 #define __EXEC_OBJECT_NEEDS_MAP BIT(28)
40 #define __EXEC_OBJECT_NEEDS_BIAS BIT(27)
41 #define __EXEC_OBJECT_INTERNAL_FLAGS (~0u << 27)
42 #define __EXEC_OBJECT_RESERVED (__EXEC_OBJECT_HAS_PIN | __EXEC_OBJECT_HAS_FENCE)
43
44 #define __EXEC_HAS_RELOC BIT(31)
45 #define __EXEC_VALIDATED BIT(30)
46 #define __EXEC_INTERNAL_FLAGS (~0u << 30)
47 #define UPDATE PIN_OFFSET_FIXED
48
49 #define BATCH_OFFSET_BIAS (256*1024)
50
51 #define __I915_EXEC_ILLEGAL_FLAGS \
52 (__I915_EXEC_UNKNOWN_FLAGS | \
53 I915_EXEC_CONSTANTS_MASK | \
54 I915_EXEC_RESOURCE_STREAMER)
55
56
57 #if IS_ENABLED(CONFIG_DRM_I915_DEBUG_GEM)
58 #undef EINVAL
59 #define EINVAL ({ \
60 DRM_DEBUG_DRIVER("EINVAL at %s:%d\n", __func__, __LINE__); \
61 22; \
62 })
63 #endif
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216 struct i915_execbuffer {
217 struct drm_i915_private *i915;
218 struct drm_file *file;
219 struct drm_i915_gem_execbuffer2 *args;
220 struct drm_i915_gem_exec_object2 *exec;
221 struct i915_vma **vma;
222 unsigned int *flags;
223
224 struct intel_engine_cs *engine;
225 struct intel_context *context;
226 struct i915_gem_context *gem_context;
227
228 struct i915_request *request;
229 struct i915_vma *batch;
230
231
232 unsigned int buffer_count;
233
234
235 struct list_head unbound;
236
237
238 struct list_head relocs;
239
240
241
242
243
244
245 struct reloc_cache {
246 struct drm_mm_node node;
247 unsigned long vaddr;
248 unsigned long page;
249 unsigned int gen;
250 bool use_64bit_reloc : 1;
251 bool has_llc : 1;
252 bool has_fence : 1;
253 bool needs_unfenced : 1;
254
255 struct i915_request *rq;
256 u32 *rq_cmd;
257 unsigned int rq_size;
258 } reloc_cache;
259
260 u64 invalid_flags;
261 u32 context_flags;
262
263 u32 batch_start_offset;
264 u32 batch_len;
265 u32 batch_flags;
266
267
268
269
270
271
272 int lut_size;
273 struct hlist_head *buckets;
274 };
275
276 #define exec_entry(EB, VMA) (&(EB)->exec[(VMA)->exec_flags - (EB)->flags])
277
278
279
280
281
282
283
284
285
286 #define GEN8_HIGH_ADDRESS_BIT 47
287 static inline u64 gen8_canonical_addr(u64 address)
288 {
289 return sign_extend64(address, GEN8_HIGH_ADDRESS_BIT);
290 }
291
292 static inline u64 gen8_noncanonical_addr(u64 address)
293 {
294 return address & GENMASK_ULL(GEN8_HIGH_ADDRESS_BIT, 0);
295 }
296
297 static inline bool eb_use_cmdparser(const struct i915_execbuffer *eb)
298 {
299 return intel_engine_requires_cmd_parser(eb->engine) ||
300 (intel_engine_using_cmd_parser(eb->engine) &&
301 eb->args->batch_len);
302 }
303
304 static int eb_create(struct i915_execbuffer *eb)
305 {
306 if (!(eb->args->flags & I915_EXEC_HANDLE_LUT)) {
307 unsigned int size = 1 + ilog2(eb->buffer_count);
308
309
310
311
312
313
314
315
316
317
318
319
320 do {
321 gfp_t flags;
322
323
324
325
326
327
328
329 flags = GFP_KERNEL;
330 if (size > 1)
331 flags |= __GFP_NORETRY | __GFP_NOWARN;
332
333 eb->buckets = kzalloc(sizeof(struct hlist_head) << size,
334 flags);
335 if (eb->buckets)
336 break;
337 } while (--size);
338
339 if (unlikely(!size))
340 return -ENOMEM;
341
342 eb->lut_size = size;
343 } else {
344 eb->lut_size = -eb->buffer_count;
345 }
346
347 return 0;
348 }
349
350 static bool
351 eb_vma_misplaced(const struct drm_i915_gem_exec_object2 *entry,
352 const struct i915_vma *vma,
353 unsigned int flags)
354 {
355 if (vma->node.size < entry->pad_to_size)
356 return true;
357
358 if (entry->alignment && !IS_ALIGNED(vma->node.start, entry->alignment))
359 return true;
360
361 if (flags & EXEC_OBJECT_PINNED &&
362 vma->node.start != entry->offset)
363 return true;
364
365 if (flags & __EXEC_OBJECT_NEEDS_BIAS &&
366 vma->node.start < BATCH_OFFSET_BIAS)
367 return true;
368
369 if (!(flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS) &&
370 (vma->node.start + vma->node.size - 1) >> 32)
371 return true;
372
373 if (flags & __EXEC_OBJECT_NEEDS_MAP &&
374 !i915_vma_is_map_and_fenceable(vma))
375 return true;
376
377 return false;
378 }
379
380 static inline bool
381 eb_pin_vma(struct i915_execbuffer *eb,
382 const struct drm_i915_gem_exec_object2 *entry,
383 struct i915_vma *vma)
384 {
385 unsigned int exec_flags = *vma->exec_flags;
386 u64 pin_flags;
387
388 if (vma->node.size)
389 pin_flags = vma->node.start;
390 else
391 pin_flags = entry->offset & PIN_OFFSET_MASK;
392
393 pin_flags |= PIN_USER | PIN_NOEVICT | PIN_OFFSET_FIXED;
394 if (unlikely(exec_flags & EXEC_OBJECT_NEEDS_GTT))
395 pin_flags |= PIN_GLOBAL;
396
397 if (unlikely(i915_vma_pin(vma, 0, 0, pin_flags)))
398 return false;
399
400 if (unlikely(exec_flags & EXEC_OBJECT_NEEDS_FENCE)) {
401 if (unlikely(i915_vma_pin_fence(vma))) {
402 i915_vma_unpin(vma);
403 return false;
404 }
405
406 if (vma->fence)
407 exec_flags |= __EXEC_OBJECT_HAS_FENCE;
408 }
409
410 *vma->exec_flags = exec_flags | __EXEC_OBJECT_HAS_PIN;
411 return !eb_vma_misplaced(entry, vma, exec_flags);
412 }
413
414 static inline void __eb_unreserve_vma(struct i915_vma *vma, unsigned int flags)
415 {
416 GEM_BUG_ON(!(flags & __EXEC_OBJECT_HAS_PIN));
417
418 if (unlikely(flags & __EXEC_OBJECT_HAS_FENCE))
419 __i915_vma_unpin_fence(vma);
420
421 __i915_vma_unpin(vma);
422 }
423
424 static inline void
425 eb_unreserve_vma(struct i915_vma *vma, unsigned int *flags)
426 {
427 if (!(*flags & __EXEC_OBJECT_HAS_PIN))
428 return;
429
430 __eb_unreserve_vma(vma, *flags);
431 *flags &= ~__EXEC_OBJECT_RESERVED;
432 }
433
434 static int
435 eb_validate_vma(struct i915_execbuffer *eb,
436 struct drm_i915_gem_exec_object2 *entry,
437 struct i915_vma *vma)
438 {
439 if (unlikely(entry->flags & eb->invalid_flags))
440 return -EINVAL;
441
442 if (unlikely(entry->alignment &&
443 !is_power_of_2_u64(entry->alignment)))
444 return -EINVAL;
445
446
447
448
449
450 if (unlikely(entry->flags & EXEC_OBJECT_PINNED &&
451 entry->offset != gen8_canonical_addr(entry->offset & I915_GTT_PAGE_MASK)))
452 return -EINVAL;
453
454
455 if (entry->flags & EXEC_OBJECT_PAD_TO_SIZE) {
456 if (unlikely(offset_in_page(entry->pad_to_size)))
457 return -EINVAL;
458 } else {
459 entry->pad_to_size = 0;
460 }
461
462 if (unlikely(vma->exec_flags)) {
463 DRM_DEBUG("Object [handle %d, index %d] appears more than once in object list\n",
464 entry->handle, (int)(entry - eb->exec));
465 return -EINVAL;
466 }
467
468
469
470
471
472
473 entry->offset = gen8_noncanonical_addr(entry->offset);
474
475 if (!eb->reloc_cache.has_fence) {
476 entry->flags &= ~EXEC_OBJECT_NEEDS_FENCE;
477 } else {
478 if ((entry->flags & EXEC_OBJECT_NEEDS_FENCE ||
479 eb->reloc_cache.needs_unfenced) &&
480 i915_gem_object_is_tiled(vma->obj))
481 entry->flags |= EXEC_OBJECT_NEEDS_GTT | __EXEC_OBJECT_NEEDS_MAP;
482 }
483
484 if (!(entry->flags & EXEC_OBJECT_PINNED))
485 entry->flags |= eb->context_flags;
486
487 return 0;
488 }
489
490 static int
491 eb_add_vma(struct i915_execbuffer *eb,
492 unsigned int i, unsigned batch_idx,
493 struct i915_vma *vma)
494 {
495 struct drm_i915_gem_exec_object2 *entry = &eb->exec[i];
496 int err;
497
498 GEM_BUG_ON(i915_vma_is_closed(vma));
499
500 if (!(eb->args->flags & __EXEC_VALIDATED)) {
501 err = eb_validate_vma(eb, entry, vma);
502 if (unlikely(err))
503 return err;
504 }
505
506 if (eb->lut_size > 0) {
507 vma->exec_handle = entry->handle;
508 hlist_add_head(&vma->exec_node,
509 &eb->buckets[hash_32(entry->handle,
510 eb->lut_size)]);
511 }
512
513 if (entry->relocation_count)
514 list_add_tail(&vma->reloc_link, &eb->relocs);
515
516
517
518
519
520
521
522 eb->vma[i] = vma;
523 eb->flags[i] = entry->flags;
524 vma->exec_flags = &eb->flags[i];
525
526
527
528
529
530
531
532
533
534
535 if (i == batch_idx) {
536 if (entry->relocation_count &&
537 !(eb->flags[i] & EXEC_OBJECT_PINNED))
538 eb->flags[i] |= __EXEC_OBJECT_NEEDS_BIAS;
539 if (eb->reloc_cache.has_fence)
540 eb->flags[i] |= EXEC_OBJECT_NEEDS_FENCE;
541
542 eb->batch = vma;
543 }
544
545 err = 0;
546 if (eb_pin_vma(eb, entry, vma)) {
547 if (entry->offset != vma->node.start) {
548 entry->offset = vma->node.start | UPDATE;
549 eb->args->flags |= __EXEC_HAS_RELOC;
550 }
551 } else {
552 eb_unreserve_vma(vma, vma->exec_flags);
553
554 list_add_tail(&vma->exec_link, &eb->unbound);
555 if (drm_mm_node_allocated(&vma->node))
556 err = i915_vma_unbind(vma);
557 if (unlikely(err))
558 vma->exec_flags = NULL;
559 }
560 return err;
561 }
562
563 static inline int use_cpu_reloc(const struct reloc_cache *cache,
564 const struct drm_i915_gem_object *obj)
565 {
566 if (!i915_gem_object_has_struct_page(obj))
567 return false;
568
569 if (DBG_FORCE_RELOC == FORCE_CPU_RELOC)
570 return true;
571
572 if (DBG_FORCE_RELOC == FORCE_GTT_RELOC)
573 return false;
574
575 return (cache->has_llc ||
576 obj->cache_dirty ||
577 obj->cache_level != I915_CACHE_NONE);
578 }
579
580 static int eb_reserve_vma(const struct i915_execbuffer *eb,
581 struct i915_vma *vma)
582 {
583 struct drm_i915_gem_exec_object2 *entry = exec_entry(eb, vma);
584 unsigned int exec_flags = *vma->exec_flags;
585 u64 pin_flags;
586 int err;
587
588 pin_flags = PIN_USER | PIN_NONBLOCK;
589 if (exec_flags & EXEC_OBJECT_NEEDS_GTT)
590 pin_flags |= PIN_GLOBAL;
591
592
593
594
595
596 if (!(exec_flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS))
597 pin_flags |= PIN_ZONE_4G;
598
599 if (exec_flags & __EXEC_OBJECT_NEEDS_MAP)
600 pin_flags |= PIN_MAPPABLE;
601
602 if (exec_flags & EXEC_OBJECT_PINNED) {
603 pin_flags |= entry->offset | PIN_OFFSET_FIXED;
604 pin_flags &= ~PIN_NONBLOCK;
605 } else if (exec_flags & __EXEC_OBJECT_NEEDS_BIAS) {
606 pin_flags |= BATCH_OFFSET_BIAS | PIN_OFFSET_BIAS;
607 }
608
609 err = i915_vma_pin(vma,
610 entry->pad_to_size, entry->alignment,
611 pin_flags);
612 if (err)
613 return err;
614
615 if (entry->offset != vma->node.start) {
616 entry->offset = vma->node.start | UPDATE;
617 eb->args->flags |= __EXEC_HAS_RELOC;
618 }
619
620 if (unlikely(exec_flags & EXEC_OBJECT_NEEDS_FENCE)) {
621 err = i915_vma_pin_fence(vma);
622 if (unlikely(err)) {
623 i915_vma_unpin(vma);
624 return err;
625 }
626
627 if (vma->fence)
628 exec_flags |= __EXEC_OBJECT_HAS_FENCE;
629 }
630
631 *vma->exec_flags = exec_flags | __EXEC_OBJECT_HAS_PIN;
632 GEM_BUG_ON(eb_vma_misplaced(entry, vma, exec_flags));
633
634 return 0;
635 }
636
637 static int eb_reserve(struct i915_execbuffer *eb)
638 {
639 const unsigned int count = eb->buffer_count;
640 struct list_head last;
641 struct i915_vma *vma;
642 unsigned int i, pass;
643 int err;
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659 pass = 0;
660 err = 0;
661 do {
662 list_for_each_entry(vma, &eb->unbound, exec_link) {
663 err = eb_reserve_vma(eb, vma);
664 if (err)
665 break;
666 }
667 if (err != -ENOSPC)
668 return err;
669
670
671 INIT_LIST_HEAD(&eb->unbound);
672 INIT_LIST_HEAD(&last);
673 for (i = 0; i < count; i++) {
674 unsigned int flags = eb->flags[i];
675 struct i915_vma *vma = eb->vma[i];
676
677 if (flags & EXEC_OBJECT_PINNED &&
678 flags & __EXEC_OBJECT_HAS_PIN)
679 continue;
680
681 eb_unreserve_vma(vma, &eb->flags[i]);
682
683 if (flags & EXEC_OBJECT_PINNED)
684
685 list_add(&vma->exec_link, &eb->unbound);
686 else if (flags & __EXEC_OBJECT_NEEDS_MAP)
687
688 list_add_tail(&vma->exec_link, &eb->unbound);
689 else if (!(flags & EXEC_OBJECT_SUPPORTS_48B_ADDRESS))
690
691 list_add(&vma->exec_link, &last);
692 else
693 list_add_tail(&vma->exec_link, &last);
694 }
695 list_splice_tail(&last, &eb->unbound);
696
697 switch (pass++) {
698 case 0:
699 break;
700
701 case 1:
702
703 err = i915_gem_evict_vm(eb->context->vm);
704 if (err)
705 return err;
706 break;
707
708 default:
709 return -ENOSPC;
710 }
711 } while (1);
712 }
713
714 static unsigned int eb_batch_index(const struct i915_execbuffer *eb)
715 {
716 if (eb->args->flags & I915_EXEC_BATCH_FIRST)
717 return 0;
718 else
719 return eb->buffer_count - 1;
720 }
721
722 static int eb_select_context(struct i915_execbuffer *eb)
723 {
724 struct i915_gem_context *ctx;
725
726 ctx = i915_gem_context_lookup(eb->file->driver_priv, eb->args->rsvd1);
727 if (unlikely(!ctx))
728 return -ENOENT;
729
730 eb->gem_context = ctx;
731 if (ctx->vm)
732 eb->invalid_flags |= EXEC_OBJECT_NEEDS_GTT;
733
734 eb->context_flags = 0;
735 if (test_bit(UCONTEXT_NO_ZEROMAP, &ctx->user_flags))
736 eb->context_flags |= __EXEC_OBJECT_NEEDS_BIAS;
737
738 return 0;
739 }
740
741 static int eb_lookup_vmas(struct i915_execbuffer *eb)
742 {
743 struct radix_tree_root *handles_vma = &eb->gem_context->handles_vma;
744 struct drm_i915_gem_object *obj;
745 unsigned int i, batch;
746 int err;
747
748 if (unlikely(i915_gem_context_is_banned(eb->gem_context)))
749 return -EIO;
750
751 INIT_LIST_HEAD(&eb->relocs);
752 INIT_LIST_HEAD(&eb->unbound);
753
754 batch = eb_batch_index(eb);
755
756 mutex_lock(&eb->gem_context->mutex);
757 if (unlikely(i915_gem_context_is_closed(eb->gem_context))) {
758 err = -ENOENT;
759 goto err_ctx;
760 }
761
762 for (i = 0; i < eb->buffer_count; i++) {
763 u32 handle = eb->exec[i].handle;
764 struct i915_lut_handle *lut;
765 struct i915_vma *vma;
766
767 vma = radix_tree_lookup(handles_vma, handle);
768 if (likely(vma))
769 goto add_vma;
770
771 obj = i915_gem_object_lookup(eb->file, handle);
772 if (unlikely(!obj)) {
773 err = -ENOENT;
774 goto err_vma;
775 }
776
777 vma = i915_vma_instance(obj, eb->context->vm, NULL);
778 if (IS_ERR(vma)) {
779 err = PTR_ERR(vma);
780 goto err_obj;
781 }
782
783 lut = i915_lut_handle_alloc();
784 if (unlikely(!lut)) {
785 err = -ENOMEM;
786 goto err_obj;
787 }
788
789 err = radix_tree_insert(handles_vma, handle, vma);
790 if (unlikely(err)) {
791 i915_lut_handle_free(lut);
792 goto err_obj;
793 }
794
795
796 if (!atomic_fetch_inc(&vma->open_count))
797 i915_vma_reopen(vma);
798 lut->handle = handle;
799 lut->ctx = eb->gem_context;
800
801 i915_gem_object_lock(obj);
802 list_add(&lut->obj_link, &obj->lut_list);
803 i915_gem_object_unlock(obj);
804
805 add_vma:
806 err = eb_add_vma(eb, i, batch, vma);
807 if (unlikely(err))
808 goto err_vma;
809
810 GEM_BUG_ON(vma != eb->vma[i]);
811 GEM_BUG_ON(vma->exec_flags != &eb->flags[i]);
812 GEM_BUG_ON(drm_mm_node_allocated(&vma->node) &&
813 eb_vma_misplaced(&eb->exec[i], vma, eb->flags[i]));
814 }
815
816 mutex_unlock(&eb->gem_context->mutex);
817
818 eb->args->flags |= __EXEC_VALIDATED;
819 return eb_reserve(eb);
820
821 err_obj:
822 i915_gem_object_put(obj);
823 err_vma:
824 eb->vma[i] = NULL;
825 err_ctx:
826 mutex_unlock(&eb->gem_context->mutex);
827 return err;
828 }
829
830 static struct i915_vma *
831 eb_get_vma(const struct i915_execbuffer *eb, unsigned long handle)
832 {
833 if (eb->lut_size < 0) {
834 if (handle >= -eb->lut_size)
835 return NULL;
836 return eb->vma[handle];
837 } else {
838 struct hlist_head *head;
839 struct i915_vma *vma;
840
841 head = &eb->buckets[hash_32(handle, eb->lut_size)];
842 hlist_for_each_entry(vma, head, exec_node) {
843 if (vma->exec_handle == handle)
844 return vma;
845 }
846 return NULL;
847 }
848 }
849
850 static void eb_release_vmas(const struct i915_execbuffer *eb)
851 {
852 const unsigned int count = eb->buffer_count;
853 unsigned int i;
854
855 for (i = 0; i < count; i++) {
856 struct i915_vma *vma = eb->vma[i];
857 unsigned int flags = eb->flags[i];
858
859 if (!vma)
860 break;
861
862 GEM_BUG_ON(vma->exec_flags != &eb->flags[i]);
863 vma->exec_flags = NULL;
864 eb->vma[i] = NULL;
865
866 if (flags & __EXEC_OBJECT_HAS_PIN)
867 __eb_unreserve_vma(vma, flags);
868
869 if (flags & __EXEC_OBJECT_HAS_REF)
870 i915_vma_put(vma);
871 }
872 }
873
874 static void eb_reset_vmas(const struct i915_execbuffer *eb)
875 {
876 eb_release_vmas(eb);
877 if (eb->lut_size > 0)
878 memset(eb->buckets, 0,
879 sizeof(struct hlist_head) << eb->lut_size);
880 }
881
882 static void eb_destroy(const struct i915_execbuffer *eb)
883 {
884 GEM_BUG_ON(eb->reloc_cache.rq);
885
886 if (eb->lut_size > 0)
887 kfree(eb->buckets);
888 }
889
890 static inline u64
891 relocation_target(const struct drm_i915_gem_relocation_entry *reloc,
892 const struct i915_vma *target)
893 {
894 return gen8_canonical_addr((int)reloc->delta + target->node.start);
895 }
896
897 static void reloc_cache_init(struct reloc_cache *cache,
898 struct drm_i915_private *i915)
899 {
900 cache->page = -1;
901 cache->vaddr = 0;
902
903 cache->gen = INTEL_GEN(i915);
904 cache->has_llc = HAS_LLC(i915);
905 cache->use_64bit_reloc = HAS_64BIT_RELOC(i915);
906 cache->has_fence = cache->gen < 4;
907 cache->needs_unfenced = INTEL_INFO(i915)->unfenced_needs_alignment;
908 cache->node.allocated = false;
909 cache->rq = NULL;
910 cache->rq_size = 0;
911 }
912
913 static inline void *unmask_page(unsigned long p)
914 {
915 return (void *)(uintptr_t)(p & PAGE_MASK);
916 }
917
918 static inline unsigned int unmask_flags(unsigned long p)
919 {
920 return p & ~PAGE_MASK;
921 }
922
923 #define KMAP 0x4
924
925 static inline struct i915_ggtt *cache_to_ggtt(struct reloc_cache *cache)
926 {
927 struct drm_i915_private *i915 =
928 container_of(cache, struct i915_execbuffer, reloc_cache)->i915;
929 return &i915->ggtt;
930 }
931
932 static void reloc_gpu_flush(struct reloc_cache *cache)
933 {
934 struct drm_i915_gem_object *obj = cache->rq->batch->obj;
935
936 GEM_BUG_ON(cache->rq_size >= obj->base.size / sizeof(u32));
937 cache->rq_cmd[cache->rq_size] = MI_BATCH_BUFFER_END;
938
939 __i915_gem_object_flush_map(obj, 0, sizeof(u32) * (cache->rq_size + 1));
940 i915_gem_object_unpin_map(obj);
941
942 intel_gt_chipset_flush(cache->rq->engine->gt);
943
944 i915_request_add(cache->rq);
945 cache->rq = NULL;
946 }
947
948 static void reloc_cache_reset(struct reloc_cache *cache)
949 {
950 void *vaddr;
951
952 if (cache->rq)
953 reloc_gpu_flush(cache);
954
955 if (!cache->vaddr)
956 return;
957
958 vaddr = unmask_page(cache->vaddr);
959 if (cache->vaddr & KMAP) {
960 if (cache->vaddr & CLFLUSH_AFTER)
961 mb();
962
963 kunmap_atomic(vaddr);
964 i915_gem_object_finish_access((struct drm_i915_gem_object *)cache->node.mm);
965 } else {
966 struct i915_ggtt *ggtt = cache_to_ggtt(cache);
967
968 intel_gt_flush_ggtt_writes(ggtt->vm.gt);
969 io_mapping_unmap_atomic((void __iomem *)vaddr);
970
971 if (cache->node.allocated) {
972 ggtt->vm.clear_range(&ggtt->vm,
973 cache->node.start,
974 cache->node.size);
975 drm_mm_remove_node(&cache->node);
976 } else {
977 i915_vma_unpin((struct i915_vma *)cache->node.mm);
978 }
979 }
980
981 cache->vaddr = 0;
982 cache->page = -1;
983 }
984
985 static void *reloc_kmap(struct drm_i915_gem_object *obj,
986 struct reloc_cache *cache,
987 unsigned long page)
988 {
989 void *vaddr;
990
991 if (cache->vaddr) {
992 kunmap_atomic(unmask_page(cache->vaddr));
993 } else {
994 unsigned int flushes;
995 int err;
996
997 err = i915_gem_object_prepare_write(obj, &flushes);
998 if (err)
999 return ERR_PTR(err);
1000
1001 BUILD_BUG_ON(KMAP & CLFLUSH_FLAGS);
1002 BUILD_BUG_ON((KMAP | CLFLUSH_FLAGS) & PAGE_MASK);
1003
1004 cache->vaddr = flushes | KMAP;
1005 cache->node.mm = (void *)obj;
1006 if (flushes)
1007 mb();
1008 }
1009
1010 vaddr = kmap_atomic(i915_gem_object_get_dirty_page(obj, page));
1011 cache->vaddr = unmask_flags(cache->vaddr) | (unsigned long)vaddr;
1012 cache->page = page;
1013
1014 return vaddr;
1015 }
1016
1017 static void *reloc_iomap(struct drm_i915_gem_object *obj,
1018 struct reloc_cache *cache,
1019 unsigned long page)
1020 {
1021 struct i915_ggtt *ggtt = cache_to_ggtt(cache);
1022 unsigned long offset;
1023 void *vaddr;
1024
1025 if (cache->vaddr) {
1026 intel_gt_flush_ggtt_writes(ggtt->vm.gt);
1027 io_mapping_unmap_atomic((void __force __iomem *) unmask_page(cache->vaddr));
1028 } else {
1029 struct i915_vma *vma;
1030 int err;
1031
1032 if (i915_gem_object_is_tiled(obj))
1033 return ERR_PTR(-EINVAL);
1034
1035 if (use_cpu_reloc(cache, obj))
1036 return NULL;
1037
1038 i915_gem_object_lock(obj);
1039 err = i915_gem_object_set_to_gtt_domain(obj, true);
1040 i915_gem_object_unlock(obj);
1041 if (err)
1042 return ERR_PTR(err);
1043
1044 vma = i915_gem_object_ggtt_pin(obj, NULL, 0, 0,
1045 PIN_MAPPABLE |
1046 PIN_NONBLOCK |
1047 PIN_NOEVICT);
1048 if (IS_ERR(vma)) {
1049 memset(&cache->node, 0, sizeof(cache->node));
1050 err = drm_mm_insert_node_in_range
1051 (&ggtt->vm.mm, &cache->node,
1052 PAGE_SIZE, 0, I915_COLOR_UNEVICTABLE,
1053 0, ggtt->mappable_end,
1054 DRM_MM_INSERT_LOW);
1055 if (err)
1056 return NULL;
1057 } else {
1058 cache->node.start = vma->node.start;
1059 cache->node.mm = (void *)vma;
1060 }
1061 }
1062
1063 offset = cache->node.start;
1064 if (cache->node.allocated) {
1065 ggtt->vm.insert_page(&ggtt->vm,
1066 i915_gem_object_get_dma_address(obj, page),
1067 offset, I915_CACHE_NONE, 0);
1068 } else {
1069 offset += page << PAGE_SHIFT;
1070 }
1071
1072 vaddr = (void __force *)io_mapping_map_atomic_wc(&ggtt->iomap,
1073 offset);
1074 cache->page = page;
1075 cache->vaddr = (unsigned long)vaddr;
1076
1077 return vaddr;
1078 }
1079
1080 static void *reloc_vaddr(struct drm_i915_gem_object *obj,
1081 struct reloc_cache *cache,
1082 unsigned long page)
1083 {
1084 void *vaddr;
1085
1086 if (cache->page == page) {
1087 vaddr = unmask_page(cache->vaddr);
1088 } else {
1089 vaddr = NULL;
1090 if ((cache->vaddr & KMAP) == 0)
1091 vaddr = reloc_iomap(obj, cache, page);
1092 if (!vaddr)
1093 vaddr = reloc_kmap(obj, cache, page);
1094 }
1095
1096 return vaddr;
1097 }
1098
1099 static void clflush_write32(u32 *addr, u32 value, unsigned int flushes)
1100 {
1101 if (unlikely(flushes & (CLFLUSH_BEFORE | CLFLUSH_AFTER))) {
1102 if (flushes & CLFLUSH_BEFORE) {
1103 clflushopt(addr);
1104 mb();
1105 }
1106
1107 *addr = value;
1108
1109
1110
1111
1112
1113
1114
1115
1116 if (flushes & CLFLUSH_AFTER)
1117 clflushopt(addr);
1118 } else
1119 *addr = value;
1120 }
1121
1122 static int reloc_move_to_gpu(struct i915_request *rq, struct i915_vma *vma)
1123 {
1124 struct drm_i915_gem_object *obj = vma->obj;
1125 int err;
1126
1127 i915_vma_lock(vma);
1128
1129 if (obj->cache_dirty & ~obj->cache_coherent)
1130 i915_gem_clflush_object(obj, 0);
1131 obj->write_domain = 0;
1132
1133 err = i915_request_await_object(rq, vma->obj, true);
1134 if (err == 0)
1135 err = i915_vma_move_to_active(vma, rq, EXEC_OBJECT_WRITE);
1136
1137 i915_vma_unlock(vma);
1138
1139 return err;
1140 }
1141
1142 static int __reloc_gpu_alloc(struct i915_execbuffer *eb,
1143 struct i915_vma *vma,
1144 unsigned int len)
1145 {
1146 struct reloc_cache *cache = &eb->reloc_cache;
1147 struct intel_engine_pool_node *pool;
1148 struct i915_request *rq;
1149 struct i915_vma *batch;
1150 u32 *cmd;
1151 int err;
1152
1153 pool = intel_engine_pool_get(&eb->engine->pool, PAGE_SIZE);
1154 if (IS_ERR(pool))
1155 return PTR_ERR(pool);
1156
1157 cmd = i915_gem_object_pin_map(pool->obj,
1158 cache->has_llc ?
1159 I915_MAP_FORCE_WB :
1160 I915_MAP_FORCE_WC);
1161 if (IS_ERR(cmd)) {
1162 err = PTR_ERR(cmd);
1163 goto out_pool;
1164 }
1165
1166 batch = i915_vma_instance(pool->obj, vma->vm, NULL);
1167 if (IS_ERR(batch)) {
1168 err = PTR_ERR(batch);
1169 goto err_unmap;
1170 }
1171
1172 err = i915_vma_pin(batch, 0, 0, PIN_USER | PIN_NONBLOCK);
1173 if (err)
1174 goto err_unmap;
1175
1176 rq = i915_request_create(eb->context);
1177 if (IS_ERR(rq)) {
1178 err = PTR_ERR(rq);
1179 goto err_unpin;
1180 }
1181
1182 err = intel_engine_pool_mark_active(pool, rq);
1183 if (err)
1184 goto err_request;
1185
1186 err = reloc_move_to_gpu(rq, vma);
1187 if (err)
1188 goto err_request;
1189
1190 err = eb->engine->emit_bb_start(rq,
1191 batch->node.start, PAGE_SIZE,
1192 cache->gen > 5 ? 0 : I915_DISPATCH_SECURE);
1193 if (err)
1194 goto skip_request;
1195
1196 i915_vma_lock(batch);
1197 err = i915_request_await_object(rq, batch->obj, false);
1198 if (err == 0)
1199 err = i915_vma_move_to_active(batch, rq, 0);
1200 i915_vma_unlock(batch);
1201 if (err)
1202 goto skip_request;
1203
1204 rq->batch = batch;
1205 i915_vma_unpin(batch);
1206
1207 cache->rq = rq;
1208 cache->rq_cmd = cmd;
1209 cache->rq_size = 0;
1210
1211
1212 goto out_pool;
1213
1214 skip_request:
1215 i915_request_skip(rq, err);
1216 err_request:
1217 i915_request_add(rq);
1218 err_unpin:
1219 i915_vma_unpin(batch);
1220 err_unmap:
1221 i915_gem_object_unpin_map(pool->obj);
1222 out_pool:
1223 intel_engine_pool_put(pool);
1224 return err;
1225 }
1226
1227 static u32 *reloc_gpu(struct i915_execbuffer *eb,
1228 struct i915_vma *vma,
1229 unsigned int len)
1230 {
1231 struct reloc_cache *cache = &eb->reloc_cache;
1232 u32 *cmd;
1233
1234 if (cache->rq_size > PAGE_SIZE/sizeof(u32) - (len + 1))
1235 reloc_gpu_flush(cache);
1236
1237 if (unlikely(!cache->rq)) {
1238 int err;
1239
1240
1241 if (eb_use_cmdparser(eb))
1242 return ERR_PTR(-EWOULDBLOCK);
1243
1244 if (!intel_engine_can_store_dword(eb->engine))
1245 return ERR_PTR(-ENODEV);
1246
1247 err = __reloc_gpu_alloc(eb, vma, len);
1248 if (unlikely(err))
1249 return ERR_PTR(err);
1250 }
1251
1252 cmd = cache->rq_cmd + cache->rq_size;
1253 cache->rq_size += len;
1254
1255 return cmd;
1256 }
1257
1258 static u64
1259 relocate_entry(struct i915_vma *vma,
1260 const struct drm_i915_gem_relocation_entry *reloc,
1261 struct i915_execbuffer *eb,
1262 const struct i915_vma *target)
1263 {
1264 u64 offset = reloc->offset;
1265 u64 target_offset = relocation_target(reloc, target);
1266 bool wide = eb->reloc_cache.use_64bit_reloc;
1267 void *vaddr;
1268
1269 if (!eb->reloc_cache.vaddr &&
1270 (DBG_FORCE_RELOC == FORCE_GPU_RELOC ||
1271 !dma_resv_test_signaled_rcu(vma->resv, true))) {
1272 const unsigned int gen = eb->reloc_cache.gen;
1273 unsigned int len;
1274 u32 *batch;
1275 u64 addr;
1276
1277 if (wide)
1278 len = offset & 7 ? 8 : 5;
1279 else if (gen >= 4)
1280 len = 4;
1281 else
1282 len = 3;
1283
1284 batch = reloc_gpu(eb, vma, len);
1285 if (IS_ERR(batch))
1286 goto repeat;
1287
1288 addr = gen8_canonical_addr(vma->node.start + offset);
1289 if (wide) {
1290 if (offset & 7) {
1291 *batch++ = MI_STORE_DWORD_IMM_GEN4;
1292 *batch++ = lower_32_bits(addr);
1293 *batch++ = upper_32_bits(addr);
1294 *batch++ = lower_32_bits(target_offset);
1295
1296 addr = gen8_canonical_addr(addr + 4);
1297
1298 *batch++ = MI_STORE_DWORD_IMM_GEN4;
1299 *batch++ = lower_32_bits(addr);
1300 *batch++ = upper_32_bits(addr);
1301 *batch++ = upper_32_bits(target_offset);
1302 } else {
1303 *batch++ = (MI_STORE_DWORD_IMM_GEN4 | (1 << 21)) + 1;
1304 *batch++ = lower_32_bits(addr);
1305 *batch++ = upper_32_bits(addr);
1306 *batch++ = lower_32_bits(target_offset);
1307 *batch++ = upper_32_bits(target_offset);
1308 }
1309 } else if (gen >= 6) {
1310 *batch++ = MI_STORE_DWORD_IMM_GEN4;
1311 *batch++ = 0;
1312 *batch++ = addr;
1313 *batch++ = target_offset;
1314 } else if (gen >= 4) {
1315 *batch++ = MI_STORE_DWORD_IMM_GEN4 | MI_USE_GGTT;
1316 *batch++ = 0;
1317 *batch++ = addr;
1318 *batch++ = target_offset;
1319 } else {
1320 *batch++ = MI_STORE_DWORD_IMM | MI_MEM_VIRTUAL;
1321 *batch++ = addr;
1322 *batch++ = target_offset;
1323 }
1324
1325 goto out;
1326 }
1327
1328 repeat:
1329 vaddr = reloc_vaddr(vma->obj, &eb->reloc_cache, offset >> PAGE_SHIFT);
1330 if (IS_ERR(vaddr))
1331 return PTR_ERR(vaddr);
1332
1333 clflush_write32(vaddr + offset_in_page(offset),
1334 lower_32_bits(target_offset),
1335 eb->reloc_cache.vaddr);
1336
1337 if (wide) {
1338 offset += sizeof(u32);
1339 target_offset >>= 32;
1340 wide = false;
1341 goto repeat;
1342 }
1343
1344 out:
1345 return target->node.start | UPDATE;
1346 }
1347
1348 static u64
1349 eb_relocate_entry(struct i915_execbuffer *eb,
1350 struct i915_vma *vma,
1351 const struct drm_i915_gem_relocation_entry *reloc)
1352 {
1353 struct i915_vma *target;
1354 int err;
1355
1356
1357 target = eb_get_vma(eb, reloc->target_handle);
1358 if (unlikely(!target))
1359 return -ENOENT;
1360
1361
1362 if (unlikely(reloc->write_domain & (reloc->write_domain - 1))) {
1363 DRM_DEBUG("reloc with multiple write domains: "
1364 "target %d offset %d "
1365 "read %08x write %08x",
1366 reloc->target_handle,
1367 (int) reloc->offset,
1368 reloc->read_domains,
1369 reloc->write_domain);
1370 return -EINVAL;
1371 }
1372 if (unlikely((reloc->write_domain | reloc->read_domains)
1373 & ~I915_GEM_GPU_DOMAINS)) {
1374 DRM_DEBUG("reloc with read/write non-GPU domains: "
1375 "target %d offset %d "
1376 "read %08x write %08x",
1377 reloc->target_handle,
1378 (int) reloc->offset,
1379 reloc->read_domains,
1380 reloc->write_domain);
1381 return -EINVAL;
1382 }
1383
1384 if (reloc->write_domain) {
1385 *target->exec_flags |= EXEC_OBJECT_WRITE;
1386
1387
1388
1389
1390
1391
1392
1393 if (reloc->write_domain == I915_GEM_DOMAIN_INSTRUCTION &&
1394 IS_GEN(eb->i915, 6)) {
1395 err = i915_vma_bind(target, target->obj->cache_level,
1396 PIN_GLOBAL);
1397 if (WARN_ONCE(err,
1398 "Unexpected failure to bind target VMA!"))
1399 return err;
1400 }
1401 }
1402
1403
1404
1405
1406
1407 if (!DBG_FORCE_RELOC &&
1408 gen8_canonical_addr(target->node.start) == reloc->presumed_offset)
1409 return 0;
1410
1411
1412 if (unlikely(reloc->offset >
1413 vma->size - (eb->reloc_cache.use_64bit_reloc ? 8 : 4))) {
1414 DRM_DEBUG("Relocation beyond object bounds: "
1415 "target %d offset %d size %d.\n",
1416 reloc->target_handle,
1417 (int)reloc->offset,
1418 (int)vma->size);
1419 return -EINVAL;
1420 }
1421 if (unlikely(reloc->offset & 3)) {
1422 DRM_DEBUG("Relocation not 4-byte aligned: "
1423 "target %d offset %d.\n",
1424 reloc->target_handle,
1425 (int)reloc->offset);
1426 return -EINVAL;
1427 }
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437 *vma->exec_flags &= ~EXEC_OBJECT_ASYNC;
1438
1439
1440 return relocate_entry(vma, reloc, eb, target);
1441 }
1442
1443 static int eb_relocate_vma(struct i915_execbuffer *eb, struct i915_vma *vma)
1444 {
1445 #define N_RELOC(x) ((x) / sizeof(struct drm_i915_gem_relocation_entry))
1446 struct drm_i915_gem_relocation_entry stack[N_RELOC(512)];
1447 struct drm_i915_gem_relocation_entry __user *urelocs;
1448 const struct drm_i915_gem_exec_object2 *entry = exec_entry(eb, vma);
1449 unsigned int remain;
1450
1451 urelocs = u64_to_user_ptr(entry->relocs_ptr);
1452 remain = entry->relocation_count;
1453 if (unlikely(remain > N_RELOC(ULONG_MAX)))
1454 return -EINVAL;
1455
1456
1457
1458
1459
1460
1461 if (unlikely(!access_ok(urelocs, remain*sizeof(*urelocs))))
1462 return -EFAULT;
1463
1464 do {
1465 struct drm_i915_gem_relocation_entry *r = stack;
1466 unsigned int count =
1467 min_t(unsigned int, remain, ARRAY_SIZE(stack));
1468 unsigned int copied;
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478 pagefault_disable();
1479 copied = __copy_from_user_inatomic(r, urelocs, count * sizeof(r[0]));
1480 pagefault_enable();
1481 if (unlikely(copied)) {
1482 remain = -EFAULT;
1483 goto out;
1484 }
1485
1486 remain -= count;
1487 do {
1488 u64 offset = eb_relocate_entry(eb, vma, r);
1489
1490 if (likely(offset == 0)) {
1491 } else if ((s64)offset < 0) {
1492 remain = (int)offset;
1493 goto out;
1494 } else {
1495
1496
1497
1498
1499
1500
1501
1502
1503
1504
1505
1506
1507
1508
1509
1510
1511
1512
1513
1514
1515
1516 offset = gen8_canonical_addr(offset & ~UPDATE);
1517 if (unlikely(__put_user(offset, &urelocs[r-stack].presumed_offset))) {
1518 remain = -EFAULT;
1519 goto out;
1520 }
1521 }
1522 } while (r++, --count);
1523 urelocs += ARRAY_SIZE(stack);
1524 } while (remain);
1525 out:
1526 reloc_cache_reset(&eb->reloc_cache);
1527 return remain;
1528 }
1529
1530 static int
1531 eb_relocate_vma_slow(struct i915_execbuffer *eb, struct i915_vma *vma)
1532 {
1533 const struct drm_i915_gem_exec_object2 *entry = exec_entry(eb, vma);
1534 struct drm_i915_gem_relocation_entry *relocs =
1535 u64_to_ptr(typeof(*relocs), entry->relocs_ptr);
1536 unsigned int i;
1537 int err;
1538
1539 for (i = 0; i < entry->relocation_count; i++) {
1540 u64 offset = eb_relocate_entry(eb, vma, &relocs[i]);
1541
1542 if ((s64)offset < 0) {
1543 err = (int)offset;
1544 goto err;
1545 }
1546 }
1547 err = 0;
1548 err:
1549 reloc_cache_reset(&eb->reloc_cache);
1550 return err;
1551 }
1552
1553 static int check_relocations(const struct drm_i915_gem_exec_object2 *entry)
1554 {
1555 const char __user *addr, *end;
1556 unsigned long size;
1557 char __maybe_unused c;
1558
1559 size = entry->relocation_count;
1560 if (size == 0)
1561 return 0;
1562
1563 if (size > N_RELOC(ULONG_MAX))
1564 return -EINVAL;
1565
1566 addr = u64_to_user_ptr(entry->relocs_ptr);
1567 size *= sizeof(struct drm_i915_gem_relocation_entry);
1568 if (!access_ok(addr, size))
1569 return -EFAULT;
1570
1571 end = addr + size;
1572 for (; addr < end; addr += PAGE_SIZE) {
1573 int err = __get_user(c, addr);
1574 if (err)
1575 return err;
1576 }
1577 return __get_user(c, end - 1);
1578 }
1579
1580 static int eb_copy_relocations(const struct i915_execbuffer *eb)
1581 {
1582 struct drm_i915_gem_relocation_entry *relocs;
1583 const unsigned int count = eb->buffer_count;
1584 unsigned int i;
1585 int err;
1586
1587 for (i = 0; i < count; i++) {
1588 const unsigned int nreloc = eb->exec[i].relocation_count;
1589 struct drm_i915_gem_relocation_entry __user *urelocs;
1590 unsigned long size;
1591 unsigned long copied;
1592
1593 if (nreloc == 0)
1594 continue;
1595
1596 err = check_relocations(&eb->exec[i]);
1597 if (err)
1598 goto err;
1599
1600 urelocs = u64_to_user_ptr(eb->exec[i].relocs_ptr);
1601 size = nreloc * sizeof(*relocs);
1602
1603 relocs = kvmalloc_array(size, 1, GFP_KERNEL);
1604 if (!relocs) {
1605 err = -ENOMEM;
1606 goto err;
1607 }
1608
1609
1610 copied = 0;
1611 do {
1612 unsigned int len =
1613 min_t(u64, BIT_ULL(31), size - copied);
1614
1615 if (__copy_from_user((char *)relocs + copied,
1616 (char __user *)urelocs + copied,
1617 len))
1618 goto end;
1619
1620 copied += len;
1621 } while (copied < size);
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633 if (!user_access_begin(urelocs, size))
1634 goto end;
1635
1636 for (copied = 0; copied < nreloc; copied++)
1637 unsafe_put_user(-1,
1638 &urelocs[copied].presumed_offset,
1639 end_user);
1640 user_access_end();
1641
1642 eb->exec[i].relocs_ptr = (uintptr_t)relocs;
1643 }
1644
1645 return 0;
1646
1647 end_user:
1648 user_access_end();
1649 end:
1650 kvfree(relocs);
1651 err = -EFAULT;
1652 err:
1653 while (i--) {
1654 relocs = u64_to_ptr(typeof(*relocs), eb->exec[i].relocs_ptr);
1655 if (eb->exec[i].relocation_count)
1656 kvfree(relocs);
1657 }
1658 return err;
1659 }
1660
1661 static int eb_prefault_relocations(const struct i915_execbuffer *eb)
1662 {
1663 const unsigned int count = eb->buffer_count;
1664 unsigned int i;
1665
1666 if (unlikely(i915_modparams.prefault_disable))
1667 return 0;
1668
1669 for (i = 0; i < count; i++) {
1670 int err;
1671
1672 err = check_relocations(&eb->exec[i]);
1673 if (err)
1674 return err;
1675 }
1676
1677 return 0;
1678 }
1679
1680 static noinline int eb_relocate_slow(struct i915_execbuffer *eb)
1681 {
1682 struct drm_device *dev = &eb->i915->drm;
1683 bool have_copy = false;
1684 struct i915_vma *vma;
1685 int err = 0;
1686
1687 repeat:
1688 if (signal_pending(current)) {
1689 err = -ERESTARTSYS;
1690 goto out;
1691 }
1692
1693
1694 eb_reset_vmas(eb);
1695 mutex_unlock(&dev->struct_mutex);
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710 if (!err) {
1711 err = eb_prefault_relocations(eb);
1712 } else if (!have_copy) {
1713 err = eb_copy_relocations(eb);
1714 have_copy = err == 0;
1715 } else {
1716 cond_resched();
1717 err = 0;
1718 }
1719 if (err) {
1720 mutex_lock(&dev->struct_mutex);
1721 goto out;
1722 }
1723
1724
1725 flush_workqueue(eb->i915->mm.userptr_wq);
1726
1727 err = i915_mutex_lock_interruptible(dev);
1728 if (err) {
1729 mutex_lock(&dev->struct_mutex);
1730 goto out;
1731 }
1732
1733
1734 err = eb_lookup_vmas(eb);
1735 if (err)
1736 goto err;
1737
1738 GEM_BUG_ON(!eb->batch);
1739
1740 list_for_each_entry(vma, &eb->relocs, reloc_link) {
1741 if (!have_copy) {
1742 pagefault_disable();
1743 err = eb_relocate_vma(eb, vma);
1744 pagefault_enable();
1745 if (err)
1746 goto repeat;
1747 } else {
1748 err = eb_relocate_vma_slow(eb, vma);
1749 if (err)
1750 goto err;
1751 }
1752 }
1753
1754
1755
1756
1757
1758
1759
1760
1761 err:
1762 if (err == -EAGAIN)
1763 goto repeat;
1764
1765 out:
1766 if (have_copy) {
1767 const unsigned int count = eb->buffer_count;
1768 unsigned int i;
1769
1770 for (i = 0; i < count; i++) {
1771 const struct drm_i915_gem_exec_object2 *entry =
1772 &eb->exec[i];
1773 struct drm_i915_gem_relocation_entry *relocs;
1774
1775 if (!entry->relocation_count)
1776 continue;
1777
1778 relocs = u64_to_ptr(typeof(*relocs), entry->relocs_ptr);
1779 kvfree(relocs);
1780 }
1781 }
1782
1783 return err;
1784 }
1785
1786 static int eb_relocate(struct i915_execbuffer *eb)
1787 {
1788 if (eb_lookup_vmas(eb))
1789 goto slow;
1790
1791
1792 if (eb->args->flags & __EXEC_HAS_RELOC) {
1793 struct i915_vma *vma;
1794
1795 list_for_each_entry(vma, &eb->relocs, reloc_link) {
1796 if (eb_relocate_vma(eb, vma))
1797 goto slow;
1798 }
1799 }
1800
1801 return 0;
1802
1803 slow:
1804 return eb_relocate_slow(eb);
1805 }
1806
1807 static int eb_move_to_gpu(struct i915_execbuffer *eb)
1808 {
1809 const unsigned int count = eb->buffer_count;
1810 struct ww_acquire_ctx acquire;
1811 unsigned int i;
1812 int err = 0;
1813
1814 ww_acquire_init(&acquire, &reservation_ww_class);
1815
1816 for (i = 0; i < count; i++) {
1817 struct i915_vma *vma = eb->vma[i];
1818
1819 err = ww_mutex_lock_interruptible(&vma->resv->lock, &acquire);
1820 if (!err)
1821 continue;
1822
1823 GEM_BUG_ON(err == -EALREADY);
1824
1825 if (err == -EDEADLK) {
1826 GEM_BUG_ON(i == 0);
1827 do {
1828 int j = i - 1;
1829
1830 ww_mutex_unlock(&eb->vma[j]->resv->lock);
1831
1832 swap(eb->flags[i], eb->flags[j]);
1833 swap(eb->vma[i], eb->vma[j]);
1834 eb->vma[i]->exec_flags = &eb->flags[i];
1835 } while (--i);
1836 GEM_BUG_ON(vma != eb->vma[0]);
1837 vma->exec_flags = &eb->flags[0];
1838
1839 err = ww_mutex_lock_slow_interruptible(&vma->resv->lock,
1840 &acquire);
1841 }
1842 if (err)
1843 break;
1844 }
1845 ww_acquire_done(&acquire);
1846
1847 while (i--) {
1848 unsigned int flags = eb->flags[i];
1849 struct i915_vma *vma = eb->vma[i];
1850 struct drm_i915_gem_object *obj = vma->obj;
1851
1852 assert_vma_held(vma);
1853
1854 if (flags & EXEC_OBJECT_CAPTURE) {
1855 struct i915_capture_list *capture;
1856
1857 capture = kmalloc(sizeof(*capture), GFP_KERNEL);
1858 if (capture) {
1859 capture->next = eb->request->capture_list;
1860 capture->vma = vma;
1861 eb->request->capture_list = capture;
1862 }
1863 }
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877 if (unlikely(obj->cache_dirty & ~obj->cache_coherent)) {
1878 if (i915_gem_clflush_object(obj, 0))
1879 flags &= ~EXEC_OBJECT_ASYNC;
1880 }
1881
1882 if (err == 0 && !(flags & EXEC_OBJECT_ASYNC)) {
1883 err = i915_request_await_object
1884 (eb->request, obj, flags & EXEC_OBJECT_WRITE);
1885 }
1886
1887 if (err == 0)
1888 err = i915_vma_move_to_active(vma, eb->request, flags);
1889
1890 i915_vma_unlock(vma);
1891
1892 __eb_unreserve_vma(vma, flags);
1893 vma->exec_flags = NULL;
1894
1895 if (unlikely(flags & __EXEC_OBJECT_HAS_REF))
1896 i915_vma_put(vma);
1897 }
1898 ww_acquire_fini(&acquire);
1899
1900 if (unlikely(err))
1901 goto err_skip;
1902
1903 eb->exec = NULL;
1904
1905
1906 intel_gt_chipset_flush(eb->engine->gt);
1907 return 0;
1908
1909 err_skip:
1910 i915_request_skip(eb->request, err);
1911 return err;
1912 }
1913
1914 static bool i915_gem_check_execbuffer(struct drm_i915_gem_execbuffer2 *exec)
1915 {
1916 if (exec->flags & __I915_EXEC_ILLEGAL_FLAGS)
1917 return false;
1918
1919
1920 if (!(exec->flags & I915_EXEC_FENCE_ARRAY)) {
1921 if (exec->num_cliprects || exec->cliprects_ptr)
1922 return false;
1923 }
1924
1925 if (exec->DR4 == 0xffffffff) {
1926 DRM_DEBUG("UXA submitting garbage DR4, fixing up\n");
1927 exec->DR4 = 0;
1928 }
1929 if (exec->DR1 || exec->DR4)
1930 return false;
1931
1932 if ((exec->batch_start_offset | exec->batch_len) & 0x7)
1933 return false;
1934
1935 return true;
1936 }
1937
1938 static int i915_reset_gen7_sol_offsets(struct i915_request *rq)
1939 {
1940 u32 *cs;
1941 int i;
1942
1943 if (!IS_GEN(rq->i915, 7) || rq->engine->id != RCS0) {
1944 DRM_DEBUG("sol reset is gen7/rcs only\n");
1945 return -EINVAL;
1946 }
1947
1948 cs = intel_ring_begin(rq, 4 * 2 + 2);
1949 if (IS_ERR(cs))
1950 return PTR_ERR(cs);
1951
1952 *cs++ = MI_LOAD_REGISTER_IMM(4);
1953 for (i = 0; i < 4; i++) {
1954 *cs++ = i915_mmio_reg_offset(GEN7_SO_WRITE_OFFSET(i));
1955 *cs++ = 0;
1956 }
1957 *cs++ = MI_NOOP;
1958 intel_ring_advance(rq, cs);
1959
1960 return 0;
1961 }
1962
1963 static struct i915_vma *
1964 shadow_batch_pin(struct i915_execbuffer *eb, struct drm_i915_gem_object *obj)
1965 {
1966 struct drm_i915_private *dev_priv = eb->i915;
1967 struct i915_vma * const vma = *eb->vma;
1968 struct i915_address_space *vm;
1969 u64 flags;
1970
1971
1972
1973
1974
1975 if (CMDPARSER_USES_GGTT(dev_priv)) {
1976 flags = PIN_GLOBAL;
1977 vm = &dev_priv->ggtt.vm;
1978 } else if (vma->vm->has_read_only) {
1979 flags = PIN_USER;
1980 vm = vma->vm;
1981 i915_gem_object_set_readonly(obj);
1982 } else {
1983 DRM_DEBUG("Cannot prevent post-scan tampering without RO capable vm\n");
1984 return ERR_PTR(-EINVAL);
1985 }
1986
1987 return i915_gem_object_pin(obj, vm, NULL, 0, 0, flags);
1988 }
1989
1990 static struct i915_vma *eb_parse(struct i915_execbuffer *eb)
1991 {
1992 struct intel_engine_pool_node *pool;
1993 struct i915_vma *vma;
1994 u64 batch_start;
1995 u64 shadow_batch_start;
1996 int err;
1997
1998 pool = intel_engine_pool_get(&eb->engine->pool, eb->batch_len);
1999 if (IS_ERR(pool))
2000 return ERR_CAST(pool);
2001
2002 vma = shadow_batch_pin(eb, pool->obj);
2003 if (IS_ERR(vma))
2004 goto err;
2005
2006 batch_start = gen8_canonical_addr(eb->batch->node.start) +
2007 eb->batch_start_offset;
2008
2009 shadow_batch_start = gen8_canonical_addr(vma->node.start);
2010
2011 err = intel_engine_cmd_parser(eb->gem_context,
2012 eb->engine,
2013 eb->batch->obj,
2014 batch_start,
2015 eb->batch_start_offset,
2016 eb->batch_len,
2017 pool->obj,
2018 shadow_batch_start);
2019
2020 if (err) {
2021 i915_vma_unpin(vma);
2022
2023
2024
2025
2026
2027
2028
2029 if (CMDPARSER_USES_GGTT(eb->i915) && (err == -EACCES))
2030
2031 vma = NULL;
2032 else
2033 vma = ERR_PTR(err);
2034 goto err;
2035 }
2036
2037 eb->vma[eb->buffer_count] = i915_vma_get(vma);
2038 eb->flags[eb->buffer_count] =
2039 __EXEC_OBJECT_HAS_PIN | __EXEC_OBJECT_HAS_REF;
2040 vma->exec_flags = &eb->flags[eb->buffer_count];
2041 eb->buffer_count++;
2042
2043 eb->batch_start_offset = 0;
2044 eb->batch = vma;
2045
2046 if (CMDPARSER_USES_GGTT(eb->i915))
2047 eb->batch_flags |= I915_DISPATCH_SECURE;
2048
2049
2050
2051 vma->private = pool;
2052 return vma;
2053
2054 err:
2055 intel_engine_pool_put(pool);
2056 return vma;
2057 }
2058
2059 static void
2060 add_to_client(struct i915_request *rq, struct drm_file *file)
2061 {
2062 struct drm_i915_file_private *file_priv = file->driver_priv;
2063
2064 rq->file_priv = file_priv;
2065
2066 spin_lock(&file_priv->mm.lock);
2067 list_add_tail(&rq->client_link, &file_priv->mm.request_list);
2068 spin_unlock(&file_priv->mm.lock);
2069 }
2070
2071 static int eb_submit(struct i915_execbuffer *eb)
2072 {
2073 int err;
2074
2075 err = eb_move_to_gpu(eb);
2076 if (err)
2077 return err;
2078
2079 if (eb->args->flags & I915_EXEC_GEN7_SOL_RESET) {
2080 err = i915_reset_gen7_sol_offsets(eb->request);
2081 if (err)
2082 return err;
2083 }
2084
2085
2086
2087
2088
2089
2090
2091 if (eb->engine->emit_init_breadcrumb) {
2092 err = eb->engine->emit_init_breadcrumb(eb->request);
2093 if (err)
2094 return err;
2095 }
2096
2097 err = eb->engine->emit_bb_start(eb->request,
2098 eb->batch->node.start +
2099 eb->batch_start_offset,
2100 eb->batch_len,
2101 eb->batch_flags);
2102 if (err)
2103 return err;
2104
2105 return 0;
2106 }
2107
2108 static int num_vcs_engines(const struct drm_i915_private *i915)
2109 {
2110 return hweight64(INTEL_INFO(i915)->engine_mask &
2111 GENMASK_ULL(VCS0 + I915_MAX_VCS - 1, VCS0));
2112 }
2113
2114
2115
2116
2117
2118 static unsigned int
2119 gen8_dispatch_bsd_engine(struct drm_i915_private *dev_priv,
2120 struct drm_file *file)
2121 {
2122 struct drm_i915_file_private *file_priv = file->driver_priv;
2123
2124
2125 if ((int)file_priv->bsd_engine < 0)
2126 file_priv->bsd_engine =
2127 get_random_int() % num_vcs_engines(dev_priv);
2128
2129 return file_priv->bsd_engine;
2130 }
2131
2132 static const enum intel_engine_id user_ring_map[] = {
2133 [I915_EXEC_DEFAULT] = RCS0,
2134 [I915_EXEC_RENDER] = RCS0,
2135 [I915_EXEC_BLT] = BCS0,
2136 [I915_EXEC_BSD] = VCS0,
2137 [I915_EXEC_VEBOX] = VECS0
2138 };
2139
2140 static struct i915_request *eb_throttle(struct intel_context *ce)
2141 {
2142 struct intel_ring *ring = ce->ring;
2143 struct intel_timeline *tl = ce->timeline;
2144 struct i915_request *rq;
2145
2146
2147
2148
2149
2150 if (intel_ring_update_space(ring) >= PAGE_SIZE)
2151 return NULL;
2152
2153
2154
2155
2156
2157
2158
2159
2160 list_for_each_entry(rq, &tl->requests, link) {
2161 if (rq->ring != ring)
2162 continue;
2163
2164 if (__intel_ring_space(rq->postfix,
2165 ring->emit, ring->size) > ring->size / 2)
2166 break;
2167 }
2168 if (&rq->link == &tl->requests)
2169 return NULL;
2170
2171 return i915_request_get(rq);
2172 }
2173
2174 static int
2175 __eb_pin_context(struct i915_execbuffer *eb, struct intel_context *ce)
2176 {
2177 int err;
2178
2179 if (likely(atomic_inc_not_zero(&ce->pin_count)))
2180 return 0;
2181
2182 err = mutex_lock_interruptible(&eb->i915->drm.struct_mutex);
2183 if (err)
2184 return err;
2185
2186 err = __intel_context_do_pin(ce);
2187 mutex_unlock(&eb->i915->drm.struct_mutex);
2188
2189 return err;
2190 }
2191
2192 static void
2193 __eb_unpin_context(struct i915_execbuffer *eb, struct intel_context *ce)
2194 {
2195 if (likely(atomic_add_unless(&ce->pin_count, -1, 1)))
2196 return;
2197
2198 mutex_lock(&eb->i915->drm.struct_mutex);
2199 intel_context_unpin(ce);
2200 mutex_unlock(&eb->i915->drm.struct_mutex);
2201 }
2202
2203 static int __eb_pin_engine(struct i915_execbuffer *eb, struct intel_context *ce)
2204 {
2205 struct intel_timeline *tl;
2206 struct i915_request *rq;
2207 int err;
2208
2209
2210
2211
2212
2213 err = intel_gt_terminally_wedged(ce->engine->gt);
2214 if (err)
2215 return err;
2216
2217
2218
2219
2220
2221
2222 err = __eb_pin_context(eb, ce);
2223 if (err)
2224 return err;
2225
2226
2227
2228
2229
2230
2231
2232
2233
2234 tl = intel_context_timeline_lock(ce);
2235 if (IS_ERR(tl)) {
2236 err = PTR_ERR(tl);
2237 goto err_unpin;
2238 }
2239
2240 intel_context_enter(ce);
2241 rq = eb_throttle(ce);
2242
2243 intel_context_timeline_unlock(tl);
2244
2245 if (rq) {
2246 if (i915_request_wait(rq,
2247 I915_WAIT_INTERRUPTIBLE,
2248 MAX_SCHEDULE_TIMEOUT) < 0) {
2249 i915_request_put(rq);
2250 err = -EINTR;
2251 goto err_exit;
2252 }
2253
2254 i915_request_put(rq);
2255 }
2256
2257 eb->engine = ce->engine;
2258 eb->context = ce;
2259 return 0;
2260
2261 err_exit:
2262 mutex_lock(&tl->mutex);
2263 intel_context_exit(ce);
2264 intel_context_timeline_unlock(tl);
2265 err_unpin:
2266 __eb_unpin_context(eb, ce);
2267 return err;
2268 }
2269
2270 static void eb_unpin_engine(struct i915_execbuffer *eb)
2271 {
2272 struct intel_context *ce = eb->context;
2273 struct intel_timeline *tl = ce->timeline;
2274
2275 mutex_lock(&tl->mutex);
2276 intel_context_exit(ce);
2277 mutex_unlock(&tl->mutex);
2278
2279 __eb_unpin_context(eb, ce);
2280 }
2281
2282 static unsigned int
2283 eb_select_legacy_ring(struct i915_execbuffer *eb,
2284 struct drm_file *file,
2285 struct drm_i915_gem_execbuffer2 *args)
2286 {
2287 struct drm_i915_private *i915 = eb->i915;
2288 unsigned int user_ring_id = args->flags & I915_EXEC_RING_MASK;
2289
2290 if (user_ring_id != I915_EXEC_BSD &&
2291 (args->flags & I915_EXEC_BSD_MASK)) {
2292 DRM_DEBUG("execbuf with non bsd ring but with invalid "
2293 "bsd dispatch flags: %d\n", (int)(args->flags));
2294 return -1;
2295 }
2296
2297 if (user_ring_id == I915_EXEC_BSD && num_vcs_engines(i915) > 1) {
2298 unsigned int bsd_idx = args->flags & I915_EXEC_BSD_MASK;
2299
2300 if (bsd_idx == I915_EXEC_BSD_DEFAULT) {
2301 bsd_idx = gen8_dispatch_bsd_engine(i915, file);
2302 } else if (bsd_idx >= I915_EXEC_BSD_RING1 &&
2303 bsd_idx <= I915_EXEC_BSD_RING2) {
2304 bsd_idx >>= I915_EXEC_BSD_SHIFT;
2305 bsd_idx--;
2306 } else {
2307 DRM_DEBUG("execbuf with unknown bsd ring: %u\n",
2308 bsd_idx);
2309 return -1;
2310 }
2311
2312 return _VCS(bsd_idx);
2313 }
2314
2315 if (user_ring_id >= ARRAY_SIZE(user_ring_map)) {
2316 DRM_DEBUG("execbuf with unknown ring: %u\n", user_ring_id);
2317 return -1;
2318 }
2319
2320 return user_ring_map[user_ring_id];
2321 }
2322
2323 static int
2324 eb_pin_engine(struct i915_execbuffer *eb,
2325 struct drm_file *file,
2326 struct drm_i915_gem_execbuffer2 *args)
2327 {
2328 struct intel_context *ce;
2329 unsigned int idx;
2330 int err;
2331
2332 if (i915_gem_context_user_engines(eb->gem_context))
2333 idx = args->flags & I915_EXEC_RING_MASK;
2334 else
2335 idx = eb_select_legacy_ring(eb, file, args);
2336
2337 ce = i915_gem_context_get_engine(eb->gem_context, idx);
2338 if (IS_ERR(ce))
2339 return PTR_ERR(ce);
2340
2341 err = __eb_pin_engine(eb, ce);
2342 intel_context_put(ce);
2343
2344 return err;
2345 }
2346
2347 static void
2348 __free_fence_array(struct drm_syncobj **fences, unsigned int n)
2349 {
2350 while (n--)
2351 drm_syncobj_put(ptr_mask_bits(fences[n], 2));
2352 kvfree(fences);
2353 }
2354
2355 static struct drm_syncobj **
2356 get_fence_array(struct drm_i915_gem_execbuffer2 *args,
2357 struct drm_file *file)
2358 {
2359 const unsigned long nfences = args->num_cliprects;
2360 struct drm_i915_gem_exec_fence __user *user;
2361 struct drm_syncobj **fences;
2362 unsigned long n;
2363 int err;
2364
2365 if (!(args->flags & I915_EXEC_FENCE_ARRAY))
2366 return NULL;
2367
2368
2369 BUILD_BUG_ON(sizeof(size_t) > sizeof(unsigned long));
2370 if (nfences > min_t(unsigned long,
2371 ULONG_MAX / sizeof(*user),
2372 SIZE_MAX / sizeof(*fences)))
2373 return ERR_PTR(-EINVAL);
2374
2375 user = u64_to_user_ptr(args->cliprects_ptr);
2376 if (!access_ok(user, nfences * sizeof(*user)))
2377 return ERR_PTR(-EFAULT);
2378
2379 fences = kvmalloc_array(nfences, sizeof(*fences),
2380 __GFP_NOWARN | GFP_KERNEL);
2381 if (!fences)
2382 return ERR_PTR(-ENOMEM);
2383
2384 for (n = 0; n < nfences; n++) {
2385 struct drm_i915_gem_exec_fence fence;
2386 struct drm_syncobj *syncobj;
2387
2388 if (__copy_from_user(&fence, user++, sizeof(fence))) {
2389 err = -EFAULT;
2390 goto err;
2391 }
2392
2393 if (fence.flags & __I915_EXEC_FENCE_UNKNOWN_FLAGS) {
2394 err = -EINVAL;
2395 goto err;
2396 }
2397
2398 syncobj = drm_syncobj_find(file, fence.handle);
2399 if (!syncobj) {
2400 DRM_DEBUG("Invalid syncobj handle provided\n");
2401 err = -ENOENT;
2402 goto err;
2403 }
2404
2405 BUILD_BUG_ON(~(ARCH_KMALLOC_MINALIGN - 1) &
2406 ~__I915_EXEC_FENCE_UNKNOWN_FLAGS);
2407
2408 fences[n] = ptr_pack_bits(syncobj, fence.flags, 2);
2409 }
2410
2411 return fences;
2412
2413 err:
2414 __free_fence_array(fences, n);
2415 return ERR_PTR(err);
2416 }
2417
2418 static void
2419 put_fence_array(struct drm_i915_gem_execbuffer2 *args,
2420 struct drm_syncobj **fences)
2421 {
2422 if (fences)
2423 __free_fence_array(fences, args->num_cliprects);
2424 }
2425
2426 static int
2427 await_fence_array(struct i915_execbuffer *eb,
2428 struct drm_syncobj **fences)
2429 {
2430 const unsigned int nfences = eb->args->num_cliprects;
2431 unsigned int n;
2432 int err;
2433
2434 for (n = 0; n < nfences; n++) {
2435 struct drm_syncobj *syncobj;
2436 struct dma_fence *fence;
2437 unsigned int flags;
2438
2439 syncobj = ptr_unpack_bits(fences[n], &flags, 2);
2440 if (!(flags & I915_EXEC_FENCE_WAIT))
2441 continue;
2442
2443 fence = drm_syncobj_fence_get(syncobj);
2444 if (!fence)
2445 return -EINVAL;
2446
2447 err = i915_request_await_dma_fence(eb->request, fence);
2448 dma_fence_put(fence);
2449 if (err < 0)
2450 return err;
2451 }
2452
2453 return 0;
2454 }
2455
2456 static void
2457 signal_fence_array(struct i915_execbuffer *eb,
2458 struct drm_syncobj **fences)
2459 {
2460 const unsigned int nfences = eb->args->num_cliprects;
2461 struct dma_fence * const fence = &eb->request->fence;
2462 unsigned int n;
2463
2464 for (n = 0; n < nfences; n++) {
2465 struct drm_syncobj *syncobj;
2466 unsigned int flags;
2467
2468 syncobj = ptr_unpack_bits(fences[n], &flags, 2);
2469 if (!(flags & I915_EXEC_FENCE_SIGNAL))
2470 continue;
2471
2472 drm_syncobj_replace_fence(syncobj, fence);
2473 }
2474 }
2475
2476 static int
2477 i915_gem_do_execbuffer(struct drm_device *dev,
2478 struct drm_file *file,
2479 struct drm_i915_gem_execbuffer2 *args,
2480 struct drm_i915_gem_exec_object2 *exec,
2481 struct drm_syncobj **fences)
2482 {
2483 struct drm_i915_private *i915 = to_i915(dev);
2484 struct i915_execbuffer eb;
2485 struct dma_fence *in_fence = NULL;
2486 struct dma_fence *exec_fence = NULL;
2487 struct sync_file *out_fence = NULL;
2488 int out_fence_fd = -1;
2489 int err;
2490
2491 BUILD_BUG_ON(__EXEC_INTERNAL_FLAGS & ~__I915_EXEC_ILLEGAL_FLAGS);
2492 BUILD_BUG_ON(__EXEC_OBJECT_INTERNAL_FLAGS &
2493 ~__EXEC_OBJECT_UNKNOWN_FLAGS);
2494
2495 eb.i915 = i915;
2496 eb.file = file;
2497 eb.args = args;
2498 if (DBG_FORCE_RELOC || !(args->flags & I915_EXEC_NO_RELOC))
2499 args->flags |= __EXEC_HAS_RELOC;
2500
2501 eb.exec = exec;
2502 eb.vma = (struct i915_vma **)(exec + args->buffer_count + 1);
2503 eb.vma[0] = NULL;
2504 eb.flags = (unsigned int *)(eb.vma + args->buffer_count + 1);
2505
2506 eb.invalid_flags = __EXEC_OBJECT_UNKNOWN_FLAGS;
2507 reloc_cache_init(&eb.reloc_cache, eb.i915);
2508
2509 eb.buffer_count = args->buffer_count;
2510 eb.batch_start_offset = args->batch_start_offset;
2511 eb.batch_len = args->batch_len;
2512
2513 eb.batch_flags = 0;
2514 if (args->flags & I915_EXEC_SECURE) {
2515 if (INTEL_GEN(i915) >= 11)
2516 return -ENODEV;
2517
2518
2519 if (!HAS_SECURE_BATCHES(i915))
2520 return -EPERM;
2521
2522 if (!drm_is_current_master(file) || !capable(CAP_SYS_ADMIN))
2523 return -EPERM;
2524
2525 eb.batch_flags |= I915_DISPATCH_SECURE;
2526 }
2527 if (args->flags & I915_EXEC_IS_PINNED)
2528 eb.batch_flags |= I915_DISPATCH_PINNED;
2529
2530 if (args->flags & I915_EXEC_FENCE_IN) {
2531 in_fence = sync_file_get_fence(lower_32_bits(args->rsvd2));
2532 if (!in_fence)
2533 return -EINVAL;
2534 }
2535
2536 if (args->flags & I915_EXEC_FENCE_SUBMIT) {
2537 if (in_fence) {
2538 err = -EINVAL;
2539 goto err_in_fence;
2540 }
2541
2542 exec_fence = sync_file_get_fence(lower_32_bits(args->rsvd2));
2543 if (!exec_fence) {
2544 err = -EINVAL;
2545 goto err_in_fence;
2546 }
2547 }
2548
2549 if (args->flags & I915_EXEC_FENCE_OUT) {
2550 out_fence_fd = get_unused_fd_flags(O_CLOEXEC);
2551 if (out_fence_fd < 0) {
2552 err = out_fence_fd;
2553 goto err_exec_fence;
2554 }
2555 }
2556
2557 err = eb_create(&eb);
2558 if (err)
2559 goto err_out_fence;
2560
2561 GEM_BUG_ON(!eb.lut_size);
2562
2563 err = eb_select_context(&eb);
2564 if (unlikely(err))
2565 goto err_destroy;
2566
2567 err = eb_pin_engine(&eb, file, args);
2568 if (unlikely(err))
2569 goto err_context;
2570
2571 err = i915_mutex_lock_interruptible(dev);
2572 if (err)
2573 goto err_engine;
2574
2575 err = eb_relocate(&eb);
2576 if (err) {
2577
2578
2579
2580
2581
2582
2583
2584 args->flags &= ~__EXEC_HAS_RELOC;
2585 goto err_vma;
2586 }
2587
2588 if (unlikely(*eb.batch->exec_flags & EXEC_OBJECT_WRITE)) {
2589 DRM_DEBUG("Attempting to use self-modifying batch buffer\n");
2590 err = -EINVAL;
2591 goto err_vma;
2592 }
2593 if (eb.batch_start_offset > eb.batch->size ||
2594 eb.batch_len > eb.batch->size - eb.batch_start_offset) {
2595 DRM_DEBUG("Attempting to use out-of-bounds batch\n");
2596 err = -EINVAL;
2597 goto err_vma;
2598 }
2599
2600 if (eb.batch_len == 0)
2601 eb.batch_len = eb.batch->size - eb.batch_start_offset;
2602
2603 if (eb_use_cmdparser(&eb)) {
2604 struct i915_vma *vma;
2605
2606 vma = eb_parse(&eb);
2607 if (IS_ERR(vma)) {
2608 err = PTR_ERR(vma);
2609 goto err_vma;
2610 }
2611 }
2612
2613
2614
2615
2616
2617 if (eb.batch_flags & I915_DISPATCH_SECURE) {
2618 struct i915_vma *vma;
2619
2620
2621
2622
2623
2624
2625
2626
2627
2628
2629
2630 vma = i915_gem_object_ggtt_pin(eb.batch->obj, NULL, 0, 0, 0);
2631 if (IS_ERR(vma)) {
2632 err = PTR_ERR(vma);
2633 goto err_vma;
2634 }
2635
2636 eb.batch = vma;
2637 }
2638
2639
2640 GEM_BUG_ON(eb.reloc_cache.rq);
2641
2642
2643 eb.request = i915_request_create(eb.context);
2644 if (IS_ERR(eb.request)) {
2645 err = PTR_ERR(eb.request);
2646 goto err_batch_unpin;
2647 }
2648
2649 if (in_fence) {
2650 err = i915_request_await_dma_fence(eb.request, in_fence);
2651 if (err < 0)
2652 goto err_request;
2653 }
2654
2655 if (exec_fence) {
2656 err = i915_request_await_execution(eb.request, exec_fence,
2657 eb.engine->bond_execute);
2658 if (err < 0)
2659 goto err_request;
2660 }
2661
2662 if (fences) {
2663 err = await_fence_array(&eb, fences);
2664 if (err)
2665 goto err_request;
2666 }
2667
2668 if (out_fence_fd != -1) {
2669 out_fence = sync_file_create(&eb.request->fence);
2670 if (!out_fence) {
2671 err = -ENOMEM;
2672 goto err_request;
2673 }
2674 }
2675
2676
2677
2678
2679
2680
2681
2682
2683 eb.request->batch = eb.batch;
2684 if (eb.batch->private)
2685 intel_engine_pool_mark_active(eb.batch->private, eb.request);
2686
2687 trace_i915_request_queue(eb.request, eb.batch_flags);
2688 err = eb_submit(&eb);
2689 err_request:
2690 add_to_client(eb.request, file);
2691 i915_request_add(eb.request);
2692
2693 if (fences)
2694 signal_fence_array(&eb, fences);
2695
2696 if (out_fence) {
2697 if (err == 0) {
2698 fd_install(out_fence_fd, out_fence->file);
2699 args->rsvd2 &= GENMASK_ULL(31, 0);
2700 args->rsvd2 |= (u64)out_fence_fd << 32;
2701 out_fence_fd = -1;
2702 } else {
2703 fput(out_fence->file);
2704 }
2705 }
2706
2707 err_batch_unpin:
2708 if (eb.batch_flags & I915_DISPATCH_SECURE)
2709 i915_vma_unpin(eb.batch);
2710 if (eb.batch->private)
2711 intel_engine_pool_put(eb.batch->private);
2712 err_vma:
2713 if (eb.exec)
2714 eb_release_vmas(&eb);
2715 mutex_unlock(&dev->struct_mutex);
2716 err_engine:
2717 eb_unpin_engine(&eb);
2718 err_context:
2719 i915_gem_context_put(eb.gem_context);
2720 err_destroy:
2721 eb_destroy(&eb);
2722 err_out_fence:
2723 if (out_fence_fd != -1)
2724 put_unused_fd(out_fence_fd);
2725 err_exec_fence:
2726 dma_fence_put(exec_fence);
2727 err_in_fence:
2728 dma_fence_put(in_fence);
2729 return err;
2730 }
2731
2732 static size_t eb_element_size(void)
2733 {
2734 return (sizeof(struct drm_i915_gem_exec_object2) +
2735 sizeof(struct i915_vma *) +
2736 sizeof(unsigned int));
2737 }
2738
2739 static bool check_buffer_count(size_t count)
2740 {
2741 const size_t sz = eb_element_size();
2742
2743
2744
2745
2746
2747
2748
2749 return !(count < 1 || count > INT_MAX || count > SIZE_MAX / sz - 1);
2750 }
2751
2752
2753
2754
2755
2756 int
2757 i915_gem_execbuffer_ioctl(struct drm_device *dev, void *data,
2758 struct drm_file *file)
2759 {
2760 struct drm_i915_gem_execbuffer *args = data;
2761 struct drm_i915_gem_execbuffer2 exec2;
2762 struct drm_i915_gem_exec_object *exec_list = NULL;
2763 struct drm_i915_gem_exec_object2 *exec2_list = NULL;
2764 const size_t count = args->buffer_count;
2765 unsigned int i;
2766 int err;
2767
2768 if (!check_buffer_count(count)) {
2769 DRM_DEBUG("execbuf2 with %zd buffers\n", count);
2770 return -EINVAL;
2771 }
2772
2773 exec2.buffers_ptr = args->buffers_ptr;
2774 exec2.buffer_count = args->buffer_count;
2775 exec2.batch_start_offset = args->batch_start_offset;
2776 exec2.batch_len = args->batch_len;
2777 exec2.DR1 = args->DR1;
2778 exec2.DR4 = args->DR4;
2779 exec2.num_cliprects = args->num_cliprects;
2780 exec2.cliprects_ptr = args->cliprects_ptr;
2781 exec2.flags = I915_EXEC_RENDER;
2782 i915_execbuffer2_set_context_id(exec2, 0);
2783
2784 if (!i915_gem_check_execbuffer(&exec2))
2785 return -EINVAL;
2786
2787
2788 exec_list = kvmalloc_array(count, sizeof(*exec_list),
2789 __GFP_NOWARN | GFP_KERNEL);
2790 exec2_list = kvmalloc_array(count + 1, eb_element_size(),
2791 __GFP_NOWARN | GFP_KERNEL);
2792 if (exec_list == NULL || exec2_list == NULL) {
2793 DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
2794 args->buffer_count);
2795 kvfree(exec_list);
2796 kvfree(exec2_list);
2797 return -ENOMEM;
2798 }
2799 err = copy_from_user(exec_list,
2800 u64_to_user_ptr(args->buffers_ptr),
2801 sizeof(*exec_list) * count);
2802 if (err) {
2803 DRM_DEBUG("copy %d exec entries failed %d\n",
2804 args->buffer_count, err);
2805 kvfree(exec_list);
2806 kvfree(exec2_list);
2807 return -EFAULT;
2808 }
2809
2810 for (i = 0; i < args->buffer_count; i++) {
2811 exec2_list[i].handle = exec_list[i].handle;
2812 exec2_list[i].relocation_count = exec_list[i].relocation_count;
2813 exec2_list[i].relocs_ptr = exec_list[i].relocs_ptr;
2814 exec2_list[i].alignment = exec_list[i].alignment;
2815 exec2_list[i].offset = exec_list[i].offset;
2816 if (INTEL_GEN(to_i915(dev)) < 4)
2817 exec2_list[i].flags = EXEC_OBJECT_NEEDS_FENCE;
2818 else
2819 exec2_list[i].flags = 0;
2820 }
2821
2822 err = i915_gem_do_execbuffer(dev, file, &exec2, exec2_list, NULL);
2823 if (exec2.flags & __EXEC_HAS_RELOC) {
2824 struct drm_i915_gem_exec_object __user *user_exec_list =
2825 u64_to_user_ptr(args->buffers_ptr);
2826
2827
2828 for (i = 0; i < args->buffer_count; i++) {
2829 if (!(exec2_list[i].offset & UPDATE))
2830 continue;
2831
2832 exec2_list[i].offset =
2833 gen8_canonical_addr(exec2_list[i].offset & PIN_OFFSET_MASK);
2834 exec2_list[i].offset &= PIN_OFFSET_MASK;
2835 if (__copy_to_user(&user_exec_list[i].offset,
2836 &exec2_list[i].offset,
2837 sizeof(user_exec_list[i].offset)))
2838 break;
2839 }
2840 }
2841
2842 kvfree(exec_list);
2843 kvfree(exec2_list);
2844 return err;
2845 }
2846
2847 int
2848 i915_gem_execbuffer2_ioctl(struct drm_device *dev, void *data,
2849 struct drm_file *file)
2850 {
2851 struct drm_i915_gem_execbuffer2 *args = data;
2852 struct drm_i915_gem_exec_object2 *exec2_list;
2853 struct drm_syncobj **fences = NULL;
2854 const size_t count = args->buffer_count;
2855 int err;
2856
2857 if (!check_buffer_count(count)) {
2858 DRM_DEBUG("execbuf2 with %zd buffers\n", count);
2859 return -EINVAL;
2860 }
2861
2862 if (!i915_gem_check_execbuffer(args))
2863 return -EINVAL;
2864
2865
2866 exec2_list = kvmalloc_array(count + 1, eb_element_size(),
2867 __GFP_NOWARN | GFP_KERNEL);
2868 if (exec2_list == NULL) {
2869 DRM_DEBUG("Failed to allocate exec list for %zd buffers\n",
2870 count);
2871 return -ENOMEM;
2872 }
2873 if (copy_from_user(exec2_list,
2874 u64_to_user_ptr(args->buffers_ptr),
2875 sizeof(*exec2_list) * count)) {
2876 DRM_DEBUG("copy %zd exec entries failed\n", count);
2877 kvfree(exec2_list);
2878 return -EFAULT;
2879 }
2880
2881 if (args->flags & I915_EXEC_FENCE_ARRAY) {
2882 fences = get_fence_array(args, file);
2883 if (IS_ERR(fences)) {
2884 kvfree(exec2_list);
2885 return PTR_ERR(fences);
2886 }
2887 }
2888
2889 err = i915_gem_do_execbuffer(dev, file, args, exec2_list, fences);
2890
2891
2892
2893
2894
2895
2896
2897 if (args->flags & __EXEC_HAS_RELOC) {
2898 struct drm_i915_gem_exec_object2 __user *user_exec_list =
2899 u64_to_user_ptr(args->buffers_ptr);
2900 unsigned int i;
2901
2902
2903
2904
2905
2906
2907
2908
2909
2910 if (!user_access_begin(user_exec_list, count * sizeof(*user_exec_list)))
2911 goto end;
2912
2913 for (i = 0; i < args->buffer_count; i++) {
2914 if (!(exec2_list[i].offset & UPDATE))
2915 continue;
2916
2917 exec2_list[i].offset =
2918 gen8_canonical_addr(exec2_list[i].offset & PIN_OFFSET_MASK);
2919 unsafe_put_user(exec2_list[i].offset,
2920 &user_exec_list[i].offset,
2921 end_user);
2922 }
2923 end_user:
2924 user_access_end();
2925 end:;
2926 }
2927
2928 args->flags &= ~__I915_EXEC_UNKNOWN_FLAGS;
2929 put_fence_array(args, fences);
2930 kvfree(exec2_list);
2931 return err;
2932 }