Lines Matching refs:ctx
52 struct cxl_context *ctx; in __afu_open() local
76 if (!(ctx = cxl_context_alloc())) { in __afu_open()
81 if ((rc = cxl_context_init(ctx, afu, master, inode->i_mapping))) in __afu_open()
84 pr_devel("afu_open pe: %i\n", ctx->pe); in __afu_open()
85 file->private_data = ctx; in __afu_open()
111 struct cxl_context *ctx = file->private_data; in afu_release() local
114 __func__, ctx->pe); in afu_release()
115 cxl_context_detach(ctx); in afu_release()
117 mutex_lock(&ctx->mapping_lock); in afu_release()
118 ctx->mapping = NULL; in afu_release()
119 mutex_unlock(&ctx->mapping_lock); in afu_release()
121 put_device(&ctx->afu->dev); in afu_release()
129 cxl_context_free(ctx); in afu_release()
135 static long afu_ioctl_start_work(struct cxl_context *ctx, in afu_ioctl_start_work() argument
142 pr_devel("%s: pe: %i\n", __func__, ctx->pe); in afu_ioctl_start_work()
152 mutex_lock(&ctx->status_mutex); in afu_ioctl_start_work()
153 if (ctx->status != OPENED) { in afu_ioctl_start_work()
170 work.num_interrupts = ctx->afu->pp_irqs; in afu_ioctl_start_work()
171 else if ((work.num_interrupts < ctx->afu->pp_irqs) || in afu_ioctl_start_work()
172 (work.num_interrupts > ctx->afu->irqs_max)) { in afu_ioctl_start_work()
176 if ((rc = afu_register_irqs(ctx, work.num_interrupts))) in afu_ioctl_start_work()
188 ctx->pid = get_pid(get_task_pid(current, PIDTYPE_PID)); in afu_ioctl_start_work()
190 trace_cxl_attach(ctx, work.work_element_descriptor, work.num_interrupts, amr); in afu_ioctl_start_work()
192 if ((rc = cxl_attach_process(ctx, false, work.work_element_descriptor, in afu_ioctl_start_work()
194 afu_release_irqs(ctx); in afu_ioctl_start_work()
198 ctx->status = STARTED; in afu_ioctl_start_work()
201 mutex_unlock(&ctx->status_mutex); in afu_ioctl_start_work()
204 static long afu_ioctl_process_element(struct cxl_context *ctx, in afu_ioctl_process_element() argument
207 pr_devel("%s: pe: %i\n", __func__, ctx->pe); in afu_ioctl_process_element()
209 if (copy_to_user(upe, &ctx->pe, sizeof(__u32))) in afu_ioctl_process_element()
217 struct cxl_context *ctx = file->private_data; in afu_ioctl() local
219 if (ctx->status == CLOSED) in afu_ioctl()
225 return afu_ioctl_start_work(ctx, (struct cxl_ioctl_start_work __user *)arg); in afu_ioctl()
227 return afu_ioctl_process_element(ctx, (__u32 __user *)arg); in afu_ioctl()
240 struct cxl_context *ctx = file->private_data; in afu_mmap() local
243 if (ctx->status != STARTED) in afu_mmap()
246 return cxl_context_iomap(ctx, vm); in afu_mmap()
251 struct cxl_context *ctx = file->private_data; in afu_poll() local
256 poll_wait(file, &ctx->wq, poll); in afu_poll()
258 pr_devel("afu_poll wait done pe: %i\n", ctx->pe); in afu_poll()
260 spin_lock_irqsave(&ctx->lock, flags); in afu_poll()
261 if (ctx->pending_irq || ctx->pending_fault || in afu_poll()
262 ctx->pending_afu_err) in afu_poll()
264 else if (ctx->status == CLOSED) in afu_poll()
268 spin_unlock_irqrestore(&ctx->lock, flags); in afu_poll()
270 pr_devel("afu_poll pe: %i returning %#x\n", ctx->pe, mask); in afu_poll()
275 static inline int ctx_event_pending(struct cxl_context *ctx) in ctx_event_pending() argument
277 return (ctx->pending_irq || ctx->pending_fault || in ctx_event_pending()
278 ctx->pending_afu_err || (ctx->status == CLOSED)); in ctx_event_pending()
284 struct cxl_context *ctx = file->private_data; in afu_read() local
293 spin_lock_irqsave(&ctx->lock, flags); in afu_read()
296 prepare_to_wait(&ctx->wq, &wait, TASK_INTERRUPTIBLE); in afu_read()
297 if (ctx_event_pending(ctx)) in afu_read()
310 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()
314 spin_lock_irqsave(&ctx->lock, flags); in afu_read()
317 finish_wait(&ctx->wq, &wait); in afu_read()
320 event.header.process_element = ctx->pe; in afu_read()
322 if (ctx->pending_irq) { in afu_read()
326 event.irq.irq = find_first_bit(ctx->irq_bitmap, ctx->irq_count) + 1; in afu_read()
327 clear_bit(event.irq.irq - 1, ctx->irq_bitmap); in afu_read()
328 if (bitmap_empty(ctx->irq_bitmap, ctx->irq_count)) in afu_read()
329 ctx->pending_irq = false; in afu_read()
330 } else if (ctx->pending_fault) { in afu_read()
334 event.fault.addr = ctx->fault_addr; in afu_read()
335 event.fault.dsisr = ctx->fault_dsisr; in afu_read()
336 ctx->pending_fault = false; in afu_read()
337 } else if (ctx->pending_afu_err) { in afu_read()
341 event.afu_error.error = ctx->afu_err; in afu_read()
342 ctx->pending_afu_err = false; in afu_read()
343 } else if (ctx->status == CLOSED) { in afu_read()
345 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()
350 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()
357 finish_wait(&ctx->wq, &wait); in afu_read()
358 spin_unlock_irqrestore(&ctx->lock, flags); in afu_read()