drm/i915: Add VM to pin
To verbalize it, one can say, "pin an object into the given address space." The semantics of pinning remain the same otherwise. Certain objects will always have to be bound into the global GTT. Therefore, global GTT is a special case, and keep a special interface around for it (i915_gem_obj_ggtt_pin). v2: s/i915_gem_ggtt_pin/i915_gem_obj_ggtt_pin Signed-off-by: Ben Widawsky <ben@bwidawsk.net> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
This commit is contained in:
parent
fcb4a57805
commit
c37e220461
|
@ -1710,6 +1710,7 @@ struct i915_vma *i915_gem_vma_create(struct drm_i915_gem_object *obj,
|
||||||
void i915_gem_vma_destroy(struct i915_vma *vma);
|
void i915_gem_vma_destroy(struct i915_vma *vma);
|
||||||
|
|
||||||
int __must_check i915_gem_object_pin(struct drm_i915_gem_object *obj,
|
int __must_check i915_gem_object_pin(struct drm_i915_gem_object *obj,
|
||||||
|
struct i915_address_space *vm,
|
||||||
uint32_t alignment,
|
uint32_t alignment,
|
||||||
bool map_and_fenceable,
|
bool map_and_fenceable,
|
||||||
bool nonblocking);
|
bool nonblocking);
|
||||||
|
@ -1895,6 +1896,16 @@ i915_gem_obj_ggtt_size(struct drm_i915_gem_object *obj)
|
||||||
{
|
{
|
||||||
return i915_gem_obj_size(obj, obj_to_ggtt(obj));
|
return i915_gem_obj_size(obj, obj_to_ggtt(obj));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline int __must_check
|
||||||
|
i915_gem_obj_ggtt_pin(struct drm_i915_gem_object *obj,
|
||||||
|
uint32_t alignment,
|
||||||
|
bool map_and_fenceable,
|
||||||
|
bool nonblocking)
|
||||||
|
{
|
||||||
|
return i915_gem_object_pin(obj, obj_to_ggtt(obj), alignment,
|
||||||
|
map_and_fenceable, nonblocking);
|
||||||
|
}
|
||||||
#undef obj_to_ggtt
|
#undef obj_to_ggtt
|
||||||
|
|
||||||
/* i915_gem_context.c */
|
/* i915_gem_context.c */
|
||||||
|
|
|
@ -592,7 +592,7 @@ i915_gem_gtt_pwrite_fast(struct drm_device *dev,
|
||||||
char __user *user_data;
|
char __user *user_data;
|
||||||
int page_offset, page_length, ret;
|
int page_offset, page_length, ret;
|
||||||
|
|
||||||
ret = i915_gem_object_pin(obj, 0, true, true);
|
ret = i915_gem_obj_ggtt_pin(obj, 0, true, true);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -1346,7 +1346,7 @@ int i915_gem_fault(struct vm_area_struct *vma, struct vm_fault *vmf)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Now bind it into the GTT if needed */
|
/* Now bind it into the GTT if needed */
|
||||||
ret = i915_gem_object_pin(obj, 0, true, false);
|
ret = i915_gem_obj_ggtt_pin(obj, 0, true, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto unlock;
|
goto unlock;
|
||||||
|
|
||||||
|
@ -3488,7 +3488,7 @@ i915_gem_object_pin_to_display_plane(struct drm_i915_gem_object *obj,
|
||||||
* (e.g. libkms for the bootup splash), we have to ensure that we
|
* (e.g. libkms for the bootup splash), we have to ensure that we
|
||||||
* always use map_and_fenceable for all scanout buffers.
|
* always use map_and_fenceable for all scanout buffers.
|
||||||
*/
|
*/
|
||||||
ret = i915_gem_object_pin(obj, alignment, true, false);
|
ret = i915_gem_obj_ggtt_pin(obj, alignment, true, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
@ -3631,6 +3631,7 @@ i915_gem_ring_throttle(struct drm_device *dev, struct drm_file *file)
|
||||||
|
|
||||||
int
|
int
|
||||||
i915_gem_object_pin(struct drm_i915_gem_object *obj,
|
i915_gem_object_pin(struct drm_i915_gem_object *obj,
|
||||||
|
struct i915_address_space *vm,
|
||||||
uint32_t alignment,
|
uint32_t alignment,
|
||||||
bool map_and_fenceable,
|
bool map_and_fenceable,
|
||||||
bool nonblocking)
|
bool nonblocking)
|
||||||
|
@ -3720,7 +3721,7 @@ i915_gem_pin_ioctl(struct drm_device *dev, void *data,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (obj->user_pin_count == 0) {
|
if (obj->user_pin_count == 0) {
|
||||||
ret = i915_gem_object_pin(obj, args->alignment, true, false);
|
ret = i915_gem_obj_ggtt_pin(obj, args->alignment, true, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
|
@ -214,7 +214,7 @@ static int create_default_context(struct drm_i915_private *dev_priv)
|
||||||
* default context.
|
* default context.
|
||||||
*/
|
*/
|
||||||
dev_priv->ring[RCS].default_context = ctx;
|
dev_priv->ring[RCS].default_context = ctx;
|
||||||
ret = i915_gem_object_pin(ctx->obj, CONTEXT_ALIGN, false, false);
|
ret = i915_gem_obj_ggtt_pin(ctx->obj, CONTEXT_ALIGN, false, false);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_DEBUG_DRIVER("Couldn't pin %d\n", ret);
|
DRM_DEBUG_DRIVER("Couldn't pin %d\n", ret);
|
||||||
goto err_destroy;
|
goto err_destroy;
|
||||||
|
@ -400,7 +400,7 @@ static int do_switch(struct i915_hw_context *to)
|
||||||
if (from == to)
|
if (from == to)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
ret = i915_gem_object_pin(to->obj, CONTEXT_ALIGN, false, false);
|
ret = i915_gem_obj_ggtt_pin(to->obj, CONTEXT_ALIGN, false, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -409,7 +409,9 @@ i915_gem_execbuffer_reserve_object(struct drm_i915_gem_object *obj,
|
||||||
obj->tiling_mode != I915_TILING_NONE;
|
obj->tiling_mode != I915_TILING_NONE;
|
||||||
need_mappable = need_fence || need_reloc_mappable(obj);
|
need_mappable = need_fence || need_reloc_mappable(obj);
|
||||||
|
|
||||||
ret = i915_gem_object_pin(obj, entry->alignment, need_mappable, false);
|
/* FIXME: vm plubming */
|
||||||
|
ret = i915_gem_object_pin(obj, &dev_priv->gtt.base, entry->alignment,
|
||||||
|
need_mappable, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
|
|
@ -1352,7 +1352,7 @@ void intel_setup_overlay(struct drm_device *dev)
|
||||||
}
|
}
|
||||||
overlay->flip_addr = reg_bo->phys_obj->handle->busaddr;
|
overlay->flip_addr = reg_bo->phys_obj->handle->busaddr;
|
||||||
} else {
|
} else {
|
||||||
ret = i915_gem_object_pin(reg_bo, PAGE_SIZE, true, false);
|
ret = i915_gem_obj_ggtt_pin(reg_bo, PAGE_SIZE, true, false);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("failed to pin overlay register bo\n");
|
DRM_ERROR("failed to pin overlay register bo\n");
|
||||||
goto out_free_bo;
|
goto out_free_bo;
|
||||||
|
|
|
@ -2886,7 +2886,7 @@ intel_alloc_context_page(struct drm_device *dev)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = i915_gem_object_pin(ctx, 4096, true, false);
|
ret = i915_gem_obj_ggtt_pin(ctx, 4096, true, false);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
DRM_ERROR("failed to pin power context: %d\n", ret);
|
DRM_ERROR("failed to pin power context: %d\n", ret);
|
||||||
goto err_unref;
|
goto err_unref;
|
||||||
|
|
|
@ -501,7 +501,7 @@ init_pipe_control(struct intel_ring_buffer *ring)
|
||||||
|
|
||||||
i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
|
i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
|
||||||
|
|
||||||
ret = i915_gem_object_pin(obj, 4096, true, false);
|
ret = i915_gem_obj_ggtt_pin(obj, 4096, true, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_unref;
|
goto err_unref;
|
||||||
|
|
||||||
|
@ -1224,7 +1224,7 @@ static int init_status_page(struct intel_ring_buffer *ring)
|
||||||
|
|
||||||
i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
|
i915_gem_object_set_cache_level(obj, I915_CACHE_LLC);
|
||||||
|
|
||||||
ret = i915_gem_object_pin(obj, 4096, true, false);
|
ret = i915_gem_obj_ggtt_pin(obj, 4096, true, false);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
goto err_unref;
|
goto err_unref;
|
||||||
}
|
}
|
||||||
|
@ -1307,7 +1307,7 @@ static int intel_init_ring_buffer(struct drm_device *dev,
|
||||||
|
|
||||||
ring->obj = obj;
|
ring->obj = obj;
|
||||||
|
|
||||||
ret = i915_gem_object_pin(obj, PAGE_SIZE, true, false);
|
ret = i915_gem_obj_ggtt_pin(obj, PAGE_SIZE, true, false);
|
||||||
if (ret)
|
if (ret)
|
||||||
goto err_unref;
|
goto err_unref;
|
||||||
|
|
||||||
|
@ -1828,7 +1828,7 @@ int intel_init_render_ring_buffer(struct drm_device *dev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = i915_gem_object_pin(obj, 0, true, false);
|
ret = i915_gem_obj_ggtt_pin(obj, 0, true, false);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
drm_gem_object_unreference(&obj->base);
|
drm_gem_object_unreference(&obj->base);
|
||||||
DRM_ERROR("Failed to ping batch bo\n");
|
DRM_ERROR("Failed to ping batch bo\n");
|
||||||
|
|
Loading…
Reference in New Issue