Lines Matching refs:ctx
25 struct cxl_context *ctx; in cxl_dev_context_init() local
32 ctx = cxl_context_alloc(); in cxl_dev_context_init()
33 if (IS_ERR(ctx)) { in cxl_dev_context_init()
34 rc = PTR_ERR(ctx); in cxl_dev_context_init()
38 ctx->kernelapi = true; in cxl_dev_context_init()
54 rc = cxl_context_init(ctx, afu, false, mapping); in cxl_dev_context_init()
58 return ctx; in cxl_dev_context_init()
63 kfree(ctx); in cxl_dev_context_init()
75 int cxl_release_context(struct cxl_context *ctx) in cxl_release_context() argument
77 if (ctx->status >= STARTED) in cxl_release_context()
80 cxl_context_free(ctx); in cxl_release_context()
86 static irq_hw_number_t cxl_find_afu_irq(struct cxl_context *ctx, int num) in cxl_find_afu_irq() argument
92 range = ctx->irqs.range[r]; in cxl_find_afu_irq()
94 return ctx->irqs.offset[r] + num; in cxl_find_afu_irq()
101 int _cxl_next_msi_hwirq(struct pci_dev *pdev, struct cxl_context **ctx, int *afu_irq) in _cxl_next_msi_hwirq() argument
103 if (*ctx == NULL || *afu_irq == 0) { in _cxl_next_msi_hwirq()
105 *ctx = cxl_get_context(pdev); in _cxl_next_msi_hwirq()
109 *ctx = list_next_entry(*ctx, extra_irq_contexts); in _cxl_next_msi_hwirq()
113 return cxl_find_afu_irq(*ctx, *afu_irq); in _cxl_next_msi_hwirq()
117 int cxl_set_priv(struct cxl_context *ctx, void *priv) in cxl_set_priv() argument
119 if (!ctx) in cxl_set_priv()
122 ctx->priv = priv; in cxl_set_priv()
128 void *cxl_get_priv(struct cxl_context *ctx) in cxl_get_priv() argument
130 if (!ctx) in cxl_get_priv()
133 return ctx->priv; in cxl_get_priv()
137 int cxl_allocate_afu_irqs(struct cxl_context *ctx, int num) in cxl_allocate_afu_irqs() argument
143 num = ctx->afu->pp_irqs; in cxl_allocate_afu_irqs()
144 res = afu_allocate_irqs(ctx, num); in cxl_allocate_afu_irqs()
152 hwirq = cxl_find_afu_irq(ctx, 0); in cxl_allocate_afu_irqs()
154 cxl_map_irq(ctx->afu->adapter, hwirq, cxl_ops->psl_interrupt, ctx, "psl"); in cxl_allocate_afu_irqs()
157 if (ctx->status == STARTED) { in cxl_allocate_afu_irqs()
159 cxl_ops->update_ivtes(ctx); in cxl_allocate_afu_irqs()
167 void cxl_free_afu_irqs(struct cxl_context *ctx) in cxl_free_afu_irqs() argument
173 hwirq = cxl_find_afu_irq(ctx, 0); in cxl_free_afu_irqs()
177 cxl_unmap_irq(virq, ctx); in cxl_free_afu_irqs()
180 afu_irq_name_free(ctx); in cxl_free_afu_irqs()
181 cxl_ops->release_irq_ranges(&ctx->irqs, ctx->afu->adapter); in cxl_free_afu_irqs()
185 int cxl_map_afu_irq(struct cxl_context *ctx, int num, in cxl_map_afu_irq() argument
193 hwirq = cxl_find_afu_irq(ctx, num); in cxl_map_afu_irq()
197 return cxl_map_irq(ctx->afu->adapter, hwirq, handler, cookie, name); in cxl_map_afu_irq()
201 void cxl_unmap_afu_irq(struct cxl_context *ctx, int num, void *cookie) in cxl_unmap_afu_irq() argument
206 hwirq = cxl_find_afu_irq(ctx, num); in cxl_unmap_afu_irq()
220 int cxl_start_context(struct cxl_context *ctx, u64 wed, in cxl_start_context() argument
226 pr_devel("%s: pe: %i\n", __func__, ctx->pe); in cxl_start_context()
228 mutex_lock(&ctx->status_mutex); in cxl_start_context()
229 if (ctx->status == STARTED) in cxl_start_context()
236 rc = cxl_adapter_context_get(ctx->afu->adapter); in cxl_start_context()
241 ctx->pid = get_task_pid(task, PIDTYPE_PID); in cxl_start_context()
242 ctx->glpid = get_task_pid(task->group_leader, PIDTYPE_PID); in cxl_start_context()
244 ctx->real_mode = false; in cxl_start_context()
253 if ((rc = cxl_ops->attach_process(ctx, kernel, wed, 0))) { in cxl_start_context()
254 put_pid(ctx->glpid); in cxl_start_context()
255 put_pid(ctx->pid); in cxl_start_context()
256 ctx->glpid = ctx->pid = NULL; in cxl_start_context()
257 cxl_adapter_context_put(ctx->afu->adapter); in cxl_start_context()
262 ctx->status = STARTED; in cxl_start_context()
264 mutex_unlock(&ctx->status_mutex); in cxl_start_context()
269 int cxl_process_element(struct cxl_context *ctx) in cxl_process_element() argument
271 return ctx->external_pe; in cxl_process_element()
276 int cxl_stop_context(struct cxl_context *ctx) in cxl_stop_context() argument
278 return __detach_context(ctx); in cxl_stop_context()
282 void cxl_set_master(struct cxl_context *ctx) in cxl_set_master() argument
284 ctx->master = true; in cxl_set_master()
288 int cxl_set_translation_mode(struct cxl_context *ctx, bool real_mode) in cxl_set_translation_mode() argument
290 if (ctx->status == STARTED) { in cxl_set_translation_mode()
301 ctx->real_mode = real_mode; in cxl_set_translation_mode()
342 struct file *cxl_get_fd(struct cxl_context *ctx, struct file_operations *fops, in cxl_get_fd() argument
370 file = anon_inode_getfile("cxl", fops, ctx, flags); in cxl_get_fd()
374 file->f_mapping = ctx->mapping; in cxl_get_fd()
391 void cxl_set_driver_ops(struct cxl_context *ctx, in cxl_set_driver_ops() argument
395 atomic_set(&ctx->afu_driver_events, 0); in cxl_set_driver_ops()
396 ctx->afu_driver_ops = ops; in cxl_set_driver_ops()
400 void cxl_context_events_pending(struct cxl_context *ctx, in cxl_context_events_pending() argument
403 atomic_add(new_events, &ctx->afu_driver_events); in cxl_context_events_pending()
404 wake_up_all(&ctx->wq); in cxl_context_events_pending()
408 int cxl_start_work(struct cxl_context *ctx, in cxl_start_work() argument
415 work->num_interrupts = ctx->afu->pp_irqs; in cxl_start_work()
416 else if ((work->num_interrupts < ctx->afu->pp_irqs) || in cxl_start_work()
417 (work->num_interrupts > ctx->afu->irqs_max)) { in cxl_start_work()
421 rc = afu_register_irqs(ctx, work->num_interrupts); in cxl_start_work()
425 rc = cxl_start_context(ctx, work->work_element_descriptor, current); in cxl_start_work()
427 afu_release_irqs(ctx, ctx); in cxl_start_work()
435 void __iomem *cxl_psa_map(struct cxl_context *ctx) in cxl_psa_map() argument
437 if (ctx->status != STARTED) in cxl_psa_map()
441 __func__, ctx->psn_phys, ctx->psn_size); in cxl_psa_map()
442 return ioremap(ctx->psn_phys, ctx->psn_size); in cxl_psa_map()
452 int cxl_afu_reset(struct cxl_context *ctx) in cxl_afu_reset() argument
454 struct cxl_afu *afu = ctx->afu; in cxl_afu_reset()
523 struct cxl_context *ctx, *new_ctx, *default_ctx; in _cxl_cx4_setup_msi_irqs() local
527 ctx = default_ctx = cxl_get_context(pdev); in _cxl_cx4_setup_msi_irqs()
533 rc = cxl_allocate_afu_irqs(ctx, min(remaining, ctx->afu->irqs_max)); in _cxl_cx4_setup_msi_irqs()
538 remaining -= ctx->afu->irqs_max; in _cxl_cx4_setup_msi_irqs()
540 if (ctx != default_ctx && default_ctx->status == STARTED) { in _cxl_cx4_setup_msi_irqs()
541 WARN_ON(cxl_start_context(ctx, in _cxl_cx4_setup_msi_irqs()
552 list_add(&new_ctx->extra_irq_contexts, &ctx->extra_irq_contexts); in _cxl_cx4_setup_msi_irqs()
553 ctx = new_ctx; in _cxl_cx4_setup_msi_irqs()
563 struct cxl_context *ctx, *pos, *tmp; in _cxl_cx4_teardown_msi_irqs() local
565 ctx = cxl_get_context(pdev); in _cxl_cx4_teardown_msi_irqs()
566 if (WARN_ON(!ctx)) in _cxl_cx4_teardown_msi_irqs()
569 cxl_free_afu_irqs(ctx); in _cxl_cx4_teardown_msi_irqs()
570 list_for_each_entry_safe(pos, tmp, &ctx->extra_irq_contexts, extra_irq_contexts) { in _cxl_cx4_teardown_msi_irqs()