Lines Matching refs:cd

116 	struct genwqe_dev *cd;  in genwqe_dev_alloc()  local
125 cd = kzalloc(sizeof(struct genwqe_dev), GFP_KERNEL); in genwqe_dev_alloc()
126 if (!cd) in genwqe_dev_alloc()
129 cd->card_idx = i; in genwqe_dev_alloc()
130 cd->class_genwqe = class_genwqe; in genwqe_dev_alloc()
131 cd->debugfs_genwqe = debugfs_genwqe; in genwqe_dev_alloc()
137 cd->use_platform_recovery = CONFIG_GENWQE_PLATFORM_ERROR_RECOVERY; in genwqe_dev_alloc()
139 init_waitqueue_head(&cd->queue_waitq); in genwqe_dev_alloc()
141 spin_lock_init(&cd->file_lock); in genwqe_dev_alloc()
142 INIT_LIST_HEAD(&cd->file_list); in genwqe_dev_alloc()
144 cd->card_state = GENWQE_CARD_UNUSED; in genwqe_dev_alloc()
145 spin_lock_init(&cd->print_lock); in genwqe_dev_alloc()
147 cd->ddcb_software_timeout = GENWQE_DDCB_SOFTWARE_TIMEOUT; in genwqe_dev_alloc()
148 cd->kill_timeout = GENWQE_KILL_TIMEOUT; in genwqe_dev_alloc()
151 cd->vf_jobtimeout_msec[j] = GENWQE_VF_JOBTIMEOUT_MSEC; in genwqe_dev_alloc()
153 genwqe_devices[i] = cd; in genwqe_dev_alloc()
154 return cd; in genwqe_dev_alloc()
157 static void genwqe_dev_free(struct genwqe_dev *cd) in genwqe_dev_free() argument
159 if (!cd) in genwqe_dev_free()
162 genwqe_devices[cd->card_idx] = NULL; in genwqe_dev_free()
163 kfree(cd); in genwqe_dev_free()
174 static int genwqe_bus_reset(struct genwqe_dev *cd) in genwqe_bus_reset() argument
177 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_bus_reset()
180 if (cd->err_inject & GENWQE_INJECT_BUS_RESET_FAILURE) in genwqe_bus_reset()
183 mmio = cd->mmio; in genwqe_bus_reset()
184 cd->mmio = NULL; in genwqe_bus_reset()
207 cd->err_inject &= ~(GENWQE_INJECT_HARDWARE_FAILURE | in genwqe_bus_reset()
218 cd->mmio = pci_iomap(pci_dev, 0, 0); in genwqe_bus_reset()
219 if (cd->mmio == NULL) { in genwqe_bus_reset()
239 bool genwqe_need_err_masking(struct genwqe_dev *cd) in genwqe_need_err_masking() argument
241 return (cd->slu_unitcfg & 0xFFFF0ull) < 0x32170ull; in genwqe_need_err_masking()
244 static void genwqe_tweak_hardware(struct genwqe_dev *cd) in genwqe_tweak_hardware() argument
246 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_tweak_hardware()
249 if (((cd->slu_unitcfg & 0xFFFF0ull) >= 0x32000ull) && in genwqe_tweak_hardware()
250 ((cd->slu_unitcfg & 0xFFFF0ull) <= 0x33250ull)) { in genwqe_tweak_hardware()
253 cd->slu_unitcfg, cd->app_unitcfg); in genwqe_tweak_hardware()
255 __genwqe_writeq(cd, IO_APP_SEC_LEM_DEBUG_OVR, in genwqe_tweak_hardware()
258 __genwqe_writeq(cd, IO_APP_ERR_ACT_MASK, in genwqe_tweak_hardware()
271 int genwqe_recovery_on_fatal_gfir_required(struct genwqe_dev *cd) in genwqe_recovery_on_fatal_gfir_required() argument
273 return (cd->slu_unitcfg & 0xFFFF0ull) >= 0x32170ull; in genwqe_recovery_on_fatal_gfir_required()
276 int genwqe_flash_readback_fails(struct genwqe_dev *cd) in genwqe_flash_readback_fails() argument
278 return (cd->slu_unitcfg & 0xFFFF0ull) < 0x32170ull; in genwqe_flash_readback_fails()
292 static int genwqe_T_psec(struct genwqe_dev *cd) in genwqe_T_psec() argument
297 speed = (u16)((cd->slu_unitcfg >> 28) & 0x0full); in genwqe_T_psec()
313 static bool genwqe_setup_pf_jtimer(struct genwqe_dev *cd) in genwqe_setup_pf_jtimer() argument
315 u32 T = genwqe_T_psec(cd); in genwqe_setup_pf_jtimer()
325 genwqe_write_vreg(cd, IO_SLC_VF_APPJOB_TIMEOUT, in genwqe_setup_pf_jtimer()
333 static bool genwqe_setup_vf_jtimer(struct genwqe_dev *cd) in genwqe_setup_vf_jtimer() argument
335 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_setup_vf_jtimer()
337 u32 T = genwqe_T_psec(cd); in genwqe_setup_vf_jtimer()
347 if (cd->vf_jobtimeout_msec[vf] == 0) in genwqe_setup_vf_jtimer()
350 x = ilog2(cd->vf_jobtimeout_msec[vf] * in genwqe_setup_vf_jtimer()
353 genwqe_write_vreg(cd, IO_SLC_VF_APPJOB_TIMEOUT, in genwqe_setup_vf_jtimer()
359 static int genwqe_ffdc_buffs_alloc(struct genwqe_dev *cd) in genwqe_ffdc_buffs_alloc() argument
366 e = genwqe_ffdc_buff_size(cd, 0); in genwqe_ffdc_buffs_alloc()
369 e = genwqe_ffdc_buff_size(cd, 1); in genwqe_ffdc_buffs_alloc()
372 e = genwqe_ffdc_buff_size(cd, 2); in genwqe_ffdc_buffs_alloc()
380 cd->ffdc[type].entries = e; in genwqe_ffdc_buffs_alloc()
381 cd->ffdc[type].regs = in genwqe_ffdc_buffs_alloc()
392 static void genwqe_ffdc_buffs_free(struct genwqe_dev *cd) in genwqe_ffdc_buffs_free() argument
397 kfree(cd->ffdc[type].regs); in genwqe_ffdc_buffs_free()
398 cd->ffdc[type].regs = NULL; in genwqe_ffdc_buffs_free()
402 static int genwqe_read_ids(struct genwqe_dev *cd) in genwqe_read_ids() argument
406 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_read_ids()
408 cd->slu_unitcfg = __genwqe_readq(cd, IO_SLU_UNITCFG); in genwqe_read_ids()
409 if (cd->slu_unitcfg == IO_ILLEGAL_VALUE) { in genwqe_read_ids()
411 "err: SLUID=%016llx\n", cd->slu_unitcfg); in genwqe_read_ids()
416 slu_id = genwqe_get_slu_id(cd); in genwqe_read_ids()
424 cd->app_unitcfg = __genwqe_readq(cd, IO_APP_UNITCFG); in genwqe_read_ids()
425 if (cd->app_unitcfg == IO_ILLEGAL_VALUE) { in genwqe_read_ids()
427 "err: APPID=%016llx\n", cd->app_unitcfg); in genwqe_read_ids()
431 genwqe_read_app_id(cd, cd->app_name, sizeof(cd->app_name)); in genwqe_read_ids()
441 cd->is_privileged = 0; in genwqe_read_ids()
443 cd->is_privileged = (__genwqe_readq(cd, IO_SLU_BITSTREAM) in genwqe_read_ids()
450 static int genwqe_start(struct genwqe_dev *cd) in genwqe_start() argument
453 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_start()
455 err = genwqe_read_ids(cd); in genwqe_start()
459 if (genwqe_is_privileged(cd)) { in genwqe_start()
461 genwqe_ffdc_buffs_alloc(cd); in genwqe_start()
462 genwqe_stop_traps(cd); in genwqe_start()
465 genwqe_read_ffdc_regs(cd, cd->ffdc[GENWQE_DBG_REGS].regs, in genwqe_start()
466 cd->ffdc[GENWQE_DBG_REGS].entries, 0); in genwqe_start()
468 genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT0, in genwqe_start()
469 cd->ffdc[GENWQE_DBG_UNIT0].regs, in genwqe_start()
470 cd->ffdc[GENWQE_DBG_UNIT0].entries); in genwqe_start()
472 genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT1, in genwqe_start()
473 cd->ffdc[GENWQE_DBG_UNIT1].regs, in genwqe_start()
474 cd->ffdc[GENWQE_DBG_UNIT1].entries); in genwqe_start()
476 genwqe_ffdc_buff_read(cd, GENWQE_DBG_UNIT2, in genwqe_start()
477 cd->ffdc[GENWQE_DBG_UNIT2].regs, in genwqe_start()
478 cd->ffdc[GENWQE_DBG_UNIT2].entries); in genwqe_start()
480 genwqe_start_traps(cd); in genwqe_start()
482 if (cd->card_state == GENWQE_CARD_FATAL_ERROR) { in genwqe_start()
490 cd->softreset = 0x7Cull; in genwqe_start()
491 __genwqe_writeq(cd, IO_SLC_CFGREG_SOFTRESET, in genwqe_start()
492 cd->softreset); in genwqe_start()
494 err = genwqe_bus_reset(cd); in genwqe_start()
507 err = genwqe_read_ids(cd); in genwqe_start()
513 err = genwqe_setup_service_layer(cd); /* does a reset to the card */ in genwqe_start()
521 if (genwqe_is_privileged(cd)) { /* code is running _after_ reset */ in genwqe_start()
522 genwqe_tweak_hardware(cd); in genwqe_start()
524 genwqe_setup_pf_jtimer(cd); in genwqe_start()
525 genwqe_setup_vf_jtimer(cd); in genwqe_start()
528 err = genwqe_device_create(cd); in genwqe_start()
537 genwqe_release_service_layer(cd); in genwqe_start()
539 if (genwqe_is_privileged(cd)) in genwqe_start()
540 genwqe_ffdc_buffs_free(cd); in genwqe_start()
556 static int genwqe_stop(struct genwqe_dev *cd) in genwqe_stop() argument
558 genwqe_finish_queue(cd); /* no register access */ in genwqe_stop()
559 genwqe_device_remove(cd); /* device removed, procs killed */ in genwqe_stop()
560 genwqe_release_service_layer(cd); /* here genwqe_thread is stopped */ in genwqe_stop()
562 if (genwqe_is_privileged(cd)) { in genwqe_stop()
563 pci_disable_sriov(cd->pci_dev); /* access pci config space */ in genwqe_stop()
564 genwqe_ffdc_buffs_free(cd); in genwqe_stop()
580 static int genwqe_recover_card(struct genwqe_dev *cd, int fatal_err) in genwqe_recover_card() argument
583 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_recover_card()
585 genwqe_stop(cd); in genwqe_recover_card()
592 cd->softreset = 0x70ull; in genwqe_recover_card()
593 __genwqe_writeq(cd, IO_SLC_CFGREG_SOFTRESET, cd->softreset); in genwqe_recover_card()
596 rc = genwqe_bus_reset(cd); in genwqe_recover_card()
603 rc = genwqe_start(cd); in genwqe_recover_card()
612 static int genwqe_health_check_cond(struct genwqe_dev *cd, u64 *gfir) in genwqe_health_check_cond() argument
614 *gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_health_check_cond()
616 genwqe_recovery_on_fatal_gfir_required(cd); in genwqe_health_check_cond()
628 static u64 genwqe_fir_checking(struct genwqe_dev *cd) in genwqe_fir_checking() argument
633 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_fir_checking()
643 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_fir_checking()
665 fir = __genwqe_readq(cd, fir_addr); in genwqe_fir_checking()
675 fec = __genwqe_readq(cd, fec_addr); in genwqe_fir_checking()
688 sfir = __genwqe_readq(cd, sfir_addr); in genwqe_fir_checking()
696 sfec = __genwqe_readq(cd, sfec_addr); in genwqe_fir_checking()
703 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_fir_checking()
719 __genwqe_writeq(cd, sfir_addr, sfir); in genwqe_fir_checking()
736 __genwqe_writeq(cd, fir_clr_addr, mask); in genwqe_fir_checking()
744 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_fir_checking()
795 static int genwqe_platform_recovery(struct genwqe_dev *cd) in genwqe_platform_recovery() argument
797 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_platform_recovery()
804 cd->err_inject &= ~(GENWQE_INJECT_HARDWARE_FAILURE | in genwqe_platform_recovery()
808 genwqe_stop(cd); in genwqe_platform_recovery()
813 rc = genwqe_start(cd); in genwqe_platform_recovery()
837 static int genwqe_reload_bistream(struct genwqe_dev *cd) in genwqe_reload_bistream() argument
839 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_reload_bistream()
846 genwqe_stop(cd); in genwqe_reload_bistream()
852 __genwqe_writeq(cd, IO_SLC_CFGREG_SOFTRESET, in genwqe_reload_bistream()
853 (cd->softreset & 0xcull) | 0x70ull); in genwqe_reload_bistream()
868 rc = genwqe_start(cd); in genwqe_reload_bistream()
903 struct genwqe_dev *cd = data; in genwqe_health_thread() local
904 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_health_thread()
909 rc = wait_event_interruptible_timeout(cd->health_waitq, in genwqe_health_thread()
910 (genwqe_health_check_cond(cd, &gfir) || in genwqe_health_thread()
923 slu_unitcfg = __genwqe_readq(cd, IO_SLU_UNITCFG); in genwqe_health_thread()
931 app_unitcfg = __genwqe_readq(cd, IO_APP_UNITCFG); in genwqe_health_thread()
939 gfir = __genwqe_readq(cd, IO_SLC_CFGREG_GFIR); in genwqe_health_thread()
948 gfir_masked = genwqe_fir_checking(cd); in genwqe_health_thread()
956 if ((gfir_masked) && !cd->skip_recovery && in genwqe_health_thread()
957 genwqe_recovery_on_fatal_gfir_required(cd)) { in genwqe_health_thread()
959 cd->card_state = GENWQE_CARD_FATAL_ERROR; in genwqe_health_thread()
961 rc = genwqe_recover_card(cd, 0); in genwqe_health_thread()
968 if (cd->card_state == GENWQE_CARD_RELOAD_BITSTREAM) { in genwqe_health_thread()
970 rc = genwqe_reload_bistream(cd); in genwqe_health_thread()
975 cd->last_gfir = gfir; in genwqe_health_thread()
982 if (cd->use_platform_recovery) { in genwqe_health_thread()
988 readq(cd->mmio + IO_SLC_CFGREG_GFIR); in genwqe_health_thread()
999 rc = genwqe_platform_recovery(cd); in genwqe_health_thread()
1008 cd->card_state = GENWQE_CARD_FATAL_ERROR; in genwqe_health_thread()
1009 genwqe_stop(cd); in genwqe_health_thread()
1018 static int genwqe_health_check_start(struct genwqe_dev *cd) in genwqe_health_check_start() argument
1028 cd->health_thread = kthread_run(genwqe_health_thread, cd, in genwqe_health_check_start()
1030 cd->card_idx); in genwqe_health_check_start()
1031 if (IS_ERR(cd->health_thread)) { in genwqe_health_check_start()
1032 rc = PTR_ERR(cd->health_thread); in genwqe_health_check_start()
1033 cd->health_thread = NULL; in genwqe_health_check_start()
1039 static int genwqe_health_thread_running(struct genwqe_dev *cd) in genwqe_health_thread_running() argument
1041 return cd->health_thread != NULL; in genwqe_health_thread_running()
1044 static int genwqe_health_check_stop(struct genwqe_dev *cd) in genwqe_health_check_stop() argument
1048 if (!genwqe_health_thread_running(cd)) in genwqe_health_check_stop()
1051 rc = kthread_stop(cd->health_thread); in genwqe_health_check_stop()
1052 cd->health_thread = NULL; in genwqe_health_check_stop()
1059 static int genwqe_pci_setup(struct genwqe_dev *cd) in genwqe_pci_setup() argument
1062 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_pci_setup()
1112 cd->mmio_len = pci_resource_len(pci_dev, 0); in genwqe_pci_setup()
1113 cd->mmio = pci_iomap(pci_dev, 0, 0); in genwqe_pci_setup()
1114 if (cd->mmio == NULL) { in genwqe_pci_setup()
1121 cd->num_vfs = pci_sriov_get_totalvfs(pci_dev); in genwqe_pci_setup()
1122 if (cd->num_vfs < 0) in genwqe_pci_setup()
1123 cd->num_vfs = 0; in genwqe_pci_setup()
1125 err = genwqe_read_ids(cd); in genwqe_pci_setup()
1132 pci_iounmap(pci_dev, cd->mmio); in genwqe_pci_setup()
1144 static void genwqe_pci_remove(struct genwqe_dev *cd) in genwqe_pci_remove() argument
1146 struct pci_dev *pci_dev = cd->pci_dev; in genwqe_pci_remove()
1148 if (cd->mmio) in genwqe_pci_remove()
1149 pci_iounmap(pci_dev, cd->mmio); in genwqe_pci_remove()
1167 struct genwqe_dev *cd; in genwqe_probe() local
1171 cd = genwqe_dev_alloc(); in genwqe_probe()
1172 if (IS_ERR(cd)) { in genwqe_probe()
1174 (int)PTR_ERR(cd)); in genwqe_probe()
1175 return PTR_ERR(cd); in genwqe_probe()
1178 dev_set_drvdata(&pci_dev->dev, cd); in genwqe_probe()
1179 cd->pci_dev = pci_dev; in genwqe_probe()
1181 err = genwqe_pci_setup(cd); in genwqe_probe()
1188 err = genwqe_start(cd); in genwqe_probe()
1195 if (genwqe_is_privileged(cd)) { in genwqe_probe()
1196 err = genwqe_health_check_start(cd); in genwqe_probe()
1207 genwqe_stop(cd); in genwqe_probe()
1209 genwqe_pci_remove(cd); in genwqe_probe()
1211 genwqe_dev_free(cd); in genwqe_probe()
1222 struct genwqe_dev *cd = dev_get_drvdata(&pci_dev->dev); in genwqe_remove() local
1224 genwqe_health_check_stop(cd); in genwqe_remove()
1231 genwqe_stop(cd); in genwqe_remove()
1232 genwqe_pci_remove(cd); in genwqe_remove()
1233 genwqe_dev_free(cd); in genwqe_remove()
1245 struct genwqe_dev *cd; in genwqe_err_error_detected() local
1249 cd = dev_get_drvdata(&pci_dev->dev); in genwqe_err_error_detected()
1250 if (cd == NULL) in genwqe_err_error_detected()
1254 genwqe_health_check_stop(cd); in genwqe_err_error_detected()
1255 genwqe_stop(cd); in genwqe_err_error_detected()
1265 genwqe_pci_remove(cd); in genwqe_err_error_detected()
1273 struct genwqe_dev *cd = dev_get_drvdata(&pci_dev->dev); in genwqe_err_slot_reset() local
1275 rc = genwqe_pci_setup(cd); in genwqe_err_slot_reset()
1293 struct genwqe_dev *cd = dev_get_drvdata(&pci_dev->dev); in genwqe_err_resume() local
1295 rc = genwqe_start(cd); in genwqe_err_resume()
1297 rc = genwqe_health_check_start(cd); in genwqe_err_resume()
1311 struct genwqe_dev *cd = dev_get_drvdata(&dev->dev); in genwqe_sriov_configure() local
1314 genwqe_setup_vf_jtimer(cd); in genwqe_sriov_configure()