|
XenevaOS
|
#include <xe_drm.h>
Public Attributes | ||
| __u64 | extensions | |
| __u32 | obj | |
| __u16 | pat_index | |
| __u16 | pad | |
| union { | ||
| __u64 obj_offset | ||
| __u64 userptr | ||
| __s64 cpu_addr_mirror_offset | ||
| }; | ||
| __u64 | range | |
| __u64 | addr | |
| __u32 | op | |
| __u32 | flags | |
| __u32 | prefetch_mem_region_instance | |
| __u32 | pad2 | |
| __u64 | reserved [3] | |
struct drm_xe_vm_bind_op - run bind operations
The @op can be:
and the @flags can be:
The @prefetch_mem_region_instance for DRM_XE_VM_BIND_OP_PREFETCH can also be:
| union { ... } drm_xe_vm_bind_op |
| __u64 drm_xe_vm_bind_op::addr |
@addr: Address to operate on, MBZ for UNMAP_ALL
| __s64 drm_xe_vm_bind_op::cpu_addr_mirror_offset |
@cpu_addr_mirror_offset: Offset from GPU @addr to create CPU address mirror mappings. MBZ with current level of support (e.g. 1 to 1 mapping between GPU and CPU mappings only supported).
| __u64 drm_xe_vm_bind_op::extensions |
@extensions: Pointer to the first extension struct, if any
| __u32 drm_xe_vm_bind_op::flags |
@flags: Bind flags
| __u32 drm_xe_vm_bind_op::obj |
@obj: GEM object to operate on, MBZ for MAP_USERPTR, MBZ for UNMAP
| __u64 drm_xe_vm_bind_op::obj_offset |
@obj_offset: Offset into the object, MBZ for CLEAR_RANGE, ignored for unbind
| __u32 drm_xe_vm_bind_op::op |
@op: Bind operation to perform
| __u16 drm_xe_vm_bind_op::pad |
@pad: MBZ
| __u32 drm_xe_vm_bind_op::pad2 |
@pad2: MBZ
| __u16 drm_xe_vm_bind_op::pat_index |
@pat_index: The platform defined @pat_index to use for this mapping. The index basically maps to some predefined memory attributes, including things like caching, coherency, compression etc. The exact meaning of the pat_index is platform specific and defined in the Bspec and PRMs. When the KMD sets up the binding the index here is encoded into the ppGTT PTE.
For coherency the @pat_index needs to be at least 1way coherent when drm_xe_gem_create.cpu_caching is DRM_XE_GEM_CPU_CACHING_WB. The KMD will extract the coherency mode from the @pat_index and reject if there is a mismatch (see note below for pre-MTL platforms).
Note: On pre-MTL platforms there is only a caching mode and no explicit coherency mode, but on such hardware there is always a shared-LLC (or is dgpu) so all GT memory accesses are coherent with CPU caches even with the caching mode set as uncached. It's only the display engine that is incoherent (on dgpu it must be in VRAM which is always mapped as WC on the CPU). However to keep the uapi somewhat consistent with newer platforms the KMD groups the different cache levels into the following coherency buckets on all pre-MTL platforms:
ppGTT UC -> COH_NONE ppGTT WC -> COH_NONE ppGTT WT -> COH_NONE ppGTT WB -> COH_AT_LEAST_1WAY
In practice UC/WC/WT should only ever be used for scanout surfaces on such platforms (or perhaps in general for dma-buf if shared with another device) since it is only the display engine that is actually incoherent. Everything else should typically use WB given that we have a shared-LLC. On MTL+ this completely changes and the HW defines the coherency mode as part of the @pat_index, where incoherent GT access is possible.
Note: For userptr and externally imported dma-buf the kernel expects either 1WAY or 2WAY for the @pat_index. Starting from NVL-P, for userptr, svm, madvise and externally imported dma-buf the kernel expects either 2WAY or 1WAY and XA @pat_index.
For DRM_XE_VM_BIND_FLAG_NULL bindings there are no KMD restrictions on the @pat_index. For such mappings there is no actual memory being mapped (the address in the PTE is invalid), so the various PAT memory attributes likely do not apply. Simply leaving as zero is one option (still a valid pat_index). Same applies to DRM_XE_VM_BIND_FLAG_CPU_ADDR_MIRROR bindings as for such mapping there is no actual memory being mapped.
| __u32 drm_xe_vm_bind_op::prefetch_mem_region_instance |
@prefetch_mem_region_instance: Memory region to prefetch VMA to. It is a region instance, not a mask. To be used only with DRM_XE_VM_BIND_OP_PREFETCH operation.
| __u64 drm_xe_vm_bind_op::range |
@range: Number of bytes from the object to bind to addr, MBZ for UNMAP_ALL
| __u64 drm_xe_vm_bind_op::reserved[3] |
@reserved: Reserved
| __u64 drm_xe_vm_bind_op::userptr |
@userptr: user pointer to bind on