diff --git a/src/gallium/drivers/iris/i915/iris_bufmgr.c b/src/gallium/drivers/iris/i915/iris_bufmgr.c index e90bcc57a69..6422d17e0b7 100644 --- a/src/gallium/drivers/iris/i915/iris_bufmgr.c +++ b/src/gallium/drivers/iris/i915/iris_bufmgr.c @@ -23,10 +23,13 @@ #include "i915/iris_bufmgr.h" #include "common/intel_gem.h" +#include "intel/dev/intel_debug.h" #include "iris/iris_bufmgr.h" #include "drm-uapi/i915_drm.h" +#define FILE_DEBUG_FLAG DEBUG_BUFMGR + bool iris_i915_bo_busy_gem(struct iris_bo *bo) { assert(iris_bo_is_real(bo)); @@ -65,3 +68,43 @@ bool iris_i915_init_global_vm(struct iris_bufmgr *bufmgr, uint32_t *vm_id) *vm_id = value; return ret; } + +int iris_i915_bo_get_tiling(struct iris_bo *bo, uint32_t *tiling) +{ + struct iris_bufmgr *bufmgr = bo->bufmgr; + struct drm_i915_gem_get_tiling ti = { .handle = bo->gem_handle }; + int ret = intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_I915_GEM_GET_TILING, &ti); + + if (ret) { + DBG("gem_get_tiling failed for BO %u: %s\n", + bo->gem_handle, strerror(errno)); + } + + *tiling = ti.tiling_mode; + + return ret; +} + +int iris_i915_bo_set_tiling(struct iris_bo *bo, const struct isl_surf *surf) +{ + struct iris_bufmgr *bufmgr = bo->bufmgr; + uint32_t tiling_mode = isl_tiling_to_i915_tiling(surf->tiling); + int ret; + + /* GEM_SET_TILING is slightly broken and overwrites the input on the + * error path, so we have to open code intel_ioctl(). + */ + struct drm_i915_gem_set_tiling set_tiling = { + .handle = bo->gem_handle, + .tiling_mode = tiling_mode, + .stride = surf->row_pitch_B, + }; + + ret = intel_ioctl(iris_bufmgr_get_fd(bufmgr), DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling); + if (ret) { + DBG("gem_set_tiling failed for BO %u: %s\n", + bo->gem_handle, strerror(errno)); + } + + return ret; +} diff --git a/src/gallium/drivers/iris/i915/iris_bufmgr.h b/src/gallium/drivers/iris/i915/iris_bufmgr.h index 534fd7ca7a1..25ca37be396 100644 --- a/src/gallium/drivers/iris/i915/iris_bufmgr.h +++ b/src/gallium/drivers/iris/i915/iris_bufmgr.h @@ -25,10 +25,14 @@ #include #include +#include "isl/isl.h" + struct iris_bo; struct iris_bufmgr; bool iris_i915_bo_busy_gem(struct iris_bo *bo); int iris_i915_bo_wait_gem(struct iris_bo *bo, int64_t timeout_ns); +int iris_i915_bo_get_tiling(struct iris_bo *bo, uint32_t *tiling); +int iris_i915_bo_set_tiling(struct iris_bo *bo, const struct isl_surf *surf); bool iris_i915_init_global_vm(struct iris_bufmgr *bufmgr, uint32_t *vm_id); diff --git a/src/gallium/drivers/iris/iris_bufmgr.c b/src/gallium/drivers/iris/iris_bufmgr.c index 74153297cf3..c3589d7674b 100644 --- a/src/gallium/drivers/iris/iris_bufmgr.c +++ b/src/gallium/drivers/iris/iris_bufmgr.c @@ -1839,29 +1839,18 @@ iris_gem_get_tiling(struct iris_bo *bo, uint32_t *tiling) struct iris_bufmgr *bufmgr = bo->bufmgr; if (!bufmgr->devinfo.has_tiling_uapi) { - *tiling = I915_TILING_NONE; + *tiling = 0; return 0; } - struct drm_i915_gem_get_tiling ti = { .handle = bo->gem_handle }; - int ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_GET_TILING, &ti); - - if (ret) { - DBG("gem_get_tiling failed for BO %u: %s\n", - bo->gem_handle, strerror(errno)); - } - - *tiling = ti.tiling_mode; - - return ret; + assert(iris_bufmgr_get_device_info(bo->bufmgr)->kmd_type == INTEL_KMD_TYPE_I915); + return iris_i915_bo_get_tiling(bo, tiling); } int iris_gem_set_tiling(struct iris_bo *bo, const struct isl_surf *surf) { struct iris_bufmgr *bufmgr = bo->bufmgr; - uint32_t tiling_mode = isl_tiling_to_i915_tiling(surf->tiling); - int ret; /* If we can't do map_gtt, the set/get_tiling API isn't useful. And it's * actually not supported by the kernel in those cases. @@ -1869,22 +1858,8 @@ iris_gem_set_tiling(struct iris_bo *bo, const struct isl_surf *surf) if (!bufmgr->devinfo.has_tiling_uapi) return 0; - /* GEM_SET_TILING is slightly broken and overwrites the input on the - * error path, so we have to open code intel_ioctl(). - */ - struct drm_i915_gem_set_tiling set_tiling = { - .handle = bo->gem_handle, - .tiling_mode = tiling_mode, - .stride = surf->row_pitch_B, - }; - - ret = intel_ioctl(bufmgr->fd, DRM_IOCTL_I915_GEM_SET_TILING, &set_tiling); - if (ret) { - DBG("gem_set_tiling failed for BO %u: %s\n", - bo->gem_handle, strerror(errno)); - } - - return ret; + assert(iris_bufmgr_get_device_info(bo->bufmgr)->kmd_type == INTEL_KMD_TYPE_I915); + return iris_i915_bo_set_tiling(bo, surf); } struct iris_bo *