diff options
author | Jesse Barnes <jbarnes@virtuousgeek.org> | 2014-02-28 13:48:00 -0800 |
---|---|---|
committer | Jesse Barnes <jbarnes@virtuousgeek.org> | 2016-02-11 12:44:53 -0800 |
commit | 50f5e424127afa19f4f6789588d18780ff30a1d5 (patch) | |
tree | 4ba82e5567cab1dd6fc604c7cd0af184e5c5a2f4 | |
parent | f884af9b57ff480d3c87870d8b40055d9c8c6cfe (diff) |
intel: initial SVM context creation support
-rw-r--r-- | include/drm/i915_drm.h | 19 | ||||
-rw-r--r-- | intel/intel_bufmgr.h | 1 | ||||
-rw-r--r-- | intel/intel_bufmgr_gem.c | 25 |
3 files changed, 45 insertions, 0 deletions
diff --git a/include/drm/i915_drm.h b/include/drm/i915_drm.h index 0e51d4214..887ac4790 100644 --- a/include/drm/i915_drm.h +++ b/include/drm/i915_drm.h @@ -230,6 +230,7 @@ typedef struct _drm_i915_sarea { #define DRM_I915_GEM_USERPTR 0x33 #define DRM_I915_GEM_CONTEXT_GETPARAM 0x34 #define DRM_I915_GEM_CONTEXT_SETPARAM 0x35 +#define DRM_I915_GEM_CONTEXT_CREATE2 0x36 #define DRM_IOCTL_I915_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_I915_INIT, drm_i915_init_t) #define DRM_IOCTL_I915_FLUSH DRM_IO ( DRM_COMMAND_BASE + DRM_I915_FLUSH) @@ -283,6 +284,7 @@ typedef struct _drm_i915_sarea { #define DRM_IOCTL_I915_GEM_USERPTR DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_USERPTR, struct drm_i915_gem_userptr) #define DRM_IOCTL_I915_GEM_CONTEXT_GETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_GETPARAM, struct drm_i915_gem_context_param) #define DRM_IOCTL_I915_GEM_CONTEXT_SETPARAM DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_SETPARAM, struct drm_i915_gem_context_param) +#define DRM_IOCTL_I915_GEM_CONTEXT_CREATE2 DRM_IOWR (DRM_COMMAND_BASE + DRM_I915_GEM_CONTEXT_CREATE2, struct drm_i915_gem_context_create2) /* Allow drivers to submit batchbuffers directly to hardware, relying * on the security mechanisms provided by hardware. @@ -1079,6 +1081,22 @@ struct drm_i915_gem_context_create { __u32 pad; }; +/* + * SVM handling + * + * A context can opt in to SVM support (thereby using its CPU page tables + * when accessing data from the GPU) by using the %I915_ENABLE_SVM flag + * and passing an existing context id. This is a one way transition; SVM + * contexts can not be downgraded into PPGTT contexts once converted. + */ +#define I915_GEM_CONTEXT_ENABLE_SVM (1<<0) +#define I915_GEM_CONTEXT_FULL_PPGTT (1<<1) +struct drm_i915_gem_context_create2 { + /* output: id of new context*/ + __u32 ctx_id; + __u32 flags; +}; + struct drm_i915_gem_context_destroy { __u32 ctx_id; __u32 pad; @@ -1144,3 +1162,4 @@ struct drm_i915_gem_context_param { }; #endif /* _I915_DRM_H_ */ + diff --git a/intel/intel_bufmgr.h b/intel/intel_bufmgr.h index a1abbcd2b..217a32ded 100644 --- a/intel/intel_bufmgr.h +++ b/intel/intel_bufmgr.h @@ -208,6 +208,7 @@ int drm_intel_bufmgr_gem_get_devid(drm_intel_bufmgr *bufmgr); int drm_intel_gem_bo_wait(drm_intel_bo *bo, int64_t timeout_ns); drm_intel_context *drm_intel_gem_context_create(drm_intel_bufmgr *bufmgr); +drm_intel_context *drm_intel_gem_svm_context_create(drm_intel_bufmgr *bufmgr); void drm_intel_gem_context_destroy(drm_intel_context *ctx); int drm_intel_gem_bo_context_exec(drm_intel_bo *bo, drm_intel_context *ctx, int used, unsigned int flags); diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index dc28200ff..00325a836 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -3104,6 +3104,30 @@ drm_intel_bufmgr_gem_set_aub_dump(drm_intel_bufmgr *bufmgr, int enable) } drm_intel_context * +drm_intel_gem_svm_context_create(drm_intel_bufmgr *bufmgr) +{ + drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; + struct drm_i915_gem_context_create2 create; + drm_intel_context *context = NULL; + int ret; + + memclear(create); + create.flags = I915_GEM_CONTEXT_ENABLE_SVM; + ret = drmIoctl(bufmgr_gem->fd, DRM_IOCTL_I915_GEM_CONTEXT_CREATE2, &create); + if (ret != 0) { + DBG("DRM_IOCTL_I915_GEM_CONTEXT_CREATE failed: %s\n", + strerror(errno)); + return NULL; + } + + context = calloc(1, sizeof(*context)); + context->ctx_id = create.ctx_id; + context->bufmgr = bufmgr; + + return context; +} + +drm_intel_context * drm_intel_gem_context_create(drm_intel_bufmgr *bufmgr) { drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *)bufmgr; @@ -3370,6 +3394,7 @@ drm_intel_bufmgr_gem_init(int fd, int batch_size) else if (IS_GEN9(bufmgr_gem->pci_device)) bufmgr_gem->gen = 9; else { + fprintf(stderr, "intel_bufmgr: unknown chipset, init failed\n"); free(bufmgr_gem); bufmgr_gem = NULL; goto exit; |