diff options
author | Ben Widawsky <benjamin.widawsky@intel.com> | 2015-01-05 17:10:52 -0800 |
---|---|---|
committer | Ben Widawsky <benjamin.widawsky@intel.com> | 2015-01-05 17:10:52 -0800 |
commit | 06211ccd7ce4a7f5594717217a93744a75cd43fc (patch) | |
tree | 342ee093f462b3e72114137b79733d3757895867 | |
parent | 449e65b67751f8e36dd9a65a73d0f4e648e17a1b (diff) |
Extract CPU map
-rw-r--r-- | intel/intel_bufmgr_gem.c | 66 |
1 files changed, 41 insertions, 25 deletions
diff --git a/intel/intel_bufmgr_gem.c b/intel/intel_bufmgr_gem.c index f4f760ee2..0e88b222c 100644 --- a/intel/intel_bufmgr_gem.c +++ b/intel/intel_bufmgr_gem.c @@ -1272,6 +1272,40 @@ static void drm_intel_gem_bo_unreference(drm_intel_bo *bo) } } +static int +do_mmap(drm_intel_bo *bo) +{ + drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; + drm_intel_bo_gem *bo_gem = (drm_intel_bo_gem *) bo; + struct drm_i915_gem_mmap mmap_arg; + int ret; + + if (bo_gem->mem_virtual) + return 0; + + DBG("bo_map: %d (%s), map_count=%d\n", + bo_gem->gem_handle, bo_gem->name, bo_gem->map_count); + + VG_CLEAR(mmap_arg); + mmap_arg.handle = bo_gem->gem_handle; + mmap_arg.offset = 0; + mmap_arg.size = bo->size; + ret = drmIoctl(bufmgr_gem->fd, + DRM_IOCTL_I915_GEM_MMAP, + &mmap_arg); + if (ret != 0) { + ret = -errno; + DBG("%s:%d: Error mapping buffer %d (%s): %s .\n", + __FILE__, __LINE__, bo_gem->gem_handle, + bo_gem->name, strerror(errno)); + return ret; + } + VG(VALGRIND_MALLOCLIKE_BLOCK(mmap_arg.addr_ptr, mmap_arg.size, 0, 1)); + bo_gem->mem_virtual = (void *)(uintptr_t) mmap_arg.addr_ptr; + + return 0; +} + static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable) { drm_intel_bufmgr_gem *bufmgr_gem = (drm_intel_bufmgr_gem *) bo->bufmgr; @@ -1290,32 +1324,14 @@ static int drm_intel_gem_bo_map(drm_intel_bo *bo, int write_enable) if (bo_gem->map_count++ == 0) drm_intel_gem_bo_open_vma(bufmgr_gem, bo_gem); - if (!bo_gem->mem_virtual) { - struct drm_i915_gem_mmap mmap_arg; - - DBG("bo_map: %d (%s), map_count=%d\n", - bo_gem->gem_handle, bo_gem->name, bo_gem->map_count); - - VG_CLEAR(mmap_arg); - mmap_arg.handle = bo_gem->gem_handle; - mmap_arg.offset = 0; - mmap_arg.size = bo->size; - ret = drmIoctl(bufmgr_gem->fd, - DRM_IOCTL_I915_GEM_MMAP, - &mmap_arg); - if (ret != 0) { - ret = -errno; - DBG("%s:%d: Error mapping buffer %d (%s): %s .\n", - __FILE__, __LINE__, bo_gem->gem_handle, - bo_gem->name, strerror(errno)); - if (--bo_gem->map_count == 0) - drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); - pthread_mutex_unlock(&bufmgr_gem->lock); - return ret; - } - VG(VALGRIND_MALLOCLIKE_BLOCK(mmap_arg.addr_ptr, mmap_arg.size, 0, 1)); - bo_gem->mem_virtual = (void *)(uintptr_t) mmap_arg.addr_ptr; + ret = do_mmap(bo); + if (ret) { + if (--bo_gem->map_count == 0) + drm_intel_gem_bo_close_vma(bufmgr_gem, bo_gem); + pthread_mutex_unlock(&bufmgr_gem->lock); + return ret; } + DBG("bo_map: %d (%s) -> %p\n", bo_gem->gem_handle, bo_gem->name, bo_gem->mem_virtual); bo->virtual = bo_gem->mem_virtual; |