Lines Matching refs:ctx

52 	struct cxl_context *ctx;  in __afu_open()  local
81 if (!(ctx = cxl_context_alloc())) { in __afu_open()
86 if ((rc = cxl_context_init(ctx, afu, master, inode->i_mapping))) in __afu_open()
89 pr_devel("afu_open pe: %i\n", ctx->pe); in __afu_open()
90 file->private_data = ctx; in __afu_open()
117 struct cxl_context *ctx = file->private_data; in afu_release() local
120 __func__, ctx->pe); in afu_release()
121 cxl_context_detach(ctx); in afu_release()
128 if (!ctx->kernelapi) { in afu_release()
129 mutex_lock(&ctx->mapping_lock); in afu_release()
130 ctx->mapping = NULL; in afu_release()
131 mutex_unlock(&ctx->mapping_lock); in afu_release()
134 put_device(&ctx->afu->dev); in afu_release()
142 cxl_context_free(ctx); in afu_release()
147 static long afu_ioctl_start_work(struct cxl_context *ctx, in afu_ioctl_start_work() argument
154 pr_devel("%s: pe: %i\n", __func__, ctx->pe); in afu_ioctl_start_work()
164 mutex_lock(&ctx->status_mutex); in afu_ioctl_start_work()
165 if (ctx->status != OPENED) { in afu_ioctl_start_work()
182 work.num_interrupts = ctx->afu->pp_irqs; in afu_ioctl_start_work()
183 else if ((work.num_interrupts < ctx->afu->pp_irqs) || in afu_ioctl_start_work()
184 (work.num_interrupts > ctx->afu->irqs_max)) { in afu_ioctl_start_work()
188 if ((rc = afu_register_irqs(ctx, work.num_interrupts))) in afu_ioctl_start_work()
194 ctx->mmio_err_ff = !!(work.flags & CXL_START_WORK_ERR_FF); in afu_ioctl_start_work()
202 ctx->pid = get_pid(get_task_pid(current, PIDTYPE_PID)); in afu_ioctl_start_work()
204 trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr); in afu_ioctl_start_work()
206 if ((rc = cxl_attach_process(ctx, false, work.work_element_descriptor, in afu_ioctl_start_work()
208 afu_release_irqs(ctx, ctx); in afu_ioctl_start_work()
212 ctx->status = STARTED; in afu_ioctl_start_work()
215 mutex_unlock(&ctx->status_mutex); in afu_ioctl_start_work()
218 static long afu_ioctl_process_element(struct cxl_context *ctx, in afu_ioctl_process_element() argument
221 pr_devel("%s: pe: %i\n", __func__, ctx->pe); in afu_ioctl_process_element()
223 if (copy_to_user(upe, &ctx->pe, sizeof(__u32))) in afu_ioctl_process_element()
229 static long afu_ioctl_get_afu_id(struct cxl_context *ctx, in afu_ioctl_get_afu_id() argument
234 afuid.card_id = ctx->afu->adapter->adapter_num; in afu_ioctl_get_afu_id()
235 afuid.afu_offset = ctx->afu->slice; in afu_ioctl_get_afu_id()
236 afuid.afu_mode = ctx->afu->current_mode; in afu_ioctl_get_afu_id()
239 if (ctx->afu->current_mode == CXL_MODE_DIRECTED && !ctx->master) in afu_ioctl_get_afu_id()
250 struct cxl_context *ctx = file->private_data; in afu_ioctl() local
252 if (ctx->status == CLOSED) in afu_ioctl()
255 if (!cxl_adapter_link_ok(ctx->afu->adapter)) in afu_ioctl()
261 return afu_ioctl_start_work(ctx, (struct cxl_ioctl_start_work __user *)arg); in afu_ioctl()
263 return afu_ioctl_process_element(ctx, (__u32 __user *)arg); in afu_ioctl()
265 return afu_ioctl_get_afu_id(ctx, (struct cxl_afu_id __user *) in afu_ioctl()
279 struct cxl_context *ctx = file->private_data; in afu_mmap() local
282 if (ctx->status != STARTED) in afu_mmap()
285 if (!cxl_adapter_link_ok(ctx->afu->adapter)) in afu_mmap()
288 return cxl_context_iomap(ctx, vm); in afu_mmap()
293 struct cxl_context *ctx = file->private_data; in afu_poll() local
298 poll_wait(file, &ctx->wq, poll); in afu_poll()
300 pr_devel("afu_poll wait done pe: %i\n", ctx->pe); in afu_poll()
302 spin_lock_irqsave(&ctx->lock, flags); in afu_poll()
303 if (ctx->pending_irq || ctx->pending_fault || in afu_poll()
304 ctx->pending_afu_err) in afu_poll()
306 else if (ctx->status == CLOSED) in afu_poll()
310 spin_unlock_irqrestore(&ctx->lock, flags); in afu_poll()
312 pr_devel("afu_poll pe: %i returning %#x\n", ctx->pe, mask); in afu_poll()
317 static inline int ctx_event_pending(struct cxl_context *ctx) in ctx_event_pending() argument
319 return (ctx->pending_irq || ctx->pending_fault || in ctx_event_pending()
320 ctx->pending_afu_err || (ctx->status == CLOSED)); in ctx_event_pending()
326 struct cxl_context *ctx = file->private_data; in afu_read() local
332 if (!cxl_adapter_link_ok(ctx->afu->adapter)) in afu_read()
338 spin_lock_irqsave(&ctx->lock, flags); in afu_read()
341 prepare_to_wait(&ctx->wq, &wait, TASK_INTERRUPTIBLE); in afu_read()
342 if (ctx_event_pending(ctx)) in afu_read()
345 if (!cxl_adapter_link_ok(ctx->afu->adapter)) { in afu_read()
360 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()
364 spin_lock_irqsave(&ctx->lock, flags); in afu_read()
367 finish_wait(&ctx->wq, &wait); in afu_read()
370 event.header.process_element = ctx->pe; in afu_read()
372 if (ctx->pending_irq) { in afu_read()
376 event.irq.irq = find_first_bit(ctx->irq_bitmap, ctx->irq_count) + 1; in afu_read()
377 clear_bit(event.irq.irq - 1, ctx->irq_bitmap); in afu_read()
378 if (bitmap_empty(ctx->irq_bitmap, ctx->irq_count)) in afu_read()
379 ctx->pending_irq = false; in afu_read()
380 } else if (ctx->pending_fault) { in afu_read()
384 event.fault.addr = ctx->fault_addr; in afu_read()
385 event.fault.dsisr = ctx->fault_dsisr; in afu_read()
386 ctx->pending_fault = false; in afu_read()
387 } else if (ctx->pending_afu_err) { in afu_read()
391 event.afu_error.error = ctx->afu_err; in afu_read()
392 ctx->pending_afu_err = false; in afu_read()
393 } else if (ctx->status == CLOSED) { in afu_read()
395 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()
400 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()
407 finish_wait(&ctx->wq, &wait); in afu_read()
408 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()