Lines Matching refs:dev

19 	struct mlx5_core_dev *dev;  member
44 static u8 mlx5_get_fw_rst_state(struct mlx5_core_dev *dev) in mlx5_get_fw_rst_state() argument
46 return (ioread32be(&dev->iseg->initializing) >> MLX5_RST_STATE_BIT_NUM) & 0xF; in mlx5_get_fw_rst_state()
49 static void mlx5_set_fw_rst_ack(struct mlx5_core_dev *dev) in mlx5_set_fw_rst_ack() argument
51 iowrite32be(BIT(MLX5_RST_ACK_BIT_NUM), &dev->iseg->initializing); in mlx5_set_fw_rst_ack()
57 struct mlx5_core_dev *dev = devlink_priv(devlink); in mlx5_fw_reset_enable_remote_dev_reset_set() local
60 fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_enable_remote_dev_reset_set()
72 struct mlx5_core_dev *dev = devlink_priv(devlink); in mlx5_fw_reset_enable_remote_dev_reset_get() local
75 fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_enable_remote_dev_reset_get()
82 static int mlx5_reg_mfrl_set(struct mlx5_core_dev *dev, u8 reset_level, in mlx5_reg_mfrl_set() argument
93 return mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), MLX5_REG_MFRL, 0, 1); in mlx5_reg_mfrl_set()
96 static int mlx5_reg_mfrl_query(struct mlx5_core_dev *dev, u8 *reset_level, in mlx5_reg_mfrl_query() argument
103 err = mlx5_core_access_reg(dev, in, sizeof(in), out, sizeof(out), MLX5_REG_MFRL, 0, 0); in mlx5_reg_mfrl_query()
117 int mlx5_fw_reset_query(struct mlx5_core_dev *dev, u8 *reset_level, u8 *reset_type) in mlx5_fw_reset_query() argument
119 return mlx5_reg_mfrl_query(dev, reset_level, reset_type, NULL); in mlx5_fw_reset_query()
122 static int mlx5_fw_reset_get_reset_state_err(struct mlx5_core_dev *dev, in mlx5_fw_reset_get_reset_state_err() argument
127 if (mlx5_reg_mfrl_query(dev, NULL, NULL, &reset_state)) in mlx5_fw_reset_get_reset_state_err()
154 int mlx5_fw_reset_set_reset_sync(struct mlx5_core_dev *dev, u8 reset_type_sel, in mlx5_fw_reset_set_reset_sync() argument
157 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_set_reset_sync()
167 err = mlx5_access_reg(dev, in, sizeof(in), out, sizeof(out), in mlx5_fw_reset_set_reset_sync()
173 if (err == -EREMOTEIO && MLX5_CAP_MCAM_FEATURE(dev, reset_state)) { in mlx5_fw_reset_set_reset_sync()
174 rst_res = mlx5_fw_reset_get_reset_state_err(dev, extack); in mlx5_fw_reset_set_reset_sync()
179 return mlx5_cmd_check(dev, err, in, out); in mlx5_fw_reset_set_reset_sync()
182 int mlx5_fw_reset_verify_fw_complete(struct mlx5_core_dev *dev, in mlx5_fw_reset_verify_fw_complete() argument
188 err = mlx5_fw_reset_get_reset_state_err(dev, extack); in mlx5_fw_reset_verify_fw_complete()
192 rst_state = mlx5_get_fw_rst_state(dev); in mlx5_fw_reset_verify_fw_complete()
196 mlx5_core_err(dev, "Sync reset did not complete, state=%d\n", rst_state); in mlx5_fw_reset_verify_fw_complete()
201 int mlx5_fw_reset_set_live_patch(struct mlx5_core_dev *dev) in mlx5_fw_reset_set_live_patch() argument
203 return mlx5_reg_mfrl_set(dev, MLX5_MFRL_REG_RESET_LEVEL0, 0, 0, false); in mlx5_fw_reset_set_live_patch()
206 static void mlx5_fw_reset_complete_reload(struct mlx5_core_dev *dev, bool unloaded) in mlx5_fw_reset_complete_reload() argument
208 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_complete_reload()
209 struct devlink *devlink = priv_to_devlink(dev); in mlx5_fw_reset_complete_reload()
216 mlx5_unload_one(dev, false); in mlx5_fw_reset_complete_reload()
217 if (mlx5_health_wait_pci_up(dev)) in mlx5_fw_reset_complete_reload()
218 mlx5_core_err(dev, "reset reload flow aborted, PCI reads still not working\n"); in mlx5_fw_reset_complete_reload()
220 mlx5_load_one(dev, true); in mlx5_fw_reset_complete_reload()
229 static void mlx5_stop_sync_reset_poll(struct mlx5_core_dev *dev) in mlx5_stop_sync_reset_poll() argument
231 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_stop_sync_reset_poll()
236 static int mlx5_sync_reset_clear_reset_requested(struct mlx5_core_dev *dev, bool poll_health) in mlx5_sync_reset_clear_reset_requested() argument
238 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_sync_reset_clear_reset_requested()
241 mlx5_core_warn(dev, "Reset request was already cleared\n"); in mlx5_sync_reset_clear_reset_requested()
245 mlx5_stop_sync_reset_poll(dev); in mlx5_sync_reset_clear_reset_requested()
247 mlx5_start_health_poll(dev); in mlx5_sync_reset_clear_reset_requested()
255 struct mlx5_core_dev *dev = fw_reset->dev; in mlx5_sync_reset_reload_work() local
257 mlx5_sync_reset_clear_reset_requested(dev, false); in mlx5_sync_reset_reload_work()
258 mlx5_enter_error_state(dev, true); in mlx5_sync_reset_reload_work()
259 mlx5_fw_reset_complete_reload(dev, false); in mlx5_sync_reset_reload_work()
266 struct mlx5_core_dev *dev = fw_reset->dev; in poll_sync_reset() local
272 fatal_error = mlx5_health_check_fatal_sensors(dev); in poll_sync_reset()
275 mlx5_core_warn(dev, "Got Device Reset\n"); in poll_sync_reset()
279 mlx5_core_err(dev, "Device is being removed, Drop new reset work\n"); in poll_sync_reset()
286 static void mlx5_start_sync_reset_poll(struct mlx5_core_dev *dev) in mlx5_start_sync_reset_poll() argument
288 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_start_sync_reset_poll()
295 static int mlx5_fw_reset_set_reset_sync_ack(struct mlx5_core_dev *dev) in mlx5_fw_reset_set_reset_sync_ack() argument
297 return mlx5_reg_mfrl_set(dev, MLX5_MFRL_REG_RESET_LEVEL3, 0, 1, false); in mlx5_fw_reset_set_reset_sync_ack()
300 static int mlx5_fw_reset_set_reset_sync_nack(struct mlx5_core_dev *dev) in mlx5_fw_reset_set_reset_sync_nack() argument
302 return mlx5_reg_mfrl_set(dev, MLX5_MFRL_REG_RESET_LEVEL3, 0, 2, false); in mlx5_fw_reset_set_reset_sync_nack()
305 static int mlx5_sync_reset_set_reset_requested(struct mlx5_core_dev *dev) in mlx5_sync_reset_set_reset_requested() argument
307 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_sync_reset_set_reset_requested()
310 mlx5_core_warn(dev, "Reset request was already set\n"); in mlx5_sync_reset_set_reset_requested()
313 mlx5_stop_health_poll(dev, true); in mlx5_sync_reset_set_reset_requested()
314 mlx5_start_sync_reset_poll(dev); in mlx5_sync_reset_set_reset_requested()
322 struct mlx5_core_dev *dev = fw_reset->dev; in mlx5_fw_live_patch_event() local
324 mlx5_core_info(dev, "Live patch updated firmware version: %d.%d.%d\n", fw_rev_maj(dev), in mlx5_fw_live_patch_event()
325 fw_rev_min(dev), fw_rev_sub(dev)); in mlx5_fw_live_patch_event()
327 if (mlx5_fw_tracer_reload(dev->tracer)) in mlx5_fw_live_patch_event()
328 mlx5_core_err(dev, "Failed to reload FW tracer\n"); in mlx5_fw_live_patch_event()
332 static int mlx5_check_hotplug_interrupt(struct mlx5_core_dev *dev) in mlx5_check_hotplug_interrupt() argument
334 struct pci_dev *bridge = dev->pdev->bus->self; in mlx5_check_hotplug_interrupt()
346 mlx5_core_warn(dev, "FW reset is not supported as HotPlug is enabled\n"); in mlx5_check_hotplug_interrupt()
354 static int mlx5_check_dev_ids(struct mlx5_core_dev *dev, u16 dev_id) in mlx5_check_dev_ids() argument
356 struct pci_bus *bridge_bus = dev->pdev->bus; in mlx5_check_dev_ids()
369 mlx5_core_warn(dev, "unrecognized dev_id (0x%x)\n", sdev_id); in mlx5_check_dev_ids()
376 static bool mlx5_is_reset_now_capable(struct mlx5_core_dev *dev) in mlx5_is_reset_now_capable() argument
381 if (!MLX5_CAP_GEN(dev, fast_teardown)) { in mlx5_is_reset_now_capable()
382 mlx5_core_warn(dev, "fast teardown is not supported by firmware\n"); in mlx5_is_reset_now_capable()
387 err = mlx5_check_hotplug_interrupt(dev); in mlx5_is_reset_now_capable()
392 err = pci_read_config_word(dev->pdev, PCI_DEVICE_ID, &dev_id); in mlx5_is_reset_now_capable()
395 return (!mlx5_check_dev_ids(dev, dev_id)); in mlx5_is_reset_now_capable()
402 struct mlx5_core_dev *dev = fw_reset->dev; in mlx5_sync_reset_request_event() local
406 !mlx5_is_reset_now_capable(dev)) { in mlx5_sync_reset_request_event()
407 err = mlx5_fw_reset_set_reset_sync_nack(dev); in mlx5_sync_reset_request_event()
408 mlx5_core_warn(dev, "PCI Sync FW Update Reset Nack %s", in mlx5_sync_reset_request_event()
412 if (mlx5_sync_reset_set_reset_requested(dev)) in mlx5_sync_reset_request_event()
415 err = mlx5_fw_reset_set_reset_sync_ack(dev); in mlx5_sync_reset_request_event()
417 mlx5_core_warn(dev, "PCI Sync FW Update Reset Ack Failed. Error code: %d\n", err); in mlx5_sync_reset_request_event()
419 mlx5_core_warn(dev, "PCI Sync FW Update Reset Ack. Device reset is expected.\n"); in mlx5_sync_reset_request_event()
422 static int mlx5_pci_link_toggle(struct mlx5_core_dev *dev) in mlx5_pci_link_toggle() argument
424 struct pci_bus *bridge_bus = dev->pdev->bus; in mlx5_pci_link_toggle()
431 err = pci_read_config_word(dev->pdev, PCI_DEVICE_ID, &dev_id); in mlx5_pci_link_toggle()
434 err = mlx5_check_dev_ids(dev, dev_id); in mlx5_pci_link_toggle()
456 mlx5_core_warn(dev, "No PCI link reporting capability\n"); in mlx5_pci_link_toggle()
461 timeout = jiffies + msecs_to_jiffies(mlx5_tout_ms(dev, PCI_TOGGLE)); in mlx5_pci_link_toggle()
472 mlx5_core_info(dev, "PCI Link up\n"); in mlx5_pci_link_toggle()
474 mlx5_core_err(dev, "PCI link not ready (0x%04x) after %llu ms\n", in mlx5_pci_link_toggle()
475 reg16, mlx5_tout_ms(dev, PCI_TOGGLE)); in mlx5_pci_link_toggle()
481 err = pci_read_config_word(dev->pdev, PCI_DEVICE_ID, &reg16); in mlx5_pci_link_toggle()
490 mlx5_core_info(dev, "Firmware responds to PCI config cycles again\n"); in mlx5_pci_link_toggle()
492 mlx5_core_err(dev, "Firmware is not responsive (0x%04x) after %llu ms\n", in mlx5_pci_link_toggle()
493 reg16, mlx5_tout_ms(dev, PCI_TOGGLE)); in mlx5_pci_link_toggle()
510 struct mlx5_core_dev *dev = fw_reset->dev; in mlx5_sync_reset_now_event() local
513 if (mlx5_sync_reset_clear_reset_requested(dev, false)) in mlx5_sync_reset_now_event()
516 mlx5_core_warn(dev, "Sync Reset now. Device is going to reset.\n"); in mlx5_sync_reset_now_event()
518 err = mlx5_cmd_fast_teardown_hca(dev); in mlx5_sync_reset_now_event()
520 mlx5_core_warn(dev, "Fast teardown failed, no reset done, err %d\n", err); in mlx5_sync_reset_now_event()
524 err = mlx5_pci_link_toggle(dev); in mlx5_sync_reset_now_event()
526 mlx5_core_warn(dev, "mlx5_pci_link_toggle failed, no reset done, err %d\n", err); in mlx5_sync_reset_now_event()
530 mlx5_enter_error_state(dev, true); in mlx5_sync_reset_now_event()
533 mlx5_fw_reset_complete_reload(dev, false); in mlx5_sync_reset_now_event()
539 struct mlx5_core_dev *dev; in mlx5_sync_reset_unload_event() local
546 dev = fw_reset->dev; in mlx5_sync_reset_unload_event()
548 if (mlx5_sync_reset_clear_reset_requested(dev, false)) in mlx5_sync_reset_unload_event()
551 mlx5_core_warn(dev, "Sync Reset Unload. Function is forced down.\n"); in mlx5_sync_reset_unload_event()
553 err = mlx5_cmd_fast_teardown_hca(dev); in mlx5_sync_reset_unload_event()
555 mlx5_core_warn(dev, "Fast teardown failed, unloading, err %d\n", err); in mlx5_sync_reset_unload_event()
557 mlx5_enter_error_state(dev, true); in mlx5_sync_reset_unload_event()
560 mlx5_unload_one_devl_locked(dev, false); in mlx5_sync_reset_unload_event()
562 mlx5_unload_one(dev, false); in mlx5_sync_reset_unload_event()
564 mlx5_set_fw_rst_ack(dev); in mlx5_sync_reset_unload_event()
565 mlx5_core_warn(dev, "Sync Reset Unload done, device reset expected\n"); in mlx5_sync_reset_unload_event()
568 timeout = jiffies + msecs_to_jiffies(mlx5_tout_ms(dev, RESET_UNLOAD)); in mlx5_sync_reset_unload_event()
570 rst_state = mlx5_get_fw_rst_state(dev); in mlx5_sync_reset_unload_event()
580 mlx5_core_err(dev, "Got timeout waiting for sync reset action, state = %u\n", in mlx5_sync_reset_unload_event()
586 mlx5_core_warn(dev, "Sync Reset, got reset action. rst_state = %u\n", rst_state); in mlx5_sync_reset_unload_event()
588 err = mlx5_pci_link_toggle(dev); in mlx5_sync_reset_unload_event()
590 mlx5_core_warn(dev, "mlx5_pci_link_toggle failed, err %d\n", err); in mlx5_sync_reset_unload_event()
596 mlx5_fw_reset_complete_reload(dev, true); in mlx5_sync_reset_unload_event()
603 struct mlx5_core_dev *dev = fw_reset->dev; in mlx5_sync_reset_abort_event() local
605 if (mlx5_sync_reset_clear_reset_requested(dev, true)) in mlx5_sync_reset_abort_event()
607 mlx5_core_warn(dev, "PCI Sync FW Update Reset Aborted.\n"); in mlx5_sync_reset_abort_event()
655 int mlx5_fw_reset_wait_reset_done(struct mlx5_core_dev *dev) in mlx5_fw_reset_wait_reset_done() argument
657 unsigned long pci_sync_update_timeout = mlx5_tout_ms(dev, PCI_SYNC_UPDATE); in mlx5_fw_reset_wait_reset_done()
658 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_wait_reset_done()
662 if (MLX5_CAP_GEN(dev, pci_sync_for_fw_update_with_driver_unload)) in mlx5_fw_reset_wait_reset_done()
663 pci_sync_update_timeout += mlx5_tout_ms(dev, RESET_UNLOAD); in mlx5_fw_reset_wait_reset_done()
666 mlx5_core_warn(dev, "FW sync reset timeout after %lu seconds\n", in mlx5_fw_reset_wait_reset_done()
673 mlx5_unload_one_devl_locked(dev, false); in mlx5_fw_reset_wait_reset_done()
674 mlx5_load_one_devl_locked(dev, true); in mlx5_fw_reset_wait_reset_done()
681 void mlx5_fw_reset_events_start(struct mlx5_core_dev *dev) in mlx5_fw_reset_events_start() argument
683 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_events_start()
689 mlx5_eq_notifier_register(dev, &fw_reset->nb); in mlx5_fw_reset_events_start()
692 void mlx5_fw_reset_events_stop(struct mlx5_core_dev *dev) in mlx5_fw_reset_events_stop() argument
694 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_events_stop()
699 mlx5_eq_notifier_unregister(dev, &fw_reset->nb); in mlx5_fw_reset_events_stop()
702 void mlx5_drain_fw_reset(struct mlx5_core_dev *dev) in mlx5_drain_fw_reset() argument
704 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_drain_fw_reset()
724 int mlx5_fw_reset_init(struct mlx5_core_dev *dev) in mlx5_fw_reset_init() argument
729 if (!MLX5_CAP_MCAM_REG(dev, mfrl)) in mlx5_fw_reset_init()
741 fw_reset->dev = dev; in mlx5_fw_reset_init()
742 dev->priv.fw_reset = fw_reset; in mlx5_fw_reset_init()
744 err = devl_params_register(priv_to_devlink(dev), in mlx5_fw_reset_init()
764 void mlx5_fw_reset_cleanup(struct mlx5_core_dev *dev) in mlx5_fw_reset_cleanup() argument
766 struct mlx5_fw_reset *fw_reset = dev->priv.fw_reset; in mlx5_fw_reset_cleanup()
771 devl_params_unregister(priv_to_devlink(dev), in mlx5_fw_reset_cleanup()
775 kfree(dev->priv.fw_reset); in mlx5_fw_reset_cleanup()