drm/nouveau/svm: initial support for shared virtual memory
This uses HMM to mirror a process' CPU page tables into a channel's page tables, and keep them synchronised so that both the CPU and GPU are able to access the same memory at the same virtual address. While this code also supports Volta/Turing, it's only enabled for Pascal GPUs currently due to channel recovery being unreliable right now on the later GPUs. Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
This commit is contained in:
41
drivers/gpu/drm/nouveau/nouveau_svm.h
Normal file
41
drivers/gpu/drm/nouveau/nouveau_svm.h
Normal file
@@ -0,0 +1,41 @@
|
||||
#ifndef __NOUVEAU_SVM_H__
|
||||
#define __NOUVEAU_SVM_H__
|
||||
#include <nvif/os.h>
|
||||
struct drm_device;
|
||||
struct drm_file;
|
||||
struct nouveau_drm;
|
||||
|
||||
struct nouveau_svmm;
|
||||
|
||||
#if IS_ENABLED(CONFIG_DRM_NOUVEAU_SVM)
|
||||
void nouveau_svm_init(struct nouveau_drm *);
|
||||
void nouveau_svm_fini(struct nouveau_drm *);
|
||||
void nouveau_svm_suspend(struct nouveau_drm *);
|
||||
void nouveau_svm_resume(struct nouveau_drm *);
|
||||
|
||||
int nouveau_svmm_init(struct drm_device *, void *, struct drm_file *);
|
||||
void nouveau_svmm_fini(struct nouveau_svmm **);
|
||||
int nouveau_svmm_join(struct nouveau_svmm *, u64 inst);
|
||||
void nouveau_svmm_part(struct nouveau_svmm *, u64 inst);
|
||||
#else /* IS_ENABLED(CONFIG_DRM_NOUVEAU_SVM) */
|
||||
static inline void nouveau_svm_init(struct nouveau_drm *drm) {}
|
||||
static inline void nouveau_svm_fini(struct nouveau_drm *drm) {}
|
||||
static inline void nouveau_svm_suspend(struct nouveau_drm *drm) {}
|
||||
static inline void nouveau_svm_resume(struct nouveau_drm *drm) {}
|
||||
|
||||
static inline int nouveau_svmm_init(struct drm_device *device, void *p,
|
||||
struct drm_file *file)
|
||||
{
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
||||
static inline void nouveau_svmm_fini(struct nouveau_svmm **svmmp) {}
|
||||
|
||||
static inline int nouveau_svmm_join(struct nouveau_svmm *svmm, u64 inst)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void nouveau_svmm_part(struct nouveau_svmm *svmm, u64 inst) {}
|
||||
#endif /* IS_ENABLED(CONFIG_DRM_NOUVEAU_SVM) */
|
||||
#endif
|
Reference in New Issue
Block a user