Rev 5368 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 5368 | Rev 6110 | ||
---|---|---|---|
Line 45... | Line 45... | ||
45 | #include |
45 | #include |
46 | #include |
46 | #include |
47 | #include |
47 | #include |
48 | #include |
48 | #include |
49 | //#include |
49 | //#include |
- | 50 | #include |
|
- | 51 | #include |
|
50 | #include |
52 | #include |
Line 51... | Line 53... | ||
51 | 53 | ||
52 | #include "errno.h" |
54 | #include "errno.h" |
53 | #ifndef ETIME |
55 | #ifndef ETIME |
54 | #define ETIME ETIMEDOUT |
56 | #define ETIME ETIMEDOUT |
- | 57 | #endif |
|
55 | #endif |
58 | #include "libdrm_macros.h" |
56 | #include "libdrm_lists.h" |
59 | #include "libdrm_lists.h" |
57 | #include "intel_bufmgr.h" |
60 | #include "intel_bufmgr.h" |
58 | #include "intel_bufmgr_priv.h" |
61 | #include "intel_bufmgr_priv.h" |
59 | #include "intel_chipset.h" |
- | |
60 | #include "intel_aub.h" |
62 | #include "intel_chipset.h" |
Line 61... | Line 63... | ||
61 | #include "string.h" |
63 | #include "string.h" |
Line 62... | Line 64... | ||
62 | 64 | ||
Line 68... | Line 70... | ||
68 | #define VG(x) x |
70 | #define VG(x) x |
69 | #else |
71 | #else |
70 | #define VG(x) |
72 | #define VG(x) |
71 | #endif |
73 | #endif |
Line 72... | Line 74... | ||
72 | 74 | ||
Line 73... | Line 75... | ||
73 | #define VG_CLEAR(s) VG(memset(&s, 0, sizeof(s))) |
75 | #define memclear(s) memset(&s, 0, sizeof(s)) |
74 | 76 | ||
- | 77 | #if 0 |
|
75 | #if 0 |
78 | #define DBG(...) do { \ |
76 | #define DBG(...) do { \ |
79 | if (bufmgr_gem->bufmgr.debug) \ |
77 | fprintf(stderr, __VA_ARGS__); \ |
80 | fprintf(stderr, __VA_ARGS__); \ |
78 | } while (0) |
81 | } while (0) |
79 | #else |
82 | #else |
Line 80... | Line 83... | ||
80 | #define DBG(...) |
83 | #define DBG(...) |
- | 84 | #endif |
|
- | 85 | ||
- | 86 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
|
- | 87 | #define MAX2(A, B) ((A) > (B) ? (A) : (B)) |
|
- | 88 | ||
- | 89 | /** |
|
- | 90 | * upper_32_bits - return bits 32-63 of a number |
|
- | 91 | * @n: the number we're accessing |
|
- | 92 | * |
|
- | 93 | * A basic shift-right of a 64- or 32-bit quantity. Use this to suppress |
|
- | 94 | * the "right shift count >= width of type" warning when that quantity is |
|
- | 95 | * 32-bits. |
|
- | 96 | */ |
|
- | 97 | #define upper_32_bits(n) ((__u32)(((n) >> 16) >> 16)) |
|
- | 98 | ||
- | 99 | /** |
|
- | 100 | * lower_32_bits - return bits 0-31 of a number |
|
Line 81... | Line 101... | ||
81 | #endif |
101 | * @n: the number we're accessing |
Line 82... | Line 102... | ||
82 | 102 | */ |
|
83 | #define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0])) |
103 | #define lower_32_bits(n) ((__u32)(n)) |
Line 90... | Line 110... | ||
90 | }; |
110 | }; |
Line 91... | Line 111... | ||
91 | 111 | ||
92 | typedef struct _drm_intel_bufmgr_gem { |
112 | typedef struct _drm_intel_bufmgr_gem { |
Line -... | Line 113... | ||
- | 113 | drm_intel_bufmgr bufmgr; |
|
- | 114 | ||
93 | drm_intel_bufmgr bufmgr; |
115 | atomic_t refcount; |
Line 94... | Line 116... | ||
94 | 116 | ||
Line 95... | Line 117... | ||
95 | int fd; |
117 | int fd; |
Line 107... | Line 129... | ||
107 | /** Array of lists of cached gem objects of power-of-two sizes */ |
129 | /** Array of lists of cached gem objects of power-of-two sizes */ |
108 | struct drm_intel_gem_bo_bucket cache_bucket[14 * 4]; |
130 | struct drm_intel_gem_bo_bucket cache_bucket[14 * 4]; |
109 | int num_buckets; |
131 | int num_buckets; |
110 | time_t time; |
132 | time_t time; |
Line -... | Line 133... | ||
- | 133 | ||
- | 134 | drmMMListHead managers; |
|
111 | 135 | ||
112 | drmMMListHead named; |
136 | drmMMListHead named; |
113 | drmMMListHead vma_cache; |
137 | drmMMListHead vma_cache; |
Line 114... | Line 138... | ||
114 | int vma_count, vma_open, vma_max; |
138 | int vma_count, vma_open, vma_max; |
Line 125... | Line 149... | ||
125 | unsigned int bo_reuse : 1; |
149 | unsigned int bo_reuse : 1; |
126 | unsigned int no_exec : 1; |
150 | unsigned int no_exec : 1; |
127 | unsigned int has_vebox : 1; |
151 | unsigned int has_vebox : 1; |
128 | bool fenced_relocs; |
152 | bool fenced_relocs; |
Line 129... | Line 153... | ||
129 | 153 | ||
130 | char *aub_filename; |
154 | struct { |
131 | FILE *aub_file; |
155 | void *ptr; |
- | 156 | uint32_t handle; |
|
- | 157 | } userptr_active; |
|
132 | uint32_t aub_offset; |
158 | |
Line 133... | Line 159... | ||
133 | } drm_intel_bufmgr_gem; |
159 | } drm_intel_bufmgr_gem; |
Line 134... | Line 160... | ||
134 | 160 | ||
Line 175... | Line 201... | ||
175 | * Array of info structs corresponding to relocs[i].target_handle etc |
201 | * Array of info structs corresponding to relocs[i].target_handle etc |
176 | */ |
202 | */ |
177 | drm_intel_reloc_target *reloc_target_info; |
203 | drm_intel_reloc_target *reloc_target_info; |
178 | /** Number of entries in relocs */ |
204 | /** Number of entries in relocs */ |
179 | int reloc_count; |
205 | int reloc_count; |
- | 206 | /** Array of BOs that are referenced by this buffer and will be softpinned */ |
|
- | 207 | drm_intel_bo **softpin_target; |
|
- | 208 | /** Number softpinned BOs that are referenced by this buffer */ |
|
- | 209 | int softpin_target_count; |
|
- | 210 | /** Maximum amount of softpinned BOs that are referenced by this buffer */ |
|
- | 211 | int softpin_target_size; |
|
- | 212 | ||
180 | /** Mapped address for the buffer, saved across map/unmap cycles */ |
213 | /** Mapped address for the buffer, saved across map/unmap cycles */ |
181 | void *mem_virtual; |
214 | void *mem_virtual; |
182 | /** GTT virtual address for the buffer, saved across map/unmap cycles */ |
215 | /** GTT virtual address for the buffer, saved across map/unmap cycles */ |
183 | void *gtt_virtual; |
216 | void *gtt_virtual; |
- | 217 | /** |
|
- | 218 | * Virtual address of the buffer allocated by user, used for userptr |
|
- | 219 | * objects only. |
|
- | 220 | */ |
|
- | 221 | void *user_virtual; |
|
184 | int map_count; |
222 | int map_count; |
185 | drmMMListHead vma_list; |
223 | drmMMListHead vma_list; |
Line 186... | Line 224... | ||
186 | 224 | ||
187 | /** BO cache list */ |
225 | /** BO cache list */ |
Line 218... | Line 256... | ||
218 | * processes, so we don't know their state. |
256 | * processes, so we don't know their state. |
219 | */ |
257 | */ |
220 | bool idle; |
258 | bool idle; |
Line 221... | Line 259... | ||
221 | 259 | ||
- | 260 | /** |
|
- | 261 | * Boolean of whether this buffer was allocated with userptr |
|
- | 262 | */ |
|
- | 263 | bool is_userptr; |
|
- | 264 | ||
- | 265 | /** |
|
- | 266 | * Boolean of whether this buffer can be placed in the full 48-bit |
|
- | 267 | * address range on gen8+. |
|
- | 268 | * |
|
- | 269 | * By default, buffers will be keep in a 32-bit range, unless this |
|
- | 270 | * flag is explicitly set. |
|
- | 271 | */ |
|
- | 272 | bool use_48b_address_range; |
|
- | 273 | ||
- | 274 | /** |
|
- | 275 | * Whether this buffer is softpinned at offset specified by the user |
|
- | 276 | */ |
|
- | 277 | bool is_softpin; |
|
- | 278 | ||
222 | /** |
279 | /** |
223 | * Size in bytes of this buffer and its relocation descendents. |
280 | * Size in bytes of this buffer and its relocation descendents. |
224 | * |
281 | * |
225 | * Used to avoid costly tree walking in |
282 | * Used to avoid costly tree walking in |
226 | * drm_intel_bufmgr_check_aperture in the common case. |
283 | * drm_intel_bufmgr_check_aperture in the common case. |
Line 233... | Line 290... | ||
233 | */ |
290 | */ |
234 | int reloc_tree_fences; |
291 | int reloc_tree_fences; |
Line 235... | Line 292... | ||
235 | 292 | ||
236 | /** Flags that we may need to do the SW_FINSIH ioctl on unmap. */ |
293 | /** Flags that we may need to do the SW_FINSIH ioctl on unmap. */ |
237 | bool mapped_cpu_write; |
- | |
238 | - | ||
239 | uint32_t aub_offset; |
- | |
240 | - | ||
241 | drm_intel_aub_annotation *aub_annotations; |
- | |
242 | unsigned aub_annotation_count; |
294 | bool mapped_cpu_write; |
Line 243... | Line 295... | ||
243 | }; |
295 | }; |
244 | 296 | ||
Line 262... | Line 314... | ||
262 | 314 | ||
Line 263... | Line 315... | ||
263 | static void drm_intel_gem_bo_unreference(drm_intel_bo *bo); |
315 | static void drm_intel_gem_bo_unreference(drm_intel_bo *bo); |
Line -... | Line 316... | ||
- | 316 | ||
- | 317 | static void drm_intel_gem_bo_free(drm_intel_bo *bo); |
|
- | 318 | ||
- | 319 | static inline drm_intel_bo_gem *to_bo_gem(drm_intel_bo *bo) |
|
- | 320 | { |
|
264 | 321 | return (drm_intel_bo_gem *)bo; |
|
265 | static void drm_intel_gem_bo_free(drm_intel_bo *bo); |
322 | } |
266 | 323 | ||
267 | static unsigned long |
324 | static unsigned long |
268 | drm_intel_gem_bo_tile_size(drm_intel_bufmgr_gem *bufmgr_gem, unsigned long size, |
325 | drm_intel_gem_bo_tile_size(drm_intel_bufmgr_gem *bufmgr_gem, unsigned long size, |
Line 370... | Line 427... | ||
370 | 427 | ||
371 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
428 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
372 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
429 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
Line 373... | Line 430... | ||
373 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
430 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
374 | 431 | ||
- | 432 | if (bo_gem->relocs == NULL && bo_gem->softpin_target == NULL) { |
|
375 | if (bo_gem->relocs == NULL) { |
433 | DBG("%2d: %d %s(%s)\n", i, bo_gem->gem_handle, |
376 | DBG("%2d: %d (%s)\n", i, bo_gem->gem_handle, |
434 | bo_gem->is_softpin ? "*" : "", |
377 | bo_gem->name); |
435 | bo_gem->name); |
Line 378... | Line 436... | ||
378 | continue; |
436 | continue; |
379 | } |
437 | } |
380 | 438 | ||
381 | for (j = 0; j < bo_gem->reloc_count; j++) { |
439 | for (j = 0; j < bo_gem->reloc_count; j++) { |
Line 382... | Line 440... | ||
382 | drm_intel_bo *target_bo = bo_gem->reloc_target_info[j].bo; |
440 | drm_intel_bo *target_bo = bo_gem->reloc_target_info[j].bo; |
383 | drm_intel_bo_gem *target_gem = |
441 | drm_intel_bo_gem *target_gem = |
384 | (drm_intel_bo_gem *) target_bo; |
442 | (drm_intel_bo_gem *) target_bo; |
385 | 443 | ||
- | 444 | DBG("%2d: %d %s(%s)@0x%08x %08x -> " |
|
- | 445 | "%d (%s)@0x%08x %08x + 0x%08x\n", |
|
386 | DBG("%2d: %d (%s)@0x%08llx -> " |
446 | i, |
- | 447 | bo_gem->gem_handle, |
|
387 | "%d (%s)@0x%08lx + 0x%08x\n", |
448 | bo_gem->is_softpin ? "*" : "", |
388 | i, |
449 | bo_gem->name, |
- | 450 | upper_32_bits(bo_gem->relocs[j].offset), |
|
389 | bo_gem->gem_handle, bo_gem->name, |
451 | lower_32_bits(bo_gem->relocs[j].offset), |
390 | (unsigned long long)bo_gem->relocs[j].offset, |
452 | target_gem->gem_handle, |
391 | target_gem->gem_handle, |
453 | target_gem->name, |
- | 454 | upper_32_bits(target_bo->offset64), |
|
- | 455 | lower_32_bits(target_bo->offset64), |
|
- | 456 | bo_gem->relocs[j].delta); |
|
- | 457 | } |
|
- | 458 | ||
- | 459 | for (j = 0; j < bo_gem->softpin_target_count; j++) { |
|
- | 460 | drm_intel_bo *target_bo = bo_gem->softpin_target[j]; |
|
- | 461 | drm_intel_bo_gem *target_gem = |
|
- | 462 | (drm_intel_bo_gem *) target_bo; |
|
- | 463 | DBG("%2d: %d %s(%s) -> " |
|
- | 464 | "%d *(%s)@0x%08x %08x\n", |
|
- | 465 | i, |
|
- | 466 | bo_gem->gem_handle, |
|
- | 467 | bo_gem->is_softpin ? "*" : "", |
|
- | 468 | bo_gem->name, |
|
- | 469 | target_gem->gem_handle, |
|
392 | target_gem->name, |
470 | target_gem->name, |
393 | target_bo->offset64, |
471 | upper_32_bits(target_bo->offset64), |
Line 394... | Line 472... | ||
394 | bo_gem->relocs[j].delta); |
472 | lower_32_bits(target_bo->offset64)); |
395 | } |
473 | } |
Line 442... | Line 520... | ||
442 | bo_gem->validate_index = index; |
520 | bo_gem->validate_index = index; |
443 | /* Fill in array entry */ |
521 | /* Fill in array entry */ |
444 | bufmgr_gem->exec_objects[index].handle = bo_gem->gem_handle; |
522 | bufmgr_gem->exec_objects[index].handle = bo_gem->gem_handle; |
445 | bufmgr_gem->exec_objects[index].relocation_count = bo_gem->reloc_count; |
523 | bufmgr_gem->exec_objects[index].relocation_count = bo_gem->reloc_count; |
446 | bufmgr_gem->exec_objects[index].relocs_ptr = (uintptr_t) bo_gem->relocs; |
524 | bufmgr_gem->exec_objects[index].relocs_ptr = (uintptr_t) bo_gem->relocs; |
447 | bufmgr_gem->exec_objects[index].alignment = 0; |
525 | bufmgr_gem->exec_objects[index].alignment = bo->align; |
448 | bufmgr_gem->exec_objects[index].offset = 0; |
526 | bufmgr_gem->exec_objects[index].offset = 0; |
449 | bufmgr_gem->exec_bos[index] = bo; |
527 | bufmgr_gem->exec_bos[index] = bo; |
450 | bufmgr_gem->exec_count++; |
528 | bufmgr_gem->exec_count++; |
451 | } |
529 | } |
Line 454... | Line 532... | ||
454 | drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence) |
532 | drm_intel_add_validate_buffer2(drm_intel_bo *bo, int need_fence) |
455 | { |
533 | { |
456 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; |
534 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; |
457 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
535 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
458 | int index; |
536 | int index; |
- | 537 | int flags = 0; |
|
Line 459... | Line -... | ||
459 | - | ||
460 | if (bo_gem->validate_index != -1) { |
538 | |
- | 539 | if (need_fence) |
|
461 | if (need_fence) |
540 | flags |= EXEC_OBJECT_NEEDS_FENCE; |
- | 541 | if (bo_gem->use_48b_address_range) |
|
- | 542 | flags |= EXEC_OBJECT_SUPPORTS_48B_ADDRESS; |
|
462 | bufmgr_gem->exec2_objects[bo_gem->validate_index].flags |= |
543 | if (bo_gem->is_softpin) |
- | 544 | flags |= EXEC_OBJECT_PINNED; |
|
- | 545 | ||
- | 546 | if (bo_gem->validate_index != -1) { |
|
463 | EXEC_OBJECT_NEEDS_FENCE; |
547 | bufmgr_gem->exec2_objects[bo_gem->validate_index].flags |= flags; |
464 | return; |
548 | return; |
Line 465... | Line 549... | ||
465 | } |
549 | } |
466 | 550 | ||
Line 484... | Line 568... | ||
484 | bo_gem->validate_index = index; |
568 | bo_gem->validate_index = index; |
485 | /* Fill in array entry */ |
569 | /* Fill in array entry */ |
486 | bufmgr_gem->exec2_objects[index].handle = bo_gem->gem_handle; |
570 | bufmgr_gem->exec2_objects[index].handle = bo_gem->gem_handle; |
487 | bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count; |
571 | bufmgr_gem->exec2_objects[index].relocation_count = bo_gem->reloc_count; |
488 | bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs; |
572 | bufmgr_gem->exec2_objects[index].relocs_ptr = (uintptr_t)bo_gem->relocs; |
489 | bufmgr_gem->exec2_objects[index].alignment = 0; |
573 | bufmgr_gem->exec2_objects[index].alignment = bo->align; |
490 | bufmgr_gem->exec2_objects[index].offset = 0; |
574 | bufmgr_gem->exec2_objects[index].offset = bo_gem->is_softpin ? |
- | 575 | bo->offset64 : 0; |
|
491 | bufmgr_gem->exec_bos[index] = bo; |
576 | bufmgr_gem->exec_bos[index] = bo; |
492 | bufmgr_gem->exec2_objects[index].flags = 0; |
577 | bufmgr_gem->exec2_objects[index].flags = flags; |
493 | bufmgr_gem->exec2_objects[index].rsvd1 = 0; |
578 | bufmgr_gem->exec2_objects[index].rsvd1 = 0; |
494 | bufmgr_gem->exec2_objects[index].rsvd2 = 0; |
579 | bufmgr_gem->exec2_objects[index].rsvd2 = 0; |
495 | if (need_fence) { |
- | |
496 | bufmgr_gem->exec2_objects[index].flags |= |
- | |
497 | EXEC_OBJECT_NEEDS_FENCE; |
- | |
498 | } |
- | |
499 | bufmgr_gem->exec_count++; |
580 | bufmgr_gem->exec_count++; |
500 | } |
581 | } |
Line 501... | Line 582... | ||
501 | 582 | ||
502 | #define RELOC_BUF_SIZE(x) ((I915_RELOC_HEADER + x * I915_RELOC0_STRIDE) * \ |
583 | #define RELOC_BUF_SIZE(x) ((I915_RELOC_HEADER + x * I915_RELOC0_STRIDE) * \ |
Line 503... | Line 584... | ||
503 | sizeof(uint32_t)) |
584 | sizeof(uint32_t)) |
504 | 585 | ||
505 | static void |
586 | static void |
- | 587 | drm_intel_bo_gem_set_in_aperture_size(drm_intel_bufmgr_gem *bufmgr_gem, |
|
506 | drm_intel_bo_gem_set_in_aperture_size(drm_intel_bufmgr_gem *bufmgr_gem, |
588 | drm_intel_bo_gem *bo_gem, |
507 | drm_intel_bo_gem *bo_gem) |
589 | unsigned int alignment) |
Line 508... | Line 590... | ||
508 | { |
590 | { |
Line 509... | Line 591... | ||
509 | int size; |
591 | unsigned int size; |
510 | 592 | ||
Line 516... | Line 598... | ||
516 | * twice as large as the object in order for it to fit into the |
598 | * twice as large as the object in order for it to fit into the |
517 | * aperture. Optimal packing is for wimps. |
599 | * aperture. Optimal packing is for wimps. |
518 | */ |
600 | */ |
519 | size = bo_gem->bo.size; |
601 | size = bo_gem->bo.size; |
520 | if (bufmgr_gem->gen < 4 && bo_gem->tiling_mode != I915_TILING_NONE) { |
602 | if (bufmgr_gem->gen < 4 && bo_gem->tiling_mode != I915_TILING_NONE) { |
521 | int min_size; |
603 | unsigned int min_size; |
Line 522... | Line 604... | ||
522 | 604 | ||
523 | if (bufmgr_gem->has_relaxed_fencing) { |
605 | if (bufmgr_gem->has_relaxed_fencing) { |
524 | if (bufmgr_gem->gen == 3) |
606 | if (bufmgr_gem->gen == 3) |
525 | min_size = 1024*1024; |
607 | min_size = 1024*1024; |
Line 530... | Line 612... | ||
530 | min_size *= 2; |
612 | min_size *= 2; |
531 | } else |
613 | } else |
532 | min_size = size; |
614 | min_size = size; |
Line 533... | Line 615... | ||
533 | 615 | ||
534 | /* Account for worst-case alignment. */ |
616 | /* Account for worst-case alignment. */ |
535 | size = 2 * min_size; |
617 | alignment = MAX2(alignment, min_size); |
Line 536... | Line 618... | ||
536 | } |
618 | } |
537 | 619 | ||
Line 538... | Line 620... | ||
538 | bo_gem->reloc_tree_size = size; |
620 | bo_gem->reloc_tree_size = size + alignment; |
539 | } |
621 | } |
540 | 622 | ||
Line 576... | Line 658... | ||
576 | int ret; |
658 | int ret; |
Line 577... | Line 659... | ||
577 | 659 | ||
578 | if (bo_gem->reusable && bo_gem->idle) |
660 | if (bo_gem->reusable && bo_gem->idle) |
Line 579... | Line 661... | ||
579 | return false; |
661 | return false; |
580 | 662 | ||
Line 581... | Line 663... | ||
581 | VG_CLEAR(busy); |
663 | memclear(busy); |
582 | busy.handle = bo_gem->gem_handle; |
664 | busy.handle = bo_gem->gem_handle; |
583 | 665 | ||
Line 595... | Line 677... | ||
595 | drm_intel_gem_bo_madvise_internal(drm_intel_bufmgr_gem *bufmgr_gem, |
677 | drm_intel_gem_bo_madvise_internal(drm_intel_bufmgr_gem *bufmgr_gem, |
596 | drm_intel_bo_gem *bo_gem, int state) |
678 | drm_intel_bo_gem *bo_gem, int state) |
597 | { |
679 | { |
598 | struct drm_i915_gem_madvise madv; |
680 | struct drm_i915_gem_madvise madv; |
Line 599... | Line 681... | ||
599 | 681 | ||
600 | VG_CLEAR(madv); |
682 | memclear(madv); |
601 | madv.handle = bo_gem->gem_handle; |
683 | madv.handle = bo_gem->gem_handle; |
602 | madv.madv = state; |
684 | madv.madv = state; |
603 | madv.retained = 1; |
685 | madv.retained = 1; |
Line 638... | Line 720... | ||
638 | drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr, |
720 | drm_intel_gem_bo_alloc_internal(drm_intel_bufmgr *bufmgr, |
639 | const char *name, |
721 | const char *name, |
640 | unsigned long size, |
722 | unsigned long size, |
641 | unsigned long flags, |
723 | unsigned long flags, |
642 | uint32_t tiling_mode, |
724 | uint32_t tiling_mode, |
643 | unsigned long stride) |
725 | unsigned long stride, |
- | 726 | unsigned int alignment) |
|
644 | { |
727 | { |
645 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
728 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
646 | drm_intel_bo_gem *bo_gem; |
729 | drm_intel_bo_gem *bo_gem; |
647 | unsigned int page_size = 4096; |
730 | unsigned int page_size = 4096; |
648 | int ret; |
731 | int ret; |
Line 680... | Line 763... | ||
680 | */ |
763 | */ |
681 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, |
764 | bo_gem = DRMLISTENTRY(drm_intel_bo_gem, |
682 | bucket->head.prev, head); |
765 | bucket->head.prev, head); |
683 | DRMLISTDEL(&bo_gem->head); |
766 | DRMLISTDEL(&bo_gem->head); |
684 | alloc_from_cache = true; |
767 | alloc_from_cache = true; |
- | 768 | bo_gem->bo.align = alignment; |
|
685 | } else { |
769 | } else { |
- | 770 | assert(alignment == 0); |
|
686 | /* For non-render-target BOs (where we're probably |
771 | /* For non-render-target BOs (where we're probably |
687 | * going to map it first thing in order to fill it |
772 | * going to map it first thing in order to fill it |
688 | * with data), check if the last BO in the cache is |
773 | * with data), check if the last BO in the cache is |
689 | * unbusy, and only reuse in that case. Otherwise, |
774 | * unbusy, and only reuse in that case. Otherwise, |
690 | * allocating a new buffer is probably faster than |
775 | * allocating a new buffer is probably faster than |
Line 724... | Line 809... | ||
724 | if (!bo_gem) |
809 | if (!bo_gem) |
725 | return NULL; |
810 | return NULL; |
Line 726... | Line 811... | ||
726 | 811 | ||
Line 727... | Line 812... | ||
727 | bo_gem->bo.size = bo_size; |
812 | bo_gem->bo.size = bo_size; |
728 | 813 | ||
Line 729... | Line 814... | ||
729 | VG_CLEAR(create); |
814 | memclear(create); |
730 | create.size = bo_size; |
815 | create.size = bo_size; |
731 | 816 | ||
Line 737... | Line 822... | ||
737 | if (ret != 0) { |
822 | if (ret != 0) { |
738 | free(bo_gem); |
823 | free(bo_gem); |
739 | return NULL; |
824 | return NULL; |
740 | } |
825 | } |
741 | bo_gem->bo.bufmgr = bufmgr; |
826 | bo_gem->bo.bufmgr = bufmgr; |
- | 827 | bo_gem->bo.align = alignment; |
|
Line 742... | Line 828... | ||
742 | 828 | ||
743 | bo_gem->tiling_mode = I915_TILING_NONE; |
829 | bo_gem->tiling_mode = I915_TILING_NONE; |
744 | bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; |
830 | bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; |
Line -... | Line 831... | ||
- | 831 | bo_gem->stride = 0; |
|
- | 832 | ||
- | 833 | /* drm_intel_gem_bo_free calls DRMLISTDEL() for an uninitialized |
|
- | 834 | list (vma_list), so better set the list head here */ |
|
745 | bo_gem->stride = 0; |
835 | DRMINITLISTHEAD(&bo_gem->name_list); |
746 | 836 | DRMINITLISTHEAD(&bo_gem->vma_list); |
|
747 | if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo, |
837 | if (drm_intel_gem_bo_set_tiling_internal(&bo_gem->bo, |
748 | tiling_mode, |
838 | tiling_mode, |
749 | stride)) { |
839 | stride)) { |
750 | drm_intel_gem_bo_free(&bo_gem->bo); |
840 | drm_intel_gem_bo_free(&bo_gem->bo); |
751 | return NULL; |
- | |
752 | } |
- | |
753 | - | ||
754 | DRMINITLISTHEAD(&bo_gem->name_list); |
841 | return NULL; |
Line 755... | Line 842... | ||
755 | DRMINITLISTHEAD(&bo_gem->vma_list); |
842 | } |
756 | } |
843 | } |
757 | 844 | ||
758 | bo_gem->name = name; |
845 | bo_gem->name = name; |
759 | atomic_set(&bo_gem->refcount, 1); |
846 | atomic_set(&bo_gem->refcount, 1); |
760 | bo_gem->validate_index = -1; |
847 | bo_gem->validate_index = -1; |
761 | bo_gem->reloc_tree_fences = 0; |
848 | bo_gem->reloc_tree_fences = 0; |
762 | bo_gem->used_as_reloc_target = false; |
849 | bo_gem->used_as_reloc_target = false; |
763 | bo_gem->has_error = false; |
- | |
Line 764... | Line 850... | ||
764 | bo_gem->reusable = true; |
850 | bo_gem->has_error = false; |
Line 765... | Line 851... | ||
765 | bo_gem->aub_annotations = NULL; |
851 | bo_gem->reusable = true; |
766 | bo_gem->aub_annotation_count = 0; |
852 | bo_gem->use_48b_address_range = false; |
Line 767... | Line 853... | ||
767 | 853 | ||
Line 779... | Line 865... | ||
779 | unsigned long size, |
865 | unsigned long size, |
780 | unsigned int alignment) |
866 | unsigned int alignment) |
781 | { |
867 | { |
782 | return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, |
868 | return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, |
783 | BO_ALLOC_FOR_RENDER, |
869 | BO_ALLOC_FOR_RENDER, |
784 | I915_TILING_NONE, 0); |
870 | I915_TILING_NONE, 0, |
- | 871 | alignment); |
|
785 | } |
872 | } |
Line 786... | Line 873... | ||
786 | 873 | ||
787 | static drm_intel_bo * |
874 | static drm_intel_bo * |
788 | drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr, |
875 | drm_intel_gem_bo_alloc(drm_intel_bufmgr *bufmgr, |
789 | const char *name, |
876 | const char *name, |
790 | unsigned long size, |
877 | unsigned long size, |
791 | unsigned int alignment) |
878 | unsigned int alignment) |
792 | { |
879 | { |
793 | return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0, |
880 | return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, 0, |
794 | I915_TILING_NONE, 0); |
881 | I915_TILING_NONE, 0, 0); |
Line 795... | Line 882... | ||
795 | } |
882 | } |
796 | 883 | ||
797 | static drm_intel_bo * |
884 | static drm_intel_bo * |
Line 841... | Line 928... | ||
841 | 928 | ||
842 | if (tiling == I915_TILING_NONE) |
929 | if (tiling == I915_TILING_NONE) |
Line 843... | Line 930... | ||
843 | stride = 0; |
930 | stride = 0; |
844 | 931 | ||
- | 932 | return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags, |
|
- | 933 | tiling, stride, 0); |
|
- | 934 | } |
|
- | 935 | ||
- | 936 | #if 0 |
|
- | 937 | static drm_intel_bo * |
|
- | 938 | drm_intel_gem_bo_alloc_userptr(drm_intel_bufmgr *bufmgr, |
|
- | 939 | const char *name, |
|
- | 940 | void *addr, |
|
- | 941 | uint32_t tiling_mode, |
|
- | 942 | uint32_t stride, |
|
- | 943 | unsigned long size, |
|
- | 944 | unsigned long flags) |
|
- | 945 | { |
|
- | 946 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
|
- | 947 | drm_intel_bo_gem *bo_gem; |
|
- | 948 | int ret; |
|
- | 949 | struct drm_i915_gem_userptr userptr; |
|
- | 950 | ||
- | 951 | /* Tiling with userptr surfaces is not supported |
|
- | 952 | * on all hardware so refuse it for time being. |
|
- | 953 | */ |
|
- | 954 | if (tiling_mode != I915_TILING_NONE) |
|
- | 955 | return NULL; |
|
- | 956 | ||
- | 957 | bo_gem = calloc(1, sizeof(*bo_gem)); |
|
- | 958 | if (!bo_gem) |
|
- | 959 | return NULL; |
|
- | 960 | ||
- | 961 | bo_gem->bo.size = size; |
|
- | 962 | ||
- | 963 | memclear(userptr); |
|
- | 964 | userptr.user_ptr = (__u64)((unsigned long)addr); |
|
- | 965 | userptr.user_size = size; |
|
- | 966 | userptr.flags = flags; |
|
- | 967 | ||
- | 968 | ret = drmIoctl(bufmgr_gem->fd, |
|
- | 969 | DRM_IOCTL_I915_GEM_USERPTR, |
|
- | 970 | &userptr); |
|
- | 971 | if (ret != 0) { |
|
- | 972 | DBG("bo_create_userptr: " |
|
- | 973 | "ioctl failed with user ptr %p size 0x%lx, " |
|
- | 974 | "user flags 0x%lx\n", addr, size, flags); |
|
- | 975 | free(bo_gem); |
|
- | 976 | return NULL; |
|
- | 977 | } |
|
- | 978 | ||
- | 979 | bo_gem->gem_handle = userptr.handle; |
|
- | 980 | bo_gem->bo.handle = bo_gem->gem_handle; |
|
- | 981 | bo_gem->bo.bufmgr = bufmgr; |
|
- | 982 | bo_gem->is_userptr = true; |
|
- | 983 | bo_gem->bo.virtual = addr; |
|
- | 984 | /* Save the address provided by user */ |
|
- | 985 | bo_gem->user_virtual = addr; |
|
- | 986 | bo_gem->tiling_mode = I915_TILING_NONE; |
|
- | 987 | bo_gem->swizzle_mode = I915_BIT_6_SWIZZLE_NONE; |
|
- | 988 | bo_gem->stride = 0; |
|
- | 989 | ||
- | 990 | DRMINITLISTHEAD(&bo_gem->name_list); |
|
- | 991 | DRMINITLISTHEAD(&bo_gem->vma_list); |
|
- | 992 | ||
- | 993 | bo_gem->name = name; |
|
- | 994 | atomic_set(&bo_gem->refcount, 1); |
|
- | 995 | bo_gem->validate_index = -1; |
|
- | 996 | bo_gem->reloc_tree_fences = 0; |
|
- | 997 | bo_gem->used_as_reloc_target = false; |
|
- | 998 | bo_gem->has_error = false; |
|
- | 999 | bo_gem->reusable = false; |
|
- | 1000 | bo_gem->use_48b_address_range = false; |
|
- | 1001 | ||
- | 1002 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
|
- | 1003 | ||
- | 1004 | DBG("bo_create_userptr: " |
|
- | 1005 | "ptr %p buf %d (%s) size %ldb, stride 0x%x, tile mode %d\n", |
|
- | 1006 | addr, bo_gem->gem_handle, bo_gem->name, |
|
- | 1007 | size, stride, tiling_mode); |
|
- | 1008 | ||
- | 1009 | return &bo_gem->bo; |
|
- | 1010 | } |
|
- | 1011 | ||
- | 1012 | static bool |
|
- | 1013 | has_userptr(drm_intel_bufmgr_gem *bufmgr_gem) |
|
- | 1014 | { |
|
- | 1015 | int ret; |
|
- | 1016 | void *ptr; |
|
- | 1017 | long pgsz; |
|
- | 1018 | struct drm_i915_gem_userptr userptr; |
|
- | 1019 | ||
- | 1020 | pgsz = sysconf(_SC_PAGESIZE); |
|
- | 1021 | assert(pgsz > 0); |
|
- | 1022 | ||
- | 1023 | ret = posix_memalign(&ptr, pgsz, pgsz); |
|
- | 1024 | if (ret) { |
|
- | 1025 | DBG("Failed to get a page (%ld) for userptr detection!\n", |
|
- | 1026 | pgsz); |
|
- | 1027 | return false; |
|
- | 1028 | } |
|
- | 1029 | ||
- | 1030 | memclear(userptr); |
|
- | 1031 | userptr.user_ptr = (__u64)(unsigned long)ptr; |
|
- | 1032 | userptr.user_size = pgsz; |
|
- | 1033 | ||
- | 1034 | retry: |
|
- | 1035 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_USERPTR, &userptr); |
|
- | 1036 | if (ret) { |
|
- | 1037 | if (errno == ENODEV && userptr.flags == 0) { |
|
- | 1038 | userptr.flags = I915_USERPTR_UNSYNCHRONIZED; |
|
- | 1039 | goto retry; |
|
- | 1040 | } |
|
- | 1041 | free(ptr); |
|
- | 1042 | return false; |
|
- | 1043 | } |
|
- | 1044 | ||
- | 1045 | /* We don't release the userptr bo here as we want to keep the |
|
- | 1046 | * kernel mm tracking alive for our lifetime. The first time we |
|
- | 1047 | * create a userptr object the kernel has to install a mmu_notifer |
|
- | 1048 | * which is a heavyweight operation (e.g. it requires taking all |
|
- | 1049 | * mm_locks and stop_machine()). |
|
- | 1050 | */ |
|
- | 1051 | ||
- | 1052 | bufmgr_gem->userptr_active.ptr = ptr; |
|
- | 1053 | bufmgr_gem->userptr_active.handle = userptr.handle; |
|
- | 1054 | ||
- | 1055 | return true; |
|
- | 1056 | } |
|
- | 1057 | ||
- | 1058 | #endif |
|
- | 1059 | ||
- | 1060 | static drm_intel_bo * |
|
- | 1061 | check_bo_alloc_userptr(drm_intel_bufmgr *bufmgr, |
|
- | 1062 | const char *name, |
|
- | 1063 | void *addr, |
|
- | 1064 | uint32_t tiling_mode, |
|
- | 1065 | uint32_t stride, |
|
- | 1066 | unsigned long size, |
|
- | 1067 | unsigned long flags) |
|
- | 1068 | { |
|
- | 1069 | bufmgr->bo_alloc_userptr = NULL; |
|
- | 1070 | ||
845 | return drm_intel_gem_bo_alloc_internal(bufmgr, name, size, flags, |
1071 | return drm_intel_bo_alloc_userptr(bufmgr, name, addr, |
Line 846... | Line 1072... | ||
846 | tiling, stride); |
1072 | tiling_mode, stride, size, flags); |
847 | } |
1073 | } |
848 | 1074 | ||
Line 878... | Line 1104... | ||
878 | drm_intel_gem_bo_reference(&bo_gem->bo); |
1104 | drm_intel_gem_bo_reference(&bo_gem->bo); |
879 | return &bo_gem->bo; |
1105 | return &bo_gem->bo; |
880 | } |
1106 | } |
881 | } |
1107 | } |
Line 882... | Line 1108... | ||
882 | 1108 | ||
883 | VG_CLEAR(open_arg); |
1109 | memclear(open_arg); |
884 | open_arg.name = handle; |
1110 | open_arg.name = handle; |
885 | ret = drmIoctl(bufmgr_gem->fd, |
1111 | ret = drmIoctl(bufmgr_gem->fd, |
886 | DRM_IOCTL_GEM_OPEN, |
1112 | DRM_IOCTL_GEM_OPEN, |
887 | &open_arg); |
1113 | &open_arg); |
Line 918... | Line 1144... | ||
918 | bo_gem->validate_index = -1; |
1144 | bo_gem->validate_index = -1; |
919 | bo_gem->gem_handle = open_arg.handle; |
1145 | bo_gem->gem_handle = open_arg.handle; |
920 | bo_gem->bo.handle = open_arg.handle; |
1146 | bo_gem->bo.handle = open_arg.handle; |
921 | bo_gem->global_name = handle; |
1147 | bo_gem->global_name = handle; |
922 | bo_gem->reusable = false; |
1148 | bo_gem->reusable = false; |
- | 1149 | bo_gem->use_48b_address_range = false; |
|
Line 923... | Line 1150... | ||
923 | 1150 | ||
924 | VG_CLEAR(get_tiling); |
1151 | memclear(get_tiling); |
925 | get_tiling.handle = bo_gem->gem_handle; |
1152 | get_tiling.handle = bo_gem->gem_handle; |
926 | ret = drmIoctl(bufmgr_gem->fd, |
1153 | ret = drmIoctl(bufmgr_gem->fd, |
927 | DRM_IOCTL_I915_GEM_GET_TILING, |
1154 | DRM_IOCTL_I915_GEM_GET_TILING, |
928 | &get_tiling); |
1155 | &get_tiling); |
Line 931... | Line 1158... | ||
931 | return NULL; |
1158 | return NULL; |
932 | } |
1159 | } |
933 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
1160 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
934 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
1161 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
935 | /* XXX stride is unknown */ |
1162 | /* XXX stride is unknown */ |
936 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem); |
1163 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
Line 937... | Line 1164... | ||
937 | 1164 | ||
938 | DRMINITLISTHEAD(&bo_gem->vma_list); |
1165 | DRMINITLISTHEAD(&bo_gem->vma_list); |
939 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
1166 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
Line 958... | Line 1185... | ||
958 | if (bo_gem->gtt_virtual) { |
1185 | if (bo_gem->gtt_virtual) { |
959 | bufmgr_gem->vma_count--; |
1186 | bufmgr_gem->vma_count--; |
960 | } |
1187 | } |
Line 961... | Line 1188... | ||
961 | 1188 | ||
962 | /* Close this object */ |
1189 | /* Close this object */ |
963 | VG_CLEAR(close); |
1190 | memclear(close); |
964 | close.handle = bo_gem->gem_handle; |
1191 | close.handle = bo_gem->gem_handle; |
965 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close); |
1192 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_GEM_CLOSE, &close); |
966 | if (ret != 0) { |
1193 | if (ret != 0) { |
967 | DBG("DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n", |
1194 | DBG("DRM_IOCTL_GEM_CLOSE %d failed (%s): %s\n", |
968 | bo_gem->gem_handle, bo_gem->name, strerror(errno)); |
1195 | bo_gem->gem_handle, bo_gem->name, strerror(errno)); |
969 | } |
- | |
970 | free(bo_gem->aub_annotations); |
1196 | } |
971 | free(bo); |
1197 | free(bo); |
Line 972... | Line 1198... | ||
972 | } |
1198 | } |
973 | 1199 | ||
Line 1090... | Line 1316... | ||
1090 | drm_intel_gem_bo_unreference_locked_timed(bo_gem-> |
1316 | drm_intel_gem_bo_unreference_locked_timed(bo_gem-> |
1091 | reloc_target_info[i].bo, |
1317 | reloc_target_info[i].bo, |
1092 | time); |
1318 | time); |
1093 | } |
1319 | } |
1094 | } |
1320 | } |
- | 1321 | for (i = 0; i < bo_gem->softpin_target_count; i++) |
|
- | 1322 | drm_intel_gem_bo_unreference_locked_timed(bo_gem->softpin_target[i], |
|
- | 1323 | time); |
|
1095 | bo_gem->reloc_count = 0; |
1324 | bo_gem->reloc_count = 0; |
1096 | bo_gem->used_as_reloc_target = false; |
1325 | bo_gem->used_as_reloc_target = false; |
- | 1326 | bo_gem->softpin_target_count = 0; |
|
Line 1097... | Line 1327... | ||
1097 | 1327 | ||
1098 | DBG("bo_unreference final: %d (%s)\n", |
1328 | DBG("bo_unreference final: %d (%s)\n", |
Line 1099... | Line 1329... | ||
1099 | bo_gem->gem_handle, bo_gem->name); |
1329 | bo_gem->gem_handle, bo_gem->name); |
Line 1105... | Line 1335... | ||
1105 | } |
1335 | } |
1106 | if (bo_gem->relocs) { |
1336 | if (bo_gem->relocs) { |
1107 | free(bo_gem->relocs); |
1337 | free(bo_gem->relocs); |
1108 | bo_gem->relocs = NULL; |
1338 | bo_gem->relocs = NULL; |
1109 | } |
1339 | } |
- | 1340 | if (bo_gem->softpin_target) { |
|
- | 1341 | free(bo_gem->softpin_target); |
|
- | 1342 | bo_gem->softpin_target = NULL; |
|
- | 1343 | bo_gem->softpin_target_size = 0; |
|
- | 1344 | } |
|
Line 1110... | Line 1345... | ||
1110 | 1345 | ||
1111 | /* Clear any left-over mappings */ |
1346 | /* Clear any left-over mappings */ |
1112 | if (bo_gem->map_count) { |
1347 | if (bo_gem->map_count) { |
1113 | DBG("bo freed with non-zero map-count %d\n", bo_gem->map_count); |
1348 | DBG("bo freed with non-zero map-count %d\n", bo_gem->map_count); |
Line 1147... | Line 1382... | ||
1147 | static void drm_intel_gem_bo_unreference(drm_intel_bo *bo) |
1382 | static void drm_intel_gem_bo_unreference(drm_intel_bo *bo) |
1148 | { |
1383 | { |
1149 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1384 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line 1150... | Line 1385... | ||
1150 | 1385 | ||
- | 1386 | assert(atomic_read(&bo_gem->refcount) > 0); |
|
1151 | assert(atomic_read(&bo_gem->refcount) > 0); |
1387 | |
1152 | if (atomic_dec_and_test(&bo_gem->refcount)) { |
1388 | if (atomic_add_unless(&bo_gem->refcount, -1, 1)) { |
1153 | drm_intel_bufmgr_gem *bufmgr_gem = |
1389 | drm_intel_bufmgr_gem *bufmgr_gem = |
1154 | (drm_intel_bufmgr_gem *) bo->bufmgr; |
1390 | (drm_intel_bufmgr_gem *) bo->bufmgr; |
Line 1155... | Line 1391... | ||
1155 | // struct timespec time; |
1391 | struct timespec time; |
Line 1156... | Line 1392... | ||
1156 | 1392 | ||
- | 1393 | clock_gettime(CLOCK_MONOTONIC, &time); |
|
- | 1394 | ||
1157 | // clock_gettime(CLOCK_MONOTONIC, &time); |
1395 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1158 | 1396 | ||
- | 1397 | if (atomic_dec_and_test(&bo_gem->refcount)) { |
|
- | 1398 | drm_intel_gem_bo_unreference_final(bo, time.tv_sec); |
|
1159 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1399 | drm_intel_gem_cleanup_bo_cache(bufmgr_gem, time.tv_sec); |
1160 | drm_intel_gem_bo_unreference_final(bo, 0); |
1400 | } |
1161 | drm_intel_gem_cleanup_bo_cache(bufmgr_gem, 0); |
1401 | |
Line 1162... | Line 1402... | ||
1162 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1402 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 1168... | Line 1408... | ||
1168 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1408 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1169 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1409 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1170 | struct drm_i915_gem_set_domain set_domain; |
1410 | struct drm_i915_gem_set_domain set_domain; |
1171 | int ret; |
1411 | int ret; |
Line -... | Line 1412... | ||
- | 1412 | ||
- | 1413 | if (bo_gem->is_userptr) { |
|
- | 1414 | /* Return the same user ptr */ |
|
- | 1415 | bo->virtual = bo_gem->user_virtual; |
|
- | 1416 | return 0; |
|
- | 1417 | } |
|
1172 | 1418 | ||
Line 1173... | Line 1419... | ||
1173 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1419 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1174 | 1420 | ||
Line 1179... | Line 1425... | ||
1179 | struct drm_i915_gem_mmap mmap_arg; |
1425 | struct drm_i915_gem_mmap mmap_arg; |
Line 1180... | Line 1426... | ||
1180 | 1426 | ||
1181 | DBG("bo_map: %d (%s), map_count=%d\n", |
1427 | DBG("bo_map: %d (%s), map_count=%d\n", |
Line 1182... | Line 1428... | ||
1182 | bo_gem->gem_handle, bo_gem->name, bo_gem->map_count); |
1428 | bo_gem->gem_handle, bo_gem->name, bo_gem->map_count); |
1183 | 1429 | ||
1184 | VG_CLEAR(mmap_arg); |
- | |
1185 | mmap_arg.handle = bo_gem->gem_handle; |
1430 | memclear(mmap_arg); |
1186 | mmap_arg.offset = 0; |
1431 | mmap_arg.handle = bo_gem->gem_handle; |
1187 | mmap_arg.size = bo->size; |
1432 | mmap_arg.size = bo->size; |
1188 | ret = drmIoctl(bufmgr_gem->fd, |
1433 | ret = drmIoctl(bufmgr_gem->fd, |
1189 | DRM_IOCTL_I915_GEM_MMAP, |
1434 | DRM_IOCTL_I915_GEM_MMAP, |
Line 1203... | Line 1448... | ||
1203 | } |
1448 | } |
1204 | DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name, |
1449 | DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name, |
1205 | bo_gem->mem_virtual); |
1450 | bo_gem->mem_virtual); |
1206 | bo->virtual = bo_gem->mem_virtual; |
1451 | bo->virtual = bo_gem->mem_virtual; |
Line 1207... | Line 1452... | ||
1207 | 1452 | ||
1208 | VG_CLEAR(set_domain); |
1453 | memclear(set_domain); |
1209 | set_domain.handle = bo_gem->gem_handle; |
1454 | set_domain.handle = bo_gem->gem_handle; |
1210 | set_domain.read_domains = I915_GEM_DOMAIN_CPU; |
1455 | set_domain.read_domains = I915_GEM_DOMAIN_CPU; |
1211 | if (write_enable) |
1456 | if (write_enable) |
1212 | set_domain.write_domain = I915_GEM_DOMAIN_CPU; |
1457 | set_domain.write_domain = I915_GEM_DOMAIN_CPU; |
Line 1236... | Line 1481... | ||
1236 | { |
1481 | { |
1237 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1482 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1238 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1483 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1239 | int ret; |
1484 | int ret; |
Line -... | Line 1485... | ||
- | 1485 | ||
- | 1486 | if (bo_gem->is_userptr) |
|
- | 1487 | return -EINVAL; |
|
1240 | 1488 | ||
1241 | if (bo_gem->map_count++ == 0) |
1489 | if (bo_gem->map_count++ == 0) |
Line 1242... | Line 1490... | ||
1242 | drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem); |
1490 | drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem); |
1243 | 1491 | ||
1244 | /* Get a mapping of the buffer if we haven't before. */ |
1492 | /* Get a mapping of the buffer if we haven't before. */ |
Line 1245... | Line 1493... | ||
1245 | if (bo_gem->gtt_virtual == NULL) { |
1493 | if (bo_gem->gtt_virtual == NULL) { |
1246 | struct drm_i915_gem_mmap_gtt mmap_arg; |
1494 | struct drm_i915_gem_mmap_gtt mmap_arg; |
Line 1247... | Line 1495... | ||
1247 | 1495 | ||
1248 | DBG("bo_map_gtt: mmap %d (%s), map_count=%d\n", |
1496 | DBG("bo_map_gtt: mmap %d (%s), map_count=%d\n", |
1249 | bo_gem->gem_handle, bo_gem->name, bo_gem->map_count); |
- | |
Line 1250... | Line 1497... | ||
1250 | 1497 | bo_gem->gem_handle, bo_gem->name, bo_gem->map_count); |
|
1251 | VG_CLEAR(mmap_arg); |
1498 | |
1252 | mmap_arg.handle = bo_gem->gem_handle; |
1499 | memclear(mmap_arg); |
1253 | mmap_arg.offset = 0; |
1500 | mmap_arg.handle = bo_gem->gem_handle; |
Line 1266... | Line 1513... | ||
1266 | drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); |
1513 | drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); |
1267 | return ret; |
1514 | return ret; |
1268 | } |
1515 | } |
Line 1269... | Line 1516... | ||
1269 | 1516 | ||
1270 | /* and mmap it */ |
1517 | /* and mmap it */ |
1271 | bo_gem->gtt_virtual = mmap_arg.offset; |
1518 | bo_gem->gtt_virtual = (void*)(__u32)mmap_arg.offset; |
1272 | if (bo_gem->gtt_virtual == 0) { |
1519 | if (bo_gem->gtt_virtual == 0) { |
1273 | bo_gem->gtt_virtual = NULL; |
1520 | bo_gem->gtt_virtual = NULL; |
1274 | ret = -errno; |
1521 | ret = -errno; |
1275 | DBG("%s:%d: Error mapping buffer %d (%s): %s .\n", |
1522 | DBG("%s:%d: Error mapping buffer %d (%s): %s .\n", |
Line 1288... | Line 1535... | ||
1288 | bo_gem->gtt_virtual); |
1535 | bo_gem->gtt_virtual); |
Line 1289... | Line 1536... | ||
1289 | 1536 | ||
1290 | return 0; |
1537 | return 0; |
Line -... | Line 1538... | ||
- | 1538 | } |
|
1291 | } |
1539 | |
1292 | 1540 | int |
|
1293 | int drm_intel_gem_bo_map_gtt(drm_intel_bo *bo) |
1541 | drm_intel_gem_bo_map_gtt(drm_intel_bo *bo) |
1294 | { |
1542 | { |
1295 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1543 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1296 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1544 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line 1312... | Line 1560... | ||
1312 | * The pagefault handler does this domain change for us when |
1560 | * The pagefault handler does this domain change for us when |
1313 | * it has unbound the BO from the GTT, but it's up to us to |
1561 | * it has unbound the BO from the GTT, but it's up to us to |
1314 | * tell it when we're about to use things if we had done |
1562 | * tell it when we're about to use things if we had done |
1315 | * rendering and it still happens to be bound to the GTT. |
1563 | * rendering and it still happens to be bound to the GTT. |
1316 | */ |
1564 | */ |
1317 | VG_CLEAR(set_domain); |
1565 | memclear(set_domain); |
1318 | set_domain.handle = bo_gem->gem_handle; |
1566 | set_domain.handle = bo_gem->gem_handle; |
1319 | set_domain.read_domains = I915_GEM_DOMAIN_GTT; |
1567 | set_domain.read_domains = I915_GEM_DOMAIN_GTT; |
1320 | set_domain.write_domain = I915_GEM_DOMAIN_GTT; |
1568 | set_domain.write_domain = I915_GEM_DOMAIN_GTT; |
1321 | ret = drmIoctl(bufmgr_gem->fd, |
1569 | ret = drmIoctl(bufmgr_gem->fd, |
1322 | DRM_IOCTL_I915_GEM_SET_DOMAIN, |
1570 | DRM_IOCTL_I915_GEM_SET_DOMAIN, |
Line 1346... | Line 1594... | ||
1346 | * data that the GPU is busy using (or, more specifically, that if it |
1594 | * data that the GPU is busy using (or, more specifically, that if it |
1347 | * does write over the data, it acknowledges that rendering is |
1595 | * does write over the data, it acknowledges that rendering is |
1348 | * undefined). |
1596 | * undefined). |
1349 | */ |
1597 | */ |
Line -... | Line 1598... | ||
- | 1598 | ||
1350 | 1599 | int |
|
1351 | int drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo) |
1600 | drm_intel_gem_bo_map_unsynchronized(drm_intel_bo *bo) |
1352 | { |
1601 | { |
1353 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1602 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1354 | #ifdef HAVE_VALGRIND |
1603 | #ifdef HAVE_VALGRIND |
1355 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1604 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line 1373... | Line 1622... | ||
1373 | return ret; |
1622 | return ret; |
1374 | } |
1623 | } |
Line 1375... | Line 1624... | ||
1375 | 1624 | ||
1376 | static int drm_intel_gem_bo_unmap(drm_intel_bo *bo) |
1625 | static int drm_intel_gem_bo_unmap(drm_intel_bo *bo) |
1377 | { |
1626 | { |
1378 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1627 | drm_intel_bufmgr_gem *bufmgr_gem; |
1379 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1628 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line 1380... | Line 1629... | ||
1380 | int ret = 0; |
1629 | int ret = 0; |
1381 | 1630 | ||
Line -... | Line 1631... | ||
- | 1631 | if (bo == NULL) |
|
- | 1632 | return 0; |
|
- | 1633 | ||
- | 1634 | if (bo_gem->is_userptr) |
|
1382 | if (bo == NULL) |
1635 | return 0; |
Line 1383... | Line 1636... | ||
1383 | return 0; |
1636 | |
1384 | 1637 | bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
|
1385 | // pthread_mutex_lock(&bufmgr_gem->lock); |
1638 | // pthread_mutex_lock(&bufmgr_gem->lock); |
Line 1417... | Line 1670... | ||
1417 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
1670 | // pthread_mutex_unlock(&bufmgr_gem->lock); |
Line 1418... | Line 1671... | ||
1418 | 1671 | ||
1419 | return ret; |
1672 | return ret; |
Line -... | Line 1673... | ||
- | 1673 | } |
|
1420 | } |
1674 | |
1421 | 1675 | int |
|
1422 | int drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo) |
1676 | drm_intel_gem_bo_unmap_gtt(drm_intel_bo *bo) |
1423 | { |
1677 | { |
Line 1424... | Line 1678... | ||
1424 | return drm_intel_gem_bo_unmap(bo); |
1678 | return drm_intel_gem_bo_unmap(bo); |
Line 1431... | Line 1685... | ||
1431 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1685 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1432 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1686 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1433 | struct drm_i915_gem_pwrite pwrite; |
1687 | struct drm_i915_gem_pwrite pwrite; |
1434 | int ret; |
1688 | int ret; |
Line -... | Line 1689... | ||
- | 1689 | ||
- | 1690 | if (bo_gem->is_userptr) |
|
- | 1691 | return -EINVAL; |
|
1435 | 1692 | ||
1436 | VG_CLEAR(pwrite); |
1693 | memclear(pwrite); |
1437 | pwrite.handle = bo_gem->gem_handle; |
1694 | pwrite.handle = bo_gem->gem_handle; |
1438 | pwrite.offset = offset; |
1695 | pwrite.offset = offset; |
1439 | pwrite.size = size; |
1696 | pwrite.size = size; |
1440 | pwrite.data_ptr = (uint64_t) (uintptr_t) data; |
1697 | pwrite.data_ptr = (uint64_t) (uintptr_t) data; |
Line 1457... | Line 1714... | ||
1457 | { |
1714 | { |
1458 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
1715 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
1459 | struct drm_i915_get_pipe_from_crtc_id get_pipe_from_crtc_id; |
1716 | struct drm_i915_get_pipe_from_crtc_id get_pipe_from_crtc_id; |
1460 | int ret; |
1717 | int ret; |
Line 1461... | Line 1718... | ||
1461 | 1718 | ||
1462 | VG_CLEAR(get_pipe_from_crtc_id); |
1719 | memclear(get_pipe_from_crtc_id); |
1463 | get_pipe_from_crtc_id.crtc_id = crtc_id; |
1720 | get_pipe_from_crtc_id.crtc_id = crtc_id; |
1464 | ret = drmIoctl(bufmgr_gem->fd, |
1721 | ret = drmIoctl(bufmgr_gem->fd, |
1465 | DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID, |
1722 | DRM_IOCTL_I915_GET_PIPE_FROM_CRTC_ID, |
1466 | &get_pipe_from_crtc_id); |
1723 | &get_pipe_from_crtc_id); |
Line 1474... | Line 1731... | ||
1474 | return -1; |
1731 | return -1; |
1475 | } |
1732 | } |
Line 1476... | Line 1733... | ||
1476 | 1733 | ||
1477 | return get_pipe_from_crtc_id.pipe; |
1734 | return get_pipe_from_crtc_id.pipe; |
- | 1735 | } |
|
Line 1478... | Line 1736... | ||
1478 | } |
1736 | #endif |
1479 | 1737 | ||
1480 | static int |
1738 | static int |
1481 | drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset, |
1739 | drm_intel_gem_bo_get_subdata(drm_intel_bo *bo, unsigned long offset, |
1482 | unsigned long size, void *data) |
1740 | unsigned long size, void *data) |
1483 | { |
1741 | { |
1484 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1742 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1485 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1743 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line -... | Line 1744... | ||
- | 1744 | struct drm_i915_gem_pread pread; |
|
- | 1745 | int ret; |
|
- | 1746 | ||
1486 | struct drm_i915_gem_pread pread; |
1747 | if (bo_gem->is_userptr) |
1487 | int ret; |
1748 | return -EINVAL; |
1488 | 1749 | ||
1489 | VG_CLEAR(pread); |
1750 | memclear(pread); |
1490 | pread.handle = bo_gem->gem_handle; |
1751 | pread.handle = bo_gem->gem_handle; |
1491 | pread.offset = offset; |
1752 | pread.offset = offset; |
Line 1502... | Line 1763... | ||
1502 | } |
1763 | } |
Line 1503... | Line 1764... | ||
1503 | 1764 | ||
1504 | return ret; |
1765 | return ret; |
Line 1505... | Line -... | ||
1505 | } |
- | |
1506 | - | ||
1507 | #endif |
1766 | } |
1508 | 1767 | ||
1509 | /** Waits for all GPU rendering with the object to have completed. */ |
1768 | /** Waits for all GPU rendering with the object to have completed. */ |
1510 | static void |
1769 | static void |
1511 | drm_intel_gem_bo_wait_rendering(drm_intel_bo *bo) |
1770 | drm_intel_gem_bo_wait_rendering(drm_intel_bo *bo) |
Line 1534... | Line 1793... | ||
1534 | * The implementation shall wait until the object is no longer actively |
1793 | * The implementation shall wait until the object is no longer actively |
1535 | * referenced within a batch buffer at the time of the call. The wait will |
1794 | * referenced within a batch buffer at the time of the call. The wait will |
1536 | * not guarantee that the buffer is re-issued via another thread, or an flinked |
1795 | * not guarantee that the buffer is re-issued via another thread, or an flinked |
1537 | * handle. Userspace must make sure this race does not occur if such precision |
1796 | * handle. Userspace must make sure this race does not occur if such precision |
1538 | * is important. |
1797 | * is important. |
- | 1798 | * |
|
- | 1799 | * Note that some kernels have broken the inifite wait for negative values |
|
- | 1800 | * promise, upgrade to latest stable kernels if this is the case. |
|
1539 | */ |
1801 | */ |
- | 1802 | int |
|
1540 | int drm_intel_gem_bo_wait(drm_intel_bo *bo, int64_t timeout_ns) |
1803 | drm_intel_gem_bo_wait(drm_intel_bo *bo, int64_t timeout_ns) |
1541 | { |
1804 | { |
1542 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1805 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1543 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1806 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1544 | struct drm_i915_gem_wait wait; |
1807 | struct drm_i915_gem_wait wait; |
1545 | int ret; |
1808 | int ret; |
Line 1549... | Line 1812... | ||
1549 | "infinite wait\n", __FILE__, __LINE__); |
1812 | "infinite wait\n", __FILE__, __LINE__); |
1550 | if (timeout_ns) { |
1813 | if (timeout_ns) { |
1551 | drm_intel_gem_bo_wait_rendering(bo); |
1814 | drm_intel_gem_bo_wait_rendering(bo); |
1552 | return 0; |
1815 | return 0; |
1553 | } else { |
1816 | } else { |
1554 | return drm_intel_gem_bo_busy(bo) ? -1 : 0; |
1817 | return drm_intel_gem_bo_busy(bo) ? -ETIME : 0; |
1555 | } |
1818 | } |
1556 | } |
1819 | } |
Line -... | Line 1820... | ||
- | 1820 | ||
1557 | 1821 | memclear(wait); |
|
1558 | wait.bo_handle = bo_gem->gem_handle; |
1822 | wait.bo_handle = bo_gem->gem_handle; |
1559 | wait.timeout_ns = timeout_ns; |
- | |
1560 | wait.flags = 0; |
1823 | wait.timeout_ns = timeout_ns; |
1561 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_WAIT, &wait); |
1824 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_WAIT, &wait); |
1562 | if (ret == -1) |
1825 | if (ret == -1) |
Line 1563... | Line 1826... | ||
1563 | return -errno; |
1826 | return -errno; |
Line 1578... | Line 1841... | ||
1578 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1841 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
1579 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1842 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1580 | struct drm_i915_gem_set_domain set_domain; |
1843 | struct drm_i915_gem_set_domain set_domain; |
1581 | int ret; |
1844 | int ret; |
Line 1582... | Line 1845... | ||
1582 | 1845 | ||
1583 | VG_CLEAR(set_domain); |
1846 | memclear(set_domain); |
1584 | set_domain.handle = bo_gem->gem_handle; |
1847 | set_domain.handle = bo_gem->gem_handle; |
1585 | set_domain.read_domains = I915_GEM_DOMAIN_GTT; |
1848 | set_domain.read_domains = I915_GEM_DOMAIN_GTT; |
1586 | set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0; |
1849 | set_domain.write_domain = write_enable ? I915_GEM_DOMAIN_GTT : 0; |
1587 | ret = drmIoctl(bufmgr_gem->fd, |
1850 | ret = drmIoctl(bufmgr_gem->fd, |
Line 1597... | Line 1860... | ||
1597 | 1860 | ||
1598 | static void |
1861 | static void |
1599 | drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr) |
1862 | drm_intel_bufmgr_gem_destroy(drm_intel_bufmgr *bufmgr) |
1600 | { |
1863 | { |
- | 1864 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
|
1601 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bufmgr; |
1865 | struct drm_gem_close close_bo; |
Line 1602... | Line 1866... | ||
1602 | int i; |
1866 | int i, ret; |
1603 | 1867 | ||
1604 | free(bufmgr_gem->exec2_objects); |
1868 | free(bufmgr_gem->exec2_objects); |
1605 | free(bufmgr_gem->exec_objects); |
- | |
Line 1606... | Line 1869... | ||
1606 | free(bufmgr_gem->exec_bos); |
1869 | free(bufmgr_gem->exec_objects); |
Line 1607... | Line 1870... | ||
1607 | free(bufmgr_gem->aub_filename); |
1870 | free(bufmgr_gem->exec_bos); |
1608 | 1871 | ||
Line 1671... | Line 1934... | ||
1671 | 1934 | ||
1672 | /* Check args */ |
1935 | /* Check args */ |
1673 | assert(offset <= bo->size - 4); |
1936 | assert(offset <= bo->size - 4); |
Line -... | Line 1937... | ||
- | 1937 | assert((write_domain & (write_domain - 1)) == 0); |
|
- | 1938 | ||
- | 1939 | /* An object needing a fence is a tiled buffer, so it won't have |
|
- | 1940 | * relocs to other buffers. |
|
- | 1941 | */ |
|
- | 1942 | if (need_fence) { |
|
- | 1943 | assert(target_bo_gem->reloc_count == 0); |
|
- | 1944 | target_bo_gem->reloc_tree_fences = 1; |
|
1674 | assert((write_domain & (write_domain - 1)) == 0); |
1945 | } |
1675 | 1946 | ||
1676 | /* Make sure that we're not adding a reloc to something whose size has |
1947 | /* Make sure that we're not adding a reloc to something whose size has |
1677 | * already been accounted for. |
1948 | * already been accounted for. |
1678 | */ |
1949 | */ |
1679 | assert(!bo_gem->used_as_reloc_target); |
1950 | assert(!bo_gem->used_as_reloc_target); |
1680 | if (target_bo_gem != bo_gem) { |
1951 | if (target_bo_gem != bo_gem) { |
1681 | target_bo_gem->used_as_reloc_target = true; |
- | |
1682 | bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size; |
- | |
1683 | } |
- | |
1684 | /* An object needing a fence is a tiled buffer, so it won't have |
- | |
1685 | * relocs to other buffers. |
- | |
1686 | */ |
- | |
1687 | if (need_fence) |
1952 | target_bo_gem->used_as_reloc_target = true; |
1688 | target_bo_gem->reloc_tree_fences = 1; |
1953 | bo_gem->reloc_tree_size += target_bo_gem->reloc_tree_size; |
1689 | bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences; |
- | |
1690 | - | ||
1691 | bo_gem->relocs[bo_gem->reloc_count].offset = offset; |
- | |
1692 | bo_gem->relocs[bo_gem->reloc_count].delta = target_offset; |
- | |
1693 | bo_gem->relocs[bo_gem->reloc_count].target_handle = |
- | |
1694 | target_bo_gem->gem_handle; |
- | |
1695 | bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains; |
- | |
Line 1696... | Line 1954... | ||
1696 | bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain; |
1954 | bo_gem->reloc_tree_fences += target_bo_gem->reloc_tree_fences; |
1697 | bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset64; |
1955 | } |
1698 | 1956 | ||
1699 | bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo; |
1957 | bo_gem->reloc_target_info[bo_gem->reloc_count].bo = target_bo; |
1700 | if (target_bo != bo) |
1958 | if (target_bo != bo) |
1701 | drm_intel_gem_bo_reference(target_bo); |
1959 | drm_intel_gem_bo_reference(target_bo); |
1702 | if (fenced_command) |
1960 | if (fenced_command) |
1703 | bo_gem->reloc_target_info[bo_gem->reloc_count].flags = |
1961 | bo_gem->reloc_target_info[bo_gem->reloc_count].flags = |
Line -... | Line 1962... | ||
- | 1962 | DRM_INTEL_RELOC_FENCE; |
|
- | 1963 | else |
|
- | 1964 | bo_gem->reloc_target_info[bo_gem->reloc_count].flags = 0; |
|
- | 1965 | ||
- | 1966 | bo_gem->relocs[bo_gem->reloc_count].offset = offset; |
|
- | 1967 | bo_gem->relocs[bo_gem->reloc_count].delta = target_offset; |
|
- | 1968 | bo_gem->relocs[bo_gem->reloc_count].target_handle = |
|
1704 | DRM_INTEL_RELOC_FENCE; |
1969 | target_bo_gem->gem_handle; |
Line 1705... | Line 1970... | ||
1705 | else |
1970 | bo_gem->relocs[bo_gem->reloc_count].read_domains = read_domains; |
1706 | bo_gem->reloc_target_info[bo_gem->reloc_count].flags = 0; |
1971 | bo_gem->relocs[bo_gem->reloc_count].write_domain = write_domain; |
Line -... | Line 1972... | ||
- | 1972 | bo_gem->relocs[bo_gem->reloc_count].presumed_offset = target_bo->offset64; |
|
- | 1973 | bo_gem->reloc_count++; |
|
- | 1974 | ||
- | 1975 | return 0; |
|
- | 1976 | } |
|
- | 1977 | ||
- | 1978 | static void |
|
- | 1979 | drm_intel_gem_bo_use_48b_address_range(drm_intel_bo *bo, uint32_t enable) |
|
- | 1980 | { |
|
- | 1981 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
|
- | 1982 | bo_gem->use_48b_address_range = enable; |
|
- | 1983 | } |
|
- | 1984 | ||
- | 1985 | static int |
|
- | 1986 | drm_intel_gem_bo_add_softpin_target(drm_intel_bo *bo, drm_intel_bo *target_bo) |
|
- | 1987 | { |
|
- | 1988 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
|
- | 1989 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
|
- | 1990 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) target_bo; |
|
- | 1991 | if (bo_gem->has_error) |
|
- | 1992 | return -ENOMEM; |
|
- | 1993 | ||
- | 1994 | if (target_bo_gem->has_error) { |
|
- | 1995 | bo_gem->has_error = true; |
|
- | 1996 | return -ENOMEM; |
|
- | 1997 | } |
|
- | 1998 | ||
- | 1999 | if (!target_bo_gem->is_softpin) |
|
- | 2000 | return -EINVAL; |
|
- | 2001 | if (target_bo_gem == bo_gem) |
|
- | 2002 | return -EINVAL; |
|
- | 2003 | ||
- | 2004 | if (bo_gem->softpin_target_count == bo_gem->softpin_target_size) { |
|
- | 2005 | int new_size = bo_gem->softpin_target_size * 2; |
|
- | 2006 | if (new_size == 0) |
|
- | 2007 | new_size = bufmgr_gem->max_relocs; |
|
- | 2008 | ||
- | 2009 | bo_gem->softpin_target = realloc(bo_gem->softpin_target, new_size * |
|
- | 2010 | sizeof(drm_intel_bo *)); |
|
- | 2011 | if (!bo_gem->softpin_target) |
|
- | 2012 | return -ENOMEM; |
|
- | 2013 | ||
- | 2014 | bo_gem->softpin_target_size = new_size; |
|
- | 2015 | } |
|
- | 2016 | bo_gem->softpin_target[bo_gem->softpin_target_count] = target_bo; |
|
1707 | 2017 | drm_intel_gem_bo_reference(target_bo); |
|
1708 | bo_gem->reloc_count++; |
2018 | bo_gem->softpin_target_count++; |
1709 | 2019 | ||
1710 | return 0; |
2020 | return 0; |
1711 | } |
2021 | } |
1712 | 2022 | ||
- | 2023 | static int |
|
Line -... | Line 2024... | ||
- | 2024 | drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset, |
|
- | 2025 | drm_intel_bo *target_bo, uint32_t target_offset, |
|
- | 2026 | uint32_t read_domains, uint32_t write_domain) |
|
1713 | static int |
2027 | { |
1714 | drm_intel_gem_bo_emit_reloc(drm_intel_bo *bo, uint32_t offset, |
2028 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; |
1715 | drm_intel_bo *target_bo, uint32_t target_offset, |
2029 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *)target_bo; |
1716 | uint32_t read_domains, uint32_t write_domain) |
2030 | |
Line 1750... | Line 2064... | ||
1750 | * batchbuffer including drm_intel_gem_get_reloc_count(), emit all the |
2064 | * batchbuffer including drm_intel_gem_get_reloc_count(), emit all the |
1751 | * state, and then check if it still fits in the aperture. |
2065 | * state, and then check if it still fits in the aperture. |
1752 | * |
2066 | * |
1753 | * Any further drm_intel_bufmgr_check_aperture_space() queries |
2067 | * Any further drm_intel_bufmgr_check_aperture_space() queries |
1754 | * involving this buffer in the tree are undefined after this call. |
2068 | * involving this buffer in the tree are undefined after this call. |
- | 2069 | * |
|
- | 2070 | * This also removes all softpinned targets being referenced by the BO. |
|
1755 | */ |
2071 | */ |
1756 | void |
2072 | void |
1757 | drm_intel_gem_bo_clear_relocs(drm_intel_bo *bo, int start) |
2073 | drm_intel_gem_bo_clear_relocs(drm_intel_bo *bo, int start) |
1758 | { |
2074 | { |
- | 2075 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
|
1759 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2076 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
1760 | int i; |
2077 | int i; |
1761 | // struct timespec time; |
2078 | struct timespec time; |
Line 1762... | Line 2079... | ||
1762 | 2079 | ||
Line 1763... | Line 2080... | ||
1763 | // clock_gettime(CLOCK_MONOTONIC, &time); |
2080 | clock_gettime(CLOCK_MONOTONIC, &time); |
- | 2081 | ||
1764 | 2082 | assert(bo_gem->reloc_count >= start); |
|
1765 | assert(bo_gem->reloc_count >= start); |
2083 | |
1766 | /* Unreference the cleared target buffers */ |
2084 | /* Unreference the cleared target buffers */ |
1767 | for (i = start; i < bo_gem->reloc_count; i++) { |
2085 | for (i = start; i < bo_gem->reloc_count; i++) { |
1768 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo; |
2086 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->reloc_target_info[i].bo; |
1769 | if (&target_bo_gem->bo != bo) { |
2087 | if (&target_bo_gem->bo != bo) { |
1770 | bo_gem->reloc_tree_fences -= target_bo_gem->reloc_tree_fences; |
2088 | bo_gem->reloc_tree_fences -= target_bo_gem->reloc_tree_fences; |
1771 | drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo, |
2089 | drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo, |
1772 | 0); |
2090 | time.tv_sec); |
1773 | } |
2091 | } |
- | 2092 | } |
|
- | 2093 | bo_gem->reloc_count = start; |
|
- | 2094 | ||
- | 2095 | for (i = 0; i < bo_gem->softpin_target_count; i++) { |
|
- | 2096 | drm_intel_bo_gem *target_bo_gem = (drm_intel_bo_gem *) bo_gem->softpin_target[i]; |
|
- | 2097 | drm_intel_gem_bo_unreference_locked_timed(&target_bo_gem->bo, time.tv_sec); |
|
1774 | } |
2098 | } |
Line 1775... | Line 2099... | ||
1775 | bo_gem->reloc_count = start; |
2099 | bo_gem->softpin_target_count = 0; |
1776 | } |
2100 | } |
1777 | 2101 | ||
Line 1809... | Line 2133... | ||
1809 | drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo) |
2133 | drm_intel_gem_bo_process_reloc2(drm_intel_bo *bo) |
1810 | { |
2134 | { |
1811 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
2135 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
1812 | int i; |
2136 | int i; |
Line 1813... | Line 2137... | ||
1813 | 2137 | ||
1814 | if (bo_gem->relocs == NULL) |
2138 | if (bo_gem->relocs == NULL && bo_gem->softpin_target == NULL) |
Line 1815... | Line 2139... | ||
1815 | return; |
2139 | return; |
1816 | 2140 | ||
1817 | for (i = 0; i < bo_gem->reloc_count; i++) { |
2141 | for (i = 0; i < bo_gem->reloc_count; i++) { |
Line 1830... | Line 2154... | ||
1830 | DRM_INTEL_RELOC_FENCE); |
2154 | DRM_INTEL_RELOC_FENCE); |
Line 1831... | Line 2155... | ||
1831 | 2155 | ||
1832 | /* Add the target to the validate list */ |
2156 | /* Add the target to the validate list */ |
1833 | drm_intel_add_validate_buffer2(target_bo, need_fence); |
2157 | drm_intel_add_validate_buffer2(target_bo, need_fence); |
- | 2158 | } |
|
- | 2159 | ||
- | 2160 | for (i = 0; i < bo_gem->softpin_target_count; i++) { |
|
- | 2161 | drm_intel_bo *target_bo = bo_gem->softpin_target[i]; |
|
- | 2162 | ||
- | 2163 | if (target_bo == bo) |
|
- | 2164 | continue; |
|
- | 2165 | ||
- | 2166 | drm_intel_gem_bo_mark_mmaps_incoherent(bo); |
|
- | 2167 | drm_intel_gem_bo_process_reloc2(target_bo); |
|
- | 2168 | drm_intel_add_validate_buffer2(target_bo, false); |
|
1834 | } |
2169 | } |
Line 1835... | Line 2170... | ||
1835 | } |
2170 | } |
1836 | 2171 | ||
Line 1844... | Line 2179... | ||
1844 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
2179 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
1845 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2180 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
Line 1846... | Line 2181... | ||
1846 | 2181 | ||
1847 | /* Update the buffer offset */ |
2182 | /* Update the buffer offset */ |
1848 | if (bufmgr_gem->exec_objects[i].offset != bo->offset64) { |
2183 | if (bufmgr_gem->exec_objects[i].offset != bo->offset64) { |
1849 | DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n", |
2184 | DBG("BO %d (%s) migrated: 0x%08x %08x -> 0x%08x %08x\n", |
- | 2185 | bo_gem->gem_handle, bo_gem->name, |
|
- | 2186 | upper_32_bits(bo->offset64), |
|
1850 | bo_gem->gem_handle, bo_gem->name, bo->offset64, |
2187 | lower_32_bits(bo->offset64), |
1851 | (unsigned long long)bufmgr_gem->exec_objects[i]. |
2188 | upper_32_bits(bufmgr_gem->exec_objects[i].offset), |
1852 | offset); |
2189 | lower_32_bits(bufmgr_gem->exec_objects[i].offset)); |
1853 | bo->offset64 = bufmgr_gem->exec_objects[i].offset; |
2190 | bo->offset64 = bufmgr_gem->exec_objects[i].offset; |
1854 | bo->offset = bufmgr_gem->exec_objects[i].offset; |
2191 | bo->offset = bufmgr_gem->exec_objects[i].offset; |
1855 | } |
2192 | } |
1856 | } |
2193 | } |
Line 1865... | Line 2202... | ||
1865 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
2202 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
1866 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
2203 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
Line 1867... | Line 2204... | ||
1867 | 2204 | ||
1868 | /* Update the buffer offset */ |
2205 | /* Update the buffer offset */ |
- | 2206 | if (bufmgr_gem->exec2_objects[i].offset != bo->offset64) { |
|
- | 2207 | /* If we're seeing softpinned object here it means that the kernel |
|
- | 2208 | * has relocated our object... Indicating a programming error |
|
- | 2209 | */ |
|
1869 | if (bufmgr_gem->exec2_objects[i].offset != bo->offset64) { |
2210 | assert(!bo_gem->is_softpin); |
1870 | DBG("BO %d (%s) migrated: 0x%08lx -> 0x%08llx\n", |
2211 | DBG("BO %d (%s) migrated: 0x%08x %08x -> 0x%08x %08x\n", |
- | 2212 | bo_gem->gem_handle, bo_gem->name, |
|
- | 2213 | upper_32_bits(bo->offset64), |
|
1871 | bo_gem->gem_handle, bo_gem->name, bo->offset64, |
2214 | lower_32_bits(bo->offset64), |
- | 2215 | upper_32_bits(bufmgr_gem->exec2_objects[i].offset), |
|
1872 | (unsigned long long)bufmgr_gem->exec2_objects[i].offset); |
2216 | lower_32_bits(bufmgr_gem->exec2_objects[i].offset)); |
1873 | bo->offset64 = bufmgr_gem->exec2_objects[i].offset; |
2217 | bo->offset64 = bufmgr_gem->exec2_objects[i].offset; |
1874 | bo->offset = bufmgr_gem->exec2_objects[i].offset; |
2218 | bo->offset = bufmgr_gem->exec2_objects[i].offset; |
1875 | } |
2219 | } |
1876 | } |
2220 | } |
Line 1877... | Line -... | ||
1877 | } |
- | |
1878 | - | ||
1879 | static void |
- | |
1880 | aub_out(drm_intel_bufmgr_gem *bufmgr_gem, uint32_t data) |
- | |
1881 | { |
- | |
1882 | fwrite(&data, 1, 4, bufmgr_gem->aub_file); |
- | |
1883 | } |
- | |
1884 | - | ||
1885 | static void |
- | |
1886 | aub_out_data(drm_intel_bufmgr_gem *bufmgr_gem, void *data, size_t size) |
- | |
1887 | { |
- | |
1888 | fwrite(data, 1, size, bufmgr_gem->aub_file); |
- | |
1889 | } |
- | |
1890 | - | ||
1891 | static void |
- | |
1892 | aub_write_bo_data(drm_intel_bo *bo, uint32_t offset, uint32_t size) |
- | |
1893 | { |
- | |
1894 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
- | |
1895 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
- | |
1896 | uint32_t *data; |
- | |
1897 | unsigned int i; |
- | |
1898 | - | ||
1899 | data = malloc(bo->size); |
- | |
1900 | drm_intel_bo_get_subdata(bo, offset, size, data); |
- | |
1901 | - | ||
1902 | /* Easy mode: write out bo with no relocations */ |
- | |
1903 | if (!bo_gem->reloc_count) { |
- | |
1904 | aub_out_data(bufmgr_gem, data, size); |
- | |
1905 | free(data); |
- | |
1906 | return; |
- | |
1907 | } |
- | |
1908 | - | ||
1909 | /* Otherwise, handle the relocations while writing. */ |
- | |
1910 | for (i = 0; i < size / 4; i++) { |
- | |
1911 | int r; |
- | |
1912 | for (r = 0; r < bo_gem->reloc_count; r++) { |
- | |
1913 | struct drm_i915_gem_relocation_entry *reloc; |
- | |
1914 | drm_intel_reloc_target *info; |
- | |
1915 | - | ||
1916 | reloc = &bo_gem->relocs[r]; |
- | |
1917 | info = &bo_gem->reloc_target_info[r]; |
- | |
1918 | - | ||
1919 | if (reloc->offset == offset + i * 4) { |
- | |
1920 | drm_intel_bo_gem *target_gem; |
- | |
1921 | uint32_t val; |
- | |
1922 | - | ||
1923 | target_gem = (drm_intel_bo_gem *)info->bo; |
- | |
1924 | - | ||
1925 | val = reloc->delta; |
- | |
1926 | val += target_gem->aub_offset; |
- | |
1927 | - | ||
1928 | aub_out(bufmgr_gem, val); |
- | |
1929 | data[i] = val; |
- | |
1930 | break; |
- | |
1931 | } |
- | |
1932 | } |
- | |
1933 | if (r == bo_gem->reloc_count) { |
- | |
1934 | /* no relocation, just the data */ |
- | |
1935 | aub_out(bufmgr_gem, data[i]); |
- | |
1936 | } |
- | |
1937 | } |
- | |
1938 | - | ||
1939 | free(data); |
- | |
1940 | } |
- | |
1941 | - | ||
1942 | static void |
- | |
1943 | aub_bo_get_address(drm_intel_bo *bo) |
- | |
1944 | { |
- | |
1945 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
- | |
1946 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
- | |
1947 | - | ||
1948 | /* Give the object a graphics address in the AUB file. We |
- | |
1949 | * don't just use the GEM object address because we do AUB |
- | |
1950 | * dumping before execution -- we want to successfully log |
- | |
1951 | * when the hardware might hang, and we might even want to aub |
- | |
1952 | * capture for a driver trying to execute on a different |
- | |
1953 | * generation of hardware by disabling the actual kernel exec |
- | |
1954 | * call. |
- | |
1955 | */ |
- | |
1956 | bo_gem->aub_offset = bufmgr_gem->aub_offset; |
- | |
1957 | bufmgr_gem->aub_offset += bo->size; |
- | |
1958 | /* XXX: Handle aperture overflow. */ |
- | |
1959 | assert(bufmgr_gem->aub_offset < 256 * 1024 * 1024); |
- | |
1960 | } |
- | |
1961 | - | ||
1962 | static void |
- | |
1963 | aub_write_trace_block(drm_intel_bo *bo, uint32_t type, uint32_t subtype, |
- | |
1964 | uint32_t offset, uint32_t size) |
- | |
1965 | { |
- | |
1966 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
- | |
1967 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
- | |
1968 | - | ||
1969 | aub_out(bufmgr_gem, |
- | |
1970 | CMD_AUB_TRACE_HEADER_BLOCK | |
- | |
1971 | ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2)); |
- | |
1972 | aub_out(bufmgr_gem, |
- | |
1973 | AUB_TRACE_MEMTYPE_GTT | type | AUB_TRACE_OP_DATA_WRITE); |
- | |
1974 | aub_out(bufmgr_gem, subtype); |
- | |
1975 | aub_out(bufmgr_gem, bo_gem->aub_offset + offset); |
- | |
1976 | aub_out(bufmgr_gem, size); |
- | |
1977 | if (bufmgr_gem->gen >= 8) |
- | |
1978 | aub_out(bufmgr_gem, 0); |
- | |
1979 | aub_write_bo_data(bo, offset, size); |
- | |
1980 | } |
- | |
1981 | - | ||
1982 | /** |
- | |
1983 | * Break up large objects into multiple writes. Otherwise a 128kb VBO |
- | |
1984 | * would overflow the 16 bits of size field in the packet header and |
- | |
1985 | * everything goes badly after that. |
- | |
1986 | */ |
- | |
1987 | static void |
- | |
1988 | aub_write_large_trace_block(drm_intel_bo *bo, uint32_t type, uint32_t subtype, |
- | |
1989 | uint32_t offset, uint32_t size) |
- | |
1990 | { |
- | |
1991 | uint32_t block_size; |
- | |
1992 | uint32_t sub_offset; |
- | |
1993 | - | ||
1994 | for (sub_offset = 0; sub_offset < size; sub_offset += block_size) { |
- | |
1995 | block_size = size - sub_offset; |
- | |
1996 | - | ||
1997 | if (block_size > 8 * 4096) |
- | |
1998 | block_size = 8 * 4096; |
- | |
1999 | - | ||
2000 | aub_write_trace_block(bo, type, subtype, offset + sub_offset, |
- | |
2001 | block_size); |
- | |
2002 | } |
- | |
2003 | } |
- | |
2004 | - | ||
2005 | static void |
- | |
2006 | aub_write_bo(drm_intel_bo *bo) |
- | |
2007 | { |
- | |
2008 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
- | |
2009 | uint32_t offset = 0; |
- | |
2010 | unsigned i; |
- | |
2011 | - | ||
2012 | aub_bo_get_address(bo); |
- | |
2013 | - | ||
2014 | /* Write out each annotated section separately. */ |
- | |
2015 | for (i = 0; i < bo_gem->aub_annotation_count; ++i) { |
- | |
2016 | drm_intel_aub_annotation *annotation = |
- | |
2017 | &bo_gem->aub_annotations[i]; |
- | |
2018 | uint32_t ending_offset = annotation->ending_offset; |
- | |
2019 | if (ending_offset > bo->size) |
- | |
2020 | ending_offset = bo->size; |
- | |
2021 | if (ending_offset > offset) { |
- | |
2022 | aub_write_large_trace_block(bo, annotation->type, |
- | |
2023 | annotation->subtype, |
- | |
2024 | offset, |
- | |
2025 | ending_offset - offset); |
- | |
2026 | offset = ending_offset; |
- | |
2027 | } |
- | |
2028 | } |
- | |
2029 | - | ||
2030 | /* Write out any remaining unannotated data */ |
- | |
2031 | if (offset < bo->size) { |
- | |
2032 | aub_write_large_trace_block(bo, AUB_TRACE_TYPE_NOTYPE, 0, |
- | |
2033 | offset, bo->size - offset); |
- | |
2034 | } |
- | |
2035 | } |
- | |
2036 | - | ||
2037 | /* |
- | |
2038 | * Make a ringbuffer on fly and dump it |
- | |
2039 | */ |
- | |
2040 | static void |
- | |
2041 | aub_build_dump_ringbuffer(drm_intel_bufmgr_gem *bufmgr_gem, |
- | |
2042 | uint32_t batch_buffer, int ring_flag) |
- | |
2043 | { |
- | |
2044 | uint32_t ringbuffer[4096]; |
- | |
2045 | int ring = AUB_TRACE_TYPE_RING_PRB0; /* The default ring */ |
- | |
2046 | int ring_count = 0; |
- | |
2047 | - | ||
2048 | if (ring_flag == I915_EXEC_BSD) |
- | |
2049 | ring = AUB_TRACE_TYPE_RING_PRB1; |
- | |
2050 | else if (ring_flag == I915_EXEC_BLT) |
- | |
2051 | ring = AUB_TRACE_TYPE_RING_PRB2; |
- | |
2052 | - | ||
2053 | /* Make a ring buffer to execute our batchbuffer. */ |
- | |
2054 | memset(ringbuffer, 0, sizeof(ringbuffer)); |
- | |
2055 | if (bufmgr_gem->gen >= 8) { |
- | |
2056 | ringbuffer[ring_count++] = AUB_MI_BATCH_BUFFER_START | (3 - 2); |
- | |
2057 | ringbuffer[ring_count++] = batch_buffer; |
- | |
2058 | ringbuffer[ring_count++] = 0; |
- | |
2059 | } else { |
- | |
2060 | ringbuffer[ring_count++] = AUB_MI_BATCH_BUFFER_START; |
- | |
2061 | ringbuffer[ring_count++] = batch_buffer; |
- | |
2062 | } |
- | |
2063 | - | ||
2064 | /* Write out the ring. This appears to trigger execution of |
- | |
2065 | * the ring in the simulator. |
- | |
2066 | */ |
- | |
2067 | aub_out(bufmgr_gem, |
- | |
2068 | CMD_AUB_TRACE_HEADER_BLOCK | |
- | |
2069 | ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2)); |
- | |
2070 | aub_out(bufmgr_gem, |
- | |
2071 | AUB_TRACE_MEMTYPE_GTT | ring | AUB_TRACE_OP_COMMAND_WRITE); |
- | |
2072 | aub_out(bufmgr_gem, 0); /* general/surface subtype */ |
- | |
2073 | aub_out(bufmgr_gem, bufmgr_gem->aub_offset); |
- | |
2074 | aub_out(bufmgr_gem, ring_count * 4); |
- | |
2075 | if (bufmgr_gem->gen >= 8) |
- | |
2076 | aub_out(bufmgr_gem, 0); |
- | |
2077 | - | ||
2078 | /* FIXME: Need some flush operations here? */ |
- | |
2079 | aub_out_data(bufmgr_gem, ringbuffer, ring_count * 4); |
- | |
2080 | - | ||
2081 | /* Update offset pointer */ |
- | |
2082 | bufmgr_gem->aub_offset += 4096; |
- | |
2083 | } |
2221 | } |
2084 | 2222 | ||
2085 | void |
2223 | void |
2086 | drm_intel_gem_bo_aub_dump_bmp(drm_intel_bo *bo, |
2224 | drm_intel_gem_bo_aub_dump_bmp(drm_intel_bo *bo, |
2087 | int x1, int y1, int width, int height, |
2225 | int x1, int y1, int width, int height, |
2088 | enum aub_dump_bmp_format format, |
2226 | enum aub_dump_bmp_format format, |
2089 | int pitch, int offset) |
- | |
2090 | { |
- | |
2091 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
- | |
2092 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
- | |
2093 | uint32_t cpp; |
- | |
2094 | - | ||
2095 | switch (format) { |
- | |
2096 | case AUB_DUMP_BMP_FORMAT_8BIT: |
- | |
2097 | cpp = 1; |
- | |
2098 | break; |
- | |
2099 | case AUB_DUMP_BMP_FORMAT_ARGB_4444: |
- | |
2100 | cpp = 2; |
- | |
2101 | break; |
- | |
2102 | case AUB_DUMP_BMP_FORMAT_ARGB_0888: |
- | |
2103 | case AUB_DUMP_BMP_FORMAT_ARGB_8888: |
- | |
2104 | cpp = 4; |
- | |
2105 | break; |
- | |
2106 | default: |
- | |
2107 | printf("Unknown AUB dump format %d\n", format); |
- | |
2108 | return; |
- | |
2109 | } |
- | |
2110 | - | ||
2111 | if (!bufmgr_gem->aub_file) |
- | |
2112 | return; |
- | |
2113 | - | ||
2114 | aub_out(bufmgr_gem, CMD_AUB_DUMP_BMP | 4); |
- | |
2115 | aub_out(bufmgr_gem, (y1 << 16) | x1); |
- | |
2116 | aub_out(bufmgr_gem, |
- | |
2117 | (format << 24) | |
- | |
2118 | (cpp << 19) | |
- | |
2119 | pitch / 4); |
- | |
2120 | aub_out(bufmgr_gem, (height << 16) | width); |
- | |
2121 | aub_out(bufmgr_gem, bo_gem->aub_offset + offset); |
- | |
2122 | aub_out(bufmgr_gem, |
- | |
2123 | ((bo_gem->tiling_mode != I915_TILING_NONE) ? (1 << 2) : 0) | |
2227 | int pitch, int offset) |
Line 2124... | Line 2228... | ||
2124 | ((bo_gem->tiling_mode == I915_TILING_Y) ? (1 << 3) : 0)); |
2228 | { |
2125 | } |
2229 | } |
- | 2230 | ||
2126 | 2231 | static int |
|
2127 | static void |
2232 | drm_intel_gem_bo_exec(drm_intel_bo *bo, int used, |
2128 | aub_exec(drm_intel_bo *bo, int ring_flag, int used) |
2233 | drm_clip_rect_t * cliprects, int num_cliprects, int DR4) |
2129 | { |
2234 | { |
2130 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
- | |
Line 2131... | Line 2235... | ||
2131 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2235 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2132 | int i; |
2236 | struct drm_i915_gem_execbuffer execbuf; |
Line -... | Line 2237... | ||
- | 2237 | int ret, i; |
|
- | 2238 | ||
- | 2239 | if (to_bo_gem(bo)->has_error) |
|
2133 | bool batch_buffer_needs_annotations; |
2240 | return -ENOMEM; |
2134 | 2241 | ||
2135 | if (!bufmgr_gem->aub_file) |
2242 | /* Update indices and set up the validate list. */ |
2136 | return; |
- | |
2137 | - | ||
2138 | /* If batch buffer is not annotated, annotate it the best we |
2243 | drm_intel_gem_bo_process_reloc(bo); |
2139 | * can. |
- | |
2140 | */ |
- | |
2141 | batch_buffer_needs_annotations = bo_gem->aub_annotation_count == 0; |
- | |
2142 | if (batch_buffer_needs_annotations) { |
- | |
2143 | drm_intel_aub_annotation annotations[2] = { |
- | |
Line -... | Line 2244... | ||
- | 2244 | ||
2144 | { AUB_TRACE_TYPE_BATCH, 0, used }, |
2245 | /* Add the batch buffer to the validation list. There are no |
2145 | { AUB_TRACE_TYPE_NOTYPE, 0, bo->size } |
2246 | * relocations pointing to it. |
- | 2247 | */ |
|
- | 2248 | drm_intel_add_validate_buffer(bo); |
|
- | 2249 | ||
- | 2250 | memclear(execbuf); |
|
- | 2251 | execbuf.buffers_ptr = (uintptr_t) bufmgr_gem->exec_objects; |
|
- | 2252 | execbuf.buffer_count = bufmgr_gem->exec_count; |
|
- | 2253 | execbuf.batch_start_offset = 0; |
|
- | 2254 | execbuf.batch_len = used; |
|
- | 2255 | execbuf.cliprects_ptr = (uintptr_t) cliprects; |
|
- | 2256 | execbuf.num_cliprects = num_cliprects; |
|
- | 2257 | execbuf.DR1 = 0; |
|
- | 2258 | execbuf.DR4 = DR4; |
|
- | 2259 | ||
- | 2260 | ret = drmIoctl(bufmgr_gem->fd, |
|
- | 2261 | DRM_IOCTL_I915_GEM_EXECBUFFER, |
|
- | 2262 | &execbuf); |
|
- | 2263 | if (ret != 0) { |
|
- | 2264 | ret = -errno; |
|
- | 2265 | if (errno == ENOSPC) { |
|
- | 2266 | DBG("Execbuffer fails to pin. " |
|
- | 2267 | "Estimate: %u. Actual: %u. Available: %u\n", |
|
2146 | }; |
2268 | drm_intel_gem_estimate_batch_space(bufmgr_gem->exec_bos, |
2147 | drm_intel_bufmgr_gem_set_aub_annotations(bo, annotations, 2); |
2269 | bufmgr_gem-> |
- | 2270 | exec_count), |
|
- | 2271 | drm_intel_gem_compute_batch_space(bufmgr_gem->exec_bos, |
|
Line 2148... | Line -... | ||
2148 | } |
- | |
2149 | 2272 | bufmgr_gem-> |
|
2150 | /* Write out all buffers to AUB memory */ |
2273 | exec_count), |
Line 2151... | Line 2274... | ||
2151 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
2274 | (unsigned int)bufmgr_gem->gtt_size); |
2152 | aub_write_bo(bufmgr_gem->exec_bos[i]); |
2275 | } |
Line 2153... | Line 2276... | ||
2153 | } |
2276 | } |
Line 2154... | Line -... | ||
2154 | - | ||
2155 | /* Remove any annotations we added */ |
2277 | drm_intel_update_buffer_offsets(bufmgr_gem); |
2156 | if (batch_buffer_needs_annotations) |
- | |
2157 | drm_intel_bufmgr_gem_set_aub_annotations(bo, NULL, 0); |
2278 | |
2158 | - | ||
2159 | /* Dump ring buffer */ |
2279 | if (bufmgr_gem->bufmgr.debug) |
2160 | aub_build_dump_ringbuffer(bufmgr_gem, bo_gem->aub_offset, ring_flag); |
2280 | drm_intel_gem_dump_validation_list(bufmgr_gem); |
- | 2281 | ||
Line -... | Line 2282... | ||
- | 2282 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
|
- | 2283 | drm_intel_bo_gem *bo_gem = to_bo_gem(bufmgr_gem->exec_bos[i]); |
|
Line 2161... | Line 2284... | ||
2161 | 2284 | ||
2162 | fflush(bufmgr_gem->aub_file); |
2285 | bo_gem->idle = false; |
2163 | 2286 | ||
2164 | /* |
2287 | /* Disconnect the buffer from the validate list */ |
Line 2178... | Line 2301... | ||
2178 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; |
2301 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bo->bufmgr; |
2179 | struct drm_i915_gem_execbuffer2 execbuf; |
2302 | struct drm_i915_gem_execbuffer2 execbuf; |
2180 | int ret = 0; |
2303 | int ret = 0; |
2181 | int i; |
2304 | int i; |
Line -... | Line 2305... | ||
- | 2305 | ||
- | 2306 | if (to_bo_gem(bo)->has_error) |
|
- | 2307 | return -ENOMEM; |
|
2182 | 2308 | ||
2183 | switch (flags & 0x7) { |
2309 | switch (flags & 0x7) { |
2184 | default: |
2310 | default: |
2185 | return -EINVAL; |
2311 | return -EINVAL; |
2186 | case I915_EXEC_BLT: |
2312 | case I915_EXEC_BLT: |
Line 2207... | Line 2333... | ||
2207 | /* Add the batch buffer to the validation list. There are no relocations |
2333 | /* Add the batch buffer to the validation list. There are no relocations |
2208 | * pointing to it. |
2334 | * pointing to it. |
2209 | */ |
2335 | */ |
2210 | drm_intel_add_validate_buffer2(bo, 0); |
2336 | drm_intel_add_validate_buffer2(bo, 0); |
Line 2211... | Line 2337... | ||
2211 | 2337 | ||
2212 | VG_CLEAR(execbuf); |
2338 | memclear(execbuf); |
2213 | execbuf.buffers_ptr = (uintptr_t)bufmgr_gem->exec2_objects; |
2339 | execbuf.buffers_ptr = (uintptr_t)bufmgr_gem->exec2_objects; |
2214 | execbuf.buffer_count = bufmgr_gem->exec_count; |
2340 | execbuf.buffer_count = bufmgr_gem->exec_count; |
2215 | execbuf.batch_start_offset = 0; |
2341 | execbuf.batch_start_offset = 0; |
2216 | execbuf.batch_len = used; |
2342 | execbuf.batch_len = used; |
Line 2223... | Line 2349... | ||
2223 | i915_execbuffer2_set_context_id(execbuf, 0); |
2349 | i915_execbuffer2_set_context_id(execbuf, 0); |
2224 | else |
2350 | else |
2225 | i915_execbuffer2_set_context_id(execbuf, ctx->ctx_id); |
2351 | i915_execbuffer2_set_context_id(execbuf, ctx->ctx_id); |
2226 | execbuf.rsvd2 = 0; |
2352 | execbuf.rsvd2 = 0; |
Line 2227... | Line -... | ||
2227 | - | ||
2228 | aub_exec(bo, flags, used); |
- | |
2229 | 2353 | ||
2230 | if (bufmgr_gem->no_exec) |
2354 | if (bufmgr_gem->no_exec) |
Line 2231... | Line 2355... | ||
2231 | goto skip_execution; |
2355 | goto skip_execution; |
2232 | 2356 | ||
Line 2250... | Line 2374... | ||
2250 | skip_execution: |
2374 | skip_execution: |
2251 | if (bufmgr_gem->bufmgr.debug) |
2375 | if (bufmgr_gem->bufmgr.debug) |
2252 | drm_intel_gem_dump_validation_list(bufmgr_gem); |
2376 | drm_intel_gem_dump_validation_list(bufmgr_gem); |
Line 2253... | Line 2377... | ||
2253 | 2377 | ||
2254 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
2378 | for (i = 0; i < bufmgr_gem->exec_count; i++) { |
2255 | drm_intel_bo *bo = bufmgr_gem->exec_bos[i]; |
- | |
Line 2256... | Line 2379... | ||
2256 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *)bo; |
2379 | drm_intel_bo_gem *bo_gem = to_bo_gem(bufmgr_gem->exec_bos[i]); |
Line 2257... | Line 2380... | ||
2257 | 2380 | ||
2258 | bo_gem->idle = false; |
2381 | bo_gem->idle = false; |
Line 2298... | Line 2421... | ||
2298 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2421 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2299 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2422 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2300 | struct drm_i915_gem_pin pin; |
2423 | struct drm_i915_gem_pin pin; |
2301 | int ret; |
2424 | int ret; |
Line 2302... | Line 2425... | ||
2302 | 2425 | ||
2303 | VG_CLEAR(pin); |
2426 | memclear(pin); |
2304 | pin.handle = bo_gem->gem_handle; |
2427 | pin.handle = bo_gem->gem_handle; |
Line 2305... | Line 2428... | ||
2305 | pin.alignment = alignment; |
2428 | pin.alignment = alignment; |
2306 | 2429 | ||
Line 2321... | Line 2444... | ||
2321 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2444 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2322 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2445 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2323 | struct drm_i915_gem_unpin unpin; |
2446 | struct drm_i915_gem_unpin unpin; |
2324 | int ret; |
2447 | int ret; |
Line 2325... | Line 2448... | ||
2325 | 2448 | ||
2326 | VG_CLEAR(unpin); |
2449 | memclear(unpin); |
Line 2327... | Line 2450... | ||
2327 | unpin.handle = bo_gem->gem_handle; |
2450 | unpin.handle = bo_gem->gem_handle; |
2328 | 2451 | ||
2329 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin); |
2452 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_UNPIN, &unpin); |
Line 2377... | Line 2500... | ||
2377 | { |
2500 | { |
2378 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2501 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; |
2379 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2502 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
2380 | int ret; |
2503 | int ret; |
Line -... | Line 2504... | ||
- | 2504 | ||
- | 2505 | /* Tiling with userptr surfaces is not supported |
|
- | 2506 | * on all hardware so refuse it for time being. |
|
- | 2507 | */ |
|
- | 2508 | if (bo_gem->is_userptr) |
|
- | 2509 | return -EINVAL; |
|
2381 | 2510 | ||
2382 | /* Linear buffers have no stride. By ensuring that we only ever use |
2511 | /* Linear buffers have no stride. By ensuring that we only ever use |
2383 | * stride 0 with linear buffers, we simplify our code. |
2512 | * stride 0 with linear buffers, we simplify our code. |
2384 | */ |
2513 | */ |
2385 | if (*tiling_mode == I915_TILING_NONE) |
2514 | if (*tiling_mode == I915_TILING_NONE) |
Line 2386... | Line 2515... | ||
2386 | stride = 0; |
2515 | stride = 0; |
2387 | 2516 | ||
2388 | ret = drm_intel_gem_bo_set_tiling_internal(bo, *tiling_mode, stride); |
2517 | ret = drm_intel_gem_bo_set_tiling_internal(bo, *tiling_mode, stride); |
Line 2389... | Line 2518... | ||
2389 | if (ret == 0) |
2518 | if (ret == 0) |
2390 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem); |
2519 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
2391 | 2520 | ||
Line 2402... | Line 2531... | ||
2402 | *tiling_mode = bo_gem->tiling_mode; |
2531 | *tiling_mode = bo_gem->tiling_mode; |
2403 | *swizzle_mode = bo_gem->swizzle_mode; |
2532 | *swizzle_mode = bo_gem->swizzle_mode; |
2404 | return 0; |
2533 | return 0; |
2405 | } |
2534 | } |
Line -... | Line 2535... | ||
- | 2535 | ||
- | 2536 | static int |
|
- | 2537 | drm_intel_gem_bo_set_softpin_offset(drm_intel_bo *bo, uint64_t offset) |
|
- | 2538 | { |
|
- | 2539 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
|
- | 2540 | ||
- | 2541 | bo_gem->is_softpin = true; |
|
- | 2542 | bo->offset64 = offset; |
|
- | 2543 | bo->offset = offset; |
|
- | 2544 | return 0; |
|
2406 | 2545 | } |
|
2407 | #if 0 |
2546 | #if 0 |
2408 | drm_intel_bo * |
2547 | drm_intel_bo * |
2409 | drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr *bufmgr, int prime_fd, int size) |
2548 | drm_intel_bo_gem_create_from_prime(drm_intel_bufmgr *bufmgr, int prime_fd, int size) |
2410 | { |
2549 | { |
Line 2414... | Line 2553... | ||
2414 | drm_intel_bo_gem *bo_gem; |
2553 | drm_intel_bo_gem *bo_gem; |
2415 | struct drm_i915_gem_get_tiling get_tiling; |
2554 | struct drm_i915_gem_get_tiling get_tiling; |
2416 | drmMMListHead *list; |
2555 | drmMMListHead *list; |
Line 2417... | Line 2556... | ||
2417 | 2556 | ||
- | 2557 | ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle); |
|
- | 2558 | if (ret) { |
|
- | 2559 | DBG("create_from_prime: failed to obtain handle from fd: %s\n", strerror(errno)); |
|
- | 2560 | pthread_mutex_unlock(&bufmgr_gem->lock); |
|
- | 2561 | return NULL; |
|
Line 2418... | Line 2562... | ||
2418 | ret = drmPrimeFDToHandle(bufmgr_gem->fd, prime_fd, &handle); |
2562 | } |
2419 | 2563 | ||
2420 | /* |
2564 | /* |
2421 | * See if the kernel has already returned this buffer to us. Just as |
2565 | * See if the kernel has already returned this buffer to us. Just as |
Line 2430... | Line 2574... | ||
2430 | drm_intel_gem_bo_reference(&bo_gem->bo); |
2574 | drm_intel_gem_bo_reference(&bo_gem->bo); |
2431 | return &bo_gem->bo; |
2575 | return &bo_gem->bo; |
2432 | } |
2576 | } |
2433 | } |
2577 | } |
Line 2434... | Line -... | ||
2434 | - | ||
2435 | if (ret) { |
- | |
2436 | fprintf(stderr,"ret is %d %d\n", ret, errno); |
- | |
2437 | return NULL; |
- | |
2438 | } |
- | |
2439 | 2578 | ||
2440 | bo_gem = calloc(1, sizeof(*bo_gem)); |
2579 | bo_gem = calloc(1, sizeof(*bo_gem)); |
2441 | if (!bo_gem) |
2580 | if (!bo_gem) { |
2442 | return NULL; |
2581 | return NULL; |
2443 | 2582 | } |
|
2444 | /* Determine size of bo. The fd-to-handle ioctl really should |
2583 | /* Determine size of bo. The fd-to-handle ioctl really should |
2445 | * return the size, but it doesn't. If we have kernel 3.12 or |
2584 | * return the size, but it doesn't. If we have kernel 3.12 or |
2446 | * later, we can lseek on the prime fd to get the size. Older |
2585 | * later, we can lseek on the prime fd to get the size. Older |
2447 | * kernels will just fail, in which case we fall back to the |
2586 | * kernels will just fail, in which case we fall back to the |
Line 2463... | Line 2602... | ||
2463 | bo_gem->validate_index = -1; |
2602 | bo_gem->validate_index = -1; |
2464 | bo_gem->reloc_tree_fences = 0; |
2603 | bo_gem->reloc_tree_fences = 0; |
2465 | bo_gem->used_as_reloc_target = false; |
2604 | bo_gem->used_as_reloc_target = false; |
2466 | bo_gem->has_error = false; |
2605 | bo_gem->has_error = false; |
2467 | bo_gem->reusable = false; |
2606 | bo_gem->reusable = false; |
- | 2607 | bo_gem->use_48b_address_range = false; |
|
Line 2468... | Line 2608... | ||
2468 | 2608 | ||
2469 | DRMINITLISTHEAD(&bo_gem->vma_list); |
2609 | DRMINITLISTHEAD(&bo_gem->vma_list); |
Line 2470... | Line 2610... | ||
2470 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2610 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2471 | 2611 | ||
2472 | VG_CLEAR(get_tiling); |
2612 | memclear(get_tiling); |
2473 | get_tiling.handle = bo_gem->gem_handle; |
2613 | get_tiling.handle = bo_gem->gem_handle; |
2474 | ret = drmIoctl(bufmgr_gem->fd, |
2614 | ret = drmIoctl(bufmgr_gem->fd, |
2475 | DRM_IOCTL_I915_GEM_GET_TILING, |
2615 | DRM_IOCTL_I915_GEM_GET_TILING, |
- | 2616 | &get_tiling); |
|
2476 | &get_tiling); |
2617 | if (ret != 0) { |
2477 | if (ret != 0) { |
2618 | DBG("create_from_prime: failed to get tiling: %s\n", strerror(errno)); |
2478 | drm_intel_gem_bo_unreference(&bo_gem->bo); |
2619 | drm_intel_gem_bo_unreference(&bo_gem->bo); |
2479 | return NULL; |
2620 | return NULL; |
2480 | } |
2621 | } |
2481 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
2622 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
2482 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
2623 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
Line 2483... | Line 2624... | ||
2483 | /* XXX stride is unknown */ |
2624 | /* XXX stride is unknown */ |
2484 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem); |
2625 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
Line 2485... | Line 2626... | ||
2485 | 2626 | ||
Line 2513... | Line 2654... | ||
2513 | int ret; |
2654 | int ret; |
Line 2514... | Line 2655... | ||
2514 | 2655 | ||
2515 | if (!bo_gem->global_name) { |
2656 | if (!bo_gem->global_name) { |
Line 2516... | Line 2657... | ||
2516 | struct drm_gem_flink flink; |
2657 | struct drm_gem_flink flink; |
2517 | 2658 | ||
Line 2518... | Line 2659... | ||
2518 | VG_CLEAR(flink); |
2659 | memclear(flink); |
2519 | flink.handle = bo_gem->gem_handle; |
2660 | flink.handle = bo_gem->gem_handle; |
2520 | 2661 | ||
Line 2525... | Line 2666... | ||
2525 | bo_gem->global_name = flink.name; |
2666 | bo_gem->global_name = flink.name; |
2526 | bo_gem->reusable = false; |
2667 | bo_gem->reusable = false; |
Line 2527... | Line 2668... | ||
2527 | 2668 | ||
2528 | if (DRMLISTEMPTY(&bo_gem->name_list)) |
2669 | if (DRMLISTEMPTY(&bo_gem->name_list)) |
- | 2670 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
|
2529 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
2671 | |
Line 2530... | Line 2672... | ||
2530 | } |
2672 | } |
2531 | 2673 | ||
2532 | *name = bo_gem->global_name; |
2674 | *name = bo_gem->global_name; |
Line 2770... | Line 2912... | ||
2770 | if (_drm_intel_gem_bo_references(bo_gem->reloc_target_info[i].bo, |
2912 | if (_drm_intel_gem_bo_references(bo_gem->reloc_target_info[i].bo, |
2771 | target_bo)) |
2913 | target_bo)) |
2772 | return 1; |
2914 | return 1; |
2773 | } |
2915 | } |
Line -... | Line 2916... | ||
- | 2916 | ||
- | 2917 | for (i = 0; i< bo_gem->softpin_target_count; i++) { |
|
- | 2918 | if (bo_gem->softpin_target[i] == target_bo) |
|
- | 2919 | return 1; |
|
- | 2920 | if (_drm_intel_gem_bo_references(bo_gem->softpin_target[i], target_bo)) |
|
- | 2921 | return 1; |
|
- | 2922 | } |
|
2774 | 2923 | ||
2775 | return 0; |
2924 | return 0; |
Line 2776... | Line 2925... | ||
2776 | } |
2925 | } |
2777 | 2926 | ||
Line 2843... | Line 2992... | ||
2843 | */ |
2992 | */ |
2844 | static int |
2993 | static int |
2845 | get_pci_device_id(drm_intel_bufmgr_gem *bufmgr_gem) |
2994 | get_pci_device_id(drm_intel_bufmgr_gem *bufmgr_gem) |
2846 | { |
2995 | { |
2847 | char *devid_override; |
2996 | char *devid_override; |
2848 | int devid; |
2997 | int devid = 0; |
2849 | int ret; |
2998 | int ret; |
2850 | drm_i915_getparam_t gp; |
2999 | drm_i915_getparam_t gp; |
Line 2851... | Line -... | ||
2851 | - | ||
2852 | VG_CLEAR(devid); |
3000 | |
2853 | VG_CLEAR(gp); |
3001 | memclear(gp); |
2854 | gp.param = I915_PARAM_CHIPSET_ID; |
3002 | gp.param = I915_PARAM_CHIPSET_ID; |
2855 | gp.value = &devid; |
3003 | gp.value = &devid; |
2856 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
3004 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
2857 | if (ret) { |
3005 | if (ret) { |
Line 2868... | Line 3016... | ||
2868 | 3016 | ||
2869 | return bufmgr_gem->pci_device; |
3017 | return bufmgr_gem->pci_device; |
Line 2870... | Line 3018... | ||
2870 | } |
3018 | } |
- | 3019 | ||
- | 3020 | /** |
|
- | 3021 | * Sets the AUB filename. |
|
- | 3022 | * |
|
- | 3023 | * This function has to be called before drm_intel_bufmgr_gem_set_aub_dump() |
|
- | 3024 | * for it to have any effect. |
|
- | 3025 | */ |
|
- | 3026 | void |
|
- | 3027 | drm_intel_bufmgr_gem_set_aub_filename(drm_intel_bufmgr *bufmgr, |
|
- | 3028 | const char *filename) |
|
- | 3029 | { |
|
- | 3030 | } |
|
2871 | 3031 | ||
2872 | /** |
3032 | /** |
2873 | * Sets up AUB dumping. |
3033 | * Sets up AUB dumping. |
2874 | * |
3034 | * |
2875 | * This is a trace file format that can be used with the simulator. |
3035 | * This is a trace file format that can be used with the simulator. |
2876 | * Packets are emitted in a format somewhat like GPU command packets. |
3036 | * Packets are emitted in a format somewhat like GPU command packets. |
2877 | * You can set up a GTT and upload your objects into the referenced |
3037 | * You can set up a GTT and upload your objects into the referenced |
2878 | * space, then send off batchbuffers and get BMPs out the other end. |
3038 | * space, then send off batchbuffers and get BMPs out the other end. |
2879 | */ |
3039 | */ |
2880 | void |
3040 | void |
2881 | drm_intel_bufmgr_gem_set_aub_dump(drm_intel_bufmgr *bufmgr, int enable) |
3041 | drm_intel_bufmgr_gem_set_aub_dump(drm_intel_bufmgr *bufmgr, int enable) |
2882 | { |
- | |
2883 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
- | |
2884 | int entry = 0x200003; |
- | |
2885 | int i; |
- | |
2886 | int gtt_size = 0x10000; |
- | |
2887 | const char *filename; |
- | |
2888 | - | ||
2889 | if (!enable) { |
- | |
2890 | if (bufmgr_gem->aub_file) { |
- | |
2891 | fclose(bufmgr_gem->aub_file); |
- | |
2892 | bufmgr_gem->aub_file = NULL; |
- | |
2893 | } |
- | |
2894 | return; |
- | |
2895 | } |
3042 | { |
2896 | 3043 | fprintf(stderr, "libdrm aub dumping is deprecated.\n\n" |
|
2897 | bufmgr_gem->aub_file = fopen("intel.aub", "w+"); |
- | |
2898 | if (!bufmgr_gem->aub_file) |
- | |
2899 | return; |
3044 | "Use intel_aubdump from intel-gpu-tools instead. Install intel-gpu-tools,\n" |
2900 | - | ||
2901 | /* Start allocating objects from just after the GTT. */ |
- | |
2902 | bufmgr_gem->aub_offset = gtt_size; |
- | |
2903 | - | ||
2904 | /* Start with a (required) version packet. */ |
- | |
2905 | aub_out(bufmgr_gem, CMD_AUB_HEADER | (13 - 2)); |
- | |
2906 | aub_out(bufmgr_gem, |
- | |
2907 | (4 << AUB_HEADER_MAJOR_SHIFT) | |
- | |
2908 | (0 << AUB_HEADER_MINOR_SHIFT)); |
- | |
2909 | for (i = 0; i < 8; i++) { |
- | |
2910 | aub_out(bufmgr_gem, 0); /* app name */ |
- | |
2911 | } |
- | |
2912 | aub_out(bufmgr_gem, 0); /* timestamp */ |
- | |
2913 | aub_out(bufmgr_gem, 0); /* timestamp */ |
- | |
2914 | aub_out(bufmgr_gem, 0); /* comment len */ |
3045 | "then run (for example)\n\n" |
2915 | - | ||
2916 | /* Set up the GTT. The max we can handle is 256M */ |
- | |
2917 | aub_out(bufmgr_gem, CMD_AUB_TRACE_HEADER_BLOCK | ((bufmgr_gem->gen >= 8 ? 6 : 5) - 2)); |
- | |
2918 | aub_out(bufmgr_gem, AUB_TRACE_MEMTYPE_NONLOCAL | 0 | AUB_TRACE_OP_DATA_WRITE); |
- | |
2919 | aub_out(bufmgr_gem, 0); /* subtype */ |
- | |
2920 | aub_out(bufmgr_gem, 0); /* offset */ |
- | |
2921 | aub_out(bufmgr_gem, gtt_size); /* size */ |
- | |
2922 | for (i = 0x000; i < gtt_size; i += 4, entry += 0x1000) { |
- | |
2923 | aub_out(bufmgr_gem, entry); |
3046 | "\t$ intel_aubdump --output=trace.aub glxgears -geometry 500x500\n\n" |
Line 2924... | Line 3047... | ||
2924 | } |
3047 | "See the intel_aubdump man page for more details.\n"); |
2925 | } |
3048 | } |
2926 | 3049 | ||
Line 2934... | Line 3057... | ||
2934 | 3057 | ||
2935 | context = calloc(1, sizeof(*context)); |
3058 | context = calloc(1, sizeof(*context)); |
2936 | if (!context) |
3059 | if (!context) |
Line 2937... | Line 3060... | ||
2937 | return NULL; |
3060 | return NULL; |
2938 | 3061 | ||
2939 | VG_CLEAR(create); |
3062 | memclear(create); |
2940 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create); |
3063 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE, &create); |
2941 | if (ret != 0) { |
3064 | if (ret != 0) { |
2942 | DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n", |
3065 | DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n", |
Line 2959... | Line 3082... | ||
2959 | int ret; |
3082 | int ret; |
Line 2960... | Line 3083... | ||
2960 | 3083 | ||
2961 | if (ctx == NULL) |
3084 | if (ctx == NULL) |
Line 2962... | Line 3085... | ||
2962 | return; |
3085 | return; |
Line 2963... | Line 3086... | ||
2963 | 3086 | ||
2964 | VG_CLEAR(destroy); |
3087 | memclear(destroy); |
2965 | 3088 | ||
2966 | bufmgr_gem = (drm_intel_bufmgr_gem *)ctx->bufmgr; |
3089 | bufmgr_gem = (drm_intel_bufmgr_gem *)ctx->bufmgr; |
Line 2981... | Line 3104... | ||
2981 | { |
3104 | { |
2982 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
3105 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
2983 | struct drm_i915_reg_read reg_read; |
3106 | struct drm_i915_reg_read reg_read; |
2984 | int ret; |
3107 | int ret; |
Line 2985... | Line 3108... | ||
2985 | 3108 | ||
2986 | VG_CLEAR(reg_read); |
3109 | memclear(reg_read); |
Line 2987... | Line 3110... | ||
2987 | reg_read.offset = offset; |
3110 | reg_read.offset = offset; |
Line 2988... | Line 3111... | ||
2988 | 3111 | ||
2989 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_REG_READ, ®_read); |
3112 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_REG_READ, ®_read); |
2990 | 3113 | ||
Line -... | Line 3114... | ||
- | 3114 | *result = reg_read.val; |
|
- | 3115 | return ret; |
|
- | 3116 | } |
|
- | 3117 | ||
- | 3118 | int |
|
- | 3119 | drm_intel_get_subslice_total(int fd, unsigned int *subslice_total) |
|
- | 3120 | { |
|
- | 3121 | drm_i915_getparam_t gp; |
|
- | 3122 | int ret; |
|
- | 3123 | ||
- | 3124 | memclear(gp); |
|
- | 3125 | gp.value = (int*)subslice_total; |
|
- | 3126 | gp.param = I915_PARAM_SUBSLICE_TOTAL; |
|
- | 3127 | ret = drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp); |
|
- | 3128 | if (ret) |
|
- | 3129 | return -errno; |
|
- | 3130 | ||
- | 3131 | return 0; |
|
- | 3132 | } |
|
- | 3133 | ||
- | 3134 | int |
|
- | 3135 | drm_intel_get_eu_total(int fd, unsigned int *eu_total) |
|
- | 3136 | { |
|
- | 3137 | drm_i915_getparam_t gp; |
|
- | 3138 | int ret; |
|
- | 3139 | ||
- | 3140 | memclear(gp); |
|
- | 3141 | gp.value = (int*)eu_total; |
|
- | 3142 | gp.param = I915_PARAM_EU_TOTAL; |
|
- | 3143 | ret = drmIoctl(fd, DRM_IOCTL_I915_GETPARAM, &gp); |
|
- | 3144 | if (ret) |
|
Line 2991... | Line 3145... | ||
2991 | *result = reg_read.val; |
3145 | return -errno; |
2992 | return ret; |
3146 | |
2993 | } |
3147 | return 0; |
2994 | 3148 | } |
|
Line 3017... | Line 3171... | ||
3017 | void |
3171 | void |
3018 | drm_intel_bufmgr_gem_set_aub_annotations(drm_intel_bo *bo, |
3172 | drm_intel_bufmgr_gem_set_aub_annotations(drm_intel_bo *bo, |
3019 | drm_intel_aub_annotation *annotations, |
3173 | drm_intel_aub_annotation *annotations, |
3020 | unsigned count) |
3174 | unsigned count) |
3021 | { |
3175 | { |
3022 | drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; |
- | |
3023 | unsigned size = sizeof(*annotations) * count; |
- | |
3024 | drm_intel_aub_annotation *new_annotations = |
- | |
3025 | count > 0 ? realloc(bo_gem->aub_annotations, size) : NULL; |
- | |
3026 | if (new_annotations == NULL) { |
- | |
3027 | free(bo_gem->aub_annotations); |
- | |
3028 | bo_gem->aub_annotations = NULL; |
- | |
3029 | bo_gem->aub_annotation_count = 0; |
- | |
3030 | return; |
- | |
3031 | } |
3176 | } |
- | 3177 | ||
- | 3178 | static drmMMListHead bufmgr_list = { &bufmgr_list, &bufmgr_list }; |
|
- | 3179 | ||
- | 3180 | static drm_intel_bufmgr_gem * |
|
3032 | memcpy(new_annotations, annotations, size); |
3181 | drm_intel_bufmgr_gem_find(int fd) |
- | 3182 | { |
|
3033 | bo_gem->aub_annotations = new_annotations; |
3183 | drm_intel_bufmgr_gem *bufmgr_gem; |
- | 3184 | ||
- | 3185 | DRMLISTFOREACHENTRY(bufmgr_gem, &bufmgr_list, managers) { |
|
- | 3186 | if (bufmgr_gem->fd == fd) { |
|
3034 | bo_gem->aub_annotation_count = count; |
3187 | atomic_inc(&bufmgr_gem->refcount); |
- | 3188 | return bufmgr_gem; |
|
- | 3189 | } |
|
- | 3190 | } |
|
- | 3191 | ||
- | 3192 | return NULL; |
|
- | 3193 | } |
|
- | 3194 | ||
- | 3195 | static void |
|
- | 3196 | drm_intel_bufmgr_gem_unref(drm_intel_bufmgr *bufmgr) |
|
- | 3197 | { |
|
- | 3198 | drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; |
|
- | 3199 | ||
- | 3200 | if (atomic_add_unless(&bufmgr_gem->refcount, -1, 1)) { |
|
- | 3201 | // pthread_mutex_lock(&bufmgr_list_mutex); |
|
- | 3202 | ||
- | 3203 | if (atomic_dec_and_test(&bufmgr_gem->refcount)) { |
|
- | 3204 | DRMLISTDEL(&bufmgr_gem->managers); |
|
- | 3205 | drm_intel_bufmgr_gem_destroy(bufmgr); |
|
- | 3206 | } |
|
- | 3207 | ||
- | 3208 | // pthread_mutex_unlock(&bufmgr_list_mutex); |
|
- | 3209 | } |
|
3035 | } |
3210 | } |
Line 3036... | Line 3211... | ||
3036 | 3211 | ||
3037 | /** |
3212 | /** |
3038 | * Initializes the GEM buffer manager, which uses the kernel to allocate, map, |
3213 | * Initializes the GEM buffer manager, which uses the kernel to allocate, map, |
Line 3047... | Line 3222... | ||
3047 | struct drm_i915_gem_get_aperture aperture; |
3222 | struct drm_i915_gem_get_aperture aperture; |
3048 | drm_i915_getparam_t gp; |
3223 | drm_i915_getparam_t gp; |
3049 | int ret, tmp; |
3224 | int ret, tmp; |
3050 | bool exec2 = false; |
3225 | bool exec2 = false; |
Line -... | Line 3226... | ||
- | 3226 | ||
- | 3227 | // pthread_mutex_lock(&bufmgr_list_mutex); |
|
- | 3228 | ||
- | 3229 | bufmgr_gem = drm_intel_bufmgr_gem_find(fd); |
|
- | 3230 | if (bufmgr_gem) |
|
- | 3231 | goto exit; |
|
3051 | 3232 | ||
3052 | bufmgr_gem = calloc(1, sizeof(*bufmgr_gem)); |
3233 | bufmgr_gem = calloc(1, sizeof(*bufmgr_gem)); |
3053 | if (bufmgr_gem == NULL) |
3234 | if (bufmgr_gem == NULL) |
Line 3054... | Line 3235... | ||
3054 | return NULL; |
3235 | goto exit; |
- | 3236 | ||
Line 3055... | Line 3237... | ||
3055 | 3237 | bufmgr_gem->fd = fd; |
|
3056 | bufmgr_gem->fd = fd; |
3238 | atomic_set(&bufmgr_gem->refcount, 1); |
3057 | 3239 | ||
3058 | // if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) { |
3240 | // if (pthread_mutex_init(&bufmgr_gem->lock, NULL) != 0) { |
Line -... | Line 3241... | ||
- | 3241 | // free(bufmgr_gem); |
|
3059 | // free(bufmgr_gem); |
3242 | // return NULL; |
3060 | // return NULL; |
3243 | // } |
3061 | // } |
3244 | |
Line 3062... | Line 3245... | ||
3062 | 3245 | memclear(aperture); |
|
3063 | ret = drmIoctl(bufmgr_gem->fd, |
3246 | ret = drmIoctl(bufmgr_gem->fd, |
3064 | DRM_IOCTL_I915_GEM_GET_APERTURE, |
3247 | DRM_IOCTL_I915_GEM_GET_APERTURE, |
3065 | &aperture); |
3248 | &aperture); |
3066 | 3249 | ||
3067 | if (ret == 0) |
3250 | if (ret == 0) |
3068 | bufmgr_gem->gtt_size = aperture.aper_available_size; |
3251 | bufmgr_gem->gtt_size = aperture.aper_available_size; |
3069 | else { |
3252 | else { |
3070 | printf("DRM_IOCTL_I915_GEM_APERTURE failed: %s\n", |
3253 | fprintf(stderr, "DRM_IOCTL_I915_GEM_APERTURE failed: %s\n", |
3071 | strerror(errno)); |
3254 | strerror(errno)); |
3072 | bufmgr_gem->gtt_size = 128 * 1024 * 1024; |
3255 | bufmgr_gem->gtt_size = 128 * 1024 * 1024; |
Line 3088... | Line 3271... | ||
3088 | bufmgr_gem->gen = 5; |
3271 | bufmgr_gem->gen = 5; |
3089 | else if (IS_GEN6(bufmgr_gem->pci_device)) |
3272 | else if (IS_GEN6(bufmgr_gem->pci_device)) |
3090 | bufmgr_gem->gen = 6; |
3273 | bufmgr_gem->gen = 6; |
3091 | else if (IS_GEN7(bufmgr_gem->pci_device)) |
3274 | else if (IS_GEN7(bufmgr_gem->pci_device)) |
3092 | bufmgr_gem->gen = 7; |
3275 | bufmgr_gem->gen = 7; |
- | 3276 | else if (IS_GEN8(bufmgr_gem->pci_device)) |
|
- | 3277 | bufmgr_gem->gen = 8; |
|
- | 3278 | else if (IS_GEN9(bufmgr_gem->pci_device)) |
|
- | 3279 | bufmgr_gem->gen = 9; |
|
3093 | else { |
3280 | else { |
3094 | free(bufmgr_gem); |
3281 | free(bufmgr_gem); |
3095 | return NULL; |
3282 | bufmgr_gem = NULL; |
- | 3283 | goto exit; |
|
3096 | } |
3284 | } |
Line 3097... | Line -... | ||
3097 | - | ||
3098 | // printf("gen %d\n", bufmgr_gem->gen); |
- | |
3099 | 3285 | ||
3100 | if (IS_GEN3(bufmgr_gem->pci_device) && |
3286 | if (IS_GEN3(bufmgr_gem->pci_device) && |
3101 | bufmgr_gem->gtt_size > 256*1024*1024) { |
3287 | bufmgr_gem->gtt_size > 256*1024*1024) { |
3102 | /* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't |
3288 | /* The unmappable part of gtt on gen 3 (i.e. above 256MB) can't |
3103 | * be used for tiled blits. To simplify the accounting, just |
3289 | * be used for tiled blits. To simplify the accounting, just |
3104 | * substract the unmappable part (fixed to 256MB on all known |
3290 | * substract the unmappable part (fixed to 256MB on all known |
3105 | * gen3 devices) if the kernel advertises it. */ |
3291 | * gen3 devices) if the kernel advertises it. */ |
3106 | bufmgr_gem->gtt_size -= 256*1024*1024; |
3292 | bufmgr_gem->gtt_size -= 256*1024*1024; |
Line 3107... | Line 3293... | ||
3107 | } |
3293 | } |
3108 | 3294 | ||
Line 3109... | Line 3295... | ||
3109 | VG_CLEAR(gp); |
3295 | memclear(gp); |
3110 | gp.value = &tmp; |
3296 | gp.value = &tmp; |
3111 | 3297 | ||
Line 3124... | Line 3310... | ||
3124 | 3310 | ||
3125 | gp.param = I915_PARAM_HAS_RELAXED_FENCING; |
3311 | gp.param = I915_PARAM_HAS_RELAXED_FENCING; |
3126 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
3312 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
Line -... | Line 3313... | ||
- | 3313 | bufmgr_gem->has_relaxed_fencing = ret == 0; |
|
- | 3314 | ||
3127 | bufmgr_gem->has_relaxed_fencing = ret == 0; |
3315 | bufmgr_gem->bufmgr.bo_alloc_userptr = NULL; |
3128 | 3316 | ||
3129 | gp.param = I915_PARAM_HAS_WAIT_TIMEOUT; |
3317 | gp.param = I915_PARAM_HAS_WAIT_TIMEOUT; |
Line 3130... | Line 3318... | ||
3130 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
3318 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
Line 3143... | Line 3331... | ||
3143 | 3331 | ||
3144 | gp.param = I915_PARAM_HAS_VEBOX; |
3332 | gp.param = I915_PARAM_HAS_VEBOX; |
3145 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
3333 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
Line -... | Line 3334... | ||
- | 3334 | bufmgr_gem->has_vebox = (ret == 0) & (*gp.value > 0); |
|
- | 3335 | ||
- | 3336 | gp.param = I915_PARAM_HAS_EXEC_SOFTPIN; |
|
- | 3337 | ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GETPARAM, &gp); |
|
- | 3338 | if (ret == 0 && *gp.value > 0) |
|
3146 | bufmgr_gem->has_vebox = (ret == 0) & (*gp.value > 0); |
3339 | bufmgr_gem->bufmgr.bo_set_softpin_offset = drm_intel_gem_bo_set_softpin_offset; |
3147 | 3340 | ||
3148 | if (bufmgr_gem->gen < 4) { |
3341 | if (bufmgr_gem->gen < 4) { |
3149 | gp.param = I915_PARAM_NUM_FENCES_AVAIL; |
3342 | gp.param = I915_PARAM_NUM_FENCES_AVAIL; |
3150 | gp.value = &bufmgr_gem->available_fences; |
3343 | gp.value = &bufmgr_gem->available_fences; |
Line 3186... | Line 3379... | ||
3186 | bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference; |
3379 | bufmgr_gem->bufmgr.bo_reference = drm_intel_gem_bo_reference; |
3187 | bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference; |
3380 | bufmgr_gem->bufmgr.bo_unreference = drm_intel_gem_bo_unreference; |
3188 | bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map; |
3381 | bufmgr_gem->bufmgr.bo_map = drm_intel_gem_bo_map; |
3189 | bufmgr_gem->bufmgr.bo_unmap = drm_intel_gem_bo_unmap; |
3382 | bufmgr_gem->bufmgr.bo_unmap = drm_intel_gem_bo_unmap; |
3190 | bufmgr_gem->bufmgr.bo_subdata = drm_intel_gem_bo_subdata; |
3383 | bufmgr_gem->bufmgr.bo_subdata = drm_intel_gem_bo_subdata; |
3191 | // bufmgr_gem->bufmgr.bo_get_subdata = drm_intel_gem_bo_get_subdata; |
3384 | bufmgr_gem->bufmgr.bo_get_subdata = drm_intel_gem_bo_get_subdata; |
3192 | bufmgr_gem->bufmgr.bo_wait_rendering = drm_intel_gem_bo_wait_rendering; |
3385 | bufmgr_gem->bufmgr.bo_wait_rendering = drm_intel_gem_bo_wait_rendering; |
3193 | bufmgr_gem->bufmgr.bo_emit_reloc = drm_intel_gem_bo_emit_reloc; |
3386 | bufmgr_gem->bufmgr.bo_emit_reloc = drm_intel_gem_bo_emit_reloc; |
3194 | bufmgr_gem->bufmgr.bo_emit_reloc_fence = drm_intel_gem_bo_emit_reloc_fence; |
3387 | bufmgr_gem->bufmgr.bo_emit_reloc_fence = drm_intel_gem_bo_emit_reloc_fence; |
3195 | bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin; |
3388 | bufmgr_gem->bufmgr.bo_pin = drm_intel_gem_bo_pin; |
3196 | bufmgr_gem->bufmgr.bo_unpin = drm_intel_gem_bo_unpin; |
3389 | bufmgr_gem->bufmgr.bo_unpin = drm_intel_gem_bo_unpin; |
3197 | bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling; |
3390 | bufmgr_gem->bufmgr.bo_get_tiling = drm_intel_gem_bo_get_tiling; |
3198 | bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling; |
3391 | bufmgr_gem->bufmgr.bo_set_tiling = drm_intel_gem_bo_set_tiling; |
3199 | bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink; |
3392 | bufmgr_gem->bufmgr.bo_flink = drm_intel_gem_bo_flink; |
3200 | /* Use the new one if available */ |
3393 | /* Use the new one if available */ |
3201 | // if (exec2) { |
3394 | if (exec2) { |
3202 | bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2; |
3395 | bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec2; |
3203 | bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2; |
3396 | bufmgr_gem->bufmgr.bo_mrb_exec = drm_intel_gem_bo_mrb_exec2; |
3204 | // } else |
3397 | } else |
3205 | // bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec; |
3398 | bufmgr_gem->bufmgr.bo_exec = drm_intel_gem_bo_exec; |
3206 | bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy; |
3399 | bufmgr_gem->bufmgr.bo_busy = drm_intel_gem_bo_busy; |
3207 | bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise; |
3400 | bufmgr_gem->bufmgr.bo_madvise = drm_intel_gem_bo_madvise; |
3208 | bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_destroy; |
3401 | bufmgr_gem->bufmgr.destroy = drm_intel_bufmgr_gem_unref; |
3209 | bufmgr_gem->bufmgr.debug = 0; |
3402 | bufmgr_gem->bufmgr.debug = 0; |
3210 | bufmgr_gem->bufmgr.check_aperture_space = |
3403 | bufmgr_gem->bufmgr.check_aperture_space = |
3211 | drm_intel_gem_check_aperture_space; |
3404 | drm_intel_gem_check_aperture_space; |
3212 | bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse; |
3405 | bufmgr_gem->bufmgr.bo_disable_reuse = drm_intel_gem_bo_disable_reuse; |
3213 | bufmgr_gem->bufmgr.bo_is_reusable = drm_intel_gem_bo_is_reusable; |
3406 | bufmgr_gem->bufmgr.bo_is_reusable = drm_intel_gem_bo_is_reusable; |
Line 3219... | Line 3412... | ||
3219 | init_cache_buckets(bufmgr_gem); |
3412 | init_cache_buckets(bufmgr_gem); |
Line 3220... | Line 3413... | ||
3220 | 3413 | ||
3221 | DRMINITLISTHEAD(&bufmgr_gem->vma_cache); |
3414 | DRMINITLISTHEAD(&bufmgr_gem->vma_cache); |
Line -... | Line 3415... | ||
- | 3415 | bufmgr_gem->vma_max = -1; /* unlimited by default */ |
|
- | 3416 | ||
- | 3417 | DRMLISTADD(&bufmgr_gem->managers, &bufmgr_list); |
|
- | 3418 | ||
- | 3419 | exit: |
|
3222 | bufmgr_gem->vma_max = -1; /* unlimited by default */ |
3420 | // pthread_mutex_unlock(&bufmgr_list_mutex); |
3223 | 3421 | ||
Line 3224... | Line 3422... | ||
3224 | return &bufmgr_gem->bufmgr; |
3422 | return bufmgr_gem != NULL ? &bufmgr_gem->bufmgr : NULL; |
3225 | } |
3423 | } |
Line 3264... | Line 3462... | ||
3264 | bo_gem->gem_handle = handle; |
3462 | bo_gem->gem_handle = handle; |
3265 | bo_gem->bo.handle = handle; |
3463 | bo_gem->bo.handle = handle; |
3266 | bo_gem->global_name = 0; |
3464 | bo_gem->global_name = 0; |
3267 | bo_gem->reusable = false; |
3465 | bo_gem->reusable = false; |
Line 3268... | Line 3466... | ||
3268 | 3466 | ||
3269 | VG_CLEAR(get_tiling); |
3467 | memclear(get_tiling); |
3270 | get_tiling.handle = bo_gem->gem_handle; |
3468 | get_tiling.handle = bo_gem->gem_handle; |
3271 | ret = drmIoctl(bufmgr_gem->fd, |
3469 | ret = drmIoctl(bufmgr_gem->fd, |
3272 | DRM_IOCTL_I915_GEM_GET_TILING, |
3470 | DRM_IOCTL_I915_GEM_GET_TILING, |
3273 | &get_tiling); |
3471 | &get_tiling); |
Line 3276... | Line 3474... | ||
3276 | return NULL; |
3474 | return NULL; |
3277 | } |
3475 | } |
3278 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
3476 | bo_gem->tiling_mode = get_tiling.tiling_mode; |
3279 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
3477 | bo_gem->swizzle_mode = get_tiling.swizzle_mode; |
3280 | /* XXX stride is unknown */ |
3478 | /* XXX stride is unknown */ |
3281 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem); |
3479 | drm_intel_bo_gem_set_in_aperture_size(bufmgr_gem, bo_gem, 0); |
Line 3282... | Line 3480... | ||
3282 | 3480 | ||
3283 | DRMINITLISTHEAD(&bo_gem->vma_list); |
3481 | DRMINITLISTHEAD(&bo_gem->vma_list); |
3284 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |
3482 | DRMLISTADDTAIL(&bo_gem->name_list, &bufmgr_gem->named); |