1 // SPDX-License-Identifier: GPL-2.0
2
3 /*
4 * Copyright 2016-2022 HabanaLabs, Ltd.
5 * All Rights Reserved.
6 */
7
8 #define pr_fmt(fmt) "habanalabs: " fmt
9
10 #include <uapi/drm/habanalabs_accel.h>
11 #include "habanalabs.h"
12
13 #include <linux/pci.h>
14 #include <linux/hwmon.h>
15 #include <linux/vmalloc.h>
16
17 #include <trace/events/habanalabs.h>
18
19 #define HL_RESET_DELAY_USEC 10000 /* 10ms */
20
21 #define HL_DEVICE_RELEASE_WATCHDOG_TIMEOUT_SEC 5
22
23 enum dma_alloc_type {
24 DMA_ALLOC_COHERENT,
25 DMA_ALLOC_POOL,
26 };
27
28 #define MEM_SCRUB_DEFAULT_VAL 0x1122334455667788
29
30 /*
31 * hl_set_dram_bar- sets the bar to allow later access to address
32 *
33 * @hdev: pointer to habanalabs device structure.
34 * @addr: the address the caller wants to access.
35 * @region: the PCI region.
36 * @new_bar_region_base: the new BAR region base address.
37 *
38 * @return: the old BAR base address on success, U64_MAX for failure.
39 * The caller should set it back to the old address after use.
40 *
41 * In case the bar space does not cover the whole address space,
42 * the bar base address should be set to allow access to a given address.
43 * This function can be called also if the bar doesn't need to be set,
44 * in that case it just won't change the base.
45 */
hl_set_dram_bar(struct hl_device * hdev,u64 addr,struct pci_mem_region * region,u64 * new_bar_region_base)46 static u64 hl_set_dram_bar(struct hl_device *hdev, u64 addr, struct pci_mem_region *region,
47 u64 *new_bar_region_base)
48 {
49 struct asic_fixed_properties *prop = &hdev->asic_prop;
50 u64 bar_base_addr, old_base;
51
52 if (is_power_of_2(prop->dram_pci_bar_size))
53 bar_base_addr = addr & ~(prop->dram_pci_bar_size - 0x1ull);
54 else
55 bar_base_addr = DIV_ROUND_DOWN_ULL(addr, prop->dram_pci_bar_size) *
56 prop->dram_pci_bar_size;
57
58 old_base = hdev->asic_funcs->set_dram_bar_base(hdev, bar_base_addr);
59
60 /* in case of success we need to update the new BAR base */
61 if ((old_base != U64_MAX) && new_bar_region_base)
62 *new_bar_region_base = bar_base_addr;
63
64 return old_base;
65 }
66
hl_access_sram_dram_region(struct hl_device * hdev,u64 addr,u64 * val,enum debugfs_access_type acc_type,enum pci_region region_type,bool set_dram_bar)67 int hl_access_sram_dram_region(struct hl_device *hdev, u64 addr, u64 *val,
68 enum debugfs_access_type acc_type, enum pci_region region_type, bool set_dram_bar)
69 {
70 struct pci_mem_region *region = &hdev->pci_mem_region[region_type];
71 u64 old_base = 0, rc, bar_region_base = region->region_base;
72 void __iomem *acc_addr;
73
74 if (set_dram_bar) {
75 old_base = hl_set_dram_bar(hdev, addr, region, &bar_region_base);
76 if (old_base == U64_MAX)
77 return -EIO;
78 }
79
80 acc_addr = hdev->pcie_bar[region->bar_id] + region->offset_in_bar +
81 (addr - bar_region_base);
82
83 switch (acc_type) {
84 case DEBUGFS_READ8:
85 *val = readb(acc_addr);
86 break;
87 case DEBUGFS_WRITE8:
88 writeb(*val, acc_addr);
89 break;
90 case DEBUGFS_READ32:
91 *val = readl(acc_addr);
92 break;
93 case DEBUGFS_WRITE32:
94 writel(*val, acc_addr);
95 break;
96 case DEBUGFS_READ64:
97 *val = readq(acc_addr);
98 break;
99 case DEBUGFS_WRITE64:
100 writeq(*val, acc_addr);
101 break;
102 }
103
104 if (set_dram_bar) {
105 rc = hl_set_dram_bar(hdev, old_base, region, NULL);
106 if (rc == U64_MAX)
107 return -EIO;
108 }
109
110 return 0;
111 }
112
hl_dma_alloc_common(struct hl_device * hdev,size_t size,dma_addr_t * dma_handle,gfp_t flag,enum dma_alloc_type alloc_type,const char * caller)113 static void *hl_dma_alloc_common(struct hl_device *hdev, size_t size, dma_addr_t *dma_handle,
114 gfp_t flag, enum dma_alloc_type alloc_type,
115 const char *caller)
116 {
117 void *ptr = NULL;
118
119 switch (alloc_type) {
120 case DMA_ALLOC_COHERENT:
121 ptr = hdev->asic_funcs->asic_dma_alloc_coherent(hdev, size, dma_handle, flag);
122 break;
123 case DMA_ALLOC_POOL:
124 ptr = hdev->asic_funcs->asic_dma_pool_zalloc(hdev, size, flag, dma_handle);
125 break;
126 }
127
128 if (trace_habanalabs_dma_alloc_enabled() && !ZERO_OR_NULL_PTR(ptr))
129 trace_habanalabs_dma_alloc(hdev->dev, (u64) (uintptr_t) ptr, *dma_handle, size,
130 caller);
131
132 return ptr;
133 }
134
hl_asic_dma_free_common(struct hl_device * hdev,size_t size,void * cpu_addr,dma_addr_t dma_handle,enum dma_alloc_type alloc_type,const char * caller)135 static void hl_asic_dma_free_common(struct hl_device *hdev, size_t size, void *cpu_addr,
136 dma_addr_t dma_handle, enum dma_alloc_type alloc_type,
137 const char *caller)
138 {
139 /* this is needed to avoid warning on using freed pointer */
140 u64 store_cpu_addr = (u64) (uintptr_t) cpu_addr;
141
142 switch (alloc_type) {
143 case DMA_ALLOC_COHERENT:
144 hdev->asic_funcs->asic_dma_free_coherent(hdev, size, cpu_addr, dma_handle);
145 break;
146 case DMA_ALLOC_POOL:
147 hdev->asic_funcs->asic_dma_pool_free(hdev, cpu_addr, dma_handle);
148 break;
149 }
150
151 trace_habanalabs_dma_free(hdev->dev, store_cpu_addr, dma_handle, size, caller);
152 }
153
hl_asic_dma_alloc_coherent_caller(struct hl_device * hdev,size_t size,dma_addr_t * dma_handle,gfp_t flag,const char * caller)154 void *hl_asic_dma_alloc_coherent_caller(struct hl_device *hdev, size_t size, dma_addr_t *dma_handle,
155 gfp_t flag, const char *caller)
156 {
157 return hl_dma_alloc_common(hdev, size, dma_handle, flag, DMA_ALLOC_COHERENT, caller);
158 }
159
hl_asic_dma_free_coherent_caller(struct hl_device * hdev,size_t size,void * cpu_addr,dma_addr_t dma_handle,const char * caller)160 void hl_asic_dma_free_coherent_caller(struct hl_device *hdev, size_t size, void *cpu_addr,
161 dma_addr_t dma_handle, const char *caller)
162 {
163 hl_asic_dma_free_common(hdev, size, cpu_addr, dma_handle, DMA_ALLOC_COHERENT, caller);
164 }
165
hl_asic_dma_pool_zalloc_caller(struct hl_device * hdev,size_t size,gfp_t mem_flags,dma_addr_t * dma_handle,const char * caller)166 void *hl_asic_dma_pool_zalloc_caller(struct hl_device *hdev, size_t size, gfp_t mem_flags,
167 dma_addr_t *dma_handle, const char *caller)
168 {
169 return hl_dma_alloc_common(hdev, size, dma_handle, mem_flags, DMA_ALLOC_POOL, caller);
170 }
171
hl_asic_dma_pool_free_caller(struct hl_device * hdev,void * vaddr,dma_addr_t dma_addr,const char * caller)172 void hl_asic_dma_pool_free_caller(struct hl_device *hdev, void *vaddr, dma_addr_t dma_addr,
173 const char *caller)
174 {
175 hl_asic_dma_free_common(hdev, 0, vaddr, dma_addr, DMA_ALLOC_POOL, caller);
176 }
177
hl_cpu_accessible_dma_pool_alloc(struct hl_device * hdev,size_t size,dma_addr_t * dma_handle)178 void *hl_cpu_accessible_dma_pool_alloc(struct hl_device *hdev, size_t size, dma_addr_t *dma_handle)
179 {
180 return hdev->asic_funcs->cpu_accessible_dma_pool_alloc(hdev, size, dma_handle);
181 }
182
hl_cpu_accessible_dma_pool_free(struct hl_device * hdev,size_t size,void * vaddr)183 void hl_cpu_accessible_dma_pool_free(struct hl_device *hdev, size_t size, void *vaddr)
184 {
185 hdev->asic_funcs->cpu_accessible_dma_pool_free(hdev, size, vaddr);
186 }
187
hl_dma_map_sgtable(struct hl_device * hdev,struct sg_table * sgt,enum dma_data_direction dir)188 int hl_dma_map_sgtable(struct hl_device *hdev, struct sg_table *sgt, enum dma_data_direction dir)
189 {
190 struct asic_fixed_properties *prop = &hdev->asic_prop;
191 struct scatterlist *sg;
192 int rc, i;
193
194 rc = dma_map_sgtable(&hdev->pdev->dev, sgt, dir, 0);
195 if (rc)
196 return rc;
197
198 /* Shift to the device's base physical address of host memory if necessary */
199 if (prop->device_dma_offset_for_host_access)
200 for_each_sgtable_dma_sg(sgt, sg, i)
201 sg->dma_address += prop->device_dma_offset_for_host_access;
202
203 return 0;
204 }
205
hl_dma_unmap_sgtable(struct hl_device * hdev,struct sg_table * sgt,enum dma_data_direction dir)206 void hl_dma_unmap_sgtable(struct hl_device *hdev, struct sg_table *sgt, enum dma_data_direction dir)
207 {
208 struct asic_fixed_properties *prop = &hdev->asic_prop;
209 struct scatterlist *sg;
210 int i;
211
212 /* Cancel the device's base physical address of host memory if necessary */
213 if (prop->device_dma_offset_for_host_access)
214 for_each_sgtable_dma_sg(sgt, sg, i)
215 sg->dma_address -= prop->device_dma_offset_for_host_access;
216
217 dma_unmap_sgtable(&hdev->pdev->dev, sgt, dir, 0);
218 }
219
220 /*
221 * hl_access_cfg_region - access the config region
222 *
223 * @hdev: pointer to habanalabs device structure
224 * @addr: the address to access
225 * @val: the value to write from or read to
226 * @acc_type: the type of access (read/write 64/32)
227 */
hl_access_cfg_region(struct hl_device * hdev,u64 addr,u64 * val,enum debugfs_access_type acc_type)228 int hl_access_cfg_region(struct hl_device *hdev, u64 addr, u64 *val,
229 enum debugfs_access_type acc_type)
230 {
231 struct pci_mem_region *cfg_region = &hdev->pci_mem_region[PCI_REGION_CFG];
232 u32 val_h, val_l;
233
234 if (!IS_ALIGNED(addr, sizeof(u32))) {
235 dev_err(hdev->dev, "address %#llx not a multiple of %zu\n", addr, sizeof(u32));
236 return -EINVAL;
237 }
238
239 switch (acc_type) {
240 case DEBUGFS_READ32:
241 *val = RREG32(addr - cfg_region->region_base);
242 break;
243 case DEBUGFS_WRITE32:
244 WREG32(addr - cfg_region->region_base, *val);
245 break;
246 case DEBUGFS_READ64:
247 val_l = RREG32(addr - cfg_region->region_base);
248 val_h = RREG32(addr + sizeof(u32) - cfg_region->region_base);
249
250 *val = (((u64) val_h) << 32) | val_l;
251 break;
252 case DEBUGFS_WRITE64:
253 WREG32(addr - cfg_region->region_base, lower_32_bits(*val));
254 WREG32(addr + sizeof(u32) - cfg_region->region_base, upper_32_bits(*val));
255 break;
256 default:
257 dev_err(hdev->dev, "access type %d is not supported\n", acc_type);
258 return -EOPNOTSUPP;
259 }
260
261 return 0;
262 }
263
264 /*
265 * hl_access_dev_mem - access device memory
266 *
267 * @hdev: pointer to habanalabs device structure
268 * @region_type: the type of the region the address belongs to
269 * @addr: the address to access
270 * @val: the value to write from or read to
271 * @acc_type: the type of access (r/w, 32/64)
272 */
hl_access_dev_mem(struct hl_device * hdev,enum pci_region region_type,u64 addr,u64 * val,enum debugfs_access_type acc_type)273 int hl_access_dev_mem(struct hl_device *hdev, enum pci_region region_type,
274 u64 addr, u64 *val, enum debugfs_access_type acc_type)
275 {
276 switch (region_type) {
277 case PCI_REGION_CFG:
278 return hl_access_cfg_region(hdev, addr, val, acc_type);
279 case PCI_REGION_SRAM:
280 case PCI_REGION_DRAM:
281 return hl_access_sram_dram_region(hdev, addr, val, acc_type,
282 region_type, (region_type == PCI_REGION_DRAM));
283 default:
284 return -EFAULT;
285 }
286
287 return 0;
288 }
289
hl_engine_data_sprintf(struct engines_data * e,const char * fmt,...)290 void hl_engine_data_sprintf(struct engines_data *e, const char *fmt, ...)
291 {
292 va_list args;
293 int str_size;
294
295 va_start(args, fmt);
296 /* Calculate formatted string length. Assuming each string is null terminated, hence
297 * increment result by 1
298 */
299 str_size = vsnprintf(NULL, 0, fmt, args) + 1;
300 va_end(args);
301
302 if ((e->actual_size + str_size) < e->allocated_buf_size) {
303 va_start(args, fmt);
304 vsnprintf(e->buf + e->actual_size, str_size, fmt, args);
305 va_end(args);
306 }
307
308 /* Need to update the size even when not updating destination buffer to get the exact size
309 * of all input strings
310 */
311 e->actual_size += str_size;
312 }
313
hl_device_status(struct hl_device * hdev)314 enum hl_device_status hl_device_status(struct hl_device *hdev)
315 {
316 enum hl_device_status status;
317
318 if (hdev->reset_info.in_reset) {
319 if (hdev->reset_info.in_compute_reset)
320 status = HL_DEVICE_STATUS_IN_RESET_AFTER_DEVICE_RELEASE;
321 else
322 status = HL_DEVICE_STATUS_IN_RESET;
323 } else if (hdev->reset_info.needs_reset) {
324 status = HL_DEVICE_STATUS_NEEDS_RESET;
325 } else if (hdev->disabled) {
326 status = HL_DEVICE_STATUS_MALFUNCTION;
327 } else if (!hdev->init_done) {
328 status = HL_DEVICE_STATUS_IN_DEVICE_CREATION;
329 } else {
330 status = HL_DEVICE_STATUS_OPERATIONAL;
331 }
332
333 return status;
334 }
335
hl_device_operational(struct hl_device * hdev,enum hl_device_status * status)336 bool hl_device_operational(struct hl_device *hdev,
337 enum hl_device_status *status)
338 {
339 enum hl_device_status current_status;
340
341 current_status = hl_device_status(hdev);
342 if (status)
343 *status = current_status;
344
345 switch (current_status) {
346 case HL_DEVICE_STATUS_IN_RESET:
347 case HL_DEVICE_STATUS_IN_RESET_AFTER_DEVICE_RELEASE:
348 case HL_DEVICE_STATUS_MALFUNCTION:
349 case HL_DEVICE_STATUS_NEEDS_RESET:
350 return false;
351 case HL_DEVICE_STATUS_OPERATIONAL:
352 case HL_DEVICE_STATUS_IN_DEVICE_CREATION:
353 default:
354 return true;
355 }
356 }
357
hl_ctrl_device_operational(struct hl_device * hdev,enum hl_device_status * status)358 bool hl_ctrl_device_operational(struct hl_device *hdev,
359 enum hl_device_status *status)
360 {
361 enum hl_device_status current_status;
362
363 current_status = hl_device_status(hdev);
364 if (status)
365 *status = current_status;
366
367 switch (current_status) {
368 case HL_DEVICE_STATUS_MALFUNCTION:
369 return false;
370 case HL_DEVICE_STATUS_IN_RESET:
371 case HL_DEVICE_STATUS_IN_RESET_AFTER_DEVICE_RELEASE:
372 case HL_DEVICE_STATUS_NEEDS_RESET:
373 case HL_DEVICE_STATUS_OPERATIONAL:
374 case HL_DEVICE_STATUS_IN_DEVICE_CREATION:
375 default:
376 return true;
377 }
378 }
379
print_idle_status_mask(struct hl_device * hdev,const char * message,u64 idle_mask[HL_BUSY_ENGINES_MASK_EXT_SIZE])380 static void print_idle_status_mask(struct hl_device *hdev, const char *message,
381 u64 idle_mask[HL_BUSY_ENGINES_MASK_EXT_SIZE])
382 {
383 if (idle_mask[3])
384 dev_err(hdev->dev, "%s (mask %#llx_%016llx_%016llx_%016llx)\n",
385 message, idle_mask[3], idle_mask[2], idle_mask[1], idle_mask[0]);
386 else if (idle_mask[2])
387 dev_err(hdev->dev, "%s (mask %#llx_%016llx_%016llx)\n",
388 message, idle_mask[2], idle_mask[1], idle_mask[0]);
389 else if (idle_mask[1])
390 dev_err(hdev->dev, "%s (mask %#llx_%016llx)\n",
391 message, idle_mask[1], idle_mask[0]);
392 else
393 dev_err(hdev->dev, "%s (mask %#llx)\n", message, idle_mask[0]);
394 }
395
hpriv_release(struct kref * ref)396 static void hpriv_release(struct kref *ref)
397 {
398 u64 idle_mask[HL_BUSY_ENGINES_MASK_EXT_SIZE] = {0};
399 bool reset_device, device_is_idle = true;
400 struct hl_fpriv *hpriv;
401 struct hl_device *hdev;
402
403 hpriv = container_of(ref, struct hl_fpriv, refcount);
404
405 hdev = hpriv->hdev;
406
407 hdev->asic_funcs->send_device_activity(hdev, false);
408
409 put_pid(hpriv->taskpid);
410
411 hl_debugfs_remove_file(hpriv);
412
413 mutex_destroy(&hpriv->ctx_lock);
414 mutex_destroy(&hpriv->restore_phase_mutex);
415
416 /* There should be no memory buffers at this point and handles IDR can be destroyed */
417 hl_mem_mgr_idr_destroy(&hpriv->mem_mgr);
418
419 /* Device should be reset if reset-upon-device-release is enabled, or if there is a pending
420 * reset that waits for device release.
421 */
422 reset_device = hdev->reset_upon_device_release || hdev->reset_info.watchdog_active;
423
424 /* Check the device idle status and reset if not idle.
425 * Skip it if already in reset, or if device is going to be reset in any case.
426 */
427 if (!hdev->reset_info.in_reset && !reset_device && hdev->pdev && !hdev->pldm)
428 device_is_idle = hdev->asic_funcs->is_device_idle(hdev, idle_mask,
429 HL_BUSY_ENGINES_MASK_EXT_SIZE, NULL);
430 if (!device_is_idle) {
431 print_idle_status_mask(hdev, "device is not idle after user context is closed",
432 idle_mask);
433 reset_device = true;
434 }
435
436 /* We need to remove the user from the list to make sure the reset process won't
437 * try to kill the user process. Because, if we got here, it means there are no
438 * more driver/device resources that the user process is occupying so there is
439 * no need to kill it
440 *
441 * However, we can't set the compute_ctx to NULL at this stage. This is to prevent
442 * a race between the release and opening the device again. We don't want to let
443 * a user open the device while there a reset is about to happen.
444 */
445 mutex_lock(&hdev->fpriv_list_lock);
446 list_del(&hpriv->dev_node);
447 mutex_unlock(&hdev->fpriv_list_lock);
448
449 if (reset_device) {
450 hl_device_reset(hdev, HL_DRV_RESET_DEV_RELEASE);
451 } else {
452 /* Scrubbing is handled within hl_device_reset(), so here need to do it directly */
453 int rc = hdev->asic_funcs->scrub_device_mem(hdev);
454
455 if (rc)
456 dev_err(hdev->dev, "failed to scrub memory from hpriv release (%d)\n", rc);
457 }
458
459 /* Now we can mark the compute_ctx as not active. Even if a reset is running in a different
460 * thread, we don't care because the in_reset is marked so if a user will try to open
461 * the device it will fail on that, even if compute_ctx is false.
462 */
463 mutex_lock(&hdev->fpriv_list_lock);
464 hdev->is_compute_ctx_active = false;
465 mutex_unlock(&hdev->fpriv_list_lock);
466
467 hdev->compute_ctx_in_release = 0;
468
469 /* release the eventfd */
470 if (hpriv->notifier_event.eventfd)
471 eventfd_ctx_put(hpriv->notifier_event.eventfd);
472
473 mutex_destroy(&hpriv->notifier_event.lock);
474
475 kfree(hpriv);
476 }
477
hl_hpriv_get(struct hl_fpriv * hpriv)478 void hl_hpriv_get(struct hl_fpriv *hpriv)
479 {
480 kref_get(&hpriv->refcount);
481 }
482
hl_hpriv_put(struct hl_fpriv * hpriv)483 int hl_hpriv_put(struct hl_fpriv *hpriv)
484 {
485 return kref_put(&hpriv->refcount, hpriv_release);
486 }
487
print_device_in_use_info(struct hl_device * hdev,const char * message)488 static void print_device_in_use_info(struct hl_device *hdev, const char *message)
489 {
490 u32 active_cs_num, dmabuf_export_cnt;
491 bool unknown_reason = true;
492 char buf[128];
493 size_t size;
494 int offset;
495
496 size = sizeof(buf);
497 offset = 0;
498
499 active_cs_num = hl_get_active_cs_num(hdev);
500 if (active_cs_num) {
501 unknown_reason = false;
502 offset += scnprintf(buf + offset, size - offset, " [%u active CS]", active_cs_num);
503 }
504
505 dmabuf_export_cnt = atomic_read(&hdev->dmabuf_export_cnt);
506 if (dmabuf_export_cnt) {
507 unknown_reason = false;
508 offset += scnprintf(buf + offset, size - offset, " [%u exported dma-buf]",
509 dmabuf_export_cnt);
510 }
511
512 if (unknown_reason)
513 scnprintf(buf + offset, size - offset, " [unknown reason]");
514
515 dev_notice(hdev->dev, "%s%s\n", message, buf);
516 }
517
518 /*
519 * hl_device_release - release function for habanalabs device
520 *
521 * @inode: pointer to inode structure
522 * @filp: pointer to file structure
523 *
524 * Called when process closes an habanalabs device
525 */
hl_device_release(struct inode * inode,struct file * filp)526 static int hl_device_release(struct inode *inode, struct file *filp)
527 {
528 struct hl_fpriv *hpriv = filp->private_data;
529 struct hl_device *hdev = hpriv->hdev;
530
531 filp->private_data = NULL;
532
533 if (!hdev) {
534 pr_crit("Closing FD after device was removed. Memory leak will occur and it is advised to reboot.\n");
535 put_pid(hpriv->taskpid);
536 return 0;
537 }
538
539 hl_ctx_mgr_fini(hdev, &hpriv->ctx_mgr);
540
541 /* Memory buffers might be still in use at this point and thus the handles IDR destruction
542 * is postponed to hpriv_release().
543 */
544 hl_mem_mgr_fini(&hpriv->mem_mgr);
545
546 hdev->compute_ctx_in_release = 1;
547
548 if (!hl_hpriv_put(hpriv)) {
549 print_device_in_use_info(hdev, "User process closed FD but device still in use");
550 hl_device_reset(hdev, HL_DRV_RESET_HARD);
551 }
552
553 hdev->last_open_session_duration_jif = jiffies - hdev->last_successful_open_jif;
554
555 return 0;
556 }
557
hl_device_release_ctrl(struct inode * inode,struct file * filp)558 static int hl_device_release_ctrl(struct inode *inode, struct file *filp)
559 {
560 struct hl_fpriv *hpriv = filp->private_data;
561 struct hl_device *hdev = hpriv->hdev;
562
563 filp->private_data = NULL;
564
565 if (!hdev) {
566 pr_err("Closing FD after device was removed\n");
567 goto out;
568 }
569
570 mutex_lock(&hdev->fpriv_ctrl_list_lock);
571 list_del(&hpriv->dev_node);
572 mutex_unlock(&hdev->fpriv_ctrl_list_lock);
573 out:
574 /* release the eventfd */
575 if (hpriv->notifier_event.eventfd)
576 eventfd_ctx_put(hpriv->notifier_event.eventfd);
577
578 mutex_destroy(&hpriv->notifier_event.lock);
579 put_pid(hpriv->taskpid);
580
581 kfree(hpriv);
582
583 return 0;
584 }
585
586 /*
587 * hl_mmap - mmap function for habanalabs device
588 *
589 * @*filp: pointer to file structure
590 * @*vma: pointer to vm_area_struct of the process
591 *
592 * Called when process does an mmap on habanalabs device. Call the relevant mmap
593 * function at the end of the common code.
594 */
hl_mmap(struct file * filp,struct vm_area_struct * vma)595 static int hl_mmap(struct file *filp, struct vm_area_struct *vma)
596 {
597 struct hl_fpriv *hpriv = filp->private_data;
598 struct hl_device *hdev = hpriv->hdev;
599 unsigned long vm_pgoff;
600
601 if (!hdev) {
602 pr_err_ratelimited("Trying to mmap after device was removed! Please close FD\n");
603 return -ENODEV;
604 }
605
606 vm_pgoff = vma->vm_pgoff;
607
608 switch (vm_pgoff & HL_MMAP_TYPE_MASK) {
609 case HL_MMAP_TYPE_BLOCK:
610 vma->vm_pgoff = HL_MMAP_OFFSET_VALUE_GET(vm_pgoff);
611 return hl_hw_block_mmap(hpriv, vma);
612
613 case HL_MMAP_TYPE_CB:
614 case HL_MMAP_TYPE_TS_BUFF:
615 return hl_mem_mgr_mmap(&hpriv->mem_mgr, vma, NULL);
616 }
617 return -EINVAL;
618 }
619
620 static const struct file_operations hl_ops = {
621 .owner = THIS_MODULE,
622 .open = hl_device_open,
623 .release = hl_device_release,
624 .mmap = hl_mmap,
625 .unlocked_ioctl = hl_ioctl,
626 .compat_ioctl = hl_ioctl
627 };
628
629 static const struct file_operations hl_ctrl_ops = {
630 .owner = THIS_MODULE,
631 .open = hl_device_open_ctrl,
632 .release = hl_device_release_ctrl,
633 .unlocked_ioctl = hl_ioctl_control,
634 .compat_ioctl = hl_ioctl_control
635 };
636
device_release_func(struct device * dev)637 static void device_release_func(struct device *dev)
638 {
639 kfree(dev);
640 }
641
642 /*
643 * device_init_cdev - Initialize cdev and device for habanalabs device
644 *
645 * @hdev: pointer to habanalabs device structure
646 * @class: pointer to the class object of the device
647 * @minor: minor number of the specific device
648 * @fpos: file operations to install for this device
649 * @name: name of the device as it will appear in the filesystem
650 * @cdev: pointer to the char device object that will be initialized
651 * @dev: pointer to the device object that will be initialized
652 *
653 * Initialize a cdev and a Linux device for habanalabs's device.
654 */
device_init_cdev(struct hl_device * hdev,struct class * class,int minor,const struct file_operations * fops,char * name,struct cdev * cdev,struct device ** dev)655 static int device_init_cdev(struct hl_device *hdev, struct class *class,
656 int minor, const struct file_operations *fops,
657 char *name, struct cdev *cdev,
658 struct device **dev)
659 {
660 cdev_init(cdev, fops);
661 cdev->owner = THIS_MODULE;
662
663 *dev = kzalloc(sizeof(**dev), GFP_KERNEL);
664 if (!*dev)
665 return -ENOMEM;
666
667 device_initialize(*dev);
668 (*dev)->devt = MKDEV(hdev->major, minor);
669 (*dev)->class = class;
670 (*dev)->release = device_release_func;
671 dev_set_drvdata(*dev, hdev);
672 dev_set_name(*dev, "%s", name);
673
674 return 0;
675 }
676
cdev_sysfs_debugfs_add(struct hl_device * hdev)677 static int cdev_sysfs_debugfs_add(struct hl_device *hdev)
678 {
679 int rc;
680
681 rc = cdev_device_add(&hdev->cdev, hdev->dev);
682 if (rc) {
683 dev_err(hdev->dev,
684 "failed to add a char device to the system\n");
685 return rc;
686 }
687
688 rc = cdev_device_add(&hdev->cdev_ctrl, hdev->dev_ctrl);
689 if (rc) {
690 dev_err(hdev->dev,
691 "failed to add a control char device to the system\n");
692 goto delete_cdev_device;
693 }
694
695 /* hl_sysfs_init() must be done after adding the device to the system */
696 rc = hl_sysfs_init(hdev);
697 if (rc) {
698 dev_err(hdev->dev, "failed to initialize sysfs\n");
699 goto delete_ctrl_cdev_device;
700 }
701
702 hl_debugfs_add_device(hdev);
703
704 hdev->cdev_sysfs_debugfs_created = true;
705
706 return 0;
707
708 delete_ctrl_cdev_device:
709 cdev_device_del(&hdev->cdev_ctrl, hdev->dev_ctrl);
710 delete_cdev_device:
711 cdev_device_del(&hdev->cdev, hdev->dev);
712 return rc;
713 }
714
cdev_sysfs_debugfs_remove(struct hl_device * hdev)715 static void cdev_sysfs_debugfs_remove(struct hl_device *hdev)
716 {
717 if (!hdev->cdev_sysfs_debugfs_created)
718 goto put_devices;
719
720 hl_debugfs_remove_device(hdev);
721 hl_sysfs_fini(hdev);
722 cdev_device_del(&hdev->cdev_ctrl, hdev->dev_ctrl);
723 cdev_device_del(&hdev->cdev, hdev->dev);
724
725 put_devices:
726 put_device(hdev->dev);
727 put_device(hdev->dev_ctrl);
728 }
729
device_hard_reset_pending(struct work_struct * work)730 static void device_hard_reset_pending(struct work_struct *work)
731 {
732 struct hl_device_reset_work *device_reset_work =
733 container_of(work, struct hl_device_reset_work, reset_work.work);
734 struct hl_device *hdev = device_reset_work->hdev;
735 u32 flags;
736 int rc;
737
738 flags = device_reset_work->flags | HL_DRV_RESET_FROM_RESET_THR;
739
740 rc = hl_device_reset(hdev, flags);
741
742 if ((rc == -EBUSY) && !hdev->device_fini_pending) {
743 struct hl_ctx *ctx = hl_get_compute_ctx(hdev);
744
745 if (ctx) {
746 /* The read refcount value should subtracted by one, because the read is
747 * protected with hl_get_compute_ctx().
748 */
749 dev_info(hdev->dev,
750 "Could not reset device (compute_ctx refcount %u). will try again in %u seconds",
751 kref_read(&ctx->refcount) - 1, HL_PENDING_RESET_PER_SEC);
752 hl_ctx_put(ctx);
753 } else {
754 dev_info(hdev->dev, "Could not reset device. will try again in %u seconds",
755 HL_PENDING_RESET_PER_SEC);
756 }
757
758 queue_delayed_work(hdev->reset_wq, &device_reset_work->reset_work,
759 msecs_to_jiffies(HL_PENDING_RESET_PER_SEC * 1000));
760 }
761 }
762
device_release_watchdog_func(struct work_struct * work)763 static void device_release_watchdog_func(struct work_struct *work)
764 {
765 struct hl_device_reset_work *watchdog_work =
766 container_of(work, struct hl_device_reset_work, reset_work.work);
767 struct hl_device *hdev = watchdog_work->hdev;
768 u32 flags;
769
770 dev_dbg(hdev->dev, "Device wasn't released in time. Initiate hard-reset.\n");
771
772 flags = watchdog_work->flags | HL_DRV_RESET_HARD | HL_DRV_RESET_FROM_WD_THR;
773
774 hl_device_reset(hdev, flags);
775 }
776
777 /*
778 * device_early_init - do some early initialization for the habanalabs device
779 *
780 * @hdev: pointer to habanalabs device structure
781 *
782 * Install the relevant function pointers and call the early_init function,
783 * if such a function exists
784 */
device_early_init(struct hl_device * hdev)785 static int device_early_init(struct hl_device *hdev)
786 {
787 int i, rc;
788 char workq_name[32];
789
790 switch (hdev->asic_type) {
791 case ASIC_GOYA:
792 goya_set_asic_funcs(hdev);
793 strscpy(hdev->asic_name, "GOYA", sizeof(hdev->asic_name));
794 break;
795 case ASIC_GAUDI:
796 gaudi_set_asic_funcs(hdev);
797 strscpy(hdev->asic_name, "GAUDI", sizeof(hdev->asic_name));
798 break;
799 case ASIC_GAUDI_SEC:
800 gaudi_set_asic_funcs(hdev);
801 strscpy(hdev->asic_name, "GAUDI SEC", sizeof(hdev->asic_name));
802 break;
803 case ASIC_GAUDI2:
804 gaudi2_set_asic_funcs(hdev);
805 strscpy(hdev->asic_name, "GAUDI2", sizeof(hdev->asic_name));
806 break;
807 case ASIC_GAUDI2B:
808 gaudi2_set_asic_funcs(hdev);
809 strscpy(hdev->asic_name, "GAUDI2B", sizeof(hdev->asic_name));
810 break;
811 case ASIC_GAUDI2C:
812 gaudi2_set_asic_funcs(hdev);
813 strscpy(hdev->asic_name, "GAUDI2C", sizeof(hdev->asic_name));
814 break;
815 default:
816 dev_err(hdev->dev, "Unrecognized ASIC type %d\n",
817 hdev->asic_type);
818 return -EINVAL;
819 }
820
821 rc = hdev->asic_funcs->early_init(hdev);
822 if (rc)
823 return rc;
824
825 rc = hl_asid_init(hdev);
826 if (rc)
827 goto early_fini;
828
829 if (hdev->asic_prop.completion_queues_count) {
830 hdev->cq_wq = kcalloc(hdev->asic_prop.completion_queues_count,
831 sizeof(struct workqueue_struct *),
832 GFP_KERNEL);
833 if (!hdev->cq_wq) {
834 rc = -ENOMEM;
835 goto asid_fini;
836 }
837 }
838
839 for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++) {
840 snprintf(workq_name, 32, "hl%u-free-jobs-%u", hdev->cdev_idx, (u32) i);
841 hdev->cq_wq[i] = create_singlethread_workqueue(workq_name);
842 if (hdev->cq_wq[i] == NULL) {
843 dev_err(hdev->dev, "Failed to allocate CQ workqueue\n");
844 rc = -ENOMEM;
845 goto free_cq_wq;
846 }
847 }
848
849 snprintf(workq_name, 32, "hl%u-events", hdev->cdev_idx);
850 hdev->eq_wq = create_singlethread_workqueue(workq_name);
851 if (hdev->eq_wq == NULL) {
852 dev_err(hdev->dev, "Failed to allocate EQ workqueue\n");
853 rc = -ENOMEM;
854 goto free_cq_wq;
855 }
856
857 snprintf(workq_name, 32, "hl%u-cs-completions", hdev->cdev_idx);
858 hdev->cs_cmplt_wq = alloc_workqueue(workq_name, WQ_UNBOUND, 0);
859 if (!hdev->cs_cmplt_wq) {
860 dev_err(hdev->dev,
861 "Failed to allocate CS completions workqueue\n");
862 rc = -ENOMEM;
863 goto free_eq_wq;
864 }
865
866 snprintf(workq_name, 32, "hl%u-ts-free-obj", hdev->cdev_idx);
867 hdev->ts_free_obj_wq = alloc_workqueue(workq_name, WQ_UNBOUND, 0);
868 if (!hdev->ts_free_obj_wq) {
869 dev_err(hdev->dev,
870 "Failed to allocate Timestamp registration free workqueue\n");
871 rc = -ENOMEM;
872 goto free_cs_cmplt_wq;
873 }
874
875 snprintf(workq_name, 32, "hl%u-prefetch", hdev->cdev_idx);
876 hdev->prefetch_wq = alloc_workqueue(workq_name, WQ_UNBOUND, 0);
877 if (!hdev->prefetch_wq) {
878 dev_err(hdev->dev, "Failed to allocate MMU prefetch workqueue\n");
879 rc = -ENOMEM;
880 goto free_ts_free_wq;
881 }
882
883 hdev->hl_chip_info = kzalloc(sizeof(struct hwmon_chip_info), GFP_KERNEL);
884 if (!hdev->hl_chip_info) {
885 rc = -ENOMEM;
886 goto free_prefetch_wq;
887 }
888
889 rc = hl_mmu_if_set_funcs(hdev);
890 if (rc)
891 goto free_chip_info;
892
893 hl_mem_mgr_init(hdev->dev, &hdev->kernel_mem_mgr);
894
895 snprintf(workq_name, 32, "hl%u_device_reset", hdev->cdev_idx);
896 hdev->reset_wq = create_singlethread_workqueue(workq_name);
897 if (!hdev->reset_wq) {
898 rc = -ENOMEM;
899 dev_err(hdev->dev, "Failed to create device reset WQ\n");
900 goto free_cb_mgr;
901 }
902
903 INIT_DELAYED_WORK(&hdev->device_reset_work.reset_work, device_hard_reset_pending);
904 hdev->device_reset_work.hdev = hdev;
905 hdev->device_fini_pending = 0;
906
907 INIT_DELAYED_WORK(&hdev->device_release_watchdog_work.reset_work,
908 device_release_watchdog_func);
909 hdev->device_release_watchdog_work.hdev = hdev;
910
911 mutex_init(&hdev->send_cpu_message_lock);
912 mutex_init(&hdev->debug_lock);
913 INIT_LIST_HEAD(&hdev->cs_mirror_list);
914 spin_lock_init(&hdev->cs_mirror_lock);
915 spin_lock_init(&hdev->reset_info.lock);
916 INIT_LIST_HEAD(&hdev->fpriv_list);
917 INIT_LIST_HEAD(&hdev->fpriv_ctrl_list);
918 mutex_init(&hdev->fpriv_list_lock);
919 mutex_init(&hdev->fpriv_ctrl_list_lock);
920 mutex_init(&hdev->clk_throttling.lock);
921
922 return 0;
923
924 free_cb_mgr:
925 hl_mem_mgr_fini(&hdev->kernel_mem_mgr);
926 hl_mem_mgr_idr_destroy(&hdev->kernel_mem_mgr);
927 free_chip_info:
928 kfree(hdev->hl_chip_info);
929 free_prefetch_wq:
930 destroy_workqueue(hdev->prefetch_wq);
931 free_ts_free_wq:
932 destroy_workqueue(hdev->ts_free_obj_wq);
933 free_cs_cmplt_wq:
934 destroy_workqueue(hdev->cs_cmplt_wq);
935 free_eq_wq:
936 destroy_workqueue(hdev->eq_wq);
937 free_cq_wq:
938 for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
939 if (hdev->cq_wq[i])
940 destroy_workqueue(hdev->cq_wq[i]);
941 kfree(hdev->cq_wq);
942 asid_fini:
943 hl_asid_fini(hdev);
944 early_fini:
945 if (hdev->asic_funcs->early_fini)
946 hdev->asic_funcs->early_fini(hdev);
947
948 return rc;
949 }
950
951 /*
952 * device_early_fini - finalize all that was done in device_early_init
953 *
954 * @hdev: pointer to habanalabs device structure
955 *
956 */
device_early_fini(struct hl_device * hdev)957 static void device_early_fini(struct hl_device *hdev)
958 {
959 int i;
960
961 mutex_destroy(&hdev->debug_lock);
962 mutex_destroy(&hdev->send_cpu_message_lock);
963
964 mutex_destroy(&hdev->fpriv_list_lock);
965 mutex_destroy(&hdev->fpriv_ctrl_list_lock);
966
967 mutex_destroy(&hdev->clk_throttling.lock);
968
969 hl_mem_mgr_fini(&hdev->kernel_mem_mgr);
970 hl_mem_mgr_idr_destroy(&hdev->kernel_mem_mgr);
971
972 kfree(hdev->hl_chip_info);
973
974 destroy_workqueue(hdev->prefetch_wq);
975 destroy_workqueue(hdev->ts_free_obj_wq);
976 destroy_workqueue(hdev->cs_cmplt_wq);
977 destroy_workqueue(hdev->eq_wq);
978 destroy_workqueue(hdev->reset_wq);
979
980 for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
981 destroy_workqueue(hdev->cq_wq[i]);
982 kfree(hdev->cq_wq);
983
984 hl_asid_fini(hdev);
985
986 if (hdev->asic_funcs->early_fini)
987 hdev->asic_funcs->early_fini(hdev);
988 }
989
is_pci_link_healthy(struct hl_device * hdev)990 static bool is_pci_link_healthy(struct hl_device *hdev)
991 {
992 u16 vendor_id;
993
994 if (!hdev->pdev)
995 return false;
996
997 pci_read_config_word(hdev->pdev, PCI_VENDOR_ID, &vendor_id);
998
999 return (vendor_id == PCI_VENDOR_ID_HABANALABS);
1000 }
1001
hl_device_heartbeat(struct work_struct * work)1002 static void hl_device_heartbeat(struct work_struct *work)
1003 {
1004 struct hl_device *hdev = container_of(work, struct hl_device,
1005 work_heartbeat.work);
1006 struct hl_info_fw_err_info info = {0};
1007 u64 event_mask = HL_NOTIFIER_EVENT_DEVICE_RESET | HL_NOTIFIER_EVENT_DEVICE_UNAVAILABLE;
1008
1009 if (!hl_device_operational(hdev, NULL))
1010 goto reschedule;
1011
1012 if (!hdev->asic_funcs->send_heartbeat(hdev))
1013 goto reschedule;
1014
1015 if (hl_device_operational(hdev, NULL))
1016 dev_err(hdev->dev, "Device heartbeat failed! PCI link is %s\n",
1017 is_pci_link_healthy(hdev) ? "healthy" : "broken");
1018
1019 info.err_type = HL_INFO_FW_HEARTBEAT_ERR;
1020 info.event_mask = &event_mask;
1021 hl_handle_fw_err(hdev, &info);
1022 hl_device_cond_reset(hdev, HL_DRV_RESET_HARD | HL_DRV_RESET_HEARTBEAT, event_mask);
1023
1024 return;
1025
1026 reschedule:
1027 /*
1028 * prev_reset_trigger tracks consecutive fatal h/w errors until first
1029 * heartbeat immediately post reset.
1030 * If control reached here, then at least one heartbeat work has been
1031 * scheduled since last reset/init cycle.
1032 * So if the device is not already in reset cycle, reset the flag
1033 * prev_reset_trigger as no reset occurred with HL_DRV_RESET_FW_FATAL_ERR
1034 * status for at least one heartbeat. From this point driver restarts
1035 * tracking future consecutive fatal errors.
1036 */
1037 if (!hdev->reset_info.in_reset)
1038 hdev->reset_info.prev_reset_trigger = HL_RESET_TRIGGER_DEFAULT;
1039
1040 schedule_delayed_work(&hdev->work_heartbeat,
1041 usecs_to_jiffies(HL_HEARTBEAT_PER_USEC));
1042 }
1043
1044 /*
1045 * device_late_init - do late stuff initialization for the habanalabs device
1046 *
1047 * @hdev: pointer to habanalabs device structure
1048 *
1049 * Do stuff that either needs the device H/W queues to be active or needs
1050 * to happen after all the rest of the initialization is finished
1051 */
device_late_init(struct hl_device * hdev)1052 static int device_late_init(struct hl_device *hdev)
1053 {
1054 int rc;
1055
1056 if (hdev->asic_funcs->late_init) {
1057 rc = hdev->asic_funcs->late_init(hdev);
1058 if (rc) {
1059 dev_err(hdev->dev,
1060 "failed late initialization for the H/W\n");
1061 return rc;
1062 }
1063 }
1064
1065 hdev->high_pll = hdev->asic_prop.high_pll;
1066
1067 if (hdev->heartbeat) {
1068 INIT_DELAYED_WORK(&hdev->work_heartbeat, hl_device_heartbeat);
1069 schedule_delayed_work(&hdev->work_heartbeat,
1070 usecs_to_jiffies(HL_HEARTBEAT_PER_USEC));
1071 }
1072
1073 hdev->late_init_done = true;
1074
1075 return 0;
1076 }
1077
1078 /*
1079 * device_late_fini - finalize all that was done in device_late_init
1080 *
1081 * @hdev: pointer to habanalabs device structure
1082 *
1083 */
device_late_fini(struct hl_device * hdev)1084 static void device_late_fini(struct hl_device *hdev)
1085 {
1086 if (!hdev->late_init_done)
1087 return;
1088
1089 if (hdev->heartbeat)
1090 cancel_delayed_work_sync(&hdev->work_heartbeat);
1091
1092 if (hdev->asic_funcs->late_fini)
1093 hdev->asic_funcs->late_fini(hdev);
1094
1095 hdev->late_init_done = false;
1096 }
1097
hl_device_utilization(struct hl_device * hdev,u32 * utilization)1098 int hl_device_utilization(struct hl_device *hdev, u32 *utilization)
1099 {
1100 u64 max_power, curr_power, dc_power, dividend, divisor;
1101 int rc;
1102
1103 max_power = hdev->max_power;
1104 dc_power = hdev->asic_prop.dc_power_default;
1105 divisor = max_power - dc_power;
1106 if (!divisor) {
1107 dev_warn(hdev->dev, "device utilization is not supported\n");
1108 return -EOPNOTSUPP;
1109 }
1110 rc = hl_fw_cpucp_power_get(hdev, &curr_power);
1111
1112 if (rc)
1113 return rc;
1114
1115 curr_power = clamp(curr_power, dc_power, max_power);
1116
1117 dividend = (curr_power - dc_power) * 100;
1118 *utilization = (u32) div_u64(dividend, divisor);
1119
1120 return 0;
1121 }
1122
hl_device_set_debug_mode(struct hl_device * hdev,struct hl_ctx * ctx,bool enable)1123 int hl_device_set_debug_mode(struct hl_device *hdev, struct hl_ctx *ctx, bool enable)
1124 {
1125 int rc = 0;
1126
1127 mutex_lock(&hdev->debug_lock);
1128
1129 if (!enable) {
1130 if (!hdev->in_debug) {
1131 dev_err(hdev->dev,
1132 "Failed to disable debug mode because device was not in debug mode\n");
1133 rc = -EFAULT;
1134 goto out;
1135 }
1136
1137 if (!hdev->reset_info.hard_reset_pending)
1138 hdev->asic_funcs->halt_coresight(hdev, ctx);
1139
1140 hdev->in_debug = 0;
1141
1142 goto out;
1143 }
1144
1145 if (hdev->in_debug) {
1146 dev_err(hdev->dev,
1147 "Failed to enable debug mode because device is already in debug mode\n");
1148 rc = -EFAULT;
1149 goto out;
1150 }
1151
1152 hdev->in_debug = 1;
1153
1154 out:
1155 mutex_unlock(&hdev->debug_lock);
1156
1157 return rc;
1158 }
1159
take_release_locks(struct hl_device * hdev)1160 static void take_release_locks(struct hl_device *hdev)
1161 {
1162 /* Flush anyone that is inside the critical section of enqueue
1163 * jobs to the H/W
1164 */
1165 hdev->asic_funcs->hw_queues_lock(hdev);
1166 hdev->asic_funcs->hw_queues_unlock(hdev);
1167
1168 /* Flush processes that are sending message to CPU */
1169 mutex_lock(&hdev->send_cpu_message_lock);
1170 mutex_unlock(&hdev->send_cpu_message_lock);
1171
1172 /* Flush anyone that is inside device open */
1173 mutex_lock(&hdev->fpriv_list_lock);
1174 mutex_unlock(&hdev->fpriv_list_lock);
1175 mutex_lock(&hdev->fpriv_ctrl_list_lock);
1176 mutex_unlock(&hdev->fpriv_ctrl_list_lock);
1177 }
1178
hl_abort_waiting_for_completions(struct hl_device * hdev)1179 static void hl_abort_waiting_for_completions(struct hl_device *hdev)
1180 {
1181 hl_abort_waiting_for_cs_completions(hdev);
1182
1183 /* Release all pending user interrupts, each pending user interrupt
1184 * holds a reference to a user context.
1185 */
1186 hl_release_pending_user_interrupts(hdev);
1187 }
1188
cleanup_resources(struct hl_device * hdev,bool hard_reset,bool fw_reset,bool skip_wq_flush)1189 static void cleanup_resources(struct hl_device *hdev, bool hard_reset, bool fw_reset,
1190 bool skip_wq_flush)
1191 {
1192 if (hard_reset)
1193 device_late_fini(hdev);
1194
1195 /*
1196 * Halt the engines and disable interrupts so we won't get any more
1197 * completions from H/W and we won't have any accesses from the
1198 * H/W to the host machine
1199 */
1200 hdev->asic_funcs->halt_engines(hdev, hard_reset, fw_reset);
1201
1202 /* Go over all the queues, release all CS and their jobs */
1203 hl_cs_rollback_all(hdev, skip_wq_flush);
1204
1205 /* flush the MMU prefetch workqueue */
1206 flush_workqueue(hdev->prefetch_wq);
1207
1208 hl_abort_waiting_for_completions(hdev);
1209 }
1210
1211 /*
1212 * hl_device_suspend - initiate device suspend
1213 *
1214 * @hdev: pointer to habanalabs device structure
1215 *
1216 * Puts the hw in the suspend state (all asics).
1217 * Returns 0 for success or an error on failure.
1218 * Called at driver suspend.
1219 */
hl_device_suspend(struct hl_device * hdev)1220 int hl_device_suspend(struct hl_device *hdev)
1221 {
1222 int rc;
1223
1224 pci_save_state(hdev->pdev);
1225
1226 /* Block future CS/VM/JOB completion operations */
1227 spin_lock(&hdev->reset_info.lock);
1228 if (hdev->reset_info.in_reset) {
1229 spin_unlock(&hdev->reset_info.lock);
1230 dev_err(hdev->dev, "Can't suspend while in reset\n");
1231 return -EIO;
1232 }
1233 hdev->reset_info.in_reset = 1;
1234 spin_unlock(&hdev->reset_info.lock);
1235
1236 /* This blocks all other stuff that is not blocked by in_reset */
1237 hdev->disabled = true;
1238
1239 take_release_locks(hdev);
1240
1241 rc = hdev->asic_funcs->suspend(hdev);
1242 if (rc)
1243 dev_err(hdev->dev,
1244 "Failed to disable PCI access of device CPU\n");
1245
1246 /* Shut down the device */
1247 pci_disable_device(hdev->pdev);
1248 pci_set_power_state(hdev->pdev, PCI_D3hot);
1249
1250 return 0;
1251 }
1252
1253 /*
1254 * hl_device_resume - initiate device resume
1255 *
1256 * @hdev: pointer to habanalabs device structure
1257 *
1258 * Bring the hw back to operating state (all asics).
1259 * Returns 0 for success or an error on failure.
1260 * Called at driver resume.
1261 */
hl_device_resume(struct hl_device * hdev)1262 int hl_device_resume(struct hl_device *hdev)
1263 {
1264 int rc;
1265
1266 pci_set_power_state(hdev->pdev, PCI_D0);
1267 pci_restore_state(hdev->pdev);
1268 rc = pci_enable_device_mem(hdev->pdev);
1269 if (rc) {
1270 dev_err(hdev->dev,
1271 "Failed to enable PCI device in resume\n");
1272 return rc;
1273 }
1274
1275 pci_set_master(hdev->pdev);
1276
1277 rc = hdev->asic_funcs->resume(hdev);
1278 if (rc) {
1279 dev_err(hdev->dev, "Failed to resume device after suspend\n");
1280 goto disable_device;
1281 }
1282
1283
1284 /* 'in_reset' was set to true during suspend, now we must clear it in order
1285 * for hard reset to be performed
1286 */
1287 spin_lock(&hdev->reset_info.lock);
1288 hdev->reset_info.in_reset = 0;
1289 spin_unlock(&hdev->reset_info.lock);
1290
1291 rc = hl_device_reset(hdev, HL_DRV_RESET_HARD);
1292 if (rc) {
1293 dev_err(hdev->dev, "Failed to reset device during resume\n");
1294 goto disable_device;
1295 }
1296
1297 return 0;
1298
1299 disable_device:
1300 pci_disable_device(hdev->pdev);
1301
1302 return rc;
1303 }
1304
device_kill_open_processes(struct hl_device * hdev,u32 timeout,bool control_dev)1305 static int device_kill_open_processes(struct hl_device *hdev, u32 timeout, bool control_dev)
1306 {
1307 struct task_struct *task = NULL;
1308 struct list_head *fd_list;
1309 struct hl_fpriv *hpriv;
1310 struct mutex *fd_lock;
1311 u32 pending_cnt;
1312
1313 fd_lock = control_dev ? &hdev->fpriv_ctrl_list_lock : &hdev->fpriv_list_lock;
1314 fd_list = control_dev ? &hdev->fpriv_ctrl_list : &hdev->fpriv_list;
1315
1316 /* Giving time for user to close FD, and for processes that are inside
1317 * hl_device_open to finish
1318 */
1319 if (!list_empty(fd_list))
1320 ssleep(1);
1321
1322 if (timeout) {
1323 pending_cnt = timeout;
1324 } else {
1325 if (hdev->process_kill_trial_cnt) {
1326 /* Processes have been already killed */
1327 pending_cnt = 1;
1328 goto wait_for_processes;
1329 } else {
1330 /* Wait a small period after process kill */
1331 pending_cnt = HL_PENDING_RESET_PER_SEC;
1332 }
1333 }
1334
1335 mutex_lock(fd_lock);
1336
1337 /* This section must be protected because we are dereferencing
1338 * pointers that are freed if the process exits
1339 */
1340 list_for_each_entry(hpriv, fd_list, dev_node) {
1341 task = get_pid_task(hpriv->taskpid, PIDTYPE_PID);
1342 if (task) {
1343 dev_info(hdev->dev, "Killing user process pid=%d\n",
1344 task_pid_nr(task));
1345 send_sig(SIGKILL, task, 1);
1346 usleep_range(1000, 10000);
1347
1348 put_task_struct(task);
1349 } else {
1350 /*
1351 * If we got here, it means that process was killed from outside the driver
1352 * right after it started looping on fd_list and before get_pid_task, thus
1353 * we don't need to kill it.
1354 */
1355 dev_dbg(hdev->dev,
1356 "Can't get task struct for user process, assuming process was killed from outside the driver\n");
1357 }
1358 }
1359
1360 mutex_unlock(fd_lock);
1361
1362 /*
1363 * We killed the open users, but that doesn't mean they are closed.
1364 * It could be that they are running a long cleanup phase in the driver
1365 * e.g. MMU unmappings, or running other long teardown flow even before
1366 * our cleanup.
1367 * Therefore we need to wait again to make sure they are closed before
1368 * continuing with the reset.
1369 */
1370
1371 wait_for_processes:
1372 while ((!list_empty(fd_list)) && (pending_cnt)) {
1373 dev_dbg(hdev->dev,
1374 "Waiting for all unmap operations to finish before hard reset\n");
1375
1376 pending_cnt--;
1377
1378 ssleep(1);
1379 }
1380
1381 /* All processes exited successfully */
1382 if (list_empty(fd_list))
1383 return 0;
1384
1385 /* Give up waiting for processes to exit */
1386 if (hdev->process_kill_trial_cnt == HL_PENDING_RESET_MAX_TRIALS)
1387 return -ETIME;
1388
1389 hdev->process_kill_trial_cnt++;
1390
1391 return -EBUSY;
1392 }
1393
device_disable_open_processes(struct hl_device * hdev,bool control_dev)1394 static void device_disable_open_processes(struct hl_device *hdev, bool control_dev)
1395 {
1396 struct list_head *fd_list;
1397 struct hl_fpriv *hpriv;
1398 struct mutex *fd_lock;
1399
1400 fd_lock = control_dev ? &hdev->fpriv_ctrl_list_lock : &hdev->fpriv_list_lock;
1401 fd_list = control_dev ? &hdev->fpriv_ctrl_list : &hdev->fpriv_list;
1402
1403 mutex_lock(fd_lock);
1404 list_for_each_entry(hpriv, fd_list, dev_node)
1405 hpriv->hdev = NULL;
1406 mutex_unlock(fd_lock);
1407 }
1408
send_disable_pci_access(struct hl_device * hdev,u32 flags)1409 static void send_disable_pci_access(struct hl_device *hdev, u32 flags)
1410 {
1411 /* If reset is due to heartbeat, device CPU is no responsive in
1412 * which case no point sending PCI disable message to it.
1413 */
1414 if ((flags & HL_DRV_RESET_HARD) &&
1415 !(flags & (HL_DRV_RESET_HEARTBEAT | HL_DRV_RESET_BYPASS_REQ_TO_FW))) {
1416 /* Disable PCI access from device F/W so he won't send
1417 * us additional interrupts. We disable MSI/MSI-X at
1418 * the halt_engines function and we can't have the F/W
1419 * sending us interrupts after that. We need to disable
1420 * the access here because if the device is marked
1421 * disable, the message won't be send. Also, in case
1422 * of heartbeat, the device CPU is marked as disable
1423 * so this message won't be sent
1424 */
1425 if (hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0)) {
1426 dev_warn(hdev->dev, "Failed to disable FW's PCI access\n");
1427 return;
1428 }
1429
1430 /* verify that last EQs are handled before disabled is set */
1431 if (hdev->cpu_queues_enable)
1432 synchronize_irq(pci_irq_vector(hdev->pdev,
1433 hdev->asic_prop.eq_interrupt_id));
1434 }
1435 }
1436
handle_reset_trigger(struct hl_device * hdev,u32 flags)1437 static void handle_reset_trigger(struct hl_device *hdev, u32 flags)
1438 {
1439 u32 cur_reset_trigger = HL_RESET_TRIGGER_DEFAULT;
1440
1441 /* No consecutive mechanism when user context exists */
1442 if (hdev->is_compute_ctx_active)
1443 return;
1444
1445 /*
1446 * 'reset cause' is being updated here, because getting here
1447 * means that it's the 1st time and the last time we're here
1448 * ('in_reset' makes sure of it). This makes sure that
1449 * 'reset_cause' will continue holding its 1st recorded reason!
1450 */
1451 if (flags & HL_DRV_RESET_HEARTBEAT) {
1452 hdev->reset_info.curr_reset_cause = HL_RESET_CAUSE_HEARTBEAT;
1453 cur_reset_trigger = HL_DRV_RESET_HEARTBEAT;
1454 } else if (flags & HL_DRV_RESET_TDR) {
1455 hdev->reset_info.curr_reset_cause = HL_RESET_CAUSE_TDR;
1456 cur_reset_trigger = HL_DRV_RESET_TDR;
1457 } else if (flags & HL_DRV_RESET_FW_FATAL_ERR) {
1458 hdev->reset_info.curr_reset_cause = HL_RESET_CAUSE_UNKNOWN;
1459 cur_reset_trigger = HL_DRV_RESET_FW_FATAL_ERR;
1460 } else {
1461 hdev->reset_info.curr_reset_cause = HL_RESET_CAUSE_UNKNOWN;
1462 }
1463
1464 /*
1465 * If reset cause is same twice, then reset_trigger_repeated
1466 * is set and if this reset is due to a fatal FW error
1467 * device is set to an unstable state.
1468 */
1469 if (hdev->reset_info.prev_reset_trigger != cur_reset_trigger) {
1470 hdev->reset_info.prev_reset_trigger = cur_reset_trigger;
1471 hdev->reset_info.reset_trigger_repeated = 0;
1472 } else {
1473 hdev->reset_info.reset_trigger_repeated = 1;
1474 }
1475 }
1476
1477 /*
1478 * hl_device_reset - reset the device
1479 *
1480 * @hdev: pointer to habanalabs device structure
1481 * @flags: reset flags.
1482 *
1483 * Block future CS and wait for pending CS to be enqueued
1484 * Call ASIC H/W fini
1485 * Flush all completions
1486 * Re-initialize all internal data structures
1487 * Call ASIC H/W init, late_init
1488 * Test queues
1489 * Enable device
1490 *
1491 * Returns 0 for success or an error on failure.
1492 */
hl_device_reset(struct hl_device * hdev,u32 flags)1493 int hl_device_reset(struct hl_device *hdev, u32 flags)
1494 {
1495 bool hard_reset, from_hard_reset_thread, fw_reset, reset_upon_device_release,
1496 schedule_hard_reset = false, delay_reset, from_dev_release, from_watchdog_thread;
1497 u64 idle_mask[HL_BUSY_ENGINES_MASK_EXT_SIZE] = {0};
1498 struct hl_ctx *ctx;
1499 int i, rc, hw_fini_rc;
1500
1501 if (!hdev->init_done) {
1502 dev_err(hdev->dev, "Can't reset before initialization is done\n");
1503 return 0;
1504 }
1505
1506 hard_reset = !!(flags & HL_DRV_RESET_HARD);
1507 from_hard_reset_thread = !!(flags & HL_DRV_RESET_FROM_RESET_THR);
1508 fw_reset = !!(flags & HL_DRV_RESET_BYPASS_REQ_TO_FW);
1509 from_dev_release = !!(flags & HL_DRV_RESET_DEV_RELEASE);
1510 delay_reset = !!(flags & HL_DRV_RESET_DELAY);
1511 from_watchdog_thread = !!(flags & HL_DRV_RESET_FROM_WD_THR);
1512 reset_upon_device_release = hdev->reset_upon_device_release && from_dev_release;
1513
1514 if (!hard_reset && (hl_device_status(hdev) == HL_DEVICE_STATUS_MALFUNCTION)) {
1515 dev_dbg(hdev->dev, "soft-reset isn't supported on a malfunctioning device\n");
1516 return 0;
1517 }
1518
1519 if (!hard_reset && !hdev->asic_prop.supports_compute_reset) {
1520 dev_dbg(hdev->dev, "asic doesn't support compute reset - do hard-reset instead\n");
1521 hard_reset = true;
1522 }
1523
1524 if (reset_upon_device_release) {
1525 if (hard_reset) {
1526 dev_crit(hdev->dev,
1527 "Aborting reset because hard-reset is mutually exclusive with reset-on-device-release\n");
1528 return -EINVAL;
1529 }
1530
1531 goto do_reset;
1532 }
1533
1534 if (!hard_reset && !hdev->asic_prop.allow_inference_soft_reset) {
1535 dev_dbg(hdev->dev,
1536 "asic doesn't allow inference soft reset - do hard-reset instead\n");
1537 hard_reset = true;
1538 }
1539
1540 do_reset:
1541 /* Re-entry of reset thread */
1542 if (from_hard_reset_thread && hdev->process_kill_trial_cnt)
1543 goto kill_processes;
1544
1545 /*
1546 * Prevent concurrency in this function - only one reset should be
1547 * done at any given time. We need to perform this only if we didn't
1548 * get here from a dedicated hard reset thread.
1549 */
1550 if (!from_hard_reset_thread) {
1551 /* Block future CS/VM/JOB completion operations */
1552 spin_lock(&hdev->reset_info.lock);
1553 if (hdev->reset_info.in_reset) {
1554 /* We allow scheduling of a hard reset only during a compute reset */
1555 if (hard_reset && hdev->reset_info.in_compute_reset)
1556 hdev->reset_info.hard_reset_schedule_flags = flags;
1557 spin_unlock(&hdev->reset_info.lock);
1558 return 0;
1559 }
1560
1561 /* This still allows the completion of some KDMA ops
1562 * Update this before in_reset because in_compute_reset implies we are in reset
1563 */
1564 hdev->reset_info.in_compute_reset = !hard_reset;
1565
1566 hdev->reset_info.in_reset = 1;
1567
1568 spin_unlock(&hdev->reset_info.lock);
1569
1570 /* Cancel the device release watchdog work if required.
1571 * In case of reset-upon-device-release while the release watchdog work is
1572 * scheduled due to a hard-reset, do hard-reset instead of compute-reset.
1573 */
1574 if ((hard_reset || from_dev_release) && hdev->reset_info.watchdog_active) {
1575 struct hl_device_reset_work *watchdog_work =
1576 &hdev->device_release_watchdog_work;
1577
1578 hdev->reset_info.watchdog_active = 0;
1579 if (!from_watchdog_thread)
1580 cancel_delayed_work_sync(&watchdog_work->reset_work);
1581
1582 if (from_dev_release && (watchdog_work->flags & HL_DRV_RESET_HARD)) {
1583 hdev->reset_info.in_compute_reset = 0;
1584 flags |= HL_DRV_RESET_HARD;
1585 flags &= ~HL_DRV_RESET_DEV_RELEASE;
1586 hard_reset = true;
1587 }
1588 }
1589
1590 if (delay_reset)
1591 usleep_range(HL_RESET_DELAY_USEC, HL_RESET_DELAY_USEC << 1);
1592
1593 escalate_reset_flow:
1594 handle_reset_trigger(hdev, flags);
1595 send_disable_pci_access(hdev, flags);
1596
1597 /* This also blocks future CS/VM/JOB completion operations */
1598 hdev->disabled = true;
1599
1600 take_release_locks(hdev);
1601
1602 if (hard_reset)
1603 dev_info(hdev->dev, "Going to reset device\n");
1604 else if (reset_upon_device_release)
1605 dev_dbg(hdev->dev, "Going to reset device after release by user\n");
1606 else
1607 dev_dbg(hdev->dev, "Going to reset engines of inference device\n");
1608 }
1609
1610 if ((hard_reset) && (!from_hard_reset_thread)) {
1611 hdev->reset_info.hard_reset_pending = true;
1612
1613 hdev->process_kill_trial_cnt = 0;
1614
1615 hdev->device_reset_work.flags = flags;
1616
1617 /*
1618 * Because the reset function can't run from heartbeat work,
1619 * we need to call the reset function from a dedicated work.
1620 */
1621 queue_delayed_work(hdev->reset_wq, &hdev->device_reset_work.reset_work, 0);
1622
1623 return 0;
1624 }
1625
1626 cleanup_resources(hdev, hard_reset, fw_reset, from_dev_release);
1627
1628 kill_processes:
1629 if (hard_reset) {
1630 /* Kill processes here after CS rollback. This is because the
1631 * process can't really exit until all its CSs are done, which
1632 * is what we do in cs rollback
1633 */
1634 rc = device_kill_open_processes(hdev, 0, false);
1635
1636 if (rc == -EBUSY) {
1637 if (hdev->device_fini_pending) {
1638 dev_crit(hdev->dev,
1639 "%s Failed to kill all open processes, stopping hard reset\n",
1640 dev_name(&(hdev)->pdev->dev));
1641 goto out_err;
1642 }
1643
1644 /* signal reset thread to reschedule */
1645 return rc;
1646 }
1647
1648 if (rc) {
1649 dev_crit(hdev->dev,
1650 "%s Failed to kill all open processes, stopping hard reset\n",
1651 dev_name(&(hdev)->pdev->dev));
1652 goto out_err;
1653 }
1654
1655 /* Flush the Event queue workers to make sure no other thread is
1656 * reading or writing to registers during the reset
1657 */
1658 flush_workqueue(hdev->eq_wq);
1659 }
1660
1661 /* Reset the H/W. It will be in idle state after this returns */
1662 hw_fini_rc = hdev->asic_funcs->hw_fini(hdev, hard_reset, fw_reset);
1663
1664 if (hard_reset) {
1665 hdev->fw_loader.fw_comp_loaded = FW_TYPE_NONE;
1666
1667 /* Release kernel context */
1668 if (hdev->kernel_ctx && hl_ctx_put(hdev->kernel_ctx) == 1)
1669 hdev->kernel_ctx = NULL;
1670
1671 hl_vm_fini(hdev);
1672 hl_mmu_fini(hdev);
1673 hl_eq_reset(hdev, &hdev->event_queue);
1674 }
1675
1676 /* Re-initialize PI,CI to 0 in all queues (hw queue, cq) */
1677 hl_hw_queue_reset(hdev, hard_reset);
1678 for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
1679 hl_cq_reset(hdev, &hdev->completion_queue[i]);
1680
1681 /* Make sure the context switch phase will run again */
1682 ctx = hl_get_compute_ctx(hdev);
1683 if (ctx) {
1684 atomic_set(&ctx->thread_ctx_switch_token, 1);
1685 ctx->thread_ctx_switch_wait_token = 0;
1686 hl_ctx_put(ctx);
1687 }
1688
1689 if (hw_fini_rc) {
1690 rc = hw_fini_rc;
1691 goto out_err;
1692 }
1693 /* Finished tear-down, starting to re-initialize */
1694
1695 if (hard_reset) {
1696 hdev->device_cpu_disabled = false;
1697 hdev->reset_info.hard_reset_pending = false;
1698
1699 if (hdev->reset_info.reset_trigger_repeated &&
1700 (hdev->reset_info.prev_reset_trigger ==
1701 HL_DRV_RESET_FW_FATAL_ERR)) {
1702 /* if there 2 back to back resets from FW,
1703 * ensure driver puts the driver in a unusable state
1704 */
1705 dev_crit(hdev->dev,
1706 "%s Consecutive FW fatal errors received, stopping hard reset\n",
1707 dev_name(&(hdev)->pdev->dev));
1708 rc = -EIO;
1709 goto out_err;
1710 }
1711
1712 if (hdev->kernel_ctx) {
1713 dev_crit(hdev->dev,
1714 "%s kernel ctx was alive during hard reset, something is terribly wrong\n",
1715 dev_name(&(hdev)->pdev->dev));
1716 rc = -EBUSY;
1717 goto out_err;
1718 }
1719
1720 rc = hl_mmu_init(hdev);
1721 if (rc) {
1722 dev_err(hdev->dev,
1723 "Failed to initialize MMU S/W after hard reset\n");
1724 goto out_err;
1725 }
1726
1727 /* Allocate the kernel context */
1728 hdev->kernel_ctx = kzalloc(sizeof(*hdev->kernel_ctx),
1729 GFP_KERNEL);
1730 if (!hdev->kernel_ctx) {
1731 rc = -ENOMEM;
1732 hl_mmu_fini(hdev);
1733 goto out_err;
1734 }
1735
1736 hdev->is_compute_ctx_active = false;
1737
1738 rc = hl_ctx_init(hdev, hdev->kernel_ctx, true);
1739 if (rc) {
1740 dev_err(hdev->dev,
1741 "failed to init kernel ctx in hard reset\n");
1742 kfree(hdev->kernel_ctx);
1743 hdev->kernel_ctx = NULL;
1744 hl_mmu_fini(hdev);
1745 goto out_err;
1746 }
1747 }
1748
1749 /* Device is now enabled as part of the initialization requires
1750 * communication with the device firmware to get information that
1751 * is required for the initialization itself
1752 */
1753 hdev->disabled = false;
1754
1755 /* F/W security enabled indication might be updated after hard-reset */
1756 if (hard_reset) {
1757 rc = hl_fw_read_preboot_status(hdev);
1758 if (rc)
1759 goto out_err;
1760 }
1761
1762 rc = hdev->asic_funcs->hw_init(hdev);
1763 if (rc) {
1764 dev_err(hdev->dev, "failed to initialize the H/W after reset\n");
1765 goto out_err;
1766 }
1767
1768 /* If device is not idle fail the reset process */
1769 if (!hdev->asic_funcs->is_device_idle(hdev, idle_mask,
1770 HL_BUSY_ENGINES_MASK_EXT_SIZE, NULL)) {
1771 print_idle_status_mask(hdev, "device is not idle after reset", idle_mask);
1772 rc = -EIO;
1773 goto out_err;
1774 }
1775
1776 /* Check that the communication with the device is working */
1777 rc = hdev->asic_funcs->test_queues(hdev);
1778 if (rc) {
1779 dev_err(hdev->dev, "Failed to detect if device is alive after reset\n");
1780 goto out_err;
1781 }
1782
1783 if (hard_reset) {
1784 rc = device_late_init(hdev);
1785 if (rc) {
1786 dev_err(hdev->dev, "Failed late init after hard reset\n");
1787 goto out_err;
1788 }
1789
1790 rc = hl_vm_init(hdev);
1791 if (rc) {
1792 dev_err(hdev->dev, "Failed to init memory module after hard reset\n");
1793 goto out_err;
1794 }
1795
1796 if (!hdev->asic_prop.fw_security_enabled)
1797 hl_fw_set_max_power(hdev);
1798 } else {
1799 rc = hdev->asic_funcs->compute_reset_late_init(hdev);
1800 if (rc) {
1801 if (reset_upon_device_release)
1802 dev_err(hdev->dev,
1803 "Failed late init in reset after device release\n");
1804 else
1805 dev_err(hdev->dev, "Failed late init after compute reset\n");
1806 goto out_err;
1807 }
1808 }
1809
1810 rc = hdev->asic_funcs->scrub_device_mem(hdev);
1811 if (rc) {
1812 dev_err(hdev->dev, "scrub mem failed from device reset (%d)\n", rc);
1813 goto out_err;
1814 }
1815
1816 spin_lock(&hdev->reset_info.lock);
1817 hdev->reset_info.in_compute_reset = 0;
1818
1819 /* Schedule hard reset only if requested and if not already in hard reset.
1820 * We keep 'in_reset' enabled, so no other reset can go in during the hard
1821 * reset schedule
1822 */
1823 if (!hard_reset && hdev->reset_info.hard_reset_schedule_flags)
1824 schedule_hard_reset = true;
1825 else
1826 hdev->reset_info.in_reset = 0;
1827
1828 spin_unlock(&hdev->reset_info.lock);
1829
1830 hdev->reset_info.needs_reset = false;
1831
1832 if (hard_reset)
1833 dev_info(hdev->dev,
1834 "Successfully finished resetting the %s device\n",
1835 dev_name(&(hdev)->pdev->dev));
1836 else
1837 dev_dbg(hdev->dev,
1838 "Successfully finished resetting the %s device\n",
1839 dev_name(&(hdev)->pdev->dev));
1840
1841 if (hard_reset) {
1842 hdev->reset_info.hard_reset_cnt++;
1843
1844 /* After reset is done, we are ready to receive events from
1845 * the F/W. We can't do it before because we will ignore events
1846 * and if those events are fatal, we won't know about it and
1847 * the device will be operational although it shouldn't be
1848 */
1849 hdev->asic_funcs->enable_events_from_fw(hdev);
1850 } else {
1851 if (!reset_upon_device_release)
1852 hdev->reset_info.compute_reset_cnt++;
1853
1854 if (schedule_hard_reset) {
1855 dev_info(hdev->dev, "Performing hard reset scheduled during compute reset\n");
1856 flags = hdev->reset_info.hard_reset_schedule_flags;
1857 hdev->reset_info.hard_reset_schedule_flags = 0;
1858 hard_reset = true;
1859 goto escalate_reset_flow;
1860 }
1861 }
1862
1863 return 0;
1864
1865 out_err:
1866 hdev->disabled = true;
1867
1868 spin_lock(&hdev->reset_info.lock);
1869 hdev->reset_info.in_compute_reset = 0;
1870
1871 if (hard_reset) {
1872 dev_err(hdev->dev,
1873 "%s Failed to reset! Device is NOT usable\n",
1874 dev_name(&(hdev)->pdev->dev));
1875 hdev->reset_info.hard_reset_cnt++;
1876 } else {
1877 if (reset_upon_device_release) {
1878 dev_err(hdev->dev, "Failed to reset device after user release\n");
1879 flags &= ~HL_DRV_RESET_DEV_RELEASE;
1880 } else {
1881 dev_err(hdev->dev, "Failed to do compute reset\n");
1882 hdev->reset_info.compute_reset_cnt++;
1883 }
1884
1885 spin_unlock(&hdev->reset_info.lock);
1886 flags |= HL_DRV_RESET_HARD;
1887 hard_reset = true;
1888 goto escalate_reset_flow;
1889 }
1890
1891 hdev->reset_info.in_reset = 0;
1892
1893 spin_unlock(&hdev->reset_info.lock);
1894
1895 return rc;
1896 }
1897
1898 /*
1899 * hl_device_cond_reset() - conditionally reset the device.
1900 * @hdev: pointer to habanalabs device structure.
1901 * @reset_flags: reset flags.
1902 * @event_mask: events to notify user about.
1903 *
1904 * Conditionally reset the device, or alternatively schedule a watchdog work to reset the device
1905 * unless another reset precedes it.
1906 */
hl_device_cond_reset(struct hl_device * hdev,u32 flags,u64 event_mask)1907 int hl_device_cond_reset(struct hl_device *hdev, u32 flags, u64 event_mask)
1908 {
1909 struct hl_ctx *ctx = NULL;
1910
1911 /* F/W reset cannot be postponed */
1912 if (flags & HL_DRV_RESET_BYPASS_REQ_TO_FW)
1913 goto device_reset;
1914
1915 /* Device release watchdog is relevant only if user exists and gets a reset notification */
1916 if (!(event_mask & HL_NOTIFIER_EVENT_DEVICE_RESET)) {
1917 dev_err(hdev->dev, "Resetting device without a reset indication to user\n");
1918 goto device_reset;
1919 }
1920
1921 ctx = hl_get_compute_ctx(hdev);
1922 if (!ctx || !ctx->hpriv->notifier_event.eventfd)
1923 goto device_reset;
1924
1925 /* Schedule the device release watchdog work unless reset is already in progress or if the
1926 * work is already scheduled.
1927 */
1928 spin_lock(&hdev->reset_info.lock);
1929 if (hdev->reset_info.in_reset) {
1930 spin_unlock(&hdev->reset_info.lock);
1931 goto device_reset;
1932 }
1933
1934 if (hdev->reset_info.watchdog_active)
1935 goto out;
1936
1937 hdev->device_release_watchdog_work.flags = flags;
1938 dev_dbg(hdev->dev, "Device is going to be hard-reset in %u sec unless being released\n",
1939 hdev->device_release_watchdog_timeout_sec);
1940 schedule_delayed_work(&hdev->device_release_watchdog_work.reset_work,
1941 msecs_to_jiffies(hdev->device_release_watchdog_timeout_sec * 1000));
1942 hdev->reset_info.watchdog_active = 1;
1943 out:
1944 spin_unlock(&hdev->reset_info.lock);
1945
1946 hl_notifier_event_send_all(hdev, event_mask);
1947
1948 hl_ctx_put(ctx);
1949
1950 hl_abort_waiting_for_completions(hdev);
1951
1952 return 0;
1953
1954 device_reset:
1955 if (event_mask)
1956 hl_notifier_event_send_all(hdev, event_mask);
1957 if (ctx)
1958 hl_ctx_put(ctx);
1959
1960 return hl_device_reset(hdev, flags);
1961 }
1962
hl_notifier_event_send(struct hl_notifier_event * notifier_event,u64 event_mask)1963 static void hl_notifier_event_send(struct hl_notifier_event *notifier_event, u64 event_mask)
1964 {
1965 mutex_lock(¬ifier_event->lock);
1966 notifier_event->events_mask |= event_mask;
1967
1968 if (notifier_event->eventfd)
1969 eventfd_signal(notifier_event->eventfd, 1);
1970
1971 mutex_unlock(¬ifier_event->lock);
1972 }
1973
1974 /*
1975 * hl_notifier_event_send_all - notify all user processes via eventfd
1976 *
1977 * @hdev: pointer to habanalabs device structure
1978 * @event_mask: the occurred event/s
1979 * Returns 0 for success or an error on failure.
1980 */
hl_notifier_event_send_all(struct hl_device * hdev,u64 event_mask)1981 void hl_notifier_event_send_all(struct hl_device *hdev, u64 event_mask)
1982 {
1983 struct hl_fpriv *hpriv;
1984
1985 if (!event_mask) {
1986 dev_warn(hdev->dev, "Skip sending zero event");
1987 return;
1988 }
1989
1990 mutex_lock(&hdev->fpriv_list_lock);
1991
1992 list_for_each_entry(hpriv, &hdev->fpriv_list, dev_node)
1993 hl_notifier_event_send(&hpriv->notifier_event, event_mask);
1994
1995 mutex_unlock(&hdev->fpriv_list_lock);
1996
1997 /* control device */
1998 mutex_lock(&hdev->fpriv_ctrl_list_lock);
1999
2000 list_for_each_entry(hpriv, &hdev->fpriv_ctrl_list, dev_node)
2001 hl_notifier_event_send(&hpriv->notifier_event, event_mask);
2002
2003 mutex_unlock(&hdev->fpriv_ctrl_list_lock);
2004 }
2005
create_cdev(struct hl_device * hdev)2006 static int create_cdev(struct hl_device *hdev)
2007 {
2008 char *name;
2009 int rc;
2010
2011 hdev->cdev_idx = hdev->id / 2;
2012
2013 name = kasprintf(GFP_KERNEL, "hl%d", hdev->cdev_idx);
2014 if (!name) {
2015 rc = -ENOMEM;
2016 goto out_err;
2017 }
2018
2019 /* Initialize cdev and device structures */
2020 rc = device_init_cdev(hdev, hdev->hclass, hdev->id, &hl_ops, name,
2021 &hdev->cdev, &hdev->dev);
2022
2023 kfree(name);
2024
2025 if (rc)
2026 goto out_err;
2027
2028 name = kasprintf(GFP_KERNEL, "hl_controlD%d", hdev->cdev_idx);
2029 if (!name) {
2030 rc = -ENOMEM;
2031 goto free_dev;
2032 }
2033
2034 /* Initialize cdev and device structures for control device */
2035 rc = device_init_cdev(hdev, hdev->hclass, hdev->id_control, &hl_ctrl_ops,
2036 name, &hdev->cdev_ctrl, &hdev->dev_ctrl);
2037
2038 kfree(name);
2039
2040 if (rc)
2041 goto free_dev;
2042
2043 return 0;
2044
2045 free_dev:
2046 put_device(hdev->dev);
2047 out_err:
2048 return rc;
2049 }
2050
2051 /*
2052 * hl_device_init - main initialization function for habanalabs device
2053 *
2054 * @hdev: pointer to habanalabs device structure
2055 *
2056 * Allocate an id for the device, do early initialization and then call the
2057 * ASIC specific initialization functions. Finally, create the cdev and the
2058 * Linux device to expose it to the user
2059 */
hl_device_init(struct hl_device * hdev)2060 int hl_device_init(struct hl_device *hdev)
2061 {
2062 int i, rc, cq_cnt, user_interrupt_cnt, cq_ready_cnt;
2063 bool expose_interfaces_on_err = false;
2064
2065 rc = create_cdev(hdev);
2066 if (rc)
2067 goto out_disabled;
2068
2069 /* Initialize ASIC function pointers and perform early init */
2070 rc = device_early_init(hdev);
2071 if (rc)
2072 goto free_dev;
2073
2074 user_interrupt_cnt = hdev->asic_prop.user_dec_intr_count +
2075 hdev->asic_prop.user_interrupt_count;
2076
2077 if (user_interrupt_cnt) {
2078 hdev->user_interrupt = kcalloc(user_interrupt_cnt, sizeof(*hdev->user_interrupt),
2079 GFP_KERNEL);
2080 if (!hdev->user_interrupt) {
2081 rc = -ENOMEM;
2082 goto early_fini;
2083 }
2084 }
2085
2086 /*
2087 * Start calling ASIC initialization. First S/W then H/W and finally
2088 * late init
2089 */
2090 rc = hdev->asic_funcs->sw_init(hdev);
2091 if (rc)
2092 goto free_usr_intr_mem;
2093
2094
2095 /* initialize completion structure for multi CS wait */
2096 hl_multi_cs_completion_init(hdev);
2097
2098 /*
2099 * Initialize the H/W queues. Must be done before hw_init, because
2100 * there the addresses of the kernel queue are being written to the
2101 * registers of the device
2102 */
2103 rc = hl_hw_queues_create(hdev);
2104 if (rc) {
2105 dev_err(hdev->dev, "failed to initialize kernel queues\n");
2106 goto sw_fini;
2107 }
2108
2109 cq_cnt = hdev->asic_prop.completion_queues_count;
2110
2111 /*
2112 * Initialize the completion queues. Must be done before hw_init,
2113 * because there the addresses of the completion queues are being
2114 * passed as arguments to request_irq
2115 */
2116 if (cq_cnt) {
2117 hdev->completion_queue = kcalloc(cq_cnt,
2118 sizeof(*hdev->completion_queue),
2119 GFP_KERNEL);
2120
2121 if (!hdev->completion_queue) {
2122 dev_err(hdev->dev,
2123 "failed to allocate completion queues\n");
2124 rc = -ENOMEM;
2125 goto hw_queues_destroy;
2126 }
2127 }
2128
2129 for (i = 0, cq_ready_cnt = 0 ; i < cq_cnt ; i++, cq_ready_cnt++) {
2130 rc = hl_cq_init(hdev, &hdev->completion_queue[i],
2131 hdev->asic_funcs->get_queue_id_for_cq(hdev, i));
2132 if (rc) {
2133 dev_err(hdev->dev,
2134 "failed to initialize completion queue\n");
2135 goto cq_fini;
2136 }
2137 hdev->completion_queue[i].cq_idx = i;
2138 }
2139
2140 hdev->shadow_cs_queue = kcalloc(hdev->asic_prop.max_pending_cs,
2141 sizeof(struct hl_cs *), GFP_KERNEL);
2142 if (!hdev->shadow_cs_queue) {
2143 rc = -ENOMEM;
2144 goto cq_fini;
2145 }
2146
2147 /*
2148 * Initialize the event queue. Must be done before hw_init,
2149 * because there the address of the event queue is being
2150 * passed as argument to request_irq
2151 */
2152 rc = hl_eq_init(hdev, &hdev->event_queue);
2153 if (rc) {
2154 dev_err(hdev->dev, "failed to initialize event queue\n");
2155 goto free_shadow_cs_queue;
2156 }
2157
2158 /* MMU S/W must be initialized before kernel context is created */
2159 rc = hl_mmu_init(hdev);
2160 if (rc) {
2161 dev_err(hdev->dev, "Failed to initialize MMU S/W structures\n");
2162 goto eq_fini;
2163 }
2164
2165 /* Allocate the kernel context */
2166 hdev->kernel_ctx = kzalloc(sizeof(*hdev->kernel_ctx), GFP_KERNEL);
2167 if (!hdev->kernel_ctx) {
2168 rc = -ENOMEM;
2169 goto mmu_fini;
2170 }
2171
2172 hdev->is_compute_ctx_active = false;
2173
2174 hdev->asic_funcs->state_dump_init(hdev);
2175
2176 hdev->device_release_watchdog_timeout_sec = HL_DEVICE_RELEASE_WATCHDOG_TIMEOUT_SEC;
2177
2178 hdev->memory_scrub_val = MEM_SCRUB_DEFAULT_VAL;
2179
2180 rc = hl_debugfs_device_init(hdev);
2181 if (rc) {
2182 dev_err(hdev->dev, "failed to initialize debugfs entry structure\n");
2183 kfree(hdev->kernel_ctx);
2184 goto mmu_fini;
2185 }
2186
2187 /* The debugfs entry structure is accessed in hl_ctx_init(), so it must be called after
2188 * hl_debugfs_device_init().
2189 */
2190 rc = hl_ctx_init(hdev, hdev->kernel_ctx, true);
2191 if (rc) {
2192 dev_err(hdev->dev, "failed to initialize kernel context\n");
2193 kfree(hdev->kernel_ctx);
2194 goto debugfs_device_fini;
2195 }
2196
2197 rc = hl_cb_pool_init(hdev);
2198 if (rc) {
2199 dev_err(hdev->dev, "failed to initialize CB pool\n");
2200 goto release_ctx;
2201 }
2202
2203 rc = hl_dec_init(hdev);
2204 if (rc) {
2205 dev_err(hdev->dev, "Failed to initialize the decoder module\n");
2206 goto cb_pool_fini;
2207 }
2208
2209 /*
2210 * From this point, override rc (=0) in case of an error to allow debugging
2211 * (by adding char devices and creating sysfs/debugfs files as part of the error flow).
2212 */
2213 expose_interfaces_on_err = true;
2214
2215 /* Device is now enabled as part of the initialization requires
2216 * communication with the device firmware to get information that
2217 * is required for the initialization itself
2218 */
2219 hdev->disabled = false;
2220
2221 rc = hdev->asic_funcs->hw_init(hdev);
2222 if (rc) {
2223 dev_err(hdev->dev, "failed to initialize the H/W\n");
2224 rc = 0;
2225 goto out_disabled;
2226 }
2227
2228 /* Check that the communication with the device is working */
2229 rc = hdev->asic_funcs->test_queues(hdev);
2230 if (rc) {
2231 dev_err(hdev->dev, "Failed to detect if device is alive\n");
2232 rc = 0;
2233 goto out_disabled;
2234 }
2235
2236 rc = device_late_init(hdev);
2237 if (rc) {
2238 dev_err(hdev->dev, "Failed late initialization\n");
2239 rc = 0;
2240 goto out_disabled;
2241 }
2242
2243 dev_info(hdev->dev, "Found %s device with %lluGB DRAM\n",
2244 hdev->asic_name,
2245 hdev->asic_prop.dram_size / SZ_1G);
2246
2247 rc = hl_vm_init(hdev);
2248 if (rc) {
2249 dev_err(hdev->dev, "Failed to initialize memory module\n");
2250 rc = 0;
2251 goto out_disabled;
2252 }
2253
2254 /*
2255 * Expose devices and sysfs/debugfs files to user.
2256 * From here there is no need to expose them in case of an error.
2257 */
2258 expose_interfaces_on_err = false;
2259 rc = cdev_sysfs_debugfs_add(hdev);
2260 if (rc) {
2261 dev_err(hdev->dev, "Failed to add char devices and sysfs/debugfs files\n");
2262 rc = 0;
2263 goto out_disabled;
2264 }
2265
2266 /* Need to call this again because the max power might change,
2267 * depending on card type for certain ASICs
2268 */
2269 if (hdev->asic_prop.set_max_power_on_device_init &&
2270 !hdev->asic_prop.fw_security_enabled)
2271 hl_fw_set_max_power(hdev);
2272
2273 /*
2274 * hl_hwmon_init() must be called after device_late_init(), because only
2275 * there we get the information from the device about which
2276 * hwmon-related sensors the device supports.
2277 * Furthermore, it must be done after adding the device to the system.
2278 */
2279 rc = hl_hwmon_init(hdev);
2280 if (rc) {
2281 dev_err(hdev->dev, "Failed to initialize hwmon\n");
2282 rc = 0;
2283 goto out_disabled;
2284 }
2285
2286 dev_notice(hdev->dev,
2287 "Successfully added device %s to habanalabs driver\n",
2288 dev_name(&(hdev)->pdev->dev));
2289
2290 hdev->init_done = true;
2291
2292 /* After initialization is done, we are ready to receive events from
2293 * the F/W. We can't do it before because we will ignore events and if
2294 * those events are fatal, we won't know about it and the device will
2295 * be operational although it shouldn't be
2296 */
2297 hdev->asic_funcs->enable_events_from_fw(hdev);
2298
2299 return 0;
2300
2301 cb_pool_fini:
2302 hl_cb_pool_fini(hdev);
2303 release_ctx:
2304 if (hl_ctx_put(hdev->kernel_ctx) != 1)
2305 dev_err(hdev->dev,
2306 "kernel ctx is still alive on initialization failure\n");
2307 debugfs_device_fini:
2308 hl_debugfs_device_fini(hdev);
2309 mmu_fini:
2310 hl_mmu_fini(hdev);
2311 eq_fini:
2312 hl_eq_fini(hdev, &hdev->event_queue);
2313 free_shadow_cs_queue:
2314 kfree(hdev->shadow_cs_queue);
2315 cq_fini:
2316 for (i = 0 ; i < cq_ready_cnt ; i++)
2317 hl_cq_fini(hdev, &hdev->completion_queue[i]);
2318 kfree(hdev->completion_queue);
2319 hw_queues_destroy:
2320 hl_hw_queues_destroy(hdev);
2321 sw_fini:
2322 hdev->asic_funcs->sw_fini(hdev);
2323 free_usr_intr_mem:
2324 kfree(hdev->user_interrupt);
2325 early_fini:
2326 device_early_fini(hdev);
2327 free_dev:
2328 put_device(hdev->dev_ctrl);
2329 put_device(hdev->dev);
2330 out_disabled:
2331 hdev->disabled = true;
2332 if (expose_interfaces_on_err)
2333 cdev_sysfs_debugfs_add(hdev);
2334 dev_err(&hdev->pdev->dev,
2335 "Failed to initialize hl%d. Device %s is NOT usable !\n",
2336 hdev->cdev_idx, dev_name(&hdev->pdev->dev));
2337
2338 return rc;
2339 }
2340
2341 /*
2342 * hl_device_fini - main tear-down function for habanalabs device
2343 *
2344 * @hdev: pointer to habanalabs device structure
2345 *
2346 * Destroy the device, call ASIC fini functions and release the id
2347 */
hl_device_fini(struct hl_device * hdev)2348 void hl_device_fini(struct hl_device *hdev)
2349 {
2350 bool device_in_reset;
2351 ktime_t timeout;
2352 u64 reset_sec;
2353 int i, rc;
2354
2355 dev_info(hdev->dev, "Removing device\n");
2356
2357 hdev->device_fini_pending = 1;
2358 flush_delayed_work(&hdev->device_reset_work.reset_work);
2359
2360 if (hdev->pldm)
2361 reset_sec = HL_PLDM_HARD_RESET_MAX_TIMEOUT;
2362 else
2363 reset_sec = HL_HARD_RESET_MAX_TIMEOUT;
2364
2365 /*
2366 * This function is competing with the reset function, so try to
2367 * take the reset atomic and if we are already in middle of reset,
2368 * wait until reset function is finished. Reset function is designed
2369 * to always finish. However, in Gaudi, because of all the network
2370 * ports, the hard reset could take between 10-30 seconds
2371 */
2372
2373 timeout = ktime_add_us(ktime_get(), reset_sec * 1000 * 1000);
2374
2375 spin_lock(&hdev->reset_info.lock);
2376 device_in_reset = !!hdev->reset_info.in_reset;
2377 if (!device_in_reset)
2378 hdev->reset_info.in_reset = 1;
2379 spin_unlock(&hdev->reset_info.lock);
2380
2381 while (device_in_reset) {
2382 usleep_range(50, 200);
2383
2384 spin_lock(&hdev->reset_info.lock);
2385 device_in_reset = !!hdev->reset_info.in_reset;
2386 if (!device_in_reset)
2387 hdev->reset_info.in_reset = 1;
2388 spin_unlock(&hdev->reset_info.lock);
2389
2390 if (ktime_compare(ktime_get(), timeout) > 0) {
2391 dev_crit(hdev->dev,
2392 "%s Failed to remove device because reset function did not finish\n",
2393 dev_name(&(hdev)->pdev->dev));
2394 return;
2395 }
2396 }
2397
2398 cancel_delayed_work_sync(&hdev->device_release_watchdog_work.reset_work);
2399
2400 /* Disable PCI access from device F/W so it won't send us additional
2401 * interrupts. We disable MSI/MSI-X at the halt_engines function and we
2402 * can't have the F/W sending us interrupts after that. We need to
2403 * disable the access here because if the device is marked disable, the
2404 * message won't be send. Also, in case of heartbeat, the device CPU is
2405 * marked as disable so this message won't be sent
2406 */
2407 hl_fw_send_pci_access_msg(hdev, CPUCP_PACKET_DISABLE_PCI_ACCESS, 0x0);
2408
2409 /* Mark device as disabled */
2410 hdev->disabled = true;
2411
2412 take_release_locks(hdev);
2413
2414 hdev->reset_info.hard_reset_pending = true;
2415
2416 hl_hwmon_fini(hdev);
2417
2418 cleanup_resources(hdev, true, false, false);
2419
2420 /* Kill processes here after CS rollback. This is because the process
2421 * can't really exit until all its CSs are done, which is what we
2422 * do in cs rollback
2423 */
2424 dev_info(hdev->dev,
2425 "Waiting for all processes to exit (timeout of %u seconds)",
2426 HL_WAIT_PROCESS_KILL_ON_DEVICE_FINI);
2427
2428 hdev->process_kill_trial_cnt = 0;
2429 rc = device_kill_open_processes(hdev, HL_WAIT_PROCESS_KILL_ON_DEVICE_FINI, false);
2430 if (rc) {
2431 dev_crit(hdev->dev, "Failed to kill all open processes\n");
2432 device_disable_open_processes(hdev, false);
2433 }
2434
2435 hdev->process_kill_trial_cnt = 0;
2436 rc = device_kill_open_processes(hdev, 0, true);
2437 if (rc) {
2438 dev_crit(hdev->dev, "Failed to kill all control device open processes\n");
2439 device_disable_open_processes(hdev, true);
2440 }
2441
2442 hl_cb_pool_fini(hdev);
2443
2444 /* Reset the H/W. It will be in idle state after this returns */
2445 rc = hdev->asic_funcs->hw_fini(hdev, true, false);
2446 if (rc)
2447 dev_err(hdev->dev, "hw_fini failed in device fini while removing device %d\n", rc);
2448
2449 hdev->fw_loader.fw_comp_loaded = FW_TYPE_NONE;
2450
2451 /* Release kernel context */
2452 if ((hdev->kernel_ctx) && (hl_ctx_put(hdev->kernel_ctx) != 1))
2453 dev_err(hdev->dev, "kernel ctx is still alive\n");
2454
2455 hl_dec_fini(hdev);
2456
2457 hl_vm_fini(hdev);
2458
2459 hl_mmu_fini(hdev);
2460
2461 vfree(hdev->captured_err_info.page_fault_info.user_mappings);
2462
2463 hl_eq_fini(hdev, &hdev->event_queue);
2464
2465 kfree(hdev->shadow_cs_queue);
2466
2467 for (i = 0 ; i < hdev->asic_prop.completion_queues_count ; i++)
2468 hl_cq_fini(hdev, &hdev->completion_queue[i]);
2469 kfree(hdev->completion_queue);
2470 kfree(hdev->user_interrupt);
2471
2472 hl_hw_queues_destroy(hdev);
2473
2474 /* Call ASIC S/W finalize function */
2475 hdev->asic_funcs->sw_fini(hdev);
2476
2477 device_early_fini(hdev);
2478
2479 /* Hide devices and sysfs/debugfs files from user */
2480 cdev_sysfs_debugfs_remove(hdev);
2481
2482 hl_debugfs_device_fini(hdev);
2483
2484 pr_info("removed device successfully\n");
2485 }
2486
2487 /*
2488 * MMIO register access helper functions.
2489 */
2490
2491 /*
2492 * hl_rreg - Read an MMIO register
2493 *
2494 * @hdev: pointer to habanalabs device structure
2495 * @reg: MMIO register offset (in bytes)
2496 *
2497 * Returns the value of the MMIO register we are asked to read
2498 *
2499 */
hl_rreg(struct hl_device * hdev,u32 reg)2500 inline u32 hl_rreg(struct hl_device *hdev, u32 reg)
2501 {
2502 u32 val = readl(hdev->rmmio + reg);
2503
2504 if (unlikely(trace_habanalabs_rreg32_enabled()))
2505 trace_habanalabs_rreg32(hdev->dev, reg, val);
2506
2507 return val;
2508 }
2509
2510 /*
2511 * hl_wreg - Write to an MMIO register
2512 *
2513 * @hdev: pointer to habanalabs device structure
2514 * @reg: MMIO register offset (in bytes)
2515 * @val: 32-bit value
2516 *
2517 * Writes the 32-bit value into the MMIO register
2518 *
2519 */
hl_wreg(struct hl_device * hdev,u32 reg,u32 val)2520 inline void hl_wreg(struct hl_device *hdev, u32 reg, u32 val)
2521 {
2522 if (unlikely(trace_habanalabs_wreg32_enabled()))
2523 trace_habanalabs_wreg32(hdev->dev, reg, val);
2524
2525 writel(val, hdev->rmmio + reg);
2526 }
2527
hl_capture_razwi(struct hl_device * hdev,u64 addr,u16 * engine_id,u16 num_of_engines,u8 flags)2528 void hl_capture_razwi(struct hl_device *hdev, u64 addr, u16 *engine_id, u16 num_of_engines,
2529 u8 flags)
2530 {
2531 struct razwi_info *razwi_info = &hdev->captured_err_info.razwi_info;
2532
2533 if (num_of_engines > HL_RAZWI_MAX_NUM_OF_ENGINES_PER_RTR) {
2534 dev_err(hdev->dev,
2535 "Number of possible razwi initiators (%u) exceeded limit (%u)\n",
2536 num_of_engines, HL_RAZWI_MAX_NUM_OF_ENGINES_PER_RTR);
2537 return;
2538 }
2539
2540 /* In case it's the first razwi since the device was opened, capture its parameters */
2541 if (atomic_cmpxchg(&hdev->captured_err_info.razwi_info.razwi_detected, 0, 1))
2542 return;
2543
2544 razwi_info->razwi.timestamp = ktime_to_ns(ktime_get());
2545 razwi_info->razwi.addr = addr;
2546 razwi_info->razwi.num_of_possible_engines = num_of_engines;
2547 memcpy(&razwi_info->razwi.engine_id[0], &engine_id[0],
2548 num_of_engines * sizeof(u16));
2549 razwi_info->razwi.flags = flags;
2550
2551 razwi_info->razwi_info_available = true;
2552 }
2553
hl_handle_razwi(struct hl_device * hdev,u64 addr,u16 * engine_id,u16 num_of_engines,u8 flags,u64 * event_mask)2554 void hl_handle_razwi(struct hl_device *hdev, u64 addr, u16 *engine_id, u16 num_of_engines,
2555 u8 flags, u64 *event_mask)
2556 {
2557 hl_capture_razwi(hdev, addr, engine_id, num_of_engines, flags);
2558
2559 if (event_mask)
2560 *event_mask |= HL_NOTIFIER_EVENT_RAZWI;
2561 }
2562
hl_capture_user_mappings(struct hl_device * hdev,bool is_pmmu)2563 static void hl_capture_user_mappings(struct hl_device *hdev, bool is_pmmu)
2564 {
2565 struct page_fault_info *pgf_info = &hdev->captured_err_info.page_fault_info;
2566 struct hl_vm_phys_pg_pack *phys_pg_pack = NULL;
2567 struct hl_vm_hash_node *hnode;
2568 struct hl_userptr *userptr;
2569 enum vm_type *vm_type;
2570 struct hl_ctx *ctx;
2571 u32 map_idx = 0;
2572 int i;
2573
2574 /* Reset previous session count*/
2575 pgf_info->num_of_user_mappings = 0;
2576
2577 ctx = hl_get_compute_ctx(hdev);
2578 if (!ctx) {
2579 dev_err(hdev->dev, "Can't get user context for user mappings\n");
2580 return;
2581 }
2582
2583 mutex_lock(&ctx->mem_hash_lock);
2584 hash_for_each(ctx->mem_hash, i, hnode, node) {
2585 vm_type = hnode->ptr;
2586 if (((*vm_type == VM_TYPE_USERPTR) && is_pmmu) ||
2587 ((*vm_type == VM_TYPE_PHYS_PACK) && !is_pmmu))
2588 pgf_info->num_of_user_mappings++;
2589
2590 }
2591
2592 if (!pgf_info->num_of_user_mappings)
2593 goto finish;
2594
2595 /* In case we already allocated in previous session, need to release it before
2596 * allocating new buffer.
2597 */
2598 vfree(pgf_info->user_mappings);
2599 pgf_info->user_mappings =
2600 vzalloc(pgf_info->num_of_user_mappings * sizeof(struct hl_user_mapping));
2601 if (!pgf_info->user_mappings) {
2602 pgf_info->num_of_user_mappings = 0;
2603 goto finish;
2604 }
2605
2606 hash_for_each(ctx->mem_hash, i, hnode, node) {
2607 vm_type = hnode->ptr;
2608 if ((*vm_type == VM_TYPE_USERPTR) && (is_pmmu)) {
2609 userptr = hnode->ptr;
2610 pgf_info->user_mappings[map_idx].dev_va = hnode->vaddr;
2611 pgf_info->user_mappings[map_idx].size = userptr->size;
2612 map_idx++;
2613 } else if ((*vm_type == VM_TYPE_PHYS_PACK) && (!is_pmmu)) {
2614 phys_pg_pack = hnode->ptr;
2615 pgf_info->user_mappings[map_idx].dev_va = hnode->vaddr;
2616 pgf_info->user_mappings[map_idx].size = phys_pg_pack->total_size;
2617 map_idx++;
2618 }
2619 }
2620 finish:
2621 mutex_unlock(&ctx->mem_hash_lock);
2622 hl_ctx_put(ctx);
2623 }
2624
hl_capture_page_fault(struct hl_device * hdev,u64 addr,u16 eng_id,bool is_pmmu)2625 void hl_capture_page_fault(struct hl_device *hdev, u64 addr, u16 eng_id, bool is_pmmu)
2626 {
2627 struct page_fault_info *pgf_info = &hdev->captured_err_info.page_fault_info;
2628
2629 /* Capture only the first page fault */
2630 if (atomic_cmpxchg(&pgf_info->page_fault_detected, 0, 1))
2631 return;
2632
2633 pgf_info->page_fault.timestamp = ktime_to_ns(ktime_get());
2634 pgf_info->page_fault.addr = addr;
2635 pgf_info->page_fault.engine_id = eng_id;
2636 hl_capture_user_mappings(hdev, is_pmmu);
2637
2638 pgf_info->page_fault_info_available = true;
2639 }
2640
hl_handle_page_fault(struct hl_device * hdev,u64 addr,u16 eng_id,bool is_pmmu,u64 * event_mask)2641 void hl_handle_page_fault(struct hl_device *hdev, u64 addr, u16 eng_id, bool is_pmmu,
2642 u64 *event_mask)
2643 {
2644 hl_capture_page_fault(hdev, addr, eng_id, is_pmmu);
2645
2646 if (event_mask)
2647 *event_mask |= HL_NOTIFIER_EVENT_PAGE_FAULT;
2648 }
2649
hl_capture_hw_err(struct hl_device * hdev,u16 event_id)2650 static void hl_capture_hw_err(struct hl_device *hdev, u16 event_id)
2651 {
2652 struct hw_err_info *info = &hdev->captured_err_info.hw_err;
2653
2654 /* Capture only the first HW err */
2655 if (atomic_cmpxchg(&info->event_detected, 0, 1))
2656 return;
2657
2658 info->event.timestamp = ktime_to_ns(ktime_get());
2659 info->event.event_id = event_id;
2660
2661 info->event_info_available = true;
2662 }
2663
hl_handle_critical_hw_err(struct hl_device * hdev,u16 event_id,u64 * event_mask)2664 void hl_handle_critical_hw_err(struct hl_device *hdev, u16 event_id, u64 *event_mask)
2665 {
2666 hl_capture_hw_err(hdev, event_id);
2667
2668 if (event_mask)
2669 *event_mask |= HL_NOTIFIER_EVENT_CRITICL_HW_ERR;
2670 }
2671
hl_capture_fw_err(struct hl_device * hdev,struct hl_info_fw_err_info * fw_info)2672 static void hl_capture_fw_err(struct hl_device *hdev, struct hl_info_fw_err_info *fw_info)
2673 {
2674 struct fw_err_info *info = &hdev->captured_err_info.fw_err;
2675
2676 /* Capture only the first FW error */
2677 if (atomic_cmpxchg(&info->event_detected, 0, 1))
2678 return;
2679
2680 info->event.timestamp = ktime_to_ns(ktime_get());
2681 info->event.err_type = fw_info->err_type;
2682 if (fw_info->err_type == HL_INFO_FW_REPORTED_ERR)
2683 info->event.event_id = fw_info->event_id;
2684
2685 info->event_info_available = true;
2686 }
2687
hl_handle_fw_err(struct hl_device * hdev,struct hl_info_fw_err_info * info)2688 void hl_handle_fw_err(struct hl_device *hdev, struct hl_info_fw_err_info *info)
2689 {
2690 hl_capture_fw_err(hdev, info);
2691
2692 if (info->event_mask)
2693 *info->event_mask |= HL_NOTIFIER_EVENT_CRITICL_FW_ERR;
2694 }
2695
hl_enable_err_info_capture(struct hl_error_info * captured_err_info)2696 void hl_enable_err_info_capture(struct hl_error_info *captured_err_info)
2697 {
2698 vfree(captured_err_info->page_fault_info.user_mappings);
2699 memset(captured_err_info, 0, sizeof(struct hl_error_info));
2700 atomic_set(&captured_err_info->cs_timeout.write_enable, 1);
2701 captured_err_info->undef_opcode.write_enable = true;
2702 }
2703