return 0;
}
- hl_cb_mgr_fini(hpriv->hdev, &hpriv->cb_mgr);
- hl_ctx_mgr_fini(hpriv->hdev, &hpriv->ctx_mgr);
+ hl_cb_mgr_fini(hdev, &hpriv->cb_mgr);
+ hl_ctx_mgr_fini(hdev, &hpriv->ctx_mgr);
+
+ if (hdev->reset_upon_device_release) {
+ u64 idle_mask[HL_BUSY_ENGINES_MASK_EXT_SIZE] = {0};
+
+ /* We try soft reset first */
+ hl_device_reset(hdev, false, false);
+
+ /* If device is not idle perform hard reset */
+ if (!hdev->asic_funcs->is_device_idle(hdev, idle_mask,
+ HL_BUSY_ENGINES_MASK_EXT_SIZE, NULL)) {
+ dev_info(hdev->dev,
+ "device is not idle (mask %#llx %#llx) after soft reset, performing hard reset",
+ idle_mask[0], idle_mask[1]);
+ hl_device_reset(hdev, true, false);
+ }
+ }
hl_hpriv_put(hpriv);
* @device_fini_pending: true if device_fini was called and might be
* waiting for the reset thread to finish
* @supports_staged_submission: true if staged submissions are supported
+ * @reset_upon_device_release: true if reset is required upon device release
*/
struct hl_device {
struct pci_dev *pdev;
u8 process_kill_trial_cnt;
u8 device_fini_pending;
u8 supports_staged_submission;
+ u8 reset_upon_device_release;
/* Parameters for bring-up */
u64 nic_ports_mask;