Lines Matching refs:ctx

35 static struct cxl_sste* find_free_sste(struct cxl_context *ctx,  in find_free_sste()  argument
39 unsigned int mask = (ctx->sst_size >> 7) - 1; /* SSTP0[SegTableSize] */ in find_free_sste()
48 primary = ctx->sstp + (hash << 3); in find_free_sste()
60 ret = primary + ctx->sst_lru; in find_free_sste()
61 ctx->sst_lru = (ctx->sst_lru + 1) & 0x7; in find_free_sste()
66 static void cxl_load_segment(struct cxl_context *ctx, struct copro_slb *slb) in cxl_load_segment() argument
72 spin_lock_irqsave(&ctx->sste_lock, flags); in cxl_load_segment()
73 sste = find_free_sste(ctx, slb); in cxl_load_segment()
78 sste - ctx->sstp, slb->vsid, slb->esid); in cxl_load_segment()
79 trace_cxl_ste_write(ctx, sste - ctx->sstp, slb->esid, slb->vsid); in cxl_load_segment()
84 spin_unlock_irqrestore(&ctx->sste_lock, flags); in cxl_load_segment()
87 static int cxl_fault_segment(struct cxl_context *ctx, struct mm_struct *mm, in cxl_fault_segment() argument
94 cxl_load_segment(ctx, &slb); in cxl_fault_segment()
100 static void cxl_ack_ae(struct cxl_context *ctx) in cxl_ack_ae() argument
104 cxl_ack_irq(ctx, CXL_PSL_TFC_An_AE, 0); in cxl_ack_ae()
106 spin_lock_irqsave(&ctx->lock, flags); in cxl_ack_ae()
107 ctx->pending_fault = true; in cxl_ack_ae()
108 ctx->fault_addr = ctx->dar; in cxl_ack_ae()
109 ctx->fault_dsisr = ctx->dsisr; in cxl_ack_ae()
110 spin_unlock_irqrestore(&ctx->lock, flags); in cxl_ack_ae()
112 wake_up_all(&ctx->wq); in cxl_ack_ae()
115 static int cxl_handle_segment_miss(struct cxl_context *ctx, in cxl_handle_segment_miss() argument
120 pr_devel("CXL interrupt: Segment fault pe: %i ea: %#llx\n", ctx->pe, ea); in cxl_handle_segment_miss()
121 trace_cxl_ste_miss(ctx, ea); in cxl_handle_segment_miss()
123 if ((rc = cxl_fault_segment(ctx, mm, ea))) in cxl_handle_segment_miss()
124 cxl_ack_ae(ctx); in cxl_handle_segment_miss()
128 cxl_ack_irq(ctx, CXL_PSL_TFC_An_R, 0); in cxl_handle_segment_miss()
134 static void cxl_handle_page_fault(struct cxl_context *ctx, in cxl_handle_page_fault() argument
141 trace_cxl_pte_miss(ctx, dsisr, dar); in cxl_handle_page_fault()
145 return cxl_ack_ae(ctx); in cxl_handle_page_fault()
155 if ((!ctx->kernel) || ~(dar & (1ULL << 63))) in cxl_handle_page_fault()
165 pr_devel("Page fault successfully handled for pe: %i!\n", ctx->pe); in cxl_handle_page_fault()
166 cxl_ack_irq(ctx, CXL_PSL_TFC_An_R, 0); in cxl_handle_page_fault()
171 struct cxl_context *ctx = in cxl_handle_fault() local
173 u64 dsisr = ctx->dsisr; in cxl_handle_fault()
174 u64 dar = ctx->dar; in cxl_handle_fault()
178 if (cxl_p2n_read(ctx->afu, CXL_PSL_DSISR_An) != dsisr || in cxl_handle_fault()
179 cxl_p2n_read(ctx->afu, CXL_PSL_DAR_An) != dar || in cxl_handle_fault()
180 cxl_p2n_read(ctx->afu, CXL_PSL_PEHandle_An) != ctx->pe) { in cxl_handle_fault()
184 dev_notice(&ctx->afu->dev, "cxl_handle_fault: Translation fault regs changed\n"); in cxl_handle_fault()
189 if (ctx->status == CLOSED) { in cxl_handle_fault()
190 cxl_ack_ae(ctx); in cxl_handle_fault()
195 "DSISR: %#llx DAR: %#llx\n", ctx->pe, dsisr, dar); in cxl_handle_fault()
197 if (!ctx->kernel) { in cxl_handle_fault()
198 if (!(task = get_pid_task(ctx->pid, PIDTYPE_PID))) { in cxl_handle_fault()
200 pid_nr(ctx->pid)); in cxl_handle_fault()
201 cxl_ack_ae(ctx); in cxl_handle_fault()
206 pid_nr(ctx->pid)); in cxl_handle_fault()
207 cxl_ack_ae(ctx); in cxl_handle_fault()
213 cxl_handle_segment_miss(ctx, mm, dar); in cxl_handle_fault()
215 cxl_handle_page_fault(ctx, mm, dsisr, dar); in cxl_handle_fault()
226 static void cxl_prefault_one(struct cxl_context *ctx, u64 ea) in cxl_prefault_one() argument
232 if (!(task = get_pid_task(ctx->pid, PIDTYPE_PID))) { in cxl_prefault_one()
234 pid_nr(ctx->pid)); in cxl_prefault_one()
239 pid_nr(ctx->pid)); in cxl_prefault_one()
244 rc = cxl_fault_segment(ctx, mm, ea); in cxl_prefault_one()
260 static void cxl_prefault_vma(struct cxl_context *ctx) in cxl_prefault_vma() argument
269 if (!(task = get_pid_task(ctx->pid, PIDTYPE_PID))) { in cxl_prefault_vma()
271 pid_nr(ctx->pid)); in cxl_prefault_vma()
276 pid_nr(ctx->pid)); in cxl_prefault_vma()
291 cxl_load_segment(ctx, &slb); in cxl_prefault_vma()
302 void cxl_prefault(struct cxl_context *ctx, u64 wed) in cxl_prefault() argument
304 switch (ctx->afu->prefault_mode) { in cxl_prefault()
306 cxl_prefault_one(ctx, wed); in cxl_prefault()
309 cxl_prefault_vma(ctx); in cxl_prefault()