1// SPDX-License-Identifier: GPL-2.0
2
3/*
4 * Copyright 2016-2019 HabanaLabs, Ltd.
5 * All Rights Reserved.
6 */
7
8#define pr_fmt(fmt)			"habanalabs: " fmt
9
10#include "habanalabs.h"
11
12#include <linux/pci.h>
13#include <linux/sched/signal.h>
14#include <linux/hwmon.h>
15#include <uapi/misc/habanalabs.h>
16
17#define HL_PLDM_PENDING_RESET_PER_SEC	(HL_PENDING_RESET_PER_SEC * 10)
18
19bool hl_device_disabled_or_in_reset(struct hl_device *hdev)
20{
21	if ((hdev->disabled) || (atomic_read(&hdev->in_reset)))
22		return true;
23	else
24		return false;
25}
26
27enum hl_device_status hl_device_status(struct hl_device *hdev)
28{
29	enum hl_device_status status;
30
31	if (hdev->disabled)
32		status = HL_DEVICE_STATUS_MALFUNCTION;
33	else if (atomic_read(&hdev->in_reset))
34		status = HL_DEVICE_STATUS_IN_RESET;
35	else
36		status = HL_DEVICE_STATUS_OPERATIONAL;
37
38	return status;
39}
40
41static void hpriv_release(struct kref *ref)
42{
43	struct hl_fpriv *hpriv;
44	struct hl_device *hdev;
45
46	hpriv = container_of(ref, struct hl_fpriv, refcount);
47
48	hdev = hpriv->hdev;
49
50	put_pid(hpriv->taskpid);
51
52	hl_debugfs_remove_file(hpriv);
53
54	mutex_destroy(&hpriv->restore_phase_mutex);
55
56	mutex_lock(&hdev->fpriv_list_lock);
57	list_del(&hpriv->dev_node);
58	hdev->compute_ctx = NULL;
59	mutex_unlock(&hdev->fpriv_list_lock);
60
61	kfree(hpriv);
62}
63
64void hl_hpriv_get(struct hl_fpriv *hpriv)
65{
66	kref_get(&hpriv->refcount);
67}
68
69void hl_hpriv_put(struct hl_fpriv *hpriv)
70{
71	kref_put(&hpriv->refcount, hpriv_release);
72}
73
74/*
75 * hl_device_release - release function for habanalabs device
76 *
77 * @inode: pointer to inode structure
78 * @filp: pointer to file structure
79 *
80 * Called when process closes an habanalabs device
81 */
82static int hl_device_release(struct inode *inode, struct file *filp)
83{
84	struct hl_fpriv *hpriv = filp->private_data;
85
86	hl_cb_mgr_fini(hpriv->hdev, &hpriv->cb_mgr);
87	hl_ctx_mgr_fini(hpriv->hdev, &hpriv->ctx_mgr);
88
89	filp->private_data = NULL;
90
91	hl_hpriv_put(hpriv);
92
93	return 0;
94}
95
96static int hl_device_release_ctrl(struct inode *inode, struct file *filp)
97{
98	struct hl_fpriv *hpriv = filp->private_data;
99	struct hl_device *hdev;
100
101	filp->private_data = NULL;
102
103	hdev = hpriv->hdev;
104
105	mutex_lock(&hdev->fpriv_list_lock);
106	list_del(&hpriv->dev_node);
107	mutex_unlock(&hdev->fpriv_list_lock);
108
109	put_pid(hpriv->taskpid);
110
111	kfree(hpriv);
112
113	return 0;
114}
115
116/*
117 * hl_mmap - mmap function for habanalabs device
118 *
119 * @*filp: pointer to file structure
120 * @*vma: pointer to vm_area_struct of the process
121 *
122 * Called when process does an mmap on habanalabs device. Call the device's mmap
123 * function at the end of the common code.
124 */
125static int hl_mmap(struct file *filp, struct vm_area_struct *vma)
126{
127	struct hl_fpriv *hpriv = filp->private_data;
128	unsigned long vm_pgoff;
129
130	vm_pgoff = vma->vm_pgoff;
131	vma->vm_pgoff = HL_MMAP_OFFSET_VALUE_GET(vm_pgoff);
132
133	switch (vm_pgoff & HL_MMAP_TYPE_MASK) {
134	case HL_MMAP_TYPE_CB:
135		return hl_cb_mmap(hpriv, vma);
136	}
137
138	return -EINVAL;
139}
140
141static const struct file_operations hl_ops = {
142	.owner = THIS_MODULE,
143	.open = hl_device_open,
144	.release = hl_device_release,
145	.mmap = hl_mmap,
146	.unlocked_ioctl = hl_ioctl,
147	.compat_ioctl = hl_ioctl
148};
149
150static const struct file_operations hl_ctrl_ops = {
151	.owner = THIS_MODULE,
152	.open = hl_device_open_ctrl,
153	.release = hl_device_release_ctrl,
154	.unlocked_ioctl = hl_ioctl_control,
155	.compat_ioctl = hl_ioctl_control
156};
157
158static void device_release_func(struct device *dev)
159{
160	kfree(dev);
161}
162
163/*
164 * device_init_cdev - Initialize cdev and device for habanalabs device
165 *
166 * @hdev: pointer to habanalabs device structure
167 * @hclass: pointer to the class object of the device
168 * @minor: minor number of the specific device
169 * @fpos: file operations to install for this device
170 * @name: name of the device as it will appear in the filesystem
171 * @cdev: pointer to the char device object that will be initialized
172 * @dev: pointer to the device object that will be initialized
173 *
174 * Initialize a cdev and a Linux device for habanalabs's device.
175 */
176static int device_init_cdev(struct hl_device *hdev, struct class *hclass,
177				int minor, const struct file_operations *fops,
178				char *name, struct cdev *cdev,
179				struct device **dev)
180{
181	cdev_init(cdev, fops);
182	cdev->owner = THIS_MODULE;
183
184	*dev = kzalloc(sizeof(**dev), GFP_KERNEL);
185	if (!*dev)
186		return -ENOMEM;
187
188	device_initialize(*dev);
189	(*dev)->devt = MKDEV(hdev->major, minor);
190	(*dev)->class = hclass;
191	(*dev)->release = device_release_func;
192	dev_set_drvdata(*dev, hdev);
193	dev_set_name(*dev, "%s", name);
194
195	return 0;
196}
197
198static int device_cdev_sysfs_add(struct hl_device *hdev)
199{
200	int rc;
201
202	rc = cdev_device_add(&hdev->cdev, hdev->dev);
203	if (rc) {
204		dev_err(hdev->dev,
205			"failed to add a char device to the system\n");
206		return rc;
207	}
208
209	rc = cdev_device_add(&hdev->cdev_ctrl, hdev->dev_ctrl);
210	if (rc) {
211		dev_err(hdev->dev,
212			"failed to add a control char device to the system\n");
213		goto delete_cdev_device;
214	}
215
216	/* hl_sysfs_init() must be done after adding the device to the system */
217	rc = hl_sysfs_init(hdev);
218	if (rc) {
219		dev_err(hdev->dev, "failed to initialize sysfs\n");
220		goto delete_ctrl_cdev_device;
221	}
222
223	hdev->cdev_sysfs_created = true;
224
225	return 0;
226
227delete_ctrl_cdev_device:
228	cdev_device_del(&hdev->cdev_ctrl, hdev->dev_ctrl);
229delete_cdev_device:
230	cdev_device_del(&hdev->cdev, hdev->dev);
231	return rc;
232}
233
234static void device_cdev_sysfs_del(struct hl_device *hdev)
235{
236	if (!hdev->cdev_sysfs_created)
237		goto put_devices;
238
239	hl_sysfs_fini(hdev);
240	cdev_device_del(&hdev->cdev_ctrl, hdev->dev_ctrl);
241	cdev_device_del(&hdev->cdev, hdev->dev);
242
243put_devices:
244	put_device(hdev->dev);
245	put_device(hdev->dev_ctrl);
246}
247
248/*
249 * device_early_init - do some early initialization for the habanalabs device
250 *
251 * @hdev: pointer to habanalabs device structure
252 *
253 * Install the relevant function pointers and call the early_init function,
254 * if such a function exists
255 */
256static int device_early_init(struct hl_device *hdev)
257{
258	int i, rc;
259	char workq_name[32];
260
261	switch (hdev->asic_type) {
262	case ASIC_GOYA:
263		goya_set_asic_funcs(hdev);
264		strlcpy(hdev->asic_name, "GOYA", sizeof(hdev->asic_name));
265		break;
266	case ASIC_GAUDI:
267		gaudi_set_asic_funcs(hdev);
268		sprintf(hdev->asic_name, "GAUDI");
269		break;
270	default:
271		dev_err(hdev->dev, "Unrecognized ASIC type %d\n",
272			hdev->asic_type);
273		return -EINVAL;
274	}
275
276	rc = hdev->asic_funcs->early_init(hdev);
277	if (rc)
278		return rc;
279
280	rc = hl_asid_init(hdev);
281	if (rc)
282		goto early_fini;
283
284	if (hdev->asic_prop.completion_queues_count) {
285		hdev->cq_wq = kcalloc(hdev->asic_prop.completion_queues_count,
286				sizeof(*hdev->cq_wq),
287				GFP_ATOMIC);
288		if (!hdev->cq_wq) {
289			rc = -ENOMEM;
290			goto asid_fini;
291		}
292	}
293
294	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++) {
295		snprintf(workq_name, 32, "hl-free-jobs-%u", (u32) i);
296		hdev->cq_wq[i] = create_singlethread_workqueue(workq_name);
297		if (hdev->cq_wq[i] == NULL) {
298			dev_err(hdev->dev, "Failed to allocate CQ workqueue\n");
299			rc = -ENOMEM;
300			goto free_cq_wq;
301		}
302	}
303
304	hdev->eq_wq = alloc_workqueue("hl-events", WQ_UNBOUND, 0);
305	if (hdev->eq_wq == NULL) {
306		dev_err(hdev->dev, "Failed to allocate EQ workqueue\n");
307		rc = -ENOMEM;
308		goto free_cq_wq;
309	}
310
311	hdev->hl_chip_info = kzalloc(sizeof(struct hwmon_chip_info),
312					GFP_KERNEL);
313	if (!hdev->hl_chip_info) {
314		rc = -ENOMEM;
315		goto free_eq_wq;
316	}
317
318	hdev->idle_busy_ts_arr = kmalloc_array(HL_IDLE_BUSY_TS_ARR_SIZE,
319					sizeof(struct hl_device_idle_busy_ts),
320					(GFP_KERNEL | __GFP_ZERO));
321	if (!hdev->idle_busy_ts_arr) {
322		rc = -ENOMEM;
323		goto free_chip_info;
324	}
325
326	rc = hl_mmu_if_set_funcs(hdev);
327	if (rc)
328		goto free_idle_busy_ts_arr;
329
330	hl_cb_mgr_init(&hdev->kernel_cb_mgr);
331
332	mutex_init(&hdev->send_cpu_message_lock);
333	mutex_init(&hdev->debug_lock);
334	mutex_init(&hdev->mmu_cache_lock);
335	INIT_LIST_HEAD(&hdev->hw_queues_mirror_list);
336	spin_lock_init(&hdev->hw_queues_mirror_lock);
337	INIT_LIST_HEAD(&hdev->fpriv_list);
338	mutex_init(&hdev->fpriv_list_lock);
339	atomic_set(&hdev->in_reset, 0);
340
341	return 0;
342
343free_idle_busy_ts_arr:
344	kfree(hdev->idle_busy_ts_arr);
345free_chip_info:
346	kfree(hdev->hl_chip_info);
347free_eq_wq:
348	destroy_workqueue(hdev->eq_wq);
349free_cq_wq:
350	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
351		if (hdev->cq_wq[i])
352			destroy_workqueue(hdev->cq_wq[i]);
353	kfree(hdev->cq_wq);
354asid_fini:
355	hl_asid_fini(hdev);
356early_fini:
357	if (hdev->asic_funcs->early_fini)
358		hdev->asic_funcs->early_fini(hdev);
359
360	return rc;
361}
362
363/*
364 * device_early_fini - finalize all that was done in device_early_init
365 *
366 * @hdev: pointer to habanalabs device structure
367 *
368 */
369static void device_early_fini(struct hl_device *hdev)
370{
371	int i;
372
373	mutex_destroy(&hdev->mmu_cache_lock);
374	mutex_destroy(&hdev->debug_lock);
375	mutex_destroy(&hdev->send_cpu_message_lock);
376
377	mutex_destroy(&hdev->fpriv_list_lock);
378
379	hl_cb_mgr_fini(hdev, &hdev->kernel_cb_mgr);
380
381	kfree(hdev->idle_busy_ts_arr);
382	kfree(hdev->hl_chip_info);
383
384	destroy_workqueue(hdev->eq_wq);
385
386	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
387		destroy_workqueue(hdev->cq_wq[i]);
388	kfree(hdev->cq_wq);
389
390	hl_asid_fini(hdev);
391
392	if (hdev->asic_funcs->early_fini)
393		hdev->asic_funcs->early_fini(hdev);
394}
395
396static void set_freq_to_low_job(struct work_struct *work)
397{
398	struct hl_device *hdev = container_of(work, struct hl_device,
399						work_freq.work);
400
401	mutex_lock(&hdev->fpriv_list_lock);
402
403	if (!hdev->compute_ctx)
404		hl_device_set_frequency(hdev, PLL_LOW);
405
406	mutex_unlock(&hdev->fpriv_list_lock);
407
408	schedule_delayed_work(&hdev->work_freq,
409			usecs_to_jiffies(HL_PLL_LOW_JOB_FREQ_USEC));
410}
411
412static void hl_device_heartbeat(struct work_struct *work)
413{
414	struct hl_device *hdev = container_of(work, struct hl_device,
415						work_heartbeat.work);
416
417	if (hl_device_disabled_or_in_reset(hdev))
418		goto reschedule;
419
420	if (!hdev->asic_funcs->send_heartbeat(hdev))
421		goto reschedule;
422
423	dev_err(hdev->dev, "Device heartbeat failed!\n");
424	hl_device_reset(hdev, true, false);
425
426	return;
427
428reschedule:
429	schedule_delayed_work(&hdev->work_heartbeat,
430			usecs_to_jiffies(HL_HEARTBEAT_PER_USEC));
431}
432
433/*
434 * device_late_init - do late stuff initialization for the habanalabs device
435 *
436 * @hdev: pointer to habanalabs device structure
437 *
438 * Do stuff that either needs the device H/W queues to be active or needs
439 * to happen after all the rest of the initialization is finished
440 */
441static int device_late_init(struct hl_device *hdev)
442{
443	int rc;
444
445	if (hdev->asic_funcs->late_init) {
446		rc = hdev->asic_funcs->late_init(hdev);
447		if (rc) {
448			dev_err(hdev->dev,
449				"failed late initialization for the H/W\n");
450			return rc;
451		}
452	}
453
454	hdev->high_pll = hdev->asic_prop.high_pll;
455
456	/* force setting to low frequency */
457	hdev->curr_pll_profile = PLL_LOW;
458
459	if (hdev->pm_mng_profile == PM_AUTO)
460		hdev->asic_funcs->set_pll_profile(hdev, PLL_LOW);
461	else
462		hdev->asic_funcs->set_pll_profile(hdev, PLL_LAST);
463
464	INIT_DELAYED_WORK(&hdev->work_freq, set_freq_to_low_job);
465	schedule_delayed_work(&hdev->work_freq,
466	usecs_to_jiffies(HL_PLL_LOW_JOB_FREQ_USEC));
467
468	if (hdev->heartbeat) {
469		INIT_DELAYED_WORK(&hdev->work_heartbeat, hl_device_heartbeat);
470		schedule_delayed_work(&hdev->work_heartbeat,
471				usecs_to_jiffies(HL_HEARTBEAT_PER_USEC));
472	}
473
474	hdev->late_init_done = true;
475
476	return 0;
477}
478
479/*
480 * device_late_fini - finalize all that was done in device_late_init
481 *
482 * @hdev: pointer to habanalabs device structure
483 *
484 */
485static void device_late_fini(struct hl_device *hdev)
486{
487	if (!hdev->late_init_done)
488		return;
489
490	cancel_delayed_work_sync(&hdev->work_freq);
491	if (hdev->heartbeat)
492		cancel_delayed_work_sync(&hdev->work_heartbeat);
493
494	if (hdev->asic_funcs->late_fini)
495		hdev->asic_funcs->late_fini(hdev);
496
497	hdev->late_init_done = false;
498}
499
500uint32_t hl_device_utilization(struct hl_device *hdev, uint32_t period_ms)
501{
502	struct hl_device_idle_busy_ts *ts;
503	ktime_t zero_ktime, curr = ktime_get();
504	u32 overlap_cnt = 0, last_index = hdev->idle_busy_ts_idx;
505	s64 period_us, last_start_us, last_end_us, last_busy_time_us,
506		total_busy_time_us = 0, total_busy_time_ms;
507
508	zero_ktime = ktime_set(0, 0);
509	period_us = period_ms * USEC_PER_MSEC;
510	ts = &hdev->idle_busy_ts_arr[last_index];
511
512	/* check case that device is currently in idle */
513	if (!ktime_compare(ts->busy_to_idle_ts, zero_ktime) &&
514			!ktime_compare(ts->idle_to_busy_ts, zero_ktime)) {
515
516		last_index--;
517		/* Handle case idle_busy_ts_idx was 0 */
518		if (last_index > HL_IDLE_BUSY_TS_ARR_SIZE)
519			last_index = HL_IDLE_BUSY_TS_ARR_SIZE - 1;
520
521		ts = &hdev->idle_busy_ts_arr[last_index];
522	}
523
524	while (overlap_cnt < HL_IDLE_BUSY_TS_ARR_SIZE) {
525		/* Check if we are in last sample case. i.e. if the sample
526		 * begun before the sampling period. This could be a real
527		 * sample or 0 so need to handle both cases
528		 */
529		last_start_us = ktime_to_us(
530				ktime_sub(curr, ts->idle_to_busy_ts));
531
532		if (last_start_us > period_us) {
533
534			/* First check two cases:
535			 * 1. If the device is currently busy
536			 * 2. If the device was idle during the whole sampling
537			 *    period
538			 */
539
540			if (!ktime_compare(ts->busy_to_idle_ts, zero_ktime)) {
541				/* Check if the device is currently busy */
542				if (ktime_compare(ts->idle_to_busy_ts,
543						zero_ktime))
544					return 100;
545
546				/* We either didn't have any activity or we
547				 * reached an entry which is 0. Either way,
548				 * exit and return what was accumulated so far
549				 */
550				break;
551			}
552
553			/* If sample has finished, check it is relevant */
554			last_end_us = ktime_to_us(
555					ktime_sub(curr, ts->busy_to_idle_ts));
556
557			if (last_end_us > period_us)
558				break;
559
560			/* It is relevant so add it but with adjustment */
561			last_busy_time_us = ktime_to_us(
562						ktime_sub(ts->busy_to_idle_ts,
563						ts->idle_to_busy_ts));
564			total_busy_time_us += last_busy_time_us -
565					(last_start_us - period_us);
566			break;
567		}
568
569		/* Check if the sample is finished or still open */
570		if (ktime_compare(ts->busy_to_idle_ts, zero_ktime))
571			last_busy_time_us = ktime_to_us(
572						ktime_sub(ts->busy_to_idle_ts,
573						ts->idle_to_busy_ts));
574		else
575			last_busy_time_us = ktime_to_us(
576					ktime_sub(curr, ts->idle_to_busy_ts));
577
578		total_busy_time_us += last_busy_time_us;
579
580		last_index--;
581		/* Handle case idle_busy_ts_idx was 0 */
582		if (last_index > HL_IDLE_BUSY_TS_ARR_SIZE)
583			last_index = HL_IDLE_BUSY_TS_ARR_SIZE - 1;
584
585		ts = &hdev->idle_busy_ts_arr[last_index];
586
587		overlap_cnt++;
588	}
589
590	total_busy_time_ms = DIV_ROUND_UP_ULL(total_busy_time_us,
591						USEC_PER_MSEC);
592
593	return DIV_ROUND_UP_ULL(total_busy_time_ms * 100, period_ms);
594}
595
596/*
597 * hl_device_set_frequency - set the frequency of the device
598 *
599 * @hdev: pointer to habanalabs device structure
600 * @freq: the new frequency value
601 *
602 * Change the frequency if needed. This function has no protection against
603 * concurrency, therefore it is assumed that the calling function has protected
604 * itself against the case of calling this function from multiple threads with
605 * different values
606 *
607 * Returns 0 if no change was done, otherwise returns 1
608 */
609int hl_device_set_frequency(struct hl_device *hdev, enum hl_pll_frequency freq)
610{
611	if ((hdev->pm_mng_profile == PM_MANUAL) ||
612			(hdev->curr_pll_profile == freq))
613		return 0;
614
615	dev_dbg(hdev->dev, "Changing device frequency to %s\n",
616		freq == PLL_HIGH ? "high" : "low");
617
618	hdev->asic_funcs->set_pll_profile(hdev, freq);
619
620	hdev->curr_pll_profile = freq;
621
622	return 1;
623}
624
625int hl_device_set_debug_mode(struct hl_device *hdev, bool enable)
626{
627	int rc = 0;
628
629	mutex_lock(&hdev->debug_lock);
630
631	if (!enable) {
632		if (!hdev->in_debug) {
633			dev_err(hdev->dev,
634				"Failed to disable debug mode because device was not in debug mode\n");
635			rc = -EFAULT;
636			goto out;
637		}
638
639		if (!hdev->hard_reset_pending)
640			hdev->asic_funcs->halt_coresight(hdev);
641
642		hdev->in_debug = 0;
643
644		if (!hdev->hard_reset_pending)
645			hdev->asic_funcs->set_clock_gating(hdev);
646
647		goto out;
648	}
649
650	if (hdev->in_debug) {
651		dev_err(hdev->dev,
652			"Failed to enable debug mode because device is already in debug mode\n");
653		rc = -EFAULT;
654		goto out;
655	}
656
657	hdev->asic_funcs->disable_clock_gating(hdev);
658	hdev->in_debug = 1;
659
660out:
661	mutex_unlock(&hdev->debug_lock);
662
663	return rc;
664}
665
666/*
667 * hl_device_suspend - initiate device suspend
668 *
669 * @hdev: pointer to habanalabs device structure
670 *
671 * Puts the hw in the suspend state (all asics).
672 * Returns 0 for success or an error on failure.
673 * Called at driver suspend.
674 */
675int hl_device_suspend(struct hl_device *hdev)
676{
677	int rc;
678
679	pci_save_state(hdev->pdev);
680
681	/* Block future CS/VM/JOB completion operations */
682	rc = atomic_cmpxchg(&hdev->in_reset, 0, 1);
683	if (rc) {
684		dev_err(hdev->dev, "Can't suspend while in reset\n");
685		return -EIO;
686	}
687
688	/* This blocks all other stuff that is not blocked by in_reset */
689	hdev->disabled = true;
690
691	/*
692	 * Flush anyone that is inside the critical section of enqueue
693	 * jobs to the H/W
694	 */
695	hdev->asic_funcs->hw_queues_lock(hdev);
696	hdev->asic_funcs->hw_queues_unlock(hdev);
697
698	/* Flush processes that are sending message to CPU */
699	mutex_lock(&hdev->send_cpu_message_lock);
700	mutex_unlock(&hdev->send_cpu_message_lock);
701
702	rc = hdev->asic_funcs->suspend(hdev);
703	if (rc)
704		dev_err(hdev->dev,
705			"Failed to disable PCI access of device CPU\n");
706
707	/* Shut down the device */
708	pci_disable_device(hdev->pdev);
709	pci_set_power_state(hdev->pdev, PCI_D3hot);
710
711	return 0;
712}
713
714/*
715 * hl_device_resume - initiate device resume
716 *
717 * @hdev: pointer to habanalabs device structure
718 *
719 * Bring the hw back to operating state (all asics).
720 * Returns 0 for success or an error on failure.
721 * Called at driver resume.
722 */
723int hl_device_resume(struct hl_device *hdev)
724{
725	int rc;
726
727	pci_set_power_state(hdev->pdev, PCI_D0);
728	pci_restore_state(hdev->pdev);
729	rc = pci_enable_device_mem(hdev->pdev);
730	if (rc) {
731		dev_err(hdev->dev,
732			"Failed to enable PCI device in resume\n");
733		return rc;
734	}
735
736	pci_set_master(hdev->pdev);
737
738	rc = hdev->asic_funcs->resume(hdev);
739	if (rc) {
740		dev_err(hdev->dev, "Failed to resume device after suspend\n");
741		goto disable_device;
742	}
743
744
745	hdev->disabled = false;
746	atomic_set(&hdev->in_reset, 0);
747
748	rc = hl_device_reset(hdev, true, false);
749	if (rc) {
750		dev_err(hdev->dev, "Failed to reset device during resume\n");
751		goto disable_device;
752	}
753
754	return 0;
755
756disable_device:
757	pci_clear_master(hdev->pdev);
758	pci_disable_device(hdev->pdev);
759
760	return rc;
761}
762
763static int device_kill_open_processes(struct hl_device *hdev)
764{
765	u16 pending_total, pending_cnt;
766	struct hl_fpriv	*hpriv;
767	struct task_struct *task = NULL;
768
769	if (hdev->pldm)
770		pending_total = HL_PLDM_PENDING_RESET_PER_SEC;
771	else
772		pending_total = HL_PENDING_RESET_PER_SEC;
773
774	/* Giving time for user to close FD, and for processes that are inside
775	 * hl_device_open to finish
776	 */
777	if (!list_empty(&hdev->fpriv_list))
778		ssleep(1);
779
780	mutex_lock(&hdev->fpriv_list_lock);
781
782	/* This section must be protected because we are dereferencing
783	 * pointers that are freed if the process exits
784	 */
785	list_for_each_entry(hpriv, &hdev->fpriv_list, dev_node) {
786		task = get_pid_task(hpriv->taskpid, PIDTYPE_PID);
787		if (task) {
788			dev_info(hdev->dev, "Killing user process pid=%d\n",
789				task_pid_nr(task));
790			send_sig(SIGKILL, task, 1);
791			usleep_range(1000, 10000);
792
793			put_task_struct(task);
794		}
795	}
796
797	mutex_unlock(&hdev->fpriv_list_lock);
798
799	/* We killed the open users, but because the driver cleans up after the
800	 * user contexts are closed (e.g. mmu mappings), we need to wait again
801	 * to make sure the cleaning phase is finished before continuing with
802	 * the reset
803	 */
804
805	pending_cnt = pending_total;
806
807	while ((!list_empty(&hdev->fpriv_list)) && (pending_cnt)) {
808		dev_info(hdev->dev,
809			"Waiting for all unmap operations to finish before hard reset\n");
810
811		pending_cnt--;
812
813		ssleep(1);
814	}
815
816	return list_empty(&hdev->fpriv_list) ? 0 : -EBUSY;
817}
818
819static void device_hard_reset_pending(struct work_struct *work)
820{
821	struct hl_device_reset_work *device_reset_work =
822		container_of(work, struct hl_device_reset_work, reset_work);
823	struct hl_device *hdev = device_reset_work->hdev;
824
825	hl_device_reset(hdev, true, true);
826
827	kfree(device_reset_work);
828}
829
830/*
831 * hl_device_reset - reset the device
832 *
833 * @hdev: pointer to habanalabs device structure
834 * @hard_reset: should we do hard reset to all engines or just reset the
835 *              compute/dma engines
836 * @from_hard_reset_thread: is the caller the hard-reset thread
837 *
838 * Block future CS and wait for pending CS to be enqueued
839 * Call ASIC H/W fini
840 * Flush all completions
841 * Re-initialize all internal data structures
842 * Call ASIC H/W init, late_init
843 * Test queues
844 * Enable device
845 *
846 * Returns 0 for success or an error on failure.
847 */
848int hl_device_reset(struct hl_device *hdev, bool hard_reset,
849			bool from_hard_reset_thread)
850{
851	int i, rc;
852
853	if (!hdev->init_done) {
854		dev_err(hdev->dev,
855			"Can't reset before initialization is done\n");
856		return 0;
857	}
858
859	if ((!hard_reset) && (!hdev->supports_soft_reset)) {
860		dev_dbg(hdev->dev, "Doing hard-reset instead of soft-reset\n");
861		hard_reset = true;
862	}
863
864	/*
865	 * Prevent concurrency in this function - only one reset should be
866	 * done at any given time. Only need to perform this if we didn't
867	 * get from the dedicated hard reset thread
868	 */
869	if (!from_hard_reset_thread) {
870		/* Block future CS/VM/JOB completion operations */
871		rc = atomic_cmpxchg(&hdev->in_reset, 0, 1);
872		if (rc)
873			return 0;
874
875		if (hard_reset) {
876			/* Disable PCI access from device F/W so he won't send
877			 * us additional interrupts. We disable MSI/MSI-X at
878			 * the halt_engines function and we can't have the F/W
879			 * sending us interrupts after that. We need to disable
880			 * the access here because if the device is marked
881			 * disable, the message won't be send. Also, in case
882			 * of heartbeat, the device CPU is marked as disable
883			 * so this message won't be sent
884			 */
885			if (hl_fw_send_pci_access_msg(hdev,
886					CPUCP_PACKET_DISABLE_PCI_ACCESS))
887				dev_warn(hdev->dev,
888					"Failed to disable PCI access by F/W\n");
889		}
890
891		/* This also blocks future CS/VM/JOB completion operations */
892		hdev->disabled = true;
893
894		/* Flush anyone that is inside the critical section of enqueue
895		 * jobs to the H/W
896		 */
897		hdev->asic_funcs->hw_queues_lock(hdev);
898		hdev->asic_funcs->hw_queues_unlock(hdev);
899
900		/* Flush anyone that is inside device open */
901		mutex_lock(&hdev->fpriv_list_lock);
902		mutex_unlock(&hdev->fpriv_list_lock);
903
904		dev_err(hdev->dev, "Going to RESET device!\n");
905	}
906
907again:
908	if ((hard_reset) && (!from_hard_reset_thread)) {
909		struct hl_device_reset_work *device_reset_work;
910
911		hdev->hard_reset_pending = true;
912
913		device_reset_work = kzalloc(sizeof(*device_reset_work),
914						GFP_ATOMIC);
915		if (!device_reset_work) {
916			rc = -ENOMEM;
917			goto out_err;
918		}
919
920		/*
921		 * Because the reset function can't run from interrupt or
922		 * from heartbeat work, we need to call the reset function
923		 * from a dedicated work
924		 */
925		INIT_WORK(&device_reset_work->reset_work,
926				device_hard_reset_pending);
927		device_reset_work->hdev = hdev;
928		schedule_work(&device_reset_work->reset_work);
929
930		return 0;
931	}
932
933	if (hard_reset) {
934		device_late_fini(hdev);
935
936		/*
937		 * Now that the heartbeat thread is closed, flush processes
938		 * which are sending messages to CPU
939		 */
940		mutex_lock(&hdev->send_cpu_message_lock);
941		mutex_unlock(&hdev->send_cpu_message_lock);
942	}
943
944	/*
945	 * Halt the engines and disable interrupts so we won't get any more
946	 * completions from H/W and we won't have any accesses from the
947	 * H/W to the host machine
948	 */
949	hdev->asic_funcs->halt_engines(hdev, hard_reset);
950
951	/* Go over all the queues, release all CS and their jobs */
952	hl_cs_rollback_all(hdev);
953
954	if (hard_reset) {
955		/* Kill processes here after CS rollback. This is because the
956		 * process can't really exit until all its CSs are done, which
957		 * is what we do in cs rollback
958		 */
959		rc = device_kill_open_processes(hdev);
960		if (rc) {
961			dev_crit(hdev->dev,
962				"Failed to kill all open processes, stopping hard reset\n");
963			goto out_err;
964		}
965
966		/* Flush the Event queue workers to make sure no other thread is
967		 * reading or writing to registers during the reset
968		 */
969		flush_workqueue(hdev->eq_wq);
970	}
971
972	/* Reset the H/W. It will be in idle state after this returns */
973	hdev->asic_funcs->hw_fini(hdev, hard_reset);
974
975	if (hard_reset) {
976		/* Release kernel context */
977		if (hl_ctx_put(hdev->kernel_ctx) == 1)
978			hdev->kernel_ctx = NULL;
979		hl_vm_fini(hdev);
980		hl_mmu_fini(hdev);
981		hl_eq_reset(hdev, &hdev->event_queue);
982	}
983
984	/* Re-initialize PI,CI to 0 in all queues (hw queue, cq) */
985	hl_hw_queue_reset(hdev, hard_reset);
986	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
987		hl_cq_reset(hdev, &hdev->completion_queue[i]);
988
989	hdev->idle_busy_ts_idx = 0;
990	hdev->idle_busy_ts_arr[0].busy_to_idle_ts = ktime_set(0, 0);
991	hdev->idle_busy_ts_arr[0].idle_to_busy_ts = ktime_set(0, 0);
992
993	if (hdev->cs_active_cnt)
994		dev_crit(hdev->dev, "CS active cnt %d is not 0 during reset\n",
995			hdev->cs_active_cnt);
996
997	mutex_lock(&hdev->fpriv_list_lock);
998
999	/* Make sure the context switch phase will run again */
1000	if (hdev->compute_ctx) {
1001		atomic_set(&hdev->compute_ctx->thread_ctx_switch_token, 1);
1002		hdev->compute_ctx->thread_ctx_switch_wait_token = 0;
1003	}
1004
1005	mutex_unlock(&hdev->fpriv_list_lock);
1006
1007	/* Finished tear-down, starting to re-initialize */
1008
1009	if (hard_reset) {
1010		hdev->device_cpu_disabled = false;
1011		hdev->hard_reset_pending = false;
1012
1013		if (hdev->kernel_ctx) {
1014			dev_crit(hdev->dev,
1015				"kernel ctx was alive during hard reset, something is terribly wrong\n");
1016			rc = -EBUSY;
1017			goto out_err;
1018		}
1019
1020		rc = hl_mmu_init(hdev);
1021		if (rc) {
1022			dev_err(hdev->dev,
1023				"Failed to initialize MMU S/W after hard reset\n");
1024			goto out_err;
1025		}
1026
1027		/* Allocate the kernel context */
1028		hdev->kernel_ctx = kzalloc(sizeof(*hdev->kernel_ctx),
1029						GFP_KERNEL);
1030		if (!hdev->kernel_ctx) {
1031			rc = -ENOMEM;
1032			hl_mmu_fini(hdev);
1033			goto out_err;
1034		}
1035
1036		hdev->compute_ctx = NULL;
1037
1038		rc = hl_ctx_init(hdev, hdev->kernel_ctx, true);
1039		if (rc) {
1040			dev_err(hdev->dev,
1041				"failed to init kernel ctx in hard reset\n");
1042			kfree(hdev->kernel_ctx);
1043			hdev->kernel_ctx = NULL;
1044			hl_mmu_fini(hdev);
1045			goto out_err;
1046		}
1047	}
1048
1049	/* Device is now enabled as part of the initialization requires
1050	 * communication with the device firmware to get information that
1051	 * is required for the initialization itself
1052	 */
1053	hdev->disabled = false;
1054
1055	rc = hdev->asic_funcs->hw_init(hdev);
1056	if (rc) {
1057		dev_err(hdev->dev,
1058			"failed to initialize the H/W after reset\n");
1059		goto out_err;
1060	}
1061
1062	/* Check that the communication with the device is working */
1063	rc = hdev->asic_funcs->test_queues(hdev);
1064	if (rc) {
1065		dev_err(hdev->dev,
1066			"Failed to detect if device is alive after reset\n");
1067		goto out_err;
1068	}
1069
1070	if (hard_reset) {
1071		rc = device_late_init(hdev);
1072		if (rc) {
1073			dev_err(hdev->dev,
1074				"Failed late init after hard reset\n");
1075			goto out_err;
1076		}
1077
1078		rc = hl_vm_init(hdev);
1079		if (rc) {
1080			dev_err(hdev->dev,
1081				"Failed to init memory module after hard reset\n");
1082			goto out_err;
1083		}
1084
1085		hl_set_max_power(hdev);
1086	} else {
1087		rc = hdev->asic_funcs->soft_reset_late_init(hdev);
1088		if (rc) {
1089			dev_err(hdev->dev,
1090				"Failed late init after soft reset\n");
1091			goto out_err;
1092		}
1093	}
1094
1095	atomic_set(&hdev->in_reset, 0);
1096
1097	if (hard_reset)
1098		hdev->hard_reset_cnt++;
1099	else
1100		hdev->soft_reset_cnt++;
1101
1102	dev_warn(hdev->dev, "Successfully finished resetting the device\n");
1103
1104	return 0;
1105
1106out_err:
1107	hdev->disabled = true;
1108
1109	if (hard_reset) {
1110		dev_err(hdev->dev,
1111			"Failed to reset! Device is NOT usable\n");
1112		hdev->hard_reset_cnt++;
1113	} else {
1114		dev_err(hdev->dev,
1115			"Failed to do soft-reset, trying hard reset\n");
1116		hdev->soft_reset_cnt++;
1117		hard_reset = true;
1118		goto again;
1119	}
1120
1121	atomic_set(&hdev->in_reset, 0);
1122
1123	return rc;
1124}
1125
1126/*
1127 * hl_device_init - main initialization function for habanalabs device
1128 *
1129 * @hdev: pointer to habanalabs device structure
1130 *
1131 * Allocate an id for the device, do early initialization and then call the
1132 * ASIC specific initialization functions. Finally, create the cdev and the
1133 * Linux device to expose it to the user
1134 */
1135int hl_device_init(struct hl_device *hdev, struct class *hclass)
1136{
1137	int i, rc, cq_cnt, cq_ready_cnt;
1138	char *name;
1139	bool add_cdev_sysfs_on_err = false;
1140
1141	name = kasprintf(GFP_KERNEL, "hl%d", hdev->id / 2);
1142	if (!name) {
1143		rc = -ENOMEM;
1144		goto out_disabled;
1145	}
1146
1147	/* Initialize cdev and device structures */
1148	rc = device_init_cdev(hdev, hclass, hdev->id, &hl_ops, name,
1149				&hdev->cdev, &hdev->dev);
1150
1151	kfree(name);
1152
1153	if (rc)
1154		goto out_disabled;
1155
1156	name = kasprintf(GFP_KERNEL, "hl_controlD%d", hdev->id / 2);
1157	if (!name) {
1158		rc = -ENOMEM;
1159		goto free_dev;
1160	}
1161
1162	/* Initialize cdev and device structures for control device */
1163	rc = device_init_cdev(hdev, hclass, hdev->id_control, &hl_ctrl_ops,
1164				name, &hdev->cdev_ctrl, &hdev->dev_ctrl);
1165
1166	kfree(name);
1167
1168	if (rc)
1169		goto free_dev;
1170
1171	/* Initialize ASIC function pointers and perform early init */
1172	rc = device_early_init(hdev);
1173	if (rc)
1174		goto free_dev_ctrl;
1175
1176	/*
1177	 * Start calling ASIC initialization. First S/W then H/W and finally
1178	 * late init
1179	 */
1180	rc = hdev->asic_funcs->sw_init(hdev);
1181	if (rc)
1182		goto early_fini;
1183
1184	/*
1185	 * Initialize the H/W queues. Must be done before hw_init, because
1186	 * there the addresses of the kernel queue are being written to the
1187	 * registers of the device
1188	 */
1189	rc = hl_hw_queues_create(hdev);
1190	if (rc) {
1191		dev_err(hdev->dev, "failed to initialize kernel queues\n");
1192		goto sw_fini;
1193	}
1194
1195	cq_cnt = hdev->asic_prop.completion_queues_count;
1196
1197	/*
1198	 * Initialize the completion queues. Must be done before hw_init,
1199	 * because there the addresses of the completion queues are being
1200	 * passed as arguments to request_irq
1201	 */
1202	if (cq_cnt) {
1203		hdev->completion_queue = kcalloc(cq_cnt,
1204				sizeof(*hdev->completion_queue),
1205				GFP_KERNEL);
1206
1207		if (!hdev->completion_queue) {
1208			dev_err(hdev->dev,
1209				"failed to allocate completion queues\n");
1210			rc = -ENOMEM;
1211			goto hw_queues_destroy;
1212		}
1213	}
1214
1215	for (i = 0, cq_ready_cnt = 0 ; i < cq_cnt ; i++, cq_ready_cnt++) {
1216		rc = hl_cq_init(hdev, &hdev->completion_queue[i],
1217				hdev->asic_funcs->get_queue_id_for_cq(hdev, i));
1218		if (rc) {
1219			dev_err(hdev->dev,
1220				"failed to initialize completion queue\n");
1221			goto cq_fini;
1222		}
1223		hdev->completion_queue[i].cq_idx = i;
1224	}
1225
1226	/*
1227	 * Initialize the event queue. Must be done before hw_init,
1228	 * because there the address of the event queue is being
1229	 * passed as argument to request_irq
1230	 */
1231	rc = hl_eq_init(hdev, &hdev->event_queue);
1232	if (rc) {
1233		dev_err(hdev->dev, "failed to initialize event queue\n");
1234		goto cq_fini;
1235	}
1236
1237	/* MMU S/W must be initialized before kernel context is created */
1238	rc = hl_mmu_init(hdev);
1239	if (rc) {
1240		dev_err(hdev->dev, "Failed to initialize MMU S/W structures\n");
1241		goto eq_fini;
1242	}
1243
1244	/* Allocate the kernel context */
1245	hdev->kernel_ctx = kzalloc(sizeof(*hdev->kernel_ctx), GFP_KERNEL);
1246	if (!hdev->kernel_ctx) {
1247		rc = -ENOMEM;
1248		goto mmu_fini;
1249	}
1250
1251	hdev->compute_ctx = NULL;
1252
1253	rc = hl_ctx_init(hdev, hdev->kernel_ctx, true);
1254	if (rc) {
1255		dev_err(hdev->dev, "failed to initialize kernel context\n");
1256		kfree(hdev->kernel_ctx);
1257		goto mmu_fini;
1258	}
1259
1260	rc = hl_cb_pool_init(hdev);
1261	if (rc) {
1262		dev_err(hdev->dev, "failed to initialize CB pool\n");
1263		goto release_ctx;
1264	}
1265
1266	hl_debugfs_add_device(hdev);
1267
1268	if (hdev->asic_funcs->get_hw_state(hdev) == HL_DEVICE_HW_STATE_DIRTY) {
1269		dev_info(hdev->dev,
1270			"H/W state is dirty, must reset before initializing\n");
1271		hdev->asic_funcs->halt_engines(hdev, true);
1272		hdev->asic_funcs->hw_fini(hdev, true);
1273	}
1274
1275	/*
1276	 * From this point, in case of an error, add char devices and create
1277	 * sysfs nodes as part of the error flow, to allow debugging.
1278	 */
1279	add_cdev_sysfs_on_err = true;
1280
1281	/* Device is now enabled as part of the initialization requires
1282	 * communication with the device firmware to get information that
1283	 * is required for the initialization itself
1284	 */
1285	hdev->disabled = false;
1286
1287	rc = hdev->asic_funcs->hw_init(hdev);
1288	if (rc) {
1289		dev_err(hdev->dev, "failed to initialize the H/W\n");
1290		rc = 0;
1291		goto out_disabled;
1292	}
1293
1294	/* Check that the communication with the device is working */
1295	rc = hdev->asic_funcs->test_queues(hdev);
1296	if (rc) {
1297		dev_err(hdev->dev, "Failed to detect if device is alive\n");
1298		rc = 0;
1299		goto out_disabled;
1300	}
1301
1302	rc = device_late_init(hdev);
1303	if (rc) {
1304		dev_err(hdev->dev, "Failed late initialization\n");
1305		rc = 0;
1306		goto out_disabled;
1307	}
1308
1309	dev_info(hdev->dev, "Found %s device with %lluGB DRAM\n",
1310		hdev->asic_name,
1311		hdev->asic_prop.dram_size / 1024 / 1024 / 1024);
1312
1313	rc = hl_vm_init(hdev);
1314	if (rc) {
1315		dev_err(hdev->dev, "Failed to initialize memory module\n");
1316		rc = 0;
1317		goto out_disabled;
1318	}
1319
1320	/*
1321	 * Expose devices and sysfs nodes to user.
1322	 * From here there is no need to add char devices and create sysfs nodes
1323	 * in case of an error.
1324	 */
1325	add_cdev_sysfs_on_err = false;
1326	rc = device_cdev_sysfs_add(hdev);
1327	if (rc) {
1328		dev_err(hdev->dev,
1329			"Failed to add char devices and sysfs nodes\n");
1330		rc = 0;
1331		goto out_disabled;
1332	}
1333
1334	/* Need to call this again because the max power might change,
1335	 * depending on card type for certain ASICs
1336	 */
1337	hl_set_max_power(hdev);
1338
1339	/*
1340	 * hl_hwmon_init() must be called after device_late_init(), because only
1341	 * there we get the information from the device about which
1342	 * hwmon-related sensors the device supports.
1343	 * Furthermore, it must be done after adding the device to the system.
1344	 */
1345	rc = hl_hwmon_init(hdev);
1346	if (rc) {
1347		dev_err(hdev->dev, "Failed to initialize hwmon\n");
1348		rc = 0;
1349		goto out_disabled;
1350	}
1351
1352	dev_notice(hdev->dev,
1353		"Successfully added device to habanalabs driver\n");
1354
1355	hdev->init_done = true;
1356
1357	return 0;
1358
1359release_ctx:
1360	if (hl_ctx_put(hdev->kernel_ctx) != 1)
1361		dev_err(hdev->dev,
1362			"kernel ctx is still alive on initialization failure\n");
1363mmu_fini:
1364	hl_mmu_fini(hdev);
1365eq_fini:
1366	hl_eq_fini(hdev, &hdev->event_queue);
1367cq_fini:
1368	for (i = 0 ; i < cq_ready_cnt ; i++)
1369		hl_cq_fini(hdev, &hdev->completion_queue[i]);
1370	kfree(hdev->completion_queue);
1371hw_queues_destroy:
1372	hl_hw_queues_destroy(hdev);
1373sw_fini:
1374	hdev->asic_funcs->sw_fini(hdev);
1375early_fini:
1376	device_early_fini(hdev);
1377free_dev_ctrl:
1378	put_device(hdev->dev_ctrl);
1379free_dev:
1380	put_device(hdev->dev);
1381out_disabled:
1382	hdev->disabled = true;
1383	if (add_cdev_sysfs_on_err)
1384		device_cdev_sysfs_add(hdev);
1385	if (hdev->pdev)
1386		dev_err(&hdev->pdev->dev,
1387			"Failed to initialize hl%d. Device is NOT usable !\n",
1388			hdev->id / 2);
1389	else
1390		pr_err("Failed to initialize hl%d. Device is NOT usable !\n",
1391			hdev->id / 2);
1392
1393	return rc;
1394}
1395
1396/*
1397 * hl_device_fini - main tear-down function for habanalabs device
1398 *
1399 * @hdev: pointer to habanalabs device structure
1400 *
1401 * Destroy the device, call ASIC fini functions and release the id
1402 */
1403void hl_device_fini(struct hl_device *hdev)
1404{
1405	int i, rc;
1406	ktime_t timeout;
1407
1408	dev_info(hdev->dev, "Removing device\n");
1409
1410	/*
1411	 * This function is competing with the reset function, so try to
1412	 * take the reset atomic and if we are already in middle of reset,
1413	 * wait until reset function is finished. Reset function is designed
1414	 * to always finish. However, in Gaudi, because of all the network
1415	 * ports, the hard reset could take between 10-30 seconds
1416	 */
1417
1418	timeout = ktime_add_us(ktime_get(),
1419				HL_HARD_RESET_MAX_TIMEOUT * 1000 * 1000);
1420	rc = atomic_cmpxchg(&hdev->in_reset, 0, 1);
1421	while (rc) {
1422		usleep_range(50, 200);
1423		rc = atomic_cmpxchg(&hdev->in_reset, 0, 1);
1424		if (ktime_compare(ktime_get(), timeout) > 0) {
1425			WARN(1, "Failed to remove device because reset function did not finish\n");
1426			return;
1427		}
1428	}
1429
1430	/* Disable PCI access from device F/W so it won't send us additional
1431	 * interrupts. We disable MSI/MSI-X at the halt_engines function and we
1432	 * can't have the F/W sending us interrupts after that. We need to
1433	 * disable the access here because if the device is marked disable, the
1434	 * message won't be send. Also, in case of heartbeat, the device CPU is
1435	 * marked as disable so this message won't be sent
1436	 */
1437	hl_fw_send_pci_access_msg(hdev,	CPUCP_PACKET_DISABLE_PCI_ACCESS);
1438
1439	/* Mark device as disabled */
1440	hdev->disabled = true;
1441
1442	/* Flush anyone that is inside the critical section of enqueue
1443	 * jobs to the H/W
1444	 */
1445	hdev->asic_funcs->hw_queues_lock(hdev);
1446	hdev->asic_funcs->hw_queues_unlock(hdev);
1447
1448	/* Flush anyone that is inside device open */
1449	mutex_lock(&hdev->fpriv_list_lock);
1450	mutex_unlock(&hdev->fpriv_list_lock);
1451
1452	hdev->hard_reset_pending = true;
1453
1454	hl_hwmon_fini(hdev);
1455
1456	device_late_fini(hdev);
1457
1458	hl_debugfs_remove_device(hdev);
1459
1460	/*
1461	 * Halt the engines and disable interrupts so we won't get any more
1462	 * completions from H/W and we won't have any accesses from the
1463	 * H/W to the host machine
1464	 */
1465	hdev->asic_funcs->halt_engines(hdev, true);
1466
1467	/* Go over all the queues, release all CS and their jobs */
1468	hl_cs_rollback_all(hdev);
1469
1470	/* Kill processes here after CS rollback. This is because the process
1471	 * can't really exit until all its CSs are done, which is what we
1472	 * do in cs rollback
1473	 */
1474	rc = device_kill_open_processes(hdev);
1475	if (rc)
1476		dev_crit(hdev->dev, "Failed to kill all open processes\n");
1477
1478	hl_cb_pool_fini(hdev);
1479
1480	/* Reset the H/W. It will be in idle state after this returns */
1481	hdev->asic_funcs->hw_fini(hdev, true);
1482
1483	/* Release kernel context */
1484	if ((hdev->kernel_ctx) && (hl_ctx_put(hdev->kernel_ctx) != 1))
1485		dev_err(hdev->dev, "kernel ctx is still alive\n");
1486
1487	hl_vm_fini(hdev);
1488
1489	hl_mmu_fini(hdev);
1490
1491	hl_eq_fini(hdev, &hdev->event_queue);
1492
1493	for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
1494		hl_cq_fini(hdev, &hdev->completion_queue[i]);
1495	kfree(hdev->completion_queue);
1496
1497	hl_hw_queues_destroy(hdev);
1498
1499	/* Call ASIC S/W finalize function */
1500	hdev->asic_funcs->sw_fini(hdev);
1501
1502	device_early_fini(hdev);
1503
1504	/* Hide devices and sysfs nodes from user */
1505	device_cdev_sysfs_del(hdev);
1506
1507	pr_info("removed device successfully\n");
1508}
1509
1510/*
1511 * MMIO register access helper functions.
1512 */
1513
1514/*
1515 * hl_rreg - Read an MMIO register
1516 *
1517 * @hdev: pointer to habanalabs device structure
1518 * @reg: MMIO register offset (in bytes)
1519 *
1520 * Returns the value of the MMIO register we are asked to read
1521 *
1522 */
1523inline u32 hl_rreg(struct hl_device *hdev, u32 reg)
1524{
1525	return readl(hdev->rmmio + reg);
1526}
1527
1528/*
1529 * hl_wreg - Write to an MMIO register
1530 *
1531 * @hdev: pointer to habanalabs device structure
1532 * @reg: MMIO register offset (in bytes)
1533 * @val: 32-bit value
1534 *
1535 * Writes the 32-bit value into the MMIO register
1536 *
1537 */
1538inline void hl_wreg(struct hl_device *hdev, u32 reg, u32 val)
1539{
1540	writel(val, hdev->rmmio + reg);
1541}
1542