• Home
  • Raw
  • Download

Lines Matching refs:afu

24 static int afu_control(struct cxl_afu *afu, u64 command, u64 clear,  in afu_control()  argument
31 spin_lock(&afu->afu_cntl_lock); in afu_control()
34 trace_cxl_afu_ctrl(afu, command); in afu_control()
36 AFU_Cntl = cxl_p2n_read(afu, CXL_AFU_Cntl_An); in afu_control()
37 cxl_p2n_write(afu, CXL_AFU_Cntl_An, (AFU_Cntl & ~clear) | command); in afu_control()
39 AFU_Cntl = cxl_p2n_read(afu, CXL_AFU_Cntl_An); in afu_control()
42 dev_warn(&afu->dev, "WARNING: AFU control timed out!\n"); in afu_control()
47 if (!cxl_ops->link_ok(afu->adapter, afu)) { in afu_control()
48 afu->enabled = enabled; in afu_control()
56 AFU_Cntl = cxl_p2n_read(afu, CXL_AFU_Cntl_An); in afu_control()
65 cxl_p2n_write(afu, CXL_AFU_Cntl_An, AFU_Cntl & ~CXL_AFU_Cntl_An_RA); in afu_control()
69 afu->enabled = enabled; in afu_control()
71 trace_cxl_afu_ctrl_done(afu, command, rc); in afu_control()
72 spin_unlock(&afu->afu_cntl_lock); in afu_control()
77 static int afu_enable(struct cxl_afu *afu) in afu_enable() argument
81 return afu_control(afu, CXL_AFU_Cntl_An_E, 0, in afu_enable()
86 int cxl_afu_disable(struct cxl_afu *afu) in cxl_afu_disable() argument
90 return afu_control(afu, 0, CXL_AFU_Cntl_An_E, in cxl_afu_disable()
96 static int native_afu_reset(struct cxl_afu *afu) in native_afu_reset() argument
100 return afu_control(afu, CXL_AFU_Cntl_An_RA, 0, in native_afu_reset()
106 static int native_afu_check_and_enable(struct cxl_afu *afu) in native_afu_check_and_enable() argument
108 if (!cxl_ops->link_ok(afu->adapter, afu)) { in native_afu_check_and_enable()
112 if (afu->enabled) in native_afu_check_and_enable()
114 return afu_enable(afu); in native_afu_check_and_enable()
117 int cxl_psl_purge(struct cxl_afu *afu) in cxl_psl_purge() argument
119 u64 PSL_CNTL = cxl_p1n_read(afu, CXL_PSL_SCNTL_An); in cxl_psl_purge()
120 u64 AFU_Cntl = cxl_p2n_read(afu, CXL_AFU_Cntl_An); in cxl_psl_purge()
126 trace_cxl_psl_ctrl(afu, CXL_PSL_SCNTL_An_Pc); in cxl_psl_purge()
130 if (!cxl_ops->link_ok(afu->adapter, afu)) { in cxl_psl_purge()
131 dev_warn(&afu->dev, "PSL Purge called with link down, ignoring\n"); in cxl_psl_purge()
138 cxl_afu_disable(afu); in cxl_psl_purge()
141 cxl_p1n_write(afu, CXL_PSL_SCNTL_An, in cxl_psl_purge()
144 PSL_CNTL = cxl_p1n_read(afu, CXL_PSL_SCNTL_An); in cxl_psl_purge()
148 dev_warn(&afu->dev, "WARNING: PSL Purge timed out!\n"); in cxl_psl_purge()
152 if (!cxl_ops->link_ok(afu->adapter, afu)) { in cxl_psl_purge()
157 dsisr = cxl_p2n_read(afu, CXL_PSL_DSISR_An); in cxl_psl_purge()
160 dar = cxl_p2n_read(afu, CXL_PSL_DAR_An); in cxl_psl_purge()
161 …dev_notice(&afu->dev, "PSL purge terminating pending translation, DSISR: 0x%016llx, DAR: 0x%016llx… in cxl_psl_purge()
162 cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_AE); in cxl_psl_purge()
164 …dev_notice(&afu->dev, "PSL purge acknowledging pending non-translation fault, DSISR: 0x%016llx\n",… in cxl_psl_purge()
165 cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_A); in cxl_psl_purge()
169 PSL_CNTL = cxl_p1n_read(afu, CXL_PSL_SCNTL_An); in cxl_psl_purge()
174 cxl_p1n_write(afu, CXL_PSL_SCNTL_An, in cxl_psl_purge()
177 trace_cxl_psl_ctrl_done(afu, CXL_PSL_SCNTL_An_Pc, rc); in cxl_psl_purge()
199 int cxl_alloc_spa(struct cxl_afu *afu) in cxl_alloc_spa() argument
204 afu->native->spa_order = -1; in cxl_alloc_spa()
206 afu->native->spa_order++; in cxl_alloc_spa()
207 spa_size = (1 << afu->native->spa_order) * PAGE_SIZE; in cxl_alloc_spa()
210 dev_warn(&afu->dev, "num_of_processes too large for the SPA, limiting to %i (0x%x)\n", in cxl_alloc_spa()
211 afu->native->spa_max_procs, afu->native->spa_size); in cxl_alloc_spa()
212 afu->num_procs = afu->native->spa_max_procs; in cxl_alloc_spa()
216 afu->native->spa_size = spa_size; in cxl_alloc_spa()
217 afu->native->spa_max_procs = spa_max_procs(afu->native->spa_size); in cxl_alloc_spa()
218 } while (afu->native->spa_max_procs < afu->num_procs); in cxl_alloc_spa()
220 if (!(afu->native->spa = (struct cxl_process_element *) in cxl_alloc_spa()
221 __get_free_pages(GFP_KERNEL | __GFP_ZERO, afu->native->spa_order))) { in cxl_alloc_spa()
226 1<<afu->native->spa_order, afu->native->spa_max_procs, afu->num_procs); in cxl_alloc_spa()
231 static void attach_spa(struct cxl_afu *afu) in attach_spa() argument
235 afu->native->sw_command_status = (__be64 *)((char *)afu->native->spa + in attach_spa()
236 ((afu->native->spa_max_procs + 3) * 128)); in attach_spa()
238 spap = virt_to_phys(afu->native->spa) & CXL_PSL_SPAP_Addr; in attach_spa()
239 spap |= ((afu->native->spa_size >> (12 - CXL_PSL_SPAP_Size_Shift)) - 1) & CXL_PSL_SPAP_Size; in attach_spa()
242 afu->native->spa, afu->native->spa_max_procs, in attach_spa()
243 afu->native->sw_command_status, spap); in attach_spa()
244 cxl_p1n_write(afu, CXL_PSL_SPAP_An, spap); in attach_spa()
247 static inline void detach_spa(struct cxl_afu *afu) in detach_spa() argument
249 cxl_p1n_write(afu, CXL_PSL_SPAP_An, 0); in detach_spa()
252 void cxl_release_spa(struct cxl_afu *afu) in cxl_release_spa() argument
254 if (afu->native->spa) { in cxl_release_spa()
255 free_pages((unsigned long) afu->native->spa, in cxl_release_spa()
256 afu->native->spa_order); in cxl_release_spa()
257 afu->native->spa = NULL; in cxl_release_spa()
324 static int cxl_write_sstp(struct cxl_afu *afu, u64 sstp0, u64 sstp1) in cxl_write_sstp() argument
329 cxl_p2n_write(afu, CXL_SSTP1_An, 0); in cxl_write_sstp()
332 if ((rc = cxl_afu_slbia(afu))) in cxl_write_sstp()
336 cxl_p2n_write(afu, CXL_SSTP0_An, sstp0); in cxl_write_sstp()
339 cxl_p2n_write(afu, CXL_SSTP1_An, sstp1); in cxl_write_sstp()
347 struct cxl *adapter = ctx->afu->adapter; in slb_invalid()
350 WARN_ON(!mutex_is_locked(&ctx->afu->native->spa_mutex)); in slb_invalid()
376 WARN_ON(!ctx->afu->enabled); in do_process_element_cmd()
380 *(ctx->afu->native->sw_command_status) = cpu_to_be64(cmd | 0 | ctx->pe); in do_process_element_cmd()
382 cxl_p1n_write(ctx->afu, CXL_PSL_LLCMD_An, cmd | ctx->pe); in do_process_element_cmd()
385 dev_warn(&ctx->afu->dev, "WARNING: Process Element Command timed out!\n"); in do_process_element_cmd()
389 if (!cxl_ops->link_ok(ctx->afu->adapter, ctx->afu)) { in do_process_element_cmd()
390 dev_warn(&ctx->afu->dev, "WARNING: Device link down, aborting Process Element Command!\n"); in do_process_element_cmd()
394 state = be64_to_cpup(ctx->afu->native->sw_command_status); in do_process_element_cmd()
422 mutex_lock(&ctx->afu->native->spa_mutex); in add_process_element()
427 mutex_unlock(&ctx->afu->native->spa_mutex); in add_process_element()
439 mutex_lock(&ctx->afu->native->spa_mutex); in terminate_process_element()
445 if (cxl_ops->link_ok(ctx->afu->adapter, ctx->afu)) in terminate_process_element()
450 mutex_unlock(&ctx->afu->native->spa_mutex); in terminate_process_element()
458 mutex_lock(&ctx->afu->native->spa_mutex); in remove_process_element()
464 if (cxl_ops->link_ok(ctx->afu->adapter, ctx->afu)) in remove_process_element()
471 mutex_unlock(&ctx->afu->native->spa_mutex); in remove_process_element()
478 if (!ctx->afu->pp_size || ctx->master) { in cxl_assign_psn_space()
479 ctx->psn_phys = ctx->afu->psn_phys; in cxl_assign_psn_space()
480 ctx->psn_size = ctx->afu->adapter->ps_size; in cxl_assign_psn_space()
482 ctx->psn_phys = ctx->afu->psn_phys + in cxl_assign_psn_space()
483 (ctx->afu->native->pp_offset + ctx->afu->pp_size * ctx->pe); in cxl_assign_psn_space()
484 ctx->psn_size = ctx->afu->pp_size; in cxl_assign_psn_space()
488 static int activate_afu_directed(struct cxl_afu *afu) in activate_afu_directed() argument
492 dev_info(&afu->dev, "Activating AFU directed mode\n"); in activate_afu_directed()
494 afu->num_procs = afu->max_procs_virtualised; in activate_afu_directed()
495 if (afu->native->spa == NULL) { in activate_afu_directed()
496 if (cxl_alloc_spa(afu)) in activate_afu_directed()
499 attach_spa(afu); in activate_afu_directed()
501 cxl_p1n_write(afu, CXL_PSL_SCNTL_An, CXL_PSL_SCNTL_An_PM_AFU); in activate_afu_directed()
502 cxl_p1n_write(afu, CXL_PSL_AMOR_An, 0xFFFFFFFFFFFFFFFFULL); in activate_afu_directed()
503 cxl_p1n_write(afu, CXL_PSL_ID_An, CXL_PSL_ID_An_F | CXL_PSL_ID_An_L); in activate_afu_directed()
505 afu->current_mode = CXL_MODE_DIRECTED; in activate_afu_directed()
507 if ((rc = cxl_chardev_m_afu_add(afu))) in activate_afu_directed()
510 if ((rc = cxl_sysfs_afu_m_add(afu))) in activate_afu_directed()
513 if ((rc = cxl_chardev_s_afu_add(afu))) in activate_afu_directed()
518 cxl_sysfs_afu_m_remove(afu); in activate_afu_directed()
520 cxl_chardev_afu_remove(afu); in activate_afu_directed()
615 ctx->irqs.offset[0] = ctx->afu->native->psl_hwirq; in attach_afu_directed()
625 if ((result = cxl_ops->afu_check_and_enable(ctx->afu))) in attach_afu_directed()
631 static int deactivate_afu_directed(struct cxl_afu *afu) in deactivate_afu_directed() argument
633 dev_info(&afu->dev, "Deactivating AFU directed mode\n"); in deactivate_afu_directed()
635 afu->current_mode = 0; in deactivate_afu_directed()
636 afu->num_procs = 0; in deactivate_afu_directed()
638 cxl_sysfs_afu_m_remove(afu); in deactivate_afu_directed()
639 cxl_chardev_afu_remove(afu); in deactivate_afu_directed()
666 if (afu->adapter->native->sl_ops->needs_reset_before_disable) in deactivate_afu_directed()
667 cxl_ops->afu_reset(afu); in deactivate_afu_directed()
668 cxl_afu_disable(afu); in deactivate_afu_directed()
669 cxl_psl_purge(afu); in deactivate_afu_directed()
674 static int activate_dedicated_process(struct cxl_afu *afu) in activate_dedicated_process() argument
676 dev_info(&afu->dev, "Activating dedicated process mode\n"); in activate_dedicated_process()
678 cxl_p1n_write(afu, CXL_PSL_SCNTL_An, CXL_PSL_SCNTL_An_PM_Process); in activate_dedicated_process()
680 cxl_p1n_write(afu, CXL_PSL_CtxTime_An, 0); /* disable */ in activate_dedicated_process()
681 cxl_p1n_write(afu, CXL_PSL_SPAP_An, 0); /* disable */ in activate_dedicated_process()
682 cxl_p1n_write(afu, CXL_PSL_AMOR_An, 0xFFFFFFFFFFFFFFFFULL); in activate_dedicated_process()
683 cxl_p1n_write(afu, CXL_PSL_LPID_An, mfspr(SPRN_LPID)); in activate_dedicated_process()
684 cxl_p1n_write(afu, CXL_HAURP_An, 0); /* disable */ in activate_dedicated_process()
685 cxl_p1n_write(afu, CXL_PSL_SDR_An, mfspr(SPRN_SDR1)); in activate_dedicated_process()
687 cxl_p2n_write(afu, CXL_CSRP_An, 0); /* disable */ in activate_dedicated_process()
688 cxl_p2n_write(afu, CXL_AURP0_An, 0); /* disable */ in activate_dedicated_process()
689 cxl_p2n_write(afu, CXL_AURP1_An, 0); /* disable */ in activate_dedicated_process()
691 afu->current_mode = CXL_MODE_DEDICATED; in activate_dedicated_process()
692 afu->num_procs = 1; in activate_dedicated_process()
694 return cxl_chardev_d_afu_add(afu); in activate_dedicated_process()
699 struct cxl_afu *afu = ctx->afu; in update_ivtes_dedicated() local
701 cxl_p1n_write(afu, CXL_PSL_IVTE_Offset_An, in update_ivtes_dedicated()
706 cxl_p1n_write(afu, CXL_PSL_IVTE_Limit_An, (u64) in update_ivtes_dedicated()
715 struct cxl_afu *afu = ctx->afu; in attach_dedicated() local
722 cxl_p2n_write(afu, CXL_PSL_PID_TID_An, pid); in attach_dedicated()
724 cxl_p1n_write(afu, CXL_PSL_SR_An, calculate_sr(ctx)); in attach_dedicated()
726 if ((rc = cxl_write_sstp(afu, ctx->sstp0, ctx->sstp1))) in attach_dedicated()
733 cxl_p2n_write(afu, CXL_PSL_AMR_An, amr); in attach_dedicated()
738 if ((rc = cxl_ops->afu_reset(afu))) in attach_dedicated()
741 cxl_p2n_write(afu, CXL_PSL_WED_An, wed); in attach_dedicated()
743 return afu_enable(afu); in attach_dedicated()
746 static int deactivate_dedicated_process(struct cxl_afu *afu) in deactivate_dedicated_process() argument
748 dev_info(&afu->dev, "Deactivating dedicated process mode\n"); in deactivate_dedicated_process()
750 afu->current_mode = 0; in deactivate_dedicated_process()
751 afu->num_procs = 0; in deactivate_dedicated_process()
753 cxl_chardev_afu_remove(afu); in deactivate_dedicated_process()
758 static int native_afu_deactivate_mode(struct cxl_afu *afu, int mode) in native_afu_deactivate_mode() argument
761 return deactivate_afu_directed(afu); in native_afu_deactivate_mode()
763 return deactivate_dedicated_process(afu); in native_afu_deactivate_mode()
767 static int native_afu_activate_mode(struct cxl_afu *afu, int mode) in native_afu_activate_mode() argument
771 if (!(mode & afu->modes_supported)) in native_afu_activate_mode()
774 if (!cxl_ops->link_ok(afu->adapter, afu)) { in native_afu_activate_mode()
780 return activate_afu_directed(afu); in native_afu_activate_mode()
782 return activate_dedicated_process(afu); in native_afu_activate_mode()
790 if (!cxl_ops->link_ok(ctx->afu->adapter, ctx->afu)) { in native_attach_process()
796 if (ctx->afu->current_mode == CXL_MODE_DIRECTED) in native_attach_process()
799 if (ctx->afu->current_mode == CXL_MODE_DEDICATED) in native_attach_process()
823 cxl_ops->afu_reset(ctx->afu); in detach_process_native_dedicated()
824 cxl_afu_disable(ctx->afu); in detach_process_native_dedicated()
825 cxl_psl_purge(ctx->afu); in detach_process_native_dedicated()
831 if (ctx->afu->current_mode == CXL_MODE_DIRECTED) in native_update_ivtes()
833 if (ctx->afu->current_mode == CXL_MODE_DEDICATED) in native_update_ivtes()
854 if (ctx->afu->current_mode == CXL_MODE_DEDICATED) in native_detach_process()
860 static int native_get_irq_info(struct cxl_afu *afu, struct cxl_irq_info *info) in native_get_irq_info() argument
867 if (!cxl_ops->link_ok(afu->adapter, afu)) in native_get_irq_info()
870 info->dsisr = cxl_p2n_read(afu, CXL_PSL_DSISR_An); in native_get_irq_info()
871 info->dar = cxl_p2n_read(afu, CXL_PSL_DAR_An); in native_get_irq_info()
872 info->dsr = cxl_p2n_read(afu, CXL_PSL_DSR_An); in native_get_irq_info()
873 pidtid = cxl_p2n_read(afu, CXL_PSL_PID_TID_An); in native_get_irq_info()
876 info->afu_err = cxl_p2n_read(afu, CXL_AFU_ERR_An); in native_get_irq_info()
877 info->errstat = cxl_p2n_read(afu, CXL_PSL_ErrStat_An); in native_get_irq_info()
887 fir1 = cxl_p1_read(ctx->afu->adapter, CXL_PSL_FIR1); in cxl_native_psl_irq_dump_regs()
888 fir2 = cxl_p1_read(ctx->afu->adapter, CXL_PSL_FIR2); in cxl_native_psl_irq_dump_regs()
889 fir_slice = cxl_p1n_read(ctx->afu, CXL_PSL_FIR_SLICE_An); in cxl_native_psl_irq_dump_regs()
890 afu_debug = cxl_p1n_read(ctx->afu, CXL_AFU_DEBUG_An); in cxl_native_psl_irq_dump_regs()
892 dev_crit(&ctx->afu->dev, "PSL_FIR1: 0x%016llx\n", fir1); in cxl_native_psl_irq_dump_regs()
893 dev_crit(&ctx->afu->dev, "PSL_FIR2: 0x%016llx\n", fir2); in cxl_native_psl_irq_dump_regs()
894 if (ctx->afu->adapter->native->sl_ops->register_serr_irq) { in cxl_native_psl_irq_dump_regs()
895 serr = cxl_p1n_read(ctx->afu, CXL_PSL_SERR_An); in cxl_native_psl_irq_dump_regs()
896 cxl_afu_decode_psl_serr(ctx->afu, serr); in cxl_native_psl_irq_dump_regs()
898 dev_crit(&ctx->afu->dev, "PSL_FIR_SLICE_An: 0x%016llx\n", fir_slice); in cxl_native_psl_irq_dump_regs()
899 dev_crit(&ctx->afu->dev, "CXL_PSL_AFU_DEBUG_An: 0x%016llx\n", afu_debug); in cxl_native_psl_irq_dump_regs()
906 dev_crit(&ctx->afu->dev, "PSL ERROR STATUS: 0x%016llx\n", errstat); in native_handle_psl_slice_error()
908 if (ctx->afu->adapter->native->sl_ops->psl_irq_dump_registers) in native_handle_psl_slice_error()
909 ctx->afu->adapter->native->sl_ops->psl_irq_dump_registers(ctx); in native_handle_psl_slice_error()
911 if (ctx->afu->adapter->native->sl_ops->debugfs_stop_trace) { in native_handle_psl_slice_error()
912 dev_crit(&ctx->afu->dev, "STOPPING CXL TRACE\n"); in native_handle_psl_slice_error()
913 ctx->afu->adapter->native->sl_ops->debugfs_stop_trace(ctx->afu->adapter); in native_handle_psl_slice_error()
919 static irqreturn_t fail_psl_irq(struct cxl_afu *afu, struct cxl_irq_info *irq_info) in fail_psl_irq() argument
922 cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_AE); in fail_psl_irq()
924 cxl_p2n_write(afu, CXL_PSL_TFC_An, CXL_PSL_TFC_An_A); in fail_psl_irq()
931 struct cxl_afu *afu = data; in native_irq_multiplexed() local
934 int ph = cxl_p2n_read(afu, CXL_PSL_PEHandle_An) & 0xffff; in native_irq_multiplexed()
937 if ((ret = native_get_irq_info(afu, &irq_info))) { in native_irq_multiplexed()
939 return fail_psl_irq(afu, &irq_info); in native_irq_multiplexed()
943 ctx = idr_find(&afu->contexts_idr, ph); in native_irq_multiplexed()
955 return fail_psl_irq(afu, &irq_info); in native_irq_multiplexed()
969 ph = cxl_p2n_read(ctx->afu, CXL_PSL_PEHandle_An) & 0xffff; in native_irq_wait()
972 dsisr = cxl_p2n_read(ctx->afu, CXL_PSL_DSISR_An); in native_irq_wait()
982 dev_warn(&ctx->afu->dev, "WARNING: waiting on DSI for PE %i" in native_irq_wait()
989 struct cxl_afu *afu = data; in native_slice_irq_err() local
995 serr = cxl_p1n_read(afu, CXL_PSL_SERR_An); in native_slice_irq_err()
996 fir_slice = cxl_p1n_read(afu, CXL_PSL_FIR_SLICE_An); in native_slice_irq_err()
997 errstat = cxl_p2n_read(afu, CXL_PSL_ErrStat_An); in native_slice_irq_err()
998 afu_debug = cxl_p1n_read(afu, CXL_AFU_DEBUG_An); in native_slice_irq_err()
999 afu_error = cxl_p2n_read(afu, CXL_AFU_ERR_An); in native_slice_irq_err()
1000 dsisr = cxl_p2n_read(afu, CXL_PSL_DSISR_An); in native_slice_irq_err()
1001 cxl_afu_decode_psl_serr(afu, serr); in native_slice_irq_err()
1002 dev_crit(&afu->dev, "PSL_FIR_SLICE_An: 0x%016llx\n", fir_slice); in native_slice_irq_err()
1003 dev_crit(&afu->dev, "CXL_PSL_ErrStat_An: 0x%016llx\n", errstat); in native_slice_irq_err()
1004 dev_crit(&afu->dev, "CXL_PSL_AFU_DEBUG_An: 0x%016llx\n", afu_debug); in native_slice_irq_err()
1005 dev_crit(&afu->dev, "AFU_ERR_An: 0x%.16llx\n", afu_error); in native_slice_irq_err()
1006 dev_crit(&afu->dev, "PSL_DSISR_An: 0x%.16llx\n", dsisr); in native_slice_irq_err()
1008 cxl_p1n_write(afu, CXL_PSL_SERR_An, serr); in native_slice_irq_err()
1081 int cxl_native_register_serr_irq(struct cxl_afu *afu) in cxl_native_register_serr_irq() argument
1086 afu->err_irq_name = kasprintf(GFP_KERNEL, "cxl-%s-err", in cxl_native_register_serr_irq()
1087 dev_name(&afu->dev)); in cxl_native_register_serr_irq()
1088 if (!afu->err_irq_name) in cxl_native_register_serr_irq()
1091 if ((rc = cxl_register_one_irq(afu->adapter, native_slice_irq_err, afu, in cxl_native_register_serr_irq()
1092 &afu->serr_hwirq, in cxl_native_register_serr_irq()
1093 &afu->serr_virq, afu->err_irq_name))) { in cxl_native_register_serr_irq()
1094 kfree(afu->err_irq_name); in cxl_native_register_serr_irq()
1095 afu->err_irq_name = NULL; in cxl_native_register_serr_irq()
1099 serr = cxl_p1n_read(afu, CXL_PSL_SERR_An); in cxl_native_register_serr_irq()
1100 serr = (serr & 0x00ffffffffff0000ULL) | (afu->serr_hwirq & 0xffff); in cxl_native_register_serr_irq()
1101 cxl_p1n_write(afu, CXL_PSL_SERR_An, serr); in cxl_native_register_serr_irq()
1106 void cxl_native_release_serr_irq(struct cxl_afu *afu) in cxl_native_release_serr_irq() argument
1108 if (afu->serr_virq == 0 || in cxl_native_release_serr_irq()
1109 afu->serr_virq != irq_find_mapping(NULL, afu->serr_hwirq)) in cxl_native_release_serr_irq()
1112 cxl_p1n_write(afu, CXL_PSL_SERR_An, 0x0000000000000000); in cxl_native_release_serr_irq()
1113 cxl_unmap_irq(afu->serr_virq, afu); in cxl_native_release_serr_irq()
1114 cxl_ops->release_one_irq(afu->adapter, afu->serr_hwirq); in cxl_native_release_serr_irq()
1115 kfree(afu->err_irq_name); in cxl_native_release_serr_irq()
1116 afu->serr_virq = 0; in cxl_native_release_serr_irq()
1119 int cxl_native_register_psl_irq(struct cxl_afu *afu) in cxl_native_register_psl_irq() argument
1123 afu->psl_irq_name = kasprintf(GFP_KERNEL, "cxl-%s", in cxl_native_register_psl_irq()
1124 dev_name(&afu->dev)); in cxl_native_register_psl_irq()
1125 if (!afu->psl_irq_name) in cxl_native_register_psl_irq()
1128 if ((rc = cxl_register_one_irq(afu->adapter, native_irq_multiplexed, in cxl_native_register_psl_irq()
1129 afu, &afu->native->psl_hwirq, &afu->native->psl_virq, in cxl_native_register_psl_irq()
1130 afu->psl_irq_name))) { in cxl_native_register_psl_irq()
1131 kfree(afu->psl_irq_name); in cxl_native_register_psl_irq()
1132 afu->psl_irq_name = NULL; in cxl_native_register_psl_irq()
1137 void cxl_native_release_psl_irq(struct cxl_afu *afu) in cxl_native_release_psl_irq() argument
1139 if (afu->native->psl_virq == 0 || in cxl_native_release_psl_irq()
1140 afu->native->psl_virq != in cxl_native_release_psl_irq()
1141 irq_find_mapping(NULL, afu->native->psl_hwirq)) in cxl_native_release_psl_irq()
1144 cxl_unmap_irq(afu->native->psl_virq, afu); in cxl_native_release_psl_irq()
1145 cxl_ops->release_one_irq(afu->adapter, afu->native->psl_hwirq); in cxl_native_release_psl_irq()
1146 kfree(afu->psl_irq_name); in cxl_native_release_psl_irq()
1147 afu->native->psl_virq = 0; in cxl_native_release_psl_irq()
1150 static void recover_psl_err(struct cxl_afu *afu, u64 errstat) in recover_psl_err() argument
1157 dsisr = cxl_p2n_read(afu, CXL_PSL_DSISR_An); in recover_psl_err()
1158 cxl_p2n_write(afu, CXL_PSL_DSISR_An, dsisr & ~CXL_PSL_DSISR_An_PE); in recover_psl_err()
1161 cxl_p2n_write(afu, CXL_PSL_ErrStat_An, errstat); in recover_psl_err()
1168 cxl_p2n_write(ctx->afu, CXL_PSL_TFC_An, tfc); in native_ack_irq()
1170 recover_psl_err(ctx->afu, psl_reset_mask); in native_ack_irq()
1175 int cxl_check_error(struct cxl_afu *afu) in cxl_check_error() argument
1177 return (cxl_p1n_read(afu, CXL_PSL_SCNTL_An) == ~0ULL); in cxl_check_error()
1186 static int native_afu_cr_read64(struct cxl_afu *afu, int cr, u64 off, u64 *out) in native_afu_cr_read64() argument
1188 if (unlikely(!cxl_ops->link_ok(afu->adapter, afu))) in native_afu_cr_read64()
1190 if (unlikely(off >= afu->crs_len)) in native_afu_cr_read64()
1192 *out = in_le64(afu->native->afu_desc_mmio + afu->crs_offset + in native_afu_cr_read64()
1193 (cr * afu->crs_len) + off); in native_afu_cr_read64()
1197 static int native_afu_cr_read32(struct cxl_afu *afu, int cr, u64 off, u32 *out) in native_afu_cr_read32() argument
1199 if (unlikely(!cxl_ops->link_ok(afu->adapter, afu))) in native_afu_cr_read32()
1201 if (unlikely(off >= afu->crs_len)) in native_afu_cr_read32()
1203 *out = in_le32(afu->native->afu_desc_mmio + afu->crs_offset + in native_afu_cr_read32()
1204 (cr * afu->crs_len) + off); in native_afu_cr_read32()
1208 static int native_afu_cr_read16(struct cxl_afu *afu, int cr, u64 off, u16 *out) in native_afu_cr_read16() argument
1214 rc = native_afu_cr_read32(afu, cr, aligned_off, &val); in native_afu_cr_read16()
1220 static int native_afu_cr_read8(struct cxl_afu *afu, int cr, u64 off, u8 *out) in native_afu_cr_read8() argument
1226 rc = native_afu_cr_read32(afu, cr, aligned_off, &val); in native_afu_cr_read8()
1232 static int native_afu_cr_write32(struct cxl_afu *afu, int cr, u64 off, u32 in) in native_afu_cr_write32() argument
1234 if (unlikely(!cxl_ops->link_ok(afu->adapter, afu))) in native_afu_cr_write32()
1236 if (unlikely(off >= afu->crs_len)) in native_afu_cr_write32()
1238 out_le32(afu->native->afu_desc_mmio + afu->crs_offset + in native_afu_cr_write32()
1239 (cr * afu->crs_len) + off, in); in native_afu_cr_write32()
1243 static int native_afu_cr_write16(struct cxl_afu *afu, int cr, u64 off, u16 in) in native_afu_cr_write16() argument
1249 rc = native_afu_cr_read32(afu, cr, aligned_off, &val32); in native_afu_cr_write16()
1257 rc = native_afu_cr_write32(afu, cr, aligned_off, val32); in native_afu_cr_write16()
1261 static int native_afu_cr_write8(struct cxl_afu *afu, int cr, u64 off, u8 in) in native_afu_cr_write8() argument
1267 rc = native_afu_cr_read32(afu, cr, aligned_off, &val32); in native_afu_cr_write8()
1274 rc = native_afu_cr_write32(afu, cr, aligned_off, val32); in native_afu_cr_write8()