Lines Matching refs:ctx
269 static void slb_invalid(struct cxl_context *ctx) in slb_invalid() argument
271 struct cxl *adapter = ctx->afu->adapter; in slb_invalid()
274 WARN_ON(!mutex_is_locked(&ctx->afu->spa_mutex)); in slb_invalid()
277 ((u64)be32_to_cpu(ctx->elem->common.pid) << 32) | in slb_invalid()
278 be32_to_cpu(ctx->elem->lpid)); in slb_invalid()
289 static int do_process_element_cmd(struct cxl_context *ctx, in do_process_element_cmd() argument
296 trace_cxl_llcmd(ctx, cmd); in do_process_element_cmd()
298 WARN_ON(!ctx->afu->enabled); in do_process_element_cmd()
300 ctx->elem->software_state = cpu_to_be32(pe_state); in do_process_element_cmd()
302 *(ctx->afu->sw_command_status) = cpu_to_be64(cmd | 0 | ctx->pe); in do_process_element_cmd()
304 cxl_p1n_write(ctx->afu, CXL_PSL_LLCMD_An, cmd | ctx->pe); in do_process_element_cmd()
307 dev_warn(&ctx->afu->dev, "WARNING: Process Element Command timed out!\n"); in do_process_element_cmd()
311 state = be64_to_cpup(ctx->afu->sw_command_status); in do_process_element_cmd()
318 (cmd | (cmd >> 16) | ctx->pe)) in do_process_element_cmd()
331 trace_cxl_llcmd_done(ctx, cmd, rc); in do_process_element_cmd()
335 static int add_process_element(struct cxl_context *ctx) in add_process_element() argument
339 mutex_lock(&ctx->afu->spa_mutex); in add_process_element()
340 pr_devel("%s Adding pe: %i started\n", __func__, ctx->pe); in add_process_element()
341 if (!(rc = do_process_element_cmd(ctx, CXL_SPA_SW_CMD_ADD, CXL_PE_SOFTWARE_STATE_V))) in add_process_element()
342 ctx->pe_inserted = true; in add_process_element()
343 pr_devel("%s Adding pe: %i finished\n", __func__, ctx->pe); in add_process_element()
344 mutex_unlock(&ctx->afu->spa_mutex); in add_process_element()
348 static int terminate_process_element(struct cxl_context *ctx) in terminate_process_element() argument
353 if (!(ctx->elem->software_state & cpu_to_be32(CXL_PE_SOFTWARE_STATE_V))) in terminate_process_element()
356 mutex_lock(&ctx->afu->spa_mutex); in terminate_process_element()
357 pr_devel("%s Terminate pe: %i started\n", __func__, ctx->pe); in terminate_process_element()
358 rc = do_process_element_cmd(ctx, CXL_SPA_SW_CMD_TERMINATE, in terminate_process_element()
360 ctx->elem->software_state = 0; /* Remove Valid bit */ in terminate_process_element()
361 pr_devel("%s Terminate pe: %i finished\n", __func__, ctx->pe); in terminate_process_element()
362 mutex_unlock(&ctx->afu->spa_mutex); in terminate_process_element()
366 static int remove_process_element(struct cxl_context *ctx) in remove_process_element() argument
370 mutex_lock(&ctx->afu->spa_mutex); in remove_process_element()
371 pr_devel("%s Remove pe: %i started\n", __func__, ctx->pe); in remove_process_element()
372 if (!(rc = do_process_element_cmd(ctx, CXL_SPA_SW_CMD_REMOVE, 0))) in remove_process_element()
373 ctx->pe_inserted = false; in remove_process_element()
374 slb_invalid(ctx); in remove_process_element()
375 pr_devel("%s Remove pe: %i finished\n", __func__, ctx->pe); in remove_process_element()
376 mutex_unlock(&ctx->afu->spa_mutex); in remove_process_element()
382 static void assign_psn_space(struct cxl_context *ctx) in assign_psn_space() argument
384 if (!ctx->afu->pp_size || ctx->master) { in assign_psn_space()
385 ctx->psn_phys = ctx->afu->psn_phys; in assign_psn_space()
386 ctx->psn_size = ctx->afu->adapter->ps_size; in assign_psn_space()
388 ctx->psn_phys = ctx->afu->psn_phys + in assign_psn_space()
389 (ctx->afu->pp_offset + ctx->afu->pp_size * ctx->pe); in assign_psn_space()
390 ctx->psn_size = ctx->afu->pp_size; in assign_psn_space()
433 static int attach_afu_directed(struct cxl_context *ctx, u64 wed, u64 amr) in attach_afu_directed() argument
438 assign_psn_space(ctx); in attach_afu_directed()
440 ctx->elem->ctxtime = 0; /* disable */ in attach_afu_directed()
441 ctx->elem->lpid = cpu_to_be32(mfspr(SPRN_LPID)); in attach_afu_directed()
442 ctx->elem->haurp = 0; /* disable */ in attach_afu_directed()
443 ctx->elem->sdr = cpu_to_be64(mfspr(SPRN_SDR1)); in attach_afu_directed()
446 if (ctx->master) in attach_afu_directed()
458 ctx->elem->common.pid = cpu_to_be32(current->pid); in attach_afu_directed()
459 ctx->elem->common.tid = 0; in attach_afu_directed()
460 ctx->elem->sr = cpu_to_be64(sr); in attach_afu_directed()
462 ctx->elem->common.csrp = 0; /* disable */ in attach_afu_directed()
463 ctx->elem->common.aurp0 = 0; /* disable */ in attach_afu_directed()
464 ctx->elem->common.aurp1 = 0; /* disable */ in attach_afu_directed()
466 cxl_prefault(ctx, wed); in attach_afu_directed()
468 ctx->elem->common.sstp0 = cpu_to_be64(ctx->sstp0); in attach_afu_directed()
469 ctx->elem->common.sstp1 = cpu_to_be64(ctx->sstp1); in attach_afu_directed()
472 ctx->elem->ivte_offsets[r] = cpu_to_be16(ctx->irqs.offset[r]); in attach_afu_directed()
473 ctx->elem->ivte_ranges[r] = cpu_to_be16(ctx->irqs.range[r]); in attach_afu_directed()
476 ctx->elem->common.amr = cpu_to_be64(amr); in attach_afu_directed()
477 ctx->elem->common.wed = cpu_to_be64(wed); in attach_afu_directed()
480 if ((result = afu_check_and_enable(ctx->afu))) in attach_afu_directed()
483 add_process_element(ctx); in attach_afu_directed()
530 static int attach_dedicated(struct cxl_context *ctx, u64 wed, u64 amr) in attach_dedicated() argument
532 struct cxl_afu *afu = ctx->afu; in attach_dedicated()
538 if (ctx->master) in attach_dedicated()
548 if ((rc = cxl_write_sstp(afu, ctx->sstp0, ctx->sstp1))) in attach_dedicated()
551 cxl_prefault(ctx, wed); in attach_dedicated()
554 (((u64)ctx->irqs.offset[0] & 0xffff) << 48) | in attach_dedicated()
555 (((u64)ctx->irqs.offset[1] & 0xffff) << 32) | in attach_dedicated()
556 (((u64)ctx->irqs.offset[2] & 0xffff) << 16) | in attach_dedicated()
557 ((u64)ctx->irqs.offset[3] & 0xffff)); in attach_dedicated()
559 (((u64)ctx->irqs.range[0] & 0xffff) << 48) | in attach_dedicated()
560 (((u64)ctx->irqs.range[1] & 0xffff) << 32) | in attach_dedicated()
561 (((u64)ctx->irqs.range[2] & 0xffff) << 16) | in attach_dedicated()
562 ((u64)ctx->irqs.range[3] & 0xffff)); in attach_dedicated()
567 assign_psn_space(ctx); in attach_dedicated()
618 int cxl_attach_process(struct cxl_context *ctx, bool kernel, u64 wed, u64 amr) in cxl_attach_process() argument
620 ctx->kernel = kernel; in cxl_attach_process()
621 if (ctx->afu->current_mode == CXL_MODE_DIRECTED) in cxl_attach_process()
622 return attach_afu_directed(ctx, wed, amr); in cxl_attach_process()
624 if (ctx->afu->current_mode == CXL_MODE_DEDICATED) in cxl_attach_process()
625 return attach_dedicated(ctx, wed, amr); in cxl_attach_process()
630 static inline int detach_process_native_dedicated(struct cxl_context *ctx) in detach_process_native_dedicated() argument
632 cxl_afu_reset(ctx->afu); in detach_process_native_dedicated()
633 cxl_afu_disable(ctx->afu); in detach_process_native_dedicated()
634 cxl_psl_purge(ctx->afu); in detach_process_native_dedicated()
638 static inline int detach_process_native_afu_directed(struct cxl_context *ctx) in detach_process_native_afu_directed() argument
640 if (!ctx->pe_inserted) in detach_process_native_afu_directed()
642 if (terminate_process_element(ctx)) in detach_process_native_afu_directed()
644 if (remove_process_element(ctx)) in detach_process_native_afu_directed()
650 int cxl_detach_process(struct cxl_context *ctx) in cxl_detach_process() argument
652 trace_cxl_detach(ctx); in cxl_detach_process()
654 if (ctx->afu->current_mode == CXL_MODE_DEDICATED) in cxl_detach_process()
655 return detach_process_native_dedicated(ctx); in cxl_detach_process()
657 return detach_process_native_afu_directed(ctx); in cxl_detach_process()
690 int cxl_ack_irq(struct cxl_context *ctx, u64 tfc, u64 psl_reset_mask) in cxl_ack_irq() argument
692 trace_cxl_psl_irq_ack(ctx, tfc); in cxl_ack_irq()
694 cxl_p2n_write(ctx->afu, CXL_PSL_TFC_An, tfc); in cxl_ack_irq()
696 recover_psl_err(ctx->afu, psl_reset_mask); in cxl_ack_irq()