Lines Matching +full:num +full:- +full:irqs
22 * Since we want to track memory mappings to be able to force-unmap
28 * Therefore we implement our own simple pseudo-filesystem and inode
30 * meta-data associated with it (address_space) and it is shared by
61 if (ctx->kernelapi && ctx->mapping) in cxl_release_mapping()
75 if (fops->owner && !try_module_get(fops->owner)) in cxl_getfile()
76 return ERR_PTR(-ENOENT); in cxl_getfile()
85 inode = alloc_anon_inode(cxl_vfs_mount->mnt_sb); in cxl_getfile()
96 file->private_data = priv; in cxl_getfile()
105 module_put(fops->owner); in cxl_getfile()
121 return ERR_PTR(-ENOMEM); in cxl_dev_context_init()
123 ctx->kernelapi = true; in cxl_dev_context_init()
140 return dev->dev.archdata.cxl_ctx; in cxl_get_context()
146 if (ctx->status >= STARTED) in cxl_release_context()
147 return -EBUSY; in cxl_release_context()
155 static irq_hw_number_t cxl_find_afu_irq(struct cxl_context *ctx, int num) in cxl_find_afu_irq() argument
161 range = ctx->irqs.range[r]; in cxl_find_afu_irq()
162 if (num < range) { in cxl_find_afu_irq()
163 return ctx->irqs.offset[r] + num; in cxl_find_afu_irq()
165 num -= range; in cxl_find_afu_irq()
174 return -EINVAL; in cxl_set_priv()
176 ctx->priv = priv; in cxl_set_priv()
185 return ERR_PTR(-EINVAL); in cxl_get_priv()
187 return ctx->priv; in cxl_get_priv()
191 int cxl_allocate_afu_irqs(struct cxl_context *ctx, int num) in cxl_allocate_afu_irqs() argument
196 if (num == 0) in cxl_allocate_afu_irqs()
197 num = ctx->afu->pp_irqs; in cxl_allocate_afu_irqs()
198 res = afu_allocate_irqs(ctx, num); in cxl_allocate_afu_irqs()
208 cxl_map_irq(ctx->afu->adapter, hwirq, cxl_ops->psl_interrupt, ctx, "psl"); in cxl_allocate_afu_irqs()
211 if (ctx->status == STARTED) { in cxl_allocate_afu_irqs()
212 if (cxl_ops->update_ivtes) in cxl_allocate_afu_irqs()
213 cxl_ops->update_ivtes(ctx); in cxl_allocate_afu_irqs()
235 cxl_ops->release_irq_ranges(&ctx->irqs, ctx->afu->adapter); in cxl_free_afu_irqs()
239 int cxl_map_afu_irq(struct cxl_context *ctx, int num, in cxl_map_afu_irq() argument
247 hwirq = cxl_find_afu_irq(ctx, num); in cxl_map_afu_irq()
249 return -ENOENT; in cxl_map_afu_irq()
251 return cxl_map_irq(ctx->afu->adapter, hwirq, handler, cookie, name); in cxl_map_afu_irq()
255 void cxl_unmap_afu_irq(struct cxl_context *ctx, int num, void *cookie) in cxl_unmap_afu_irq() argument
260 hwirq = cxl_find_afu_irq(ctx, num); in cxl_unmap_afu_irq()
280 pr_devel("%s: pe: %i\n", __func__, ctx->pe); in cxl_start_context()
282 mutex_lock(&ctx->status_mutex); in cxl_start_context()
283 if (ctx->status == STARTED) in cxl_start_context()
290 rc = cxl_adapter_context_get(ctx->afu->adapter); in cxl_start_context()
295 ctx->pid = get_task_pid(task, PIDTYPE_PID); in cxl_start_context()
299 ctx->mm = get_task_mm(current); in cxl_start_context()
304 if (ctx->mm) { in cxl_start_context()
306 mmput(ctx->mm); in cxl_start_context()
308 mm_context_add_copro(ctx->mm); in cxl_start_context()
321 if ((rc = cxl_ops->attach_process(ctx, kernel, wed, 0))) { in cxl_start_context()
322 put_pid(ctx->pid); in cxl_start_context()
323 ctx->pid = NULL; in cxl_start_context()
324 cxl_adapter_context_put(ctx->afu->adapter); in cxl_start_context()
328 if (ctx->mm) in cxl_start_context()
329 mm_context_remove_copro(ctx->mm); in cxl_start_context()
334 ctx->status = STARTED; in cxl_start_context()
336 mutex_unlock(&ctx->status_mutex); in cxl_start_context()
343 return ctx->external_pe; in cxl_process_element()
347 /* Stop a context. Returns 0 on success, otherwise -Errno */
356 ctx->master = true; in cxl_set_master()
393 #define PATCH_FOPS(NAME) if (!fops->NAME) fops->NAME = afu_fops.NAME
404 if (ctx->mapping) in cxl_get_fd()
405 return ERR_PTR(-EEXIST); in cxl_get_fd()
429 name = kasprintf(GFP_KERNEL, "cxl:%d", ctx->pe); in cxl_get_fd()
435 cxl_context_set_mapping(ctx, file->f_mapping); in cxl_get_fd()
447 return file->private_data; in cxl_fops_get_context()
454 WARN_ON(!ops->fetch_event || !ops->event_delivered); in cxl_set_driver_ops()
455 atomic_set(&ctx->afu_driver_events, 0); in cxl_set_driver_ops()
456 ctx->afu_driver_ops = ops; in cxl_set_driver_ops()
463 atomic_add(new_events, &ctx->afu_driver_events); in cxl_context_events_pending()
464 wake_up_all(&ctx->wq); in cxl_context_events_pending()
474 if (!(work->flags & CXL_START_WORK_NUM_IRQS)) in cxl_start_work()
475 work->num_interrupts = ctx->afu->pp_irqs; in cxl_start_work()
476 else if ((work->num_interrupts < ctx->afu->pp_irqs) || in cxl_start_work()
477 (work->num_interrupts > ctx->afu->irqs_max)) { in cxl_start_work()
478 return -EINVAL; in cxl_start_work()
481 rc = afu_register_irqs(ctx, work->num_interrupts); in cxl_start_work()
485 rc = cxl_start_context(ctx, work->work_element_descriptor, current); in cxl_start_work()
497 if (ctx->status != STARTED) in cxl_psa_map()
501 __func__, ctx->psn_phys, ctx->psn_size); in cxl_psa_map()
502 return ioremap(ctx->psn_phys, ctx->psn_size); in cxl_psa_map()
514 struct cxl_afu *afu = ctx->afu; in cxl_afu_reset()
517 rc = cxl_ops->afu_reset(afu); in cxl_afu_reset()
521 return cxl_ops->afu_check_and_enable(afu); in cxl_afu_reset()
528 afu->adapter->perst_same_image = perst_reloads_same_image; in cxl_perst_reloads_same_image()
536 return -ENODEV; in cxl_read_adapter_vpd()
538 return cxl_ops->read_adapter_vpd(afu->adapter, buf, count); in cxl_read_adapter_vpd()