u64 start, end;
/* Display may have allocated inside ggtt, so be careful with clearing here */
+ xe_device_mem_access_get(ggtt->gt->xe);
mutex_lock(&ggtt->lock);
drm_mm_for_each_hole(hole, &ggtt->mm, start, end)
xe_ggtt_clear(ggtt, start, end - start);
xe_ggtt_invalidate(ggtt->gt);
mutex_unlock(&ggtt->lock);
+ xe_device_mem_access_put(ggtt->gt->xe);
}
int xe_ggtt_init(struct xe_gt *gt, struct xe_ggtt *ggtt)
if (err)
return err;
+ xe_device_mem_access_get(ggtt->gt->xe);
mutex_lock(&ggtt->lock);
err = drm_mm_insert_node_in_range(&ggtt->mm, &bo->ggtt_node, bo->size,
alignment, 0, start, end, 0);
if (!err)
xe_ggtt_map_bo(ggtt, bo);
mutex_unlock(&ggtt->lock);
+ xe_device_mem_access_put(ggtt->gt->xe);
return err;
}
void xe_ggtt_remove_node(struct xe_ggtt *ggtt, struct drm_mm_node *node)
{
+ xe_device_mem_access_get(ggtt->gt->xe);
mutex_lock(&ggtt->lock);
xe_ggtt_clear(ggtt, node->start, node->size);
xe_ggtt_invalidate(ggtt->gt);
mutex_unlock(&ggtt->lock);
+ xe_device_mem_access_put(ggtt->gt->xe);
}
void xe_ggtt_remove_bo(struct xe_ggtt *ggtt, struct xe_bo *bo)
* need to be updated.
*/
- xe_device_mem_access_get(gt->xe);
mutex_lock(&guc->ct.lock);
seqno = gt->tlb_invalidation.seqno;
if (fence) {
if (ret < 0 && fence)
invalidation_fence_signal(fence);
mutex_unlock(&guc->ct.lock);
- xe_device_mem_access_put(gt->xe);
return ret;
}
struct xe_device *xe = gt_to_xe(gt);
#define MAX_TLB_INVALIDATION_LEN 7
u32 action[MAX_TLB_INVALIDATION_LEN];
- int len = 0;
+ int len = 0, ret;
XE_BUG_ON(!vma);
XE_BUG_ON(len > MAX_TLB_INVALIDATION_LEN);
- return send_tlb_invalidation(>->uc.guc, fence, action, len);
+ xe_device_mem_access_get(gt->xe);
+ ret = send_tlb_invalidation(>->uc.guc, fence, action, len);
+ xe_device_mem_access_put(gt->xe);
+
+ return ret;
}
static bool tlb_invalidation_seqno_past(struct xe_gt *gt, int seqno)