There are some allocations that must be only referenced by 32-bit offsets. To limit the chances of having the first 4GB already full, objects not requiring this workaround use DRM_MM_SEARCH_BELOW/ DRM_MM_CREATE_TOP flags In specific, any resource used with flat/heapless (0x00000000-0xfffff000) General State Heap (GSH) or Instruction State Heap (ISH) must be in a 32-bit range, because the General State Offset and Instruction State Offset are limited to 32-bits. Objects must have EXEC_OBJECT_SUPPORTS_48B_ADDRESS flag to indicate if they can be allocated above the 32-bit address range. To limit the chances of having the first 4GB already full, objects will use DRM_MM_SEARCH_BELOW + DRM_MM_CREATE_TOP flags when possible. The libdrm user of the EXEC_OBJECT_SUPPORTS_48B_ADDRESS flag is here: http://lists.freedesktop.org/archives/intel-gfx/2015-September/075836.html v2: Changed flag logic from neeeds_32b, to supports_48b. v3: Moved 48-bit support flag back to exec_object. (Chris, Daniel) v4: Split pin flags into PIN_ZONE_4G and PIN_HIGH; update PIN_OFFSET_MASK to use last PIN_ defined instead of hard-coded value; use correct limit check in eb_vma_misplaced. (Chris) v5: Don't touch PIN_OFFSET_MASK and update workaround comment (Chris) v6: Apply pin-high for ggtt too (Chris) v7: Handle simultaneous pin-high and pin-mappable end correctly (Akash) Fix check for entries currently using +4GB addresses, use min_t and other polish in object_bind_to_vm (Chris) v8: Commit message updated to point to libdrm patch. v9: vmas are allocated in the correct ozone, so only check flag when the vma has not been allocated. (Chris)
Showing the changes to include/uapi (1 of 4 files). Show all
Unified · Split
| @@ -690,7 +690,8 @@ struct drm_i915_gem_exec_object2 { · 689 unmodified lines | |||
| 690 | #define EXEC_OBJECT_NEEDS_FENCE (1<<0) | 690 | #define EXEC_OBJECT_NEEDS_FENCE (1<<0) |
| 691 | #define EXEC_OBJECT_NEEDS_GTT (1<<1) | 691 | #define EXEC_OBJECT_NEEDS_GTT (1<<1) |
| 692 | #define EXEC_OBJECT_WRITE (1<<2) | 692 | #define EXEC_OBJECT_WRITE (1<<2) |
| 693 | #define __EXEC_OBJECT_UNKNOWN_FLAGS -(EXEC_OBJECT_WRITE<<1) | 693 | #define EXEC_OBJECT_SUPPORTS_48B_ADDRESS (1<<3) |
| 694 | #define __EXEC_OBJECT_UNKNOWN_FLAGS -(EXEC_OBJECT_SUPPORTS_48B_ADDRESS<<1) | ||
| 694 | __u64 flags; | 695 | __u64 flags; |
| 695 | 696 | ||
| 696 | __u64 rsvd1; | 697 | __u64 rsvd1; |