Lines Matching refs:ctx
50 void cxl_release_mapping(struct cxl_context *ctx)
52 if (ctx->kernelapi && ctx->mapping)
103 struct cxl_context *ctx;
110 ctx = cxl_context_alloc();
111 if (!ctx)
114 ctx->kernelapi = true;
117 rc = cxl_context_init(ctx, afu, false);
121 return ctx;
124 kfree(ctx);
135 int cxl_release_context(struct cxl_context *ctx)
137 if (ctx->status >= STARTED)
140 cxl_context_free(ctx);
146 static irq_hw_number_t cxl_find_afu_irq(struct cxl_context *ctx, int num)
152 range = ctx->irqs.range[r];
154 return ctx->irqs.offset[r] + num;
162 int cxl_set_priv(struct cxl_context *ctx, void *priv)
164 if (!ctx)
167 ctx->priv = priv;
173 void *cxl_get_priv(struct cxl_context *ctx)
175 if (!ctx)
178 return ctx->priv;
182 int cxl_allocate_afu_irqs(struct cxl_context *ctx, int num)
188 num = ctx->afu->pp_irqs;
189 res = afu_allocate_irqs(ctx, num);
197 hwirq = cxl_find_afu_irq(ctx, 0);
199 cxl_map_irq(ctx->afu->adapter, hwirq, cxl_ops->psl_interrupt, ctx, "psl");
202 if (ctx->status == STARTED) {
204 cxl_ops->update_ivtes(ctx);
212 void cxl_free_afu_irqs(struct cxl_context *ctx)
218 hwirq = cxl_find_afu_irq(ctx, 0);
222 cxl_unmap_irq(virq, ctx);
225 afu_irq_name_free(ctx);
226 cxl_ops->release_irq_ranges(&ctx->irqs, ctx->afu->adapter);
230 int cxl_map_afu_irq(struct cxl_context *ctx, int num,
238 hwirq = cxl_find_afu_irq(ctx, num);
242 return cxl_map_irq(ctx->afu->adapter, hwirq, handler, cookie, name);
246 void cxl_unmap_afu_irq(struct cxl_context *ctx, int num, void *cookie)
251 hwirq = cxl_find_afu_irq(ctx, num);
265 int cxl_start_context(struct cxl_context *ctx, u64 wed,
271 pr_devel("%s: pe: %i\n", __func__, ctx->pe);
273 mutex_lock(&ctx->status_mutex);
274 if (ctx->status == STARTED)
281 rc = cxl_adapter_context_get(ctx->afu->adapter);
286 ctx->pid = get_task_pid(task, PIDTYPE_PID);
290 ctx->mm = get_task_mm(current);
293 cxl_context_mm_count_get(ctx);
295 if (ctx->mm) {
297 mmput(ctx->mm);
299 mm_context_add_copro(ctx->mm);
312 if ((rc = cxl_ops->attach_process(ctx, kernel, wed, 0))) {
313 put_pid(ctx->pid);
314 ctx->pid = NULL;
315 cxl_adapter_context_put(ctx->afu->adapter);
318 cxl_context_mm_count_put(ctx);
319 if (ctx->mm)
320 mm_context_remove_copro(ctx->mm);
325 ctx->status = STARTED;
327 mutex_unlock(&ctx->status_mutex);
332 int cxl_process_element(struct cxl_context *ctx)
334 return ctx->external_pe;
339 int cxl_stop_context(struct cxl_context *ctx)
341 return __detach_context(ctx);
345 void cxl_set_master(struct cxl_context *ctx)
347 ctx->master = true;
387 struct file *cxl_get_fd(struct cxl_context *ctx, struct file_operations *fops,
395 if (ctx->mapping)
420 name = kasprintf(GFP_KERNEL, "cxl:%d", ctx->pe);
421 file = cxl_getfile(name, fops, ctx, flags);
426 cxl_context_set_mapping(ctx, file->f_mapping);
442 void cxl_set_driver_ops(struct cxl_context *ctx,
446 atomic_set(&ctx->afu_driver_events, 0);
447 ctx->afu_driver_ops = ops;
451 void cxl_context_events_pending(struct cxl_context *ctx,
454 atomic_add(new_events, &ctx->afu_driver_events);
455 wake_up_all(&ctx->wq);
459 int cxl_start_work(struct cxl_context *ctx,
466 work->num_interrupts = ctx->afu->pp_irqs;
467 else if ((work->num_interrupts < ctx->afu->pp_irqs) ||
468 (work->num_interrupts > ctx->afu->irqs_max)) {
472 rc = afu_register_irqs(ctx, work->num_interrupts);
476 rc = cxl_start_context(ctx, work->work_element_descriptor, current);
478 afu_release_irqs(ctx, ctx);
486 void __iomem *cxl_psa_map(struct cxl_context *ctx)
488 if (ctx->status != STARTED)
492 __func__, ctx->psn_phys, ctx->psn_size);
493 return ioremap(ctx->psn_phys, ctx->psn_size);
503 int cxl_afu_reset(struct cxl_context *ctx)
505 struct cxl_afu *afu = ctx->afu;