• Home
  • Raw
  • Download

Lines Matching +full:ctx +full:- +full:asid

1 // SPDX-License-Identifier: GPL-2.0
4 * Copyright 2016-2019 HabanaLabs, Ltd.
12 static void hl_ctx_fini(struct hl_ctx *ctx) in hl_ctx_fini() argument
14 struct hl_device *hdev = ctx->hdev; in hl_ctx_fini()
26 for (i = 0 ; i < hdev->asic_prop.max_pending_cs ; i++) in hl_ctx_fini()
27 hl_fence_put(ctx->cs_pending[i]); in hl_ctx_fini()
29 kfree(ctx->cs_pending); in hl_ctx_fini()
31 if (ctx->asid != HL_KERNEL_ASID_ID) { in hl_ctx_fini()
32 dev_dbg(hdev->dev, "closing user context %d\n", ctx->asid); in hl_ctx_fini()
40 if ((hdev->in_debug) && (hdev->compute_ctx == ctx)) in hl_ctx_fini()
43 hl_cb_va_pool_fini(ctx); in hl_ctx_fini()
44 hl_vm_ctx_fini(ctx); in hl_ctx_fini()
45 hl_asid_free(hdev, ctx->asid); in hl_ctx_fini()
47 if ((!hdev->pldm) && (hdev->pdev) && in hl_ctx_fini()
48 (!hdev->asic_funcs->is_device_idle(hdev, in hl_ctx_fini()
50 dev_notice(hdev->dev, in hl_ctx_fini()
54 dev_dbg(hdev->dev, "closing kernel context\n"); in hl_ctx_fini()
55 hl_mmu_ctx_fini(ctx); in hl_ctx_fini()
61 struct hl_ctx *ctx; in hl_ctx_do_release() local
63 ctx = container_of(ref, struct hl_ctx, refcount); in hl_ctx_do_release()
65 hl_ctx_fini(ctx); in hl_ctx_do_release()
67 if (ctx->hpriv) in hl_ctx_do_release()
68 hl_hpriv_put(ctx->hpriv); in hl_ctx_do_release()
70 kfree(ctx); in hl_ctx_do_release()
75 struct hl_ctx_mgr *mgr = &hpriv->ctx_mgr; in hl_ctx_create()
76 struct hl_ctx *ctx; in hl_ctx_create() local
79 ctx = kzalloc(sizeof(*ctx), GFP_KERNEL); in hl_ctx_create()
80 if (!ctx) { in hl_ctx_create()
81 rc = -ENOMEM; in hl_ctx_create()
85 mutex_lock(&mgr->ctx_lock); in hl_ctx_create()
86 rc = idr_alloc(&mgr->ctx_handles, ctx, 1, 0, GFP_KERNEL); in hl_ctx_create()
87 mutex_unlock(&mgr->ctx_lock); in hl_ctx_create()
90 dev_err(hdev->dev, "Failed to allocate IDR for a new CTX\n"); in hl_ctx_create()
94 ctx->handle = rc; in hl_ctx_create()
96 rc = hl_ctx_init(hdev, ctx, false); in hl_ctx_create()
101 ctx->hpriv = hpriv; in hl_ctx_create()
104 hpriv->ctx = ctx; in hl_ctx_create()
107 hdev->compute_ctx = ctx; in hl_ctx_create()
112 mutex_lock(&mgr->ctx_lock); in hl_ctx_create()
113 idr_remove(&mgr->ctx_handles, ctx->handle); in hl_ctx_create()
114 mutex_unlock(&mgr->ctx_lock); in hl_ctx_create()
116 kfree(ctx); in hl_ctx_create()
121 void hl_ctx_free(struct hl_device *hdev, struct hl_ctx *ctx) in hl_ctx_free() argument
123 if (kref_put(&ctx->refcount, hl_ctx_do_release) == 1) in hl_ctx_free()
126 dev_warn(hdev->dev, in hl_ctx_free()
130 int hl_ctx_init(struct hl_device *hdev, struct hl_ctx *ctx, bool is_kernel_ctx) in hl_ctx_init() argument
134 ctx->hdev = hdev; in hl_ctx_init()
136 kref_init(&ctx->refcount); in hl_ctx_init()
138 ctx->cs_sequence = 1; in hl_ctx_init()
139 spin_lock_init(&ctx->cs_lock); in hl_ctx_init()
140 atomic_set(&ctx->thread_ctx_switch_token, 1); in hl_ctx_init()
141 ctx->thread_ctx_switch_wait_token = 0; in hl_ctx_init()
142 ctx->cs_pending = kcalloc(hdev->asic_prop.max_pending_cs, in hl_ctx_init()
145 if (!ctx->cs_pending) in hl_ctx_init()
146 return -ENOMEM; in hl_ctx_init()
149 ctx->asid = HL_KERNEL_ASID_ID; /* Kernel driver gets ASID 0 */ in hl_ctx_init()
150 rc = hl_mmu_ctx_init(ctx); in hl_ctx_init()
152 dev_err(hdev->dev, "Failed to init mmu ctx module\n"); in hl_ctx_init()
156 ctx->asid = hl_asid_alloc(hdev); in hl_ctx_init()
157 if (!ctx->asid) { in hl_ctx_init()
158 dev_err(hdev->dev, "No free ASID, failed to create context\n"); in hl_ctx_init()
159 rc = -ENOMEM; in hl_ctx_init()
163 rc = hl_vm_ctx_init(ctx); in hl_ctx_init()
165 dev_err(hdev->dev, "Failed to init mem ctx module\n"); in hl_ctx_init()
166 rc = -ENOMEM; in hl_ctx_init()
170 rc = hl_cb_va_pool_init(ctx); in hl_ctx_init()
172 dev_err(hdev->dev, in hl_ctx_init()
177 rc = hdev->asic_funcs->ctx_init(ctx); in hl_ctx_init()
179 dev_err(hdev->dev, "ctx_init failed\n"); in hl_ctx_init()
183 dev_dbg(hdev->dev, "create user context %d\n", ctx->asid); in hl_ctx_init()
189 hl_cb_va_pool_fini(ctx); in hl_ctx_init()
191 hl_vm_ctx_fini(ctx); in hl_ctx_init()
193 hl_asid_free(hdev, ctx->asid); in hl_ctx_init()
195 kfree(ctx->cs_pending); in hl_ctx_init()
200 void hl_ctx_get(struct hl_device *hdev, struct hl_ctx *ctx) in hl_ctx_get() argument
202 kref_get(&ctx->refcount); in hl_ctx_get()
205 int hl_ctx_put(struct hl_ctx *ctx) in hl_ctx_put() argument
207 return kref_put(&ctx->refcount, hl_ctx_do_release); in hl_ctx_put()
210 struct hl_fence *hl_ctx_get_fence(struct hl_ctx *ctx, u64 seq) in hl_ctx_get_fence() argument
212 struct asic_fixed_properties *asic_prop = &ctx->hdev->asic_prop; in hl_ctx_get_fence()
215 spin_lock(&ctx->cs_lock); in hl_ctx_get_fence()
217 if (seq >= ctx->cs_sequence) { in hl_ctx_get_fence()
218 spin_unlock(&ctx->cs_lock); in hl_ctx_get_fence()
219 return ERR_PTR(-EINVAL); in hl_ctx_get_fence()
222 if (seq + asic_prop->max_pending_cs < ctx->cs_sequence) { in hl_ctx_get_fence()
223 spin_unlock(&ctx->cs_lock); in hl_ctx_get_fence()
227 fence = ctx->cs_pending[seq & (asic_prop->max_pending_cs - 1)]; in hl_ctx_get_fence()
230 spin_unlock(&ctx->cs_lock); in hl_ctx_get_fence()
236 * hl_ctx_mgr_init - initialize the context manager
245 mutex_init(&mgr->ctx_lock); in hl_ctx_mgr_init()
246 idr_init(&mgr->ctx_handles); in hl_ctx_mgr_init()
250 * hl_ctx_mgr_fini - finalize the context manager
260 struct hl_ctx *ctx; in hl_ctx_mgr_fini() local
264 idp = &mgr->ctx_handles; in hl_ctx_mgr_fini()
266 idr_for_each_entry(idp, ctx, id) in hl_ctx_mgr_fini()
267 hl_ctx_free(hdev, ctx); in hl_ctx_mgr_fini()
269 idr_destroy(&mgr->ctx_handles); in hl_ctx_mgr_fini()
270 mutex_destroy(&mgr->ctx_lock); in hl_ctx_mgr_fini()