mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-11 15:49:56 +00:00
b88baab828
This commit provides the implementation for the new uapi motivated by the Vulkan API. It allows user mode drivers (UMDs) to: 1) Initialize a GPU virtual address (VA) space via the new DRM_IOCTL_NOUVEAU_VM_INIT ioctl for UMDs to specify the portion of VA space managed by the kernel and userspace, respectively. 2) Allocate and free a VA space region as well as bind and unbind memory to the GPUs VA space via the new DRM_IOCTL_NOUVEAU_VM_BIND ioctl. UMDs can request the named operations to be processed either synchronously or asynchronously. It supports DRM syncobjs (incl. timelines) as synchronization mechanism. The management of the GPU VA mappings is implemented with the DRM GPU VA manager. 3) Execute push buffers with the new DRM_IOCTL_NOUVEAU_EXEC ioctl. The execution happens asynchronously. It supports DRM syncobj (incl. timelines) as synchronization mechanism. DRM GEM object locking is handled with drm_exec. Both, DRM_IOCTL_NOUVEAU_VM_BIND and DRM_IOCTL_NOUVEAU_EXEC, use the DRM GPU scheduler for the asynchronous paths. Reviewed-by: Dave Airlie <airlied@redhat.com> Signed-off-by: Danilo Krummrich <dakr@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/20230804182406.5222-12-dakr@redhat.com
44 lines
1.2 KiB
C
44 lines
1.2 KiB
C
#ifndef __NOUVEAU_MEM_H__
|
|
#define __NOUVEAU_MEM_H__
|
|
#include <drm/ttm/ttm_bo.h>
|
|
struct ttm_tt;
|
|
|
|
#include <nvif/mem.h>
|
|
#include <nvif/vmm.h>
|
|
|
|
struct nouveau_mem {
|
|
struct ttm_resource base;
|
|
struct nouveau_cli *cli;
|
|
u8 kind;
|
|
u8 comp;
|
|
struct nvif_mem mem;
|
|
struct nvif_vma vma[2];
|
|
};
|
|
|
|
static inline struct nouveau_mem *
|
|
nouveau_mem(struct ttm_resource *reg)
|
|
{
|
|
return container_of(reg, struct nouveau_mem, base);
|
|
}
|
|
|
|
int nouveau_mem_new(struct nouveau_cli *, u8 kind, u8 comp,
|
|
struct ttm_resource **);
|
|
void nouveau_mem_del(struct ttm_resource_manager *man,
|
|
struct ttm_resource *);
|
|
bool nouveau_mem_intersects(struct ttm_resource *res,
|
|
const struct ttm_place *place,
|
|
size_t size);
|
|
bool nouveau_mem_compatible(struct ttm_resource *res,
|
|
const struct ttm_place *place,
|
|
size_t size);
|
|
int nouveau_mem_vram(struct ttm_resource *, bool contig, u8 page);
|
|
int nouveau_mem_host(struct ttm_resource *, struct ttm_tt *);
|
|
void nouveau_mem_fini(struct nouveau_mem *);
|
|
int nouveau_mem_map(struct nouveau_mem *, struct nvif_vmm *, struct nvif_vma *);
|
|
int
|
|
nouveau_mem_map_fixed(struct nouveau_mem *mem,
|
|
struct nvif_vmm *vmm,
|
|
u8 kind, u64 addr,
|
|
u64 offset, u64 range);
|
|
#endif
|