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