Lines Matching refs:cd
125 struct genwqe_dev *cd; in genwqe_dev_alloc() local
134 cd = kzalloc(sizeof(struct genwqe_dev), GFP_KERNEL); in genwqe_dev_alloc()
135 if (!cd) in genwqe_dev_alloc()
138 cd->card_idx = i; in genwqe_dev_alloc()
139 cd->class_genwqe = class_genwqe; in genwqe_dev_alloc()
140 cd->debugfs_genwqe = debugfs_genwqe; in genwqe_dev_alloc()
146 cd->use_platform_recovery = CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY; in genwqe_dev_alloc()
148 init_waitqueue_head(&cd->queue_waitq); in genwqe_dev_alloc()
150 spin_lock_init(&cd->file_lock); in genwqe_dev_alloc()
151 INIT_LIST_HEAD(&cd->file_list); in genwqe_dev_alloc()
153 cd->card_state = GENWQE_CARD_UNUSED; in genwqe_dev_alloc()
154 spin_lock_init(&cd->print_lock); in genwqe_dev_alloc()
156 cd->ddcb_software_timeout = genwqe_ddcb_software_timeout; in genwqe_dev_alloc()
157 cd->kill_timeout = genwqe_kill_timeout; in genwqe_dev_alloc()
160 cd->vf_jobtimeout_msec[j] = genwqe_vf_jobtimeout_msec; in genwqe_dev_alloc()
162 genwqe_devices[i] = cd; in genwqe_dev_alloc()
163 return cd; in genwqe_dev_alloc()
166 static void genwqe_dev_free(struct genwqe_dev *cd) in genwqe_dev_free() argument
168 if (!cd) in genwqe_dev_free()
171 genwqe_devices[cd->card_idx] = NULL; in genwqe_dev_free()
172 kfree(cd); in genwqe_dev_free()
183 static int genwqe_bus_reset(struct genwqe_dev *cd) in genwqe_bus_reset() argument
186 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_bus_reset()
189 if (cd->err_inject & GENWQE_INJECT_BUS_RESET_FAILURE) in genwqe_bus_reset()
192 mmio = cd->mmio; in genwqe_bus_reset()
193 cd->mmio = NULL; in genwqe_bus_reset()
217 cd->err_inject &= ~(GENWQE_INJECT_HARDWARE_FAILURE | in genwqe_bus_reset()
228 cd->mmio = pci_iomap(pci_dev, 0, 0); in genwqe_bus_reset()
229 if (cd->mmio == NULL) { in genwqe_bus_reset()
249 bool genwqe_need_err_masking(struct genwqe_dev *cd) in genwqe_need_err_masking() argument
251 return (cd->slu_unitcfg & 0xFFFF0ull) < 0x32170ull; in genwqe_need_err_masking()
254 static void genwqe_tweak_hardware(struct genwqe_dev *cd) in genwqe_tweak_hardware() argument
256 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_tweak_hardware()
259 if (((cd->slu_unitcfg & 0xFFFF0ull) >= 0x32000ull) && in genwqe_tweak_hardware()
260 ((cd->slu_unitcfg & 0xFFFF0ull) <= 0x33250ull)) { in genwqe_tweak_hardware()
263 cd->slu_unitcfg, cd->app_unitcfg); in genwqe_tweak_hardware()
265 __genwqe_writeq(cd, IO_APP_SEC_LEM_DEBUG_OVR, in genwqe_tweak_hardware()
268 __genwqe_writeq(cd, IO_APP_ERR_ACT_MASK, in genwqe_tweak_hardware()
281 int genwqe_recovery_on_fatal_gfir_required(struct genwqe_dev *cd) in genwqe_recovery_on_fatal_gfir_required() argument
283 return (cd->slu_unitcfg & 0xFFFF0ull) >= 0x32170ull; in genwqe_recovery_on_fatal_gfir_required()
286 int genwqe_flash_readback_fails(struct genwqe_dev *cd) in genwqe_flash_readback_fails() argument
288 return (cd->slu_unitcfg & 0xFFFF0ull) < 0x32170ull; in genwqe_flash_readback_fails()
302 static int genwqe_T_psec(struct genwqe_dev *cd) in genwqe_T_psec() argument
307 speed = (u16)((cd->slu_unitcfg >> 28) & 0x0full); in genwqe_T_psec()
323 static bool genwqe_setup_pf_jtimer(struct genwqe_dev *cd) in genwqe_setup_pf_jtimer() argument
325 u32 T = genwqe_T_psec(cd); in genwqe_setup_pf_jtimer()
335 genwqe_write_vreg(cd, IO_SLC_VF_APPJOB_TIMEOUT, in genwqe_setup_pf_jtimer()
343 static bool genwqe_setup_vf_jtimer(struct genwqe_dev *cd) in genwqe_setup_vf_jtimer() argument
345 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_setup_vf_jtimer()
347 u32 T = genwqe_T_psec(cd); in genwqe_setup_vf_jtimer()
357 if (cd->vf_jobtimeout_msec[vf] == 0) in genwqe_setup_vf_jtimer()
360 x = ilog2(cd->vf_jobtimeout_msec[vf] * in genwqe_setup_vf_jtimer()
363 genwqe_write_vreg(cd, IO_SLC_VF_APPJOB_TIMEOUT, in genwqe_setup_vf_jtimer()
369 static int genwqe_ffdc_buffs_alloc(struct genwqe_dev *cd) in genwqe_ffdc_buffs_alloc() argument
376 e = genwqe_ffdc_buff_size(cd, 0); in genwqe_ffdc_buffs_alloc()
379 e = genwqe_ffdc_buff_size(cd, 1); in genwqe_ffdc_buffs_alloc()
382 e = genwqe_ffdc_buff_size(cd, 2); in genwqe_ffdc_buffs_alloc()
390 cd->ffdc[type].entries = e; in genwqe_ffdc_buffs_alloc()
391 cd->ffdc[type].regs = in genwqe_ffdc_buffs_alloc()
402 static void genwqe_ffdc_buffs_free(struct genwqe_dev *cd) in genwqe_ffdc_buffs_free() argument
407 kfree(cd->ffdc[type].regs); in genwqe_ffdc_buffs_free()
408 cd->ffdc[type].regs = NULL; in genwqe_ffdc_buffs_free()
412 static int genwqe_read_ids(struct genwqe_dev *cd) in genwqe_read_ids() argument
416 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_read_ids()
418 cd->slu_unitcfg = __genwqe_readq(cd, IO_SLU_UNITCFG); in genwqe_read_ids()
419 if (cd->slu_unitcfg == IO_ILLEGAL_VALUE) { in genwqe_read_ids()
421 "err: SLUID=%016llx\n", cd->slu_unitcfg); in genwqe_read_ids()
426 slu_id = genwqe_get_slu_id(cd); in genwqe_read_ids()
434 cd->app_unitcfg = __genwqe_readq(cd, IO_APP_UNITCFG); in genwqe_read_ids()
435 if (cd->app_unitcfg == IO_ILLEGAL_VALUE) { in genwqe_read_ids()
437 "err: APPID=%016llx\n", cd->app_unitcfg); in genwqe_read_ids()
441 genwqe_read_app_id(cd, cd->app_name, sizeof(cd->app_name)); in genwqe_read_ids()
451 cd->is_privileged = 0; in genwqe_read_ids()
453 cd->is_privileged = (__genwqe_readq(cd, IO_SLU_BITSTREAM) in genwqe_read_ids()
460 static int genwqe_start(struct genwqe_dev *cd) in genwqe_start() argument
463 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_start()
465 err = genwqe_read_ids(cd); in genwqe_start()
469 if (genwqe_is_privileged(cd)) { in genwqe_start()
471 genwqe_ffdc_buffs_alloc(cd); in genwqe_start()
472 genwqe_stop_traps(cd); in genwqe_start()
475 genwqe_read_ffdc_regs(cd, cd->ffdc[GENWQE_DBG_REGS].regs, in genwqe_start()
476 cd->ffdc[GENWQE_DBG_REGS].entries, 0); in genwqe_start()
478 genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT0, in genwqe_start()
479 cd->ffdc[GENWQE_DBG_UNIT0].regs, in genwqe_start()
480 cd->ffdc[GENWQE_DBG_UNIT0].entries); in genwqe_start()
482 genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT1, in genwqe_start()
483 cd->ffdc[GENWQE_DBG_UNIT1].regs, in genwqe_start()
484 cd->ffdc[GENWQE_DBG_UNIT1].entries); in genwqe_start()
486 genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT2, in genwqe_start()
487 cd->ffdc[GENWQE_DBG_UNIT2].regs, in genwqe_start()
488 cd->ffdc[GENWQE_DBG_UNIT2].entries); in genwqe_start()
490 genwqe_start_traps(cd); in genwqe_start()
492 if (cd->card_state == GENWQE_CARD_FATAL_ERROR) { in genwqe_start()
500 cd->softreset = 0x7Cull; in genwqe_start()
501 __genwqe_writeq(cd, IO_SLC_CFGREG_SOFTRESET, in genwqe_start()
502 cd->softreset); in genwqe_start()
504 err = genwqe_bus_reset(cd); in genwqe_start()
517 err = genwqe_read_ids(cd); in genwqe_start()
523 err = genwqe_setup_service_layer(cd); /* does a reset to the card */ in genwqe_start()
531 if (genwqe_is_privileged(cd)) { /* code is running _after_ reset */ in genwqe_start()
532 genwqe_tweak_hardware(cd); in genwqe_start()
534 genwqe_setup_pf_jtimer(cd); in genwqe_start()
535 genwqe_setup_vf_jtimer(cd); in genwqe_start()
538 err = genwqe_device_create(cd); in genwqe_start()
547 genwqe_release_service_layer(cd); in genwqe_start()
549 if (genwqe_is_privileged(cd)) in genwqe_start()
550 genwqe_ffdc_buffs_free(cd); in genwqe_start()
566 static int genwqe_stop(struct genwqe_dev *cd) in genwqe_stop() argument
568 genwqe_finish_queue(cd); /* no register access */ in genwqe_stop()
569 genwqe_device_remove(cd); /* device removed, procs killed */ in genwqe_stop()
570 genwqe_release_service_layer(cd); /* here genwqe_thread is stopped */ in genwqe_stop()
572 if (genwqe_is_privileged(cd)) { in genwqe_stop()
573 pci_disable_sriov(cd->pci_dev); /* access pci config space */ in genwqe_stop()
574 genwqe_ffdc_buffs_free(cd); in genwqe_stop()
590 static int genwqe_recover_card(struct genwqe_dev *cd, int fatal_err) in genwqe_recover_card() argument
593 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_recover_card()
595 genwqe_stop(cd); in genwqe_recover_card()
602 cd->softreset = 0x70ull; in genwqe_recover_card()
603 __genwqe_writeq(cd, IO_SLC_CFGREG_SOFTRESET, cd->softreset); in genwqe_recover_card()
606 rc = genwqe_bus_reset(cd); in genwqe_recover_card()
613 rc = genwqe_start(cd); in genwqe_recover_card()
622 static int genwqe_health_check_cond(struct genwqe_dev *cd, u64 *gfir) in genwqe_health_check_cond() argument
624 *gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_health_check_cond()
626 genwqe_recovery_on_fatal_gfir_required(cd); in genwqe_health_check_cond()
638 static u64 genwqe_fir_checking(struct genwqe_dev *cd) in genwqe_fir_checking() argument
643 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_fir_checking()
653 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_fir_checking()
675 fir = __genwqe_readq(cd, fir_addr); in genwqe_fir_checking()
685 fec = __genwqe_readq(cd, fec_addr); in genwqe_fir_checking()
698 sfir = __genwqe_readq(cd, sfir_addr); in genwqe_fir_checking()
706 sfec = __genwqe_readq(cd, sfec_addr); in genwqe_fir_checking()
713 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_fir_checking()
729 __genwqe_writeq(cd, sfir_addr, sfir); in genwqe_fir_checking()
746 __genwqe_writeq(cd, fir_clr_addr, mask); in genwqe_fir_checking()
754 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_fir_checking()
805 static int genwqe_platform_recovery(struct genwqe_dev *cd) in genwqe_platform_recovery() argument
807 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_platform_recovery()
814 cd->err_inject &= ~(GENWQE_INJECT_HARDWARE_FAILURE | in genwqe_platform_recovery()
818 genwqe_stop(cd); in genwqe_platform_recovery()
823 rc = genwqe_start(cd); in genwqe_platform_recovery()
847 static int genwqe_reload_bistream(struct genwqe_dev *cd) in genwqe_reload_bistream() argument
849 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_reload_bistream()
856 genwqe_stop(cd); in genwqe_reload_bistream()
862 __genwqe_writeq(cd, IO_SLC_CFGREG_SOFTRESET, in genwqe_reload_bistream()
863 (cd->softreset & 0xcull) | 0x70ull); in genwqe_reload_bistream()
878 rc = genwqe_start(cd); in genwqe_reload_bistream()
913 struct genwqe_dev *cd = data; in genwqe_health_thread() local
914 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_health_thread()
919 rc = wait_event_interruptible_timeout(cd->health_waitq, in genwqe_health_thread()
920 (genwqe_health_check_cond(cd, &gfir) || in genwqe_health_thread()
933 slu_unitcfg = __genwqe_readq(cd, IO_SLU_UNITCFG); in genwqe_health_thread()
941 app_unitcfg = __genwqe_readq(cd, IO_APP_UNITCFG); in genwqe_health_thread()
949 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_health_thread()
958 gfir_masked = genwqe_fir_checking(cd); in genwqe_health_thread()
966 if ((gfir_masked) && !cd->skip_recovery && in genwqe_health_thread()
967 genwqe_recovery_on_fatal_gfir_required(cd)) { in genwqe_health_thread()
969 cd->card_state = GENWQE_CARD_FATAL_ERROR; in genwqe_health_thread()
971 rc = genwqe_recover_card(cd, 0); in genwqe_health_thread()
978 if (cd->card_state == GENWQE_CARD_RELOAD_BITSTREAM) { in genwqe_health_thread()
980 rc = genwqe_reload_bistream(cd); in genwqe_health_thread()
985 cd->last_gfir = gfir; in genwqe_health_thread()
992 if (cd->use_platform_recovery) { in genwqe_health_thread()
998 readq(cd->mmio + IO_SLC_CFGREG_GFIR); in genwqe_health_thread()
1009 rc = genwqe_platform_recovery(cd); in genwqe_health_thread()
1018 cd->card_state = GENWQE_CARD_FATAL_ERROR; in genwqe_health_thread()
1019 genwqe_stop(cd); in genwqe_health_thread()
1028 static int genwqe_health_check_start(struct genwqe_dev *cd) in genwqe_health_check_start() argument
1038 cd->health_thread = kthread_run(genwqe_health_thread, cd, in genwqe_health_check_start()
1040 cd->card_idx); in genwqe_health_check_start()
1041 if (IS_ERR(cd->health_thread)) { in genwqe_health_check_start()
1042 rc = PTR_ERR(cd->health_thread); in genwqe_health_check_start()
1043 cd->health_thread = NULL; in genwqe_health_check_start()
1049 static int genwqe_health_thread_running(struct genwqe_dev *cd) in genwqe_health_thread_running() argument
1051 return cd->health_thread != NULL; in genwqe_health_thread_running()
1054 static int genwqe_health_check_stop(struct genwqe_dev *cd) in genwqe_health_check_stop() argument
1058 if (!genwqe_health_thread_running(cd)) in genwqe_health_check_stop()
1061 rc = kthread_stop(cd->health_thread); in genwqe_health_check_stop()
1062 cd->health_thread = NULL; in genwqe_health_check_stop()
1069 static int genwqe_pci_setup(struct genwqe_dev *cd) in genwqe_pci_setup() argument
1072 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_pci_setup()
1123 cd->mmio_len = pci_resource_len(pci_dev, 0); in genwqe_pci_setup()
1124 cd->mmio = pci_iomap(pci_dev, 0, 0); in genwqe_pci_setup()
1125 if (cd->mmio == NULL) { in genwqe_pci_setup()
1132 cd->num_vfs = pci_sriov_get_totalvfs(pci_dev); in genwqe_pci_setup()
1133 if (cd->num_vfs < 0) in genwqe_pci_setup()
1134 cd->num_vfs = 0; in genwqe_pci_setup()
1136 err = genwqe_read_ids(cd); in genwqe_pci_setup()
1143 pci_iounmap(pci_dev, cd->mmio); in genwqe_pci_setup()
1155 static void genwqe_pci_remove(struct genwqe_dev *cd) in genwqe_pci_remove() argument
1158 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_pci_remove()
1160 if (cd->mmio) in genwqe_pci_remove()
1161 pci_iounmap(pci_dev, cd->mmio); in genwqe_pci_remove()
1180 struct genwqe_dev *cd; in genwqe_probe() local
1184 cd = genwqe_dev_alloc(); in genwqe_probe()
1185 if (IS_ERR(cd)) { in genwqe_probe()
1187 (int)PTR_ERR(cd)); in genwqe_probe()
1188 return PTR_ERR(cd); in genwqe_probe()
1191 dev_set_drvdata(&pci_dev->dev, cd); in genwqe_probe()
1192 cd->pci_dev = pci_dev; in genwqe_probe()
1194 err = genwqe_pci_setup(cd); in genwqe_probe()
1201 err = genwqe_start(cd); in genwqe_probe()
1208 if (genwqe_is_privileged(cd)) { in genwqe_probe()
1209 err = genwqe_health_check_start(cd); in genwqe_probe()
1220 genwqe_stop(cd); in genwqe_probe()
1222 genwqe_pci_remove(cd); in genwqe_probe()
1224 genwqe_dev_free(cd); in genwqe_probe()
1235 struct genwqe_dev *cd = dev_get_drvdata(&pci_dev->dev); in genwqe_remove() local
1237 genwqe_health_check_stop(cd); in genwqe_remove()
1244 genwqe_stop(cd); in genwqe_remove()
1245 genwqe_pci_remove(cd); in genwqe_remove()
1246 genwqe_dev_free(cd); in genwqe_remove()
1258 struct genwqe_dev *cd; in genwqe_err_error_detected() local
1262 cd = dev_get_drvdata(&pci_dev->dev); in genwqe_err_error_detected()
1263 if (cd == NULL) in genwqe_err_error_detected()
1267 genwqe_health_check_stop(cd); in genwqe_err_error_detected()
1268 genwqe_stop(cd); in genwqe_err_error_detected()
1278 genwqe_pci_remove(cd); in genwqe_err_error_detected()
1286 struct genwqe_dev *cd = dev_get_drvdata(&pci_dev->dev); in genwqe_err_slot_reset() local
1288 rc = genwqe_pci_setup(cd); in genwqe_err_slot_reset()
1306 struct genwqe_dev *cd = dev_get_drvdata(&pci_dev->dev); in genwqe_err_resume() local
1308 rc = genwqe_start(cd); in genwqe_err_resume()
1310 rc = genwqe_health_check_start(cd); in genwqe_err_resume()
1324 struct genwqe_dev *cd = dev_get_drvdata(&dev->dev); in genwqe_sriov_configure() local
1327 genwqe_setup_vf_jtimer(cd); in genwqe_sriov_configure()