1// SPDX-License-Identifier: GPL-2.0
2
3/*
4 * Copyright 2016-2021 HabanaLabs, Ltd.
5 * All Rights Reserved.
6 */
7
8#include "habanalabs.h"
9#include "../include/hw_ip/mmu/mmu_general.h"
10
11#include <linux/pci.h>
12#include <linux/uaccess.h>
13#include <linux/vmalloc.h>
14#include <linux/iommu.h>
15
16#define MMU_ADDR_BUF_SIZE	40
17#define MMU_ASID_BUF_SIZE	10
18#define MMU_KBUF_SIZE		(MMU_ADDR_BUF_SIZE + MMU_ASID_BUF_SIZE)
19#define I2C_MAX_TRANSACTION_LEN	8
20
21static int hl_debugfs_i2c_read(struct hl_device *hdev, u8 i2c_bus, u8 i2c_addr,
22				u8 i2c_reg, u8 i2c_len, u64 *val)
23{
24	struct cpucp_packet pkt;
25	int rc;
26
27	if (!hl_device_operational(hdev, NULL))
28		return -EBUSY;
29
30	if (i2c_len > I2C_MAX_TRANSACTION_LEN) {
31		dev_err(hdev->dev, "I2C transaction length %u, exceeds maximum of %u\n",
32				i2c_len, I2C_MAX_TRANSACTION_LEN);
33		return -EINVAL;
34	}
35
36	memset(&pkt, 0, sizeof(pkt));
37
38	pkt.ctl = cpu_to_le32(CPUCP_PACKET_I2C_RD <<
39				CPUCP_PKT_CTL_OPCODE_SHIFT);
40	pkt.i2c_bus = i2c_bus;
41	pkt.i2c_addr = i2c_addr;
42	pkt.i2c_reg = i2c_reg;
43	pkt.i2c_len = i2c_len;
44
45	rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) &pkt, sizeof(pkt),
46						0, val);
47	if (rc)
48		dev_err(hdev->dev, "Failed to read from I2C, error %d\n", rc);
49
50	return rc;
51}
52
53static int hl_debugfs_i2c_write(struct hl_device *hdev, u8 i2c_bus, u8 i2c_addr,
54				u8 i2c_reg, u8 i2c_len, u64 val)
55{
56	struct cpucp_packet pkt;
57	int rc;
58
59	if (!hl_device_operational(hdev, NULL))
60		return -EBUSY;
61
62	if (i2c_len > I2C_MAX_TRANSACTION_LEN) {
63		dev_err(hdev->dev, "I2C transaction length %u, exceeds maximum of %u\n",
64				i2c_len, I2C_MAX_TRANSACTION_LEN);
65		return -EINVAL;
66	}
67
68	memset(&pkt, 0, sizeof(pkt));
69
70	pkt.ctl = cpu_to_le32(CPUCP_PACKET_I2C_WR <<
71				CPUCP_PKT_CTL_OPCODE_SHIFT);
72	pkt.i2c_bus = i2c_bus;
73	pkt.i2c_addr = i2c_addr;
74	pkt.i2c_reg = i2c_reg;
75	pkt.i2c_len = i2c_len;
76	pkt.value = cpu_to_le64(val);
77
78	rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) &pkt, sizeof(pkt),
79						0, NULL);
80
81	if (rc)
82		dev_err(hdev->dev, "Failed to write to I2C, error %d\n", rc);
83
84	return rc;
85}
86
87static void hl_debugfs_led_set(struct hl_device *hdev, u8 led, u8 state)
88{
89	struct cpucp_packet pkt;
90	int rc;
91
92	if (!hl_device_operational(hdev, NULL))
93		return;
94
95	memset(&pkt, 0, sizeof(pkt));
96
97	pkt.ctl = cpu_to_le32(CPUCP_PACKET_LED_SET <<
98				CPUCP_PKT_CTL_OPCODE_SHIFT);
99	pkt.led_index = cpu_to_le32(led);
100	pkt.value = cpu_to_le64(state);
101
102	rc = hdev->asic_funcs->send_cpu_message(hdev, (u32 *) &pkt, sizeof(pkt),
103						0, NULL);
104
105	if (rc)
106		dev_err(hdev->dev, "Failed to set LED %d, error %d\n", led, rc);
107}
108
109static int command_buffers_show(struct seq_file *s, void *data)
110{
111	struct hl_debugfs_entry *entry = s->private;
112	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
113	struct hl_cb *cb;
114	bool first = true;
115
116	spin_lock(&dev_entry->cb_spinlock);
117
118	list_for_each_entry(cb, &dev_entry->cb_list, debugfs_list) {
119		if (first) {
120			first = false;
121			seq_puts(s, "\n");
122			seq_puts(s, " CB ID   CTX ID   CB size    CB RefCnt    mmap?   CS counter\n");
123			seq_puts(s, "---------------------------------------------------------------\n");
124		}
125		seq_printf(s,
126			"   %03llu        %d    0x%08x      %d          %d          %d\n",
127			cb->buf->handle, cb->ctx->asid, cb->size,
128			kref_read(&cb->buf->refcount),
129			atomic_read(&cb->buf->mmap), atomic_read(&cb->cs_cnt));
130	}
131
132	spin_unlock(&dev_entry->cb_spinlock);
133
134	if (!first)
135		seq_puts(s, "\n");
136
137	return 0;
138}
139
140static int command_submission_show(struct seq_file *s, void *data)
141{
142	struct hl_debugfs_entry *entry = s->private;
143	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
144	struct hl_cs *cs;
145	bool first = true;
146
147	spin_lock(&dev_entry->cs_spinlock);
148
149	list_for_each_entry(cs, &dev_entry->cs_list, debugfs_list) {
150		if (first) {
151			first = false;
152			seq_puts(s, "\n");
153			seq_puts(s, " CS ID   CS TYPE   CTX ASID   CS RefCnt   Submitted    Completed\n");
154			seq_puts(s, "----------------------------------------------------------------\n");
155		}
156		seq_printf(s,
157			"   %llu        %d          %d          %d           %d            %d\n",
158			cs->sequence, cs->type, cs->ctx->asid,
159			kref_read(&cs->refcount),
160			cs->submitted, cs->completed);
161	}
162
163	spin_unlock(&dev_entry->cs_spinlock);
164
165	if (!first)
166		seq_puts(s, "\n");
167
168	return 0;
169}
170
171static int command_submission_jobs_show(struct seq_file *s, void *data)
172{
173	struct hl_debugfs_entry *entry = s->private;
174	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
175	struct hl_cs_job *job;
176	bool first = true;
177
178	spin_lock(&dev_entry->cs_job_spinlock);
179
180	list_for_each_entry(job, &dev_entry->cs_job_list, debugfs_list) {
181		if (first) {
182			first = false;
183			seq_puts(s, "\n");
184			seq_puts(s, " JOB ID   CS ID    CS TYPE    CTX ASID   JOB RefCnt   H/W Queue\n");
185			seq_puts(s, "---------------------------------------------------------------\n");
186		}
187		if (job->cs)
188			seq_printf(s,
189				"   %02d      %llu        %d        %d          %d           %d\n",
190				job->id, job->cs->sequence, job->cs->type,
191				job->cs->ctx->asid, kref_read(&job->refcount),
192				job->hw_queue_id);
193		else
194			seq_printf(s,
195				"   %02d      0        0        %d          %d           %d\n",
196				job->id, HL_KERNEL_ASID_ID,
197				kref_read(&job->refcount), job->hw_queue_id);
198	}
199
200	spin_unlock(&dev_entry->cs_job_spinlock);
201
202	if (!first)
203		seq_puts(s, "\n");
204
205	return 0;
206}
207
208static int userptr_show(struct seq_file *s, void *data)
209{
210	struct hl_debugfs_entry *entry = s->private;
211	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
212	struct hl_userptr *userptr;
213	char dma_dir[4][30] = {"DMA_BIDIRECTIONAL", "DMA_TO_DEVICE",
214				"DMA_FROM_DEVICE", "DMA_NONE"};
215	bool first = true;
216
217	spin_lock(&dev_entry->userptr_spinlock);
218
219	list_for_each_entry(userptr, &dev_entry->userptr_list, debugfs_list) {
220		if (first) {
221			first = false;
222			seq_puts(s, "\n");
223			seq_puts(s, " pid      user virtual address     size             dma dir\n");
224			seq_puts(s, "----------------------------------------------------------\n");
225		}
226		seq_printf(s, " %-7d  0x%-14llx      %-10llu    %-30s\n",
227				userptr->pid, userptr->addr, userptr->size,
228				dma_dir[userptr->dir]);
229	}
230
231	spin_unlock(&dev_entry->userptr_spinlock);
232
233	if (!first)
234		seq_puts(s, "\n");
235
236	return 0;
237}
238
239static int vm_show(struct seq_file *s, void *data)
240{
241	struct hl_debugfs_entry *entry = s->private;
242	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
243	struct hl_vm_hw_block_list_node *lnode;
244	struct hl_ctx *ctx;
245	struct hl_vm *vm;
246	struct hl_vm_hash_node *hnode;
247	struct hl_userptr *userptr;
248	struct hl_vm_phys_pg_pack *phys_pg_pack = NULL;
249	struct hl_va_range *va_range;
250	struct hl_vm_va_block *va_block;
251	enum vm_type *vm_type;
252	bool once = true;
253	u64 j;
254	int i;
255
256	mutex_lock(&dev_entry->ctx_mem_hash_mutex);
257
258	list_for_each_entry(ctx, &dev_entry->ctx_mem_hash_list, debugfs_list) {
259		once = false;
260		seq_puts(s, "\n\n----------------------------------------------------");
261		seq_puts(s, "\n----------------------------------------------------\n\n");
262		seq_printf(s, "ctx asid: %u\n", ctx->asid);
263
264		seq_puts(s, "\nmappings:\n\n");
265		seq_puts(s, "    virtual address        size          handle\n");
266		seq_puts(s, "----------------------------------------------------\n");
267		mutex_lock(&ctx->mem_hash_lock);
268		hash_for_each(ctx->mem_hash, i, hnode, node) {
269			vm_type = hnode->ptr;
270
271			if (*vm_type == VM_TYPE_USERPTR) {
272				userptr = hnode->ptr;
273				seq_printf(s,
274					"    0x%-14llx      %-10llu\n",
275					hnode->vaddr, userptr->size);
276			} else {
277				phys_pg_pack = hnode->ptr;
278				seq_printf(s,
279					"    0x%-14llx      %-10llu       %-4u\n",
280					hnode->vaddr, phys_pg_pack->total_size,
281					phys_pg_pack->handle);
282			}
283		}
284		mutex_unlock(&ctx->mem_hash_lock);
285
286		if (ctx->asid != HL_KERNEL_ASID_ID &&
287		    !list_empty(&ctx->hw_block_mem_list)) {
288			seq_puts(s, "\nhw_block mappings:\n\n");
289			seq_puts(s,
290				"    virtual address    block size    mapped size    HW block id\n");
291			seq_puts(s,
292				"---------------------------------------------------------------\n");
293			mutex_lock(&ctx->hw_block_list_lock);
294			list_for_each_entry(lnode, &ctx->hw_block_mem_list, node) {
295				seq_printf(s,
296					"    0x%-14lx   %-6u        %-6u             %-9u\n",
297					lnode->vaddr, lnode->block_size, lnode->mapped_size,
298					lnode->id);
299			}
300			mutex_unlock(&ctx->hw_block_list_lock);
301		}
302
303		vm = &ctx->hdev->vm;
304		spin_lock(&vm->idr_lock);
305
306		if (!idr_is_empty(&vm->phys_pg_pack_handles))
307			seq_puts(s, "\n\nallocations:\n");
308
309		idr_for_each_entry(&vm->phys_pg_pack_handles, phys_pg_pack, i) {
310			if (phys_pg_pack->asid != ctx->asid)
311				continue;
312
313			seq_printf(s, "\nhandle: %u\n", phys_pg_pack->handle);
314			seq_printf(s, "page size: %u\n\n",
315						phys_pg_pack->page_size);
316			seq_puts(s, "   physical address\n");
317			seq_puts(s, "---------------------\n");
318			for (j = 0 ; j < phys_pg_pack->npages ; j++) {
319				seq_printf(s, "    0x%-14llx\n",
320						phys_pg_pack->pages[j]);
321			}
322		}
323		spin_unlock(&vm->idr_lock);
324
325	}
326
327	mutex_unlock(&dev_entry->ctx_mem_hash_mutex);
328
329	ctx = hl_get_compute_ctx(dev_entry->hdev);
330	if (ctx) {
331		seq_puts(s, "\nVA ranges:\n\n");
332		for (i = HL_VA_RANGE_TYPE_HOST ; i < HL_VA_RANGE_TYPE_MAX ; ++i) {
333			va_range = ctx->va_range[i];
334			seq_printf(s, "   va_range %d\n", i);
335			seq_puts(s, "---------------------\n");
336			mutex_lock(&va_range->lock);
337			list_for_each_entry(va_block, &va_range->list, node) {
338				seq_printf(s, "%#16llx - %#16llx (%#llx)\n",
339					   va_block->start, va_block->end,
340					   va_block->size);
341			}
342			mutex_unlock(&va_range->lock);
343			seq_puts(s, "\n");
344		}
345		hl_ctx_put(ctx);
346	}
347
348	if (!once)
349		seq_puts(s, "\n");
350
351	return 0;
352}
353
354static int userptr_lookup_show(struct seq_file *s, void *data)
355{
356	struct hl_debugfs_entry *entry = s->private;
357	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
358	struct scatterlist *sg;
359	struct hl_userptr *userptr;
360	bool first = true;
361	u64 total_npages, npages, sg_start, sg_end;
362	dma_addr_t dma_addr;
363	int i;
364
365	spin_lock(&dev_entry->userptr_spinlock);
366
367	list_for_each_entry(userptr, &dev_entry->userptr_list, debugfs_list) {
368		if (dev_entry->userptr_lookup >= userptr->addr &&
369		dev_entry->userptr_lookup < userptr->addr + userptr->size) {
370			total_npages = 0;
371			for_each_sgtable_dma_sg(userptr->sgt, sg, i) {
372				npages = hl_get_sg_info(sg, &dma_addr);
373				sg_start = userptr->addr +
374					total_npages * PAGE_SIZE;
375				sg_end = userptr->addr +
376					(total_npages + npages) * PAGE_SIZE;
377
378				if (dev_entry->userptr_lookup >= sg_start &&
379				    dev_entry->userptr_lookup < sg_end) {
380					dma_addr += (dev_entry->userptr_lookup -
381							sg_start);
382					if (first) {
383						first = false;
384						seq_puts(s, "\n");
385						seq_puts(s, " user virtual address         dma address       pid        region start     region size\n");
386						seq_puts(s, "---------------------------------------------------------------------------------------\n");
387					}
388					seq_printf(s, " 0x%-18llx  0x%-16llx  %-8u  0x%-16llx %-12llu\n",
389						dev_entry->userptr_lookup,
390						(u64)dma_addr, userptr->pid,
391						userptr->addr, userptr->size);
392				}
393				total_npages += npages;
394			}
395		}
396	}
397
398	spin_unlock(&dev_entry->userptr_spinlock);
399
400	if (!first)
401		seq_puts(s, "\n");
402
403	return 0;
404}
405
406static ssize_t userptr_lookup_write(struct file *file, const char __user *buf,
407		size_t count, loff_t *f_pos)
408{
409	struct seq_file *s = file->private_data;
410	struct hl_debugfs_entry *entry = s->private;
411	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
412	ssize_t rc;
413	u64 value;
414
415	rc = kstrtoull_from_user(buf, count, 16, &value);
416	if (rc)
417		return rc;
418
419	dev_entry->userptr_lookup = value;
420
421	return count;
422}
423
424static int mmu_show(struct seq_file *s, void *data)
425{
426	struct hl_debugfs_entry *entry = s->private;
427	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
428	struct hl_device *hdev = dev_entry->hdev;
429	struct hl_ctx *ctx;
430	struct hl_mmu_hop_info hops_info = {0};
431	u64 virt_addr = dev_entry->mmu_addr, phys_addr;
432	int i;
433
434	if (dev_entry->mmu_asid == HL_KERNEL_ASID_ID)
435		ctx = hdev->kernel_ctx;
436	else
437		ctx = hl_get_compute_ctx(hdev);
438
439	if (!ctx) {
440		dev_err(hdev->dev, "no ctx available\n");
441		return 0;
442	}
443
444	if (hl_mmu_get_tlb_info(ctx, virt_addr, &hops_info)) {
445		dev_err(hdev->dev, "virt addr 0x%llx is not mapped to phys addr\n",
446				virt_addr);
447		goto put_ctx;
448	}
449
450	hl_mmu_va_to_pa(ctx, virt_addr, &phys_addr);
451
452	if (hops_info.scrambled_vaddr &&
453		(dev_entry->mmu_addr != hops_info.scrambled_vaddr))
454		seq_printf(s,
455			"asid: %u, virt_addr: 0x%llx, scrambled virt_addr: 0x%llx,\nphys_addr: 0x%llx, scrambled_phys_addr: 0x%llx\n",
456			dev_entry->mmu_asid, dev_entry->mmu_addr,
457			hops_info.scrambled_vaddr,
458			hops_info.unscrambled_paddr, phys_addr);
459	else
460		seq_printf(s,
461			"asid: %u, virt_addr: 0x%llx, phys_addr: 0x%llx\n",
462			dev_entry->mmu_asid, dev_entry->mmu_addr, phys_addr);
463
464	for (i = 0 ; i < hops_info.used_hops ; i++) {
465		seq_printf(s, "hop%d_addr: 0x%llx\n",
466				i, hops_info.hop_info[i].hop_addr);
467		seq_printf(s, "hop%d_pte_addr: 0x%llx\n",
468				i, hops_info.hop_info[i].hop_pte_addr);
469		seq_printf(s, "hop%d_pte: 0x%llx\n",
470				i, hops_info.hop_info[i].hop_pte_val);
471	}
472
473put_ctx:
474	if (dev_entry->mmu_asid != HL_KERNEL_ASID_ID)
475		hl_ctx_put(ctx);
476
477	return 0;
478}
479
480static ssize_t mmu_asid_va_write(struct file *file, const char __user *buf,
481		size_t count, loff_t *f_pos)
482{
483	struct seq_file *s = file->private_data;
484	struct hl_debugfs_entry *entry = s->private;
485	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
486	struct hl_device *hdev = dev_entry->hdev;
487	char kbuf[MMU_KBUF_SIZE] = {0};
488	char *c;
489	ssize_t rc;
490
491	if (count > sizeof(kbuf) - 1)
492		goto err;
493	if (copy_from_user(kbuf, buf, count))
494		goto err;
495	kbuf[count] = 0;
496
497	c = strchr(kbuf, ' ');
498	if (!c)
499		goto err;
500	*c = '\0';
501
502	rc = kstrtouint(kbuf, 10, &dev_entry->mmu_asid);
503	if (rc)
504		goto err;
505
506	if (strncmp(c+1, "0x", 2))
507		goto err;
508	rc = kstrtoull(c+3, 16, &dev_entry->mmu_addr);
509	if (rc)
510		goto err;
511
512	return count;
513
514err:
515	dev_err(hdev->dev, "usage: echo <asid> <0xaddr> > mmu\n");
516
517	return -EINVAL;
518}
519
520static int mmu_ack_error(struct seq_file *s, void *data)
521{
522	struct hl_debugfs_entry *entry = s->private;
523	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
524	struct hl_device *hdev = dev_entry->hdev;
525	int rc;
526
527	if (!dev_entry->mmu_cap_mask) {
528		dev_err(hdev->dev, "mmu_cap_mask is not set\n");
529		goto err;
530	}
531
532	rc = hdev->asic_funcs->ack_mmu_errors(hdev, dev_entry->mmu_cap_mask);
533	if (rc)
534		goto err;
535
536	return 0;
537err:
538	return -EINVAL;
539}
540
541static ssize_t mmu_ack_error_value_write(struct file *file,
542		const char __user *buf,
543		size_t count, loff_t *f_pos)
544{
545	struct seq_file *s = file->private_data;
546	struct hl_debugfs_entry *entry = s->private;
547	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
548	struct hl_device *hdev = dev_entry->hdev;
549	char kbuf[MMU_KBUF_SIZE] = {0};
550	ssize_t rc;
551
552	if (count > sizeof(kbuf) - 1)
553		goto err;
554
555	if (copy_from_user(kbuf, buf, count))
556		goto err;
557
558	kbuf[count] = 0;
559
560	if (strncmp(kbuf, "0x", 2))
561		goto err;
562
563	rc = kstrtoull(kbuf, 16, &dev_entry->mmu_cap_mask);
564	if (rc)
565		goto err;
566
567	return count;
568err:
569	dev_err(hdev->dev, "usage: echo <0xmmu_cap_mask > > mmu_error\n");
570
571	return -EINVAL;
572}
573
574static int engines_show(struct seq_file *s, void *data)
575{
576	struct hl_debugfs_entry *entry = s->private;
577	struct hl_dbg_device_entry *dev_entry = entry->dev_entry;
578	struct hl_device *hdev = dev_entry->hdev;
579	struct engines_data eng_data;
580
581	if (hdev->reset_info.in_reset) {
582		dev_warn_ratelimited(hdev->dev,
583				"Can't check device idle during reset\n");
584		return 0;
585	}
586
587	eng_data.actual_size = 0;
588	eng_data.allocated_buf_size = HL_ENGINES_DATA_MAX_SIZE;
589	eng_data.buf = vmalloc(eng_data.allocated_buf_size);
590	if (!eng_data.buf)
591		return -ENOMEM;
592
593	hdev->asic_funcs->is_device_idle(hdev, NULL, 0, &eng_data);
594
595	if (eng_data.actual_size > eng_data.allocated_buf_size) {
596		dev_err(hdev->dev,
597				"Engines data size (%d Bytes) is bigger than allocated size (%u Bytes)\n",
598				eng_data.actual_size, eng_data.allocated_buf_size);
599		vfree(eng_data.buf);
600		return -ENOMEM;
601	}
602
603	seq_write(s, eng_data.buf, eng_data.actual_size);
604
605	vfree(eng_data.buf);
606
607	return 0;
608}
609
610static ssize_t hl_memory_scrub(struct file *f, const char __user *buf,
611					size_t count, loff_t *ppos)
612{
613	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
614	struct hl_device *hdev = entry->hdev;
615	u64 val = hdev->memory_scrub_val;
616	int rc;
617
618	if (!hl_device_operational(hdev, NULL)) {
619		dev_warn_ratelimited(hdev->dev, "Can't scrub memory, device is not operational\n");
620		return -EIO;
621	}
622
623	mutex_lock(&hdev->fpriv_list_lock);
624	if (hdev->is_compute_ctx_active) {
625		mutex_unlock(&hdev->fpriv_list_lock);
626		dev_err(hdev->dev, "can't scrub dram, context exist\n");
627		return -EBUSY;
628	}
629	hdev->is_in_dram_scrub = true;
630	mutex_unlock(&hdev->fpriv_list_lock);
631
632	rc = hdev->asic_funcs->scrub_device_dram(hdev, val);
633
634	mutex_lock(&hdev->fpriv_list_lock);
635	hdev->is_in_dram_scrub = false;
636	mutex_unlock(&hdev->fpriv_list_lock);
637
638	if (rc)
639		return rc;
640	return count;
641}
642
643static bool hl_is_device_va(struct hl_device *hdev, u64 addr)
644{
645	struct asic_fixed_properties *prop = &hdev->asic_prop;
646
647	if (prop->dram_supports_virtual_memory &&
648		(addr >= prop->dmmu.start_addr && addr < prop->dmmu.end_addr))
649		return true;
650
651	if (addr >= prop->pmmu.start_addr &&
652		addr < prop->pmmu.end_addr)
653		return true;
654
655	if (addr >= prop->pmmu_huge.start_addr &&
656		addr < prop->pmmu_huge.end_addr)
657		return true;
658
659	return false;
660}
661
662static bool hl_is_device_internal_memory_va(struct hl_device *hdev, u64 addr,
663						u32 size)
664{
665	struct asic_fixed_properties *prop = &hdev->asic_prop;
666	u64 dram_start_addr, dram_end_addr;
667
668	if (prop->dram_supports_virtual_memory) {
669		dram_start_addr = prop->dmmu.start_addr;
670		dram_end_addr = prop->dmmu.end_addr;
671	} else {
672		dram_start_addr = prop->dram_base_address;
673		dram_end_addr = prop->dram_end_address;
674	}
675
676	if (hl_mem_area_inside_range(addr, size, dram_start_addr,
677					dram_end_addr))
678		return true;
679
680	if (hl_mem_area_inside_range(addr, size, prop->sram_base_address,
681					prop->sram_end_address))
682		return true;
683
684	return false;
685}
686
687static int device_va_to_pa(struct hl_device *hdev, u64 virt_addr, u32 size,
688			u64 *phys_addr)
689{
690	struct hl_vm_phys_pg_pack *phys_pg_pack;
691	struct hl_ctx *ctx;
692	struct hl_vm_hash_node *hnode;
693	u64 end_address, range_size;
694	struct hl_userptr *userptr;
695	enum vm_type *vm_type;
696	bool valid = false;
697	int i, rc = 0;
698
699	ctx = hl_get_compute_ctx(hdev);
700
701	if (!ctx) {
702		dev_err(hdev->dev, "no ctx available\n");
703		return -EINVAL;
704	}
705
706	/* Verify address is mapped */
707	mutex_lock(&ctx->mem_hash_lock);
708	hash_for_each(ctx->mem_hash, i, hnode, node) {
709		vm_type = hnode->ptr;
710
711		if (*vm_type == VM_TYPE_USERPTR) {
712			userptr = hnode->ptr;
713			range_size = userptr->size;
714		} else {
715			phys_pg_pack = hnode->ptr;
716			range_size = phys_pg_pack->total_size;
717		}
718
719		end_address = virt_addr + size;
720		if ((virt_addr >= hnode->vaddr) &&
721				(end_address <= hnode->vaddr + range_size)) {
722			valid = true;
723			break;
724		}
725	}
726	mutex_unlock(&ctx->mem_hash_lock);
727
728	if (!valid) {
729		dev_err(hdev->dev,
730			"virt addr 0x%llx is not mapped\n",
731			virt_addr);
732		rc = -EINVAL;
733		goto put_ctx;
734	}
735
736	rc = hl_mmu_va_to_pa(ctx, virt_addr, phys_addr);
737	if (rc) {
738		dev_err(hdev->dev,
739			"virt addr 0x%llx is not mapped to phys addr\n",
740			virt_addr);
741		rc = -EINVAL;
742	}
743
744put_ctx:
745	hl_ctx_put(ctx);
746
747	return rc;
748}
749
750static int hl_access_dev_mem_by_region(struct hl_device *hdev, u64 addr,
751		u64 *val, enum debugfs_access_type acc_type, bool *found)
752{
753	size_t acc_size = (acc_type == DEBUGFS_READ64 || acc_type == DEBUGFS_WRITE64) ?
754		sizeof(u64) : sizeof(u32);
755	struct pci_mem_region *mem_reg;
756	int i;
757
758	for (i = 0; i < PCI_REGION_NUMBER; i++) {
759		mem_reg = &hdev->pci_mem_region[i];
760		if (!mem_reg->used)
761			continue;
762		if (addr >= mem_reg->region_base &&
763			addr <= mem_reg->region_base + mem_reg->region_size - acc_size) {
764			*found = true;
765			return hdev->asic_funcs->access_dev_mem(hdev, i, addr, val, acc_type);
766		}
767	}
768	return 0;
769}
770
771static void hl_access_host_mem(struct hl_device *hdev, u64 addr, u64 *val,
772		enum debugfs_access_type acc_type)
773{
774	struct asic_fixed_properties *prop = &hdev->asic_prop;
775	u64 offset = prop->device_dma_offset_for_host_access;
776
777	switch (acc_type) {
778	case DEBUGFS_READ32:
779		*val = *(u32 *) phys_to_virt(addr - offset);
780		break;
781	case DEBUGFS_WRITE32:
782		*(u32 *) phys_to_virt(addr - offset) = *val;
783		break;
784	case DEBUGFS_READ64:
785		*val = *(u64 *) phys_to_virt(addr - offset);
786		break;
787	case DEBUGFS_WRITE64:
788		*(u64 *) phys_to_virt(addr - offset) = *val;
789		break;
790	default:
791		dev_err(hdev->dev, "hostmem access-type %d id not supported\n", acc_type);
792		break;
793	}
794}
795
796static int hl_access_mem(struct hl_device *hdev, u64 addr, u64 *val,
797				enum debugfs_access_type acc_type)
798{
799	size_t acc_size = (acc_type == DEBUGFS_READ64 || acc_type == DEBUGFS_WRITE64) ?
800		sizeof(u64) : sizeof(u32);
801	u64 host_start = hdev->asic_prop.host_base_address;
802	u64 host_end = hdev->asic_prop.host_end_address;
803	bool user_address, found = false;
804	int rc;
805
806	user_address = hl_is_device_va(hdev, addr);
807	if (user_address) {
808		rc = device_va_to_pa(hdev, addr, acc_size, &addr);
809		if (rc)
810			return rc;
811	}
812
813	rc = hl_access_dev_mem_by_region(hdev, addr, val, acc_type, &found);
814	if (rc) {
815		dev_err(hdev->dev,
816			"Failed reading addr %#llx from dev mem (%d)\n",
817			addr, rc);
818		return rc;
819	}
820
821	if (found)
822		return 0;
823
824	if (!user_address || device_iommu_mapped(&hdev->pdev->dev)) {
825		rc = -EINVAL;
826		goto err;
827	}
828
829	if (addr >= host_start && addr <= host_end - acc_size) {
830		hl_access_host_mem(hdev, addr, val, acc_type);
831	} else {
832		rc = -EINVAL;
833		goto err;
834	}
835
836	return 0;
837err:
838	dev_err(hdev->dev, "invalid addr %#llx\n", addr);
839	return rc;
840}
841
842static ssize_t hl_data_read32(struct file *f, char __user *buf,
843					size_t count, loff_t *ppos)
844{
845	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
846	struct hl_device *hdev = entry->hdev;
847	u64 value64, addr = entry->addr;
848	char tmp_buf[32];
849	ssize_t rc;
850	u32 val;
851
852	if (hdev->reset_info.in_reset) {
853		dev_warn_ratelimited(hdev->dev, "Can't read during reset\n");
854		return 0;
855	}
856
857	if (*ppos)
858		return 0;
859
860	rc = hl_access_mem(hdev, addr, &value64, DEBUGFS_READ32);
861	if (rc)
862		return rc;
863
864	val = value64; /* downcast back to 32 */
865
866	sprintf(tmp_buf, "0x%08x\n", val);
867	return simple_read_from_buffer(buf, count, ppos, tmp_buf,
868			strlen(tmp_buf));
869}
870
871static ssize_t hl_data_write32(struct file *f, const char __user *buf,
872					size_t count, loff_t *ppos)
873{
874	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
875	struct hl_device *hdev = entry->hdev;
876	u64 value64, addr = entry->addr;
877	u32 value;
878	ssize_t rc;
879
880	if (hdev->reset_info.in_reset) {
881		dev_warn_ratelimited(hdev->dev, "Can't write during reset\n");
882		return 0;
883	}
884
885	rc = kstrtouint_from_user(buf, count, 16, &value);
886	if (rc)
887		return rc;
888
889	value64 = value;
890	rc = hl_access_mem(hdev, addr, &value64, DEBUGFS_WRITE32);
891	if (rc)
892		return rc;
893
894	return count;
895}
896
897static ssize_t hl_data_read64(struct file *f, char __user *buf,
898					size_t count, loff_t *ppos)
899{
900	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
901	struct hl_device *hdev = entry->hdev;
902	u64 addr = entry->addr;
903	char tmp_buf[32];
904	ssize_t rc;
905	u64 val;
906
907	if (hdev->reset_info.in_reset) {
908		dev_warn_ratelimited(hdev->dev, "Can't read during reset\n");
909		return 0;
910	}
911
912	if (*ppos)
913		return 0;
914
915	rc = hl_access_mem(hdev, addr, &val, DEBUGFS_READ64);
916	if (rc)
917		return rc;
918
919	sprintf(tmp_buf, "0x%016llx\n", val);
920	return simple_read_from_buffer(buf, count, ppos, tmp_buf,
921			strlen(tmp_buf));
922}
923
924static ssize_t hl_data_write64(struct file *f, const char __user *buf,
925					size_t count, loff_t *ppos)
926{
927	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
928	struct hl_device *hdev = entry->hdev;
929	u64 addr = entry->addr;
930	u64 value;
931	ssize_t rc;
932
933	if (hdev->reset_info.in_reset) {
934		dev_warn_ratelimited(hdev->dev, "Can't write during reset\n");
935		return 0;
936	}
937
938	rc = kstrtoull_from_user(buf, count, 16, &value);
939	if (rc)
940		return rc;
941
942	rc = hl_access_mem(hdev, addr, &value, DEBUGFS_WRITE64);
943	if (rc)
944		return rc;
945
946	return count;
947}
948
949static ssize_t hl_dma_size_write(struct file *f, const char __user *buf,
950					size_t count, loff_t *ppos)
951{
952	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
953	struct hl_device *hdev = entry->hdev;
954	u64 addr = entry->addr;
955	ssize_t rc;
956	u32 size;
957
958	if (hdev->reset_info.in_reset) {
959		dev_warn_ratelimited(hdev->dev, "Can't DMA during reset\n");
960		return 0;
961	}
962	rc = kstrtouint_from_user(buf, count, 16, &size);
963	if (rc)
964		return rc;
965
966	if (!size) {
967		dev_err(hdev->dev, "DMA read failed. size can't be 0\n");
968		return -EINVAL;
969	}
970
971	if (size > SZ_128M) {
972		dev_err(hdev->dev,
973			"DMA read failed. size can't be larger than 128MB\n");
974		return -EINVAL;
975	}
976
977	if (!hl_is_device_internal_memory_va(hdev, addr, size)) {
978		dev_err(hdev->dev,
979			"DMA read failed. Invalid 0x%010llx + 0x%08x\n",
980			addr, size);
981		return -EINVAL;
982	}
983
984	/* Free the previous allocation, if there was any */
985	entry->data_dma_blob_desc.size = 0;
986	vfree(entry->data_dma_blob_desc.data);
987
988	entry->data_dma_blob_desc.data = vmalloc(size);
989	if (!entry->data_dma_blob_desc.data)
990		return -ENOMEM;
991
992	rc = hdev->asic_funcs->debugfs_read_dma(hdev, addr, size,
993						entry->data_dma_blob_desc.data);
994	if (rc) {
995		dev_err(hdev->dev, "Failed to DMA from 0x%010llx\n", addr);
996		vfree(entry->data_dma_blob_desc.data);
997		entry->data_dma_blob_desc.data = NULL;
998		return -EIO;
999	}
1000
1001	entry->data_dma_blob_desc.size = size;
1002
1003	return count;
1004}
1005
1006static ssize_t hl_monitor_dump_trigger(struct file *f, const char __user *buf,
1007					size_t count, loff_t *ppos)
1008{
1009	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1010	struct hl_device *hdev = entry->hdev;
1011	u32 size, trig;
1012	ssize_t rc;
1013
1014	if (hdev->reset_info.in_reset) {
1015		dev_warn_ratelimited(hdev->dev, "Can't dump monitors during reset\n");
1016		return 0;
1017	}
1018	rc = kstrtouint_from_user(buf, count, 10, &trig);
1019	if (rc)
1020		return rc;
1021
1022	if (trig != 1) {
1023		dev_err(hdev->dev, "Must write 1 to trigger monitor dump\n");
1024		return -EINVAL;
1025	}
1026
1027	size = sizeof(struct cpucp_monitor_dump);
1028
1029	/* Free the previous allocation, if there was any */
1030	entry->mon_dump_blob_desc.size = 0;
1031	vfree(entry->mon_dump_blob_desc.data);
1032
1033	entry->mon_dump_blob_desc.data = vmalloc(size);
1034	if (!entry->mon_dump_blob_desc.data)
1035		return -ENOMEM;
1036
1037	rc = hdev->asic_funcs->get_monitor_dump(hdev, entry->mon_dump_blob_desc.data);
1038	if (rc) {
1039		dev_err(hdev->dev, "Failed to dump monitors\n");
1040		vfree(entry->mon_dump_blob_desc.data);
1041		entry->mon_dump_blob_desc.data = NULL;
1042		return -EIO;
1043	}
1044
1045	entry->mon_dump_blob_desc.size = size;
1046
1047	return count;
1048}
1049
1050static ssize_t hl_get_power_state(struct file *f, char __user *buf,
1051		size_t count, loff_t *ppos)
1052{
1053	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1054	struct hl_device *hdev = entry->hdev;
1055	char tmp_buf[200];
1056	int i;
1057
1058	if (*ppos)
1059		return 0;
1060
1061	if (hdev->pdev->current_state == PCI_D0)
1062		i = 1;
1063	else if (hdev->pdev->current_state == PCI_D3hot)
1064		i = 2;
1065	else
1066		i = 3;
1067
1068	sprintf(tmp_buf,
1069		"current power state: %d\n1 - D0\n2 - D3hot\n3 - Unknown\n", i);
1070	return simple_read_from_buffer(buf, count, ppos, tmp_buf,
1071			strlen(tmp_buf));
1072}
1073
1074static ssize_t hl_set_power_state(struct file *f, const char __user *buf,
1075					size_t count, loff_t *ppos)
1076{
1077	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1078	struct hl_device *hdev = entry->hdev;
1079	u32 value;
1080	ssize_t rc;
1081
1082	rc = kstrtouint_from_user(buf, count, 10, &value);
1083	if (rc)
1084		return rc;
1085
1086	if (value == 1) {
1087		pci_set_power_state(hdev->pdev, PCI_D0);
1088		pci_restore_state(hdev->pdev);
1089		rc = pci_enable_device(hdev->pdev);
1090		if (rc < 0)
1091			return rc;
1092	} else if (value == 2) {
1093		pci_save_state(hdev->pdev);
1094		pci_disable_device(hdev->pdev);
1095		pci_set_power_state(hdev->pdev, PCI_D3hot);
1096	} else {
1097		dev_dbg(hdev->dev, "invalid power state value %u\n", value);
1098		return -EINVAL;
1099	}
1100
1101	return count;
1102}
1103
1104static ssize_t hl_i2c_data_read(struct file *f, char __user *buf,
1105					size_t count, loff_t *ppos)
1106{
1107	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1108	struct hl_device *hdev = entry->hdev;
1109	char tmp_buf[32];
1110	u64 val;
1111	ssize_t rc;
1112
1113	if (*ppos)
1114		return 0;
1115
1116	rc = hl_debugfs_i2c_read(hdev, entry->i2c_bus, entry->i2c_addr,
1117			entry->i2c_reg, entry->i2c_len, &val);
1118	if (rc) {
1119		dev_err(hdev->dev,
1120			"Failed to read from I2C bus %d, addr %d, reg %d, len %d\n",
1121			entry->i2c_bus, entry->i2c_addr, entry->i2c_reg, entry->i2c_len);
1122		return rc;
1123	}
1124
1125	sprintf(tmp_buf, "%#02llx\n", val);
1126	rc = simple_read_from_buffer(buf, count, ppos, tmp_buf,
1127			strlen(tmp_buf));
1128
1129	return rc;
1130}
1131
1132static ssize_t hl_i2c_data_write(struct file *f, const char __user *buf,
1133					size_t count, loff_t *ppos)
1134{
1135	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1136	struct hl_device *hdev = entry->hdev;
1137	u64 value;
1138	ssize_t rc;
1139
1140	rc = kstrtou64_from_user(buf, count, 16, &value);
1141	if (rc)
1142		return rc;
1143
1144	rc = hl_debugfs_i2c_write(hdev, entry->i2c_bus, entry->i2c_addr,
1145			entry->i2c_reg, entry->i2c_len, value);
1146	if (rc) {
1147		dev_err(hdev->dev,
1148			"Failed to write %#02llx to I2C bus %d, addr %d, reg %d, len %d\n",
1149			value, entry->i2c_bus, entry->i2c_addr, entry->i2c_reg, entry->i2c_len);
1150		return rc;
1151	}
1152
1153	return count;
1154}
1155
1156static ssize_t hl_led0_write(struct file *f, const char __user *buf,
1157					size_t count, loff_t *ppos)
1158{
1159	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1160	struct hl_device *hdev = entry->hdev;
1161	u32 value;
1162	ssize_t rc;
1163
1164	rc = kstrtouint_from_user(buf, count, 10, &value);
1165	if (rc)
1166		return rc;
1167
1168	value = value ? 1 : 0;
1169
1170	hl_debugfs_led_set(hdev, 0, value);
1171
1172	return count;
1173}
1174
1175static ssize_t hl_led1_write(struct file *f, const char __user *buf,
1176					size_t count, loff_t *ppos)
1177{
1178	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1179	struct hl_device *hdev = entry->hdev;
1180	u32 value;
1181	ssize_t rc;
1182
1183	rc = kstrtouint_from_user(buf, count, 10, &value);
1184	if (rc)
1185		return rc;
1186
1187	value = value ? 1 : 0;
1188
1189	hl_debugfs_led_set(hdev, 1, value);
1190
1191	return count;
1192}
1193
1194static ssize_t hl_led2_write(struct file *f, const char __user *buf,
1195					size_t count, loff_t *ppos)
1196{
1197	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1198	struct hl_device *hdev = entry->hdev;
1199	u32 value;
1200	ssize_t rc;
1201
1202	rc = kstrtouint_from_user(buf, count, 10, &value);
1203	if (rc)
1204		return rc;
1205
1206	value = value ? 1 : 0;
1207
1208	hl_debugfs_led_set(hdev, 2, value);
1209
1210	return count;
1211}
1212
1213static ssize_t hl_device_read(struct file *f, char __user *buf,
1214					size_t count, loff_t *ppos)
1215{
1216	static const char *help =
1217		"Valid values: disable, enable, suspend, resume, cpu_timeout\n";
1218	return simple_read_from_buffer(buf, count, ppos, help, strlen(help));
1219}
1220
1221static ssize_t hl_device_write(struct file *f, const char __user *buf,
1222				     size_t count, loff_t *ppos)
1223{
1224	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1225	struct hl_device *hdev = entry->hdev;
1226	char data[30] = {0};
1227
1228	/* don't allow partial writes */
1229	if (*ppos != 0)
1230		return 0;
1231
1232	simple_write_to_buffer(data, 29, ppos, buf, count);
1233
1234	if (strncmp("disable", data, strlen("disable")) == 0) {
1235		hdev->disabled = true;
1236	} else if (strncmp("enable", data, strlen("enable")) == 0) {
1237		hdev->disabled = false;
1238	} else if (strncmp("suspend", data, strlen("suspend")) == 0) {
1239		hdev->asic_funcs->suspend(hdev);
1240	} else if (strncmp("resume", data, strlen("resume")) == 0) {
1241		hdev->asic_funcs->resume(hdev);
1242	} else if (strncmp("cpu_timeout", data, strlen("cpu_timeout")) == 0) {
1243		hdev->device_cpu_disabled = true;
1244	} else {
1245		dev_err(hdev->dev,
1246			"Valid values: disable, enable, suspend, resume, cpu_timeout\n");
1247		count = -EINVAL;
1248	}
1249
1250	return count;
1251}
1252
1253static ssize_t hl_clk_gate_read(struct file *f, char __user *buf,
1254					size_t count, loff_t *ppos)
1255{
1256	return 0;
1257}
1258
1259static ssize_t hl_clk_gate_write(struct file *f, const char __user *buf,
1260				     size_t count, loff_t *ppos)
1261{
1262	return count;
1263}
1264
1265static ssize_t hl_stop_on_err_read(struct file *f, char __user *buf,
1266					size_t count, loff_t *ppos)
1267{
1268	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1269	struct hl_device *hdev = entry->hdev;
1270	char tmp_buf[200];
1271	ssize_t rc;
1272
1273	if (!hdev->asic_prop.configurable_stop_on_err)
1274		return -EOPNOTSUPP;
1275
1276	if (*ppos)
1277		return 0;
1278
1279	sprintf(tmp_buf, "%d\n", hdev->stop_on_err);
1280	rc = simple_read_from_buffer(buf, strlen(tmp_buf) + 1, ppos, tmp_buf,
1281			strlen(tmp_buf) + 1);
1282
1283	return rc;
1284}
1285
1286static ssize_t hl_stop_on_err_write(struct file *f, const char __user *buf,
1287				     size_t count, loff_t *ppos)
1288{
1289	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1290	struct hl_device *hdev = entry->hdev;
1291	u32 value;
1292	ssize_t rc;
1293
1294	if (!hdev->asic_prop.configurable_stop_on_err)
1295		return -EOPNOTSUPP;
1296
1297	if (hdev->reset_info.in_reset) {
1298		dev_warn_ratelimited(hdev->dev,
1299				"Can't change stop on error during reset\n");
1300		return 0;
1301	}
1302
1303	rc = kstrtouint_from_user(buf, count, 10, &value);
1304	if (rc)
1305		return rc;
1306
1307	hdev->stop_on_err = value ? 1 : 0;
1308
1309	hl_device_reset(hdev, 0);
1310
1311	return count;
1312}
1313
1314static ssize_t hl_security_violations_read(struct file *f, char __user *buf,
1315					size_t count, loff_t *ppos)
1316{
1317	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1318	struct hl_device *hdev = entry->hdev;
1319
1320	hdev->asic_funcs->ack_protection_bits_errors(hdev);
1321
1322	return 0;
1323}
1324
1325static ssize_t hl_state_dump_read(struct file *f, char __user *buf,
1326					size_t count, loff_t *ppos)
1327{
1328	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1329	ssize_t rc;
1330
1331	down_read(&entry->state_dump_sem);
1332	if (!entry->state_dump[entry->state_dump_head])
1333		rc = 0;
1334	else
1335		rc = simple_read_from_buffer(
1336			buf, count, ppos,
1337			entry->state_dump[entry->state_dump_head],
1338			strlen(entry->state_dump[entry->state_dump_head]));
1339	up_read(&entry->state_dump_sem);
1340
1341	return rc;
1342}
1343
1344static ssize_t hl_state_dump_write(struct file *f, const char __user *buf,
1345					size_t count, loff_t *ppos)
1346{
1347	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1348	struct hl_device *hdev = entry->hdev;
1349	ssize_t rc;
1350	u32 size;
1351	int i;
1352
1353	rc = kstrtouint_from_user(buf, count, 10, &size);
1354	if (rc)
1355		return rc;
1356
1357	if (size <= 0 || size >= ARRAY_SIZE(entry->state_dump)) {
1358		dev_err(hdev->dev, "Invalid number of dumps to skip\n");
1359		return -EINVAL;
1360	}
1361
1362	if (entry->state_dump[entry->state_dump_head]) {
1363		down_write(&entry->state_dump_sem);
1364		for (i = 0; i < size; ++i) {
1365			vfree(entry->state_dump[entry->state_dump_head]);
1366			entry->state_dump[entry->state_dump_head] = NULL;
1367			if (entry->state_dump_head > 0)
1368				entry->state_dump_head--;
1369			else
1370				entry->state_dump_head =
1371					ARRAY_SIZE(entry->state_dump) - 1;
1372		}
1373		up_write(&entry->state_dump_sem);
1374	}
1375
1376	return count;
1377}
1378
1379static ssize_t hl_timeout_locked_read(struct file *f, char __user *buf,
1380					size_t count, loff_t *ppos)
1381{
1382	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1383	struct hl_device *hdev = entry->hdev;
1384	char tmp_buf[200];
1385	ssize_t rc;
1386
1387	if (*ppos)
1388		return 0;
1389
1390	sprintf(tmp_buf, "%d\n",
1391		jiffies_to_msecs(hdev->timeout_jiffies) / 1000);
1392	rc = simple_read_from_buffer(buf, strlen(tmp_buf) + 1, ppos, tmp_buf,
1393			strlen(tmp_buf) + 1);
1394
1395	return rc;
1396}
1397
1398static ssize_t hl_timeout_locked_write(struct file *f, const char __user *buf,
1399				     size_t count, loff_t *ppos)
1400{
1401	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1402	struct hl_device *hdev = entry->hdev;
1403	u32 value;
1404	ssize_t rc;
1405
1406	rc = kstrtouint_from_user(buf, count, 10, &value);
1407	if (rc)
1408		return rc;
1409
1410	if (value)
1411		hdev->timeout_jiffies = msecs_to_jiffies(value * 1000);
1412	else
1413		hdev->timeout_jiffies = MAX_SCHEDULE_TIMEOUT;
1414
1415	return count;
1416}
1417
1418static ssize_t hl_check_razwi_happened(struct file *f, char __user *buf,
1419					size_t count, loff_t *ppos)
1420{
1421	struct hl_dbg_device_entry *entry = file_inode(f)->i_private;
1422	struct hl_device *hdev = entry->hdev;
1423
1424	hdev->asic_funcs->check_if_razwi_happened(hdev);
1425
1426	return 0;
1427}
1428
1429static const struct file_operations hl_mem_scrub_fops = {
1430	.owner = THIS_MODULE,
1431	.write = hl_memory_scrub,
1432};
1433
1434static const struct file_operations hl_data32b_fops = {
1435	.owner = THIS_MODULE,
1436	.read = hl_data_read32,
1437	.write = hl_data_write32
1438};
1439
1440static const struct file_operations hl_data64b_fops = {
1441	.owner = THIS_MODULE,
1442	.read = hl_data_read64,
1443	.write = hl_data_write64
1444};
1445
1446static const struct file_operations hl_dma_size_fops = {
1447	.owner = THIS_MODULE,
1448	.write = hl_dma_size_write
1449};
1450
1451static const struct file_operations hl_monitor_dump_fops = {
1452	.owner = THIS_MODULE,
1453	.write = hl_monitor_dump_trigger
1454};
1455
1456static const struct file_operations hl_i2c_data_fops = {
1457	.owner = THIS_MODULE,
1458	.read = hl_i2c_data_read,
1459	.write = hl_i2c_data_write
1460};
1461
1462static const struct file_operations hl_power_fops = {
1463	.owner = THIS_MODULE,
1464	.read = hl_get_power_state,
1465	.write = hl_set_power_state
1466};
1467
1468static const struct file_operations hl_led0_fops = {
1469	.owner = THIS_MODULE,
1470	.write = hl_led0_write
1471};
1472
1473static const struct file_operations hl_led1_fops = {
1474	.owner = THIS_MODULE,
1475	.write = hl_led1_write
1476};
1477
1478static const struct file_operations hl_led2_fops = {
1479	.owner = THIS_MODULE,
1480	.write = hl_led2_write
1481};
1482
1483static const struct file_operations hl_device_fops = {
1484	.owner = THIS_MODULE,
1485	.read = hl_device_read,
1486	.write = hl_device_write
1487};
1488
1489static const struct file_operations hl_clk_gate_fops = {
1490	.owner = THIS_MODULE,
1491	.read = hl_clk_gate_read,
1492	.write = hl_clk_gate_write
1493};
1494
1495static const struct file_operations hl_stop_on_err_fops = {
1496	.owner = THIS_MODULE,
1497	.read = hl_stop_on_err_read,
1498	.write = hl_stop_on_err_write
1499};
1500
1501static const struct file_operations hl_security_violations_fops = {
1502	.owner = THIS_MODULE,
1503	.read = hl_security_violations_read
1504};
1505
1506static const struct file_operations hl_state_dump_fops = {
1507	.owner = THIS_MODULE,
1508	.read = hl_state_dump_read,
1509	.write = hl_state_dump_write
1510};
1511
1512static const struct file_operations hl_timeout_locked_fops = {
1513	.owner = THIS_MODULE,
1514	.read = hl_timeout_locked_read,
1515	.write = hl_timeout_locked_write
1516};
1517
1518static const struct file_operations hl_razwi_check_fops = {
1519	.owner = THIS_MODULE,
1520	.read = hl_check_razwi_happened
1521};
1522
1523static const struct hl_info_list hl_debugfs_list[] = {
1524	{"command_buffers", command_buffers_show, NULL},
1525	{"command_submission", command_submission_show, NULL},
1526	{"command_submission_jobs", command_submission_jobs_show, NULL},
1527	{"userptr", userptr_show, NULL},
1528	{"vm", vm_show, NULL},
1529	{"userptr_lookup", userptr_lookup_show, userptr_lookup_write},
1530	{"mmu", mmu_show, mmu_asid_va_write},
1531	{"mmu_error", mmu_ack_error, mmu_ack_error_value_write},
1532	{"engines", engines_show, NULL},
1533};
1534
1535static int hl_debugfs_open(struct inode *inode, struct file *file)
1536{
1537	struct hl_debugfs_entry *node = inode->i_private;
1538
1539	return single_open(file, node->info_ent->show, node);
1540}
1541
1542static ssize_t hl_debugfs_write(struct file *file, const char __user *buf,
1543		size_t count, loff_t *f_pos)
1544{
1545	struct hl_debugfs_entry *node = file->f_inode->i_private;
1546
1547	if (node->info_ent->write)
1548		return node->info_ent->write(file, buf, count, f_pos);
1549	else
1550		return -EINVAL;
1551
1552}
1553
1554static const struct file_operations hl_debugfs_fops = {
1555	.owner = THIS_MODULE,
1556	.open = hl_debugfs_open,
1557	.read = seq_read,
1558	.write = hl_debugfs_write,
1559	.llseek = seq_lseek,
1560	.release = single_release,
1561};
1562
1563static void add_secured_nodes(struct hl_dbg_device_entry *dev_entry, struct dentry *root)
1564{
1565	debugfs_create_u8("i2c_bus",
1566				0644,
1567				root,
1568				&dev_entry->i2c_bus);
1569
1570	debugfs_create_u8("i2c_addr",
1571				0644,
1572				root,
1573				&dev_entry->i2c_addr);
1574
1575	debugfs_create_u8("i2c_reg",
1576				0644,
1577				root,
1578				&dev_entry->i2c_reg);
1579
1580	debugfs_create_u8("i2c_len",
1581				0644,
1582				root,
1583				&dev_entry->i2c_len);
1584
1585	debugfs_create_file("i2c_data",
1586				0644,
1587				root,
1588				dev_entry,
1589				&hl_i2c_data_fops);
1590
1591	debugfs_create_file("led0",
1592				0200,
1593				root,
1594				dev_entry,
1595				&hl_led0_fops);
1596
1597	debugfs_create_file("led1",
1598				0200,
1599				root,
1600				dev_entry,
1601				&hl_led1_fops);
1602
1603	debugfs_create_file("led2",
1604				0200,
1605				root,
1606				dev_entry,
1607				&hl_led2_fops);
1608}
1609
1610static void add_files_to_device(struct hl_device *hdev, struct hl_dbg_device_entry *dev_entry,
1611				struct dentry *root)
1612{
1613	int count = ARRAY_SIZE(hl_debugfs_list);
1614	struct hl_debugfs_entry *entry;
1615	int i;
1616
1617	debugfs_create_x64("memory_scrub_val",
1618				0644,
1619				root,
1620				&hdev->memory_scrub_val);
1621
1622	debugfs_create_file("memory_scrub",
1623				0200,
1624				root,
1625				dev_entry,
1626				&hl_mem_scrub_fops);
1627
1628	debugfs_create_x64("addr",
1629				0644,
1630				root,
1631				&dev_entry->addr);
1632
1633	debugfs_create_file("data32",
1634				0644,
1635				root,
1636				dev_entry,
1637				&hl_data32b_fops);
1638
1639	debugfs_create_file("data64",
1640				0644,
1641				root,
1642				dev_entry,
1643				&hl_data64b_fops);
1644
1645	debugfs_create_file("set_power_state",
1646				0644,
1647				root,
1648				dev_entry,
1649				&hl_power_fops);
1650
1651	debugfs_create_file("device",
1652				0644,
1653				root,
1654				dev_entry,
1655				&hl_device_fops);
1656
1657	debugfs_create_file("clk_gate",
1658				0644,
1659				root,
1660				dev_entry,
1661				&hl_clk_gate_fops);
1662
1663	debugfs_create_file("stop_on_err",
1664				0644,
1665				root,
1666				dev_entry,
1667				&hl_stop_on_err_fops);
1668
1669	debugfs_create_file("dump_security_violations",
1670				0400,
1671				root,
1672				dev_entry,
1673				&hl_security_violations_fops);
1674
1675	debugfs_create_file("dump_razwi_events",
1676				0400,
1677				root,
1678				dev_entry,
1679				&hl_razwi_check_fops);
1680
1681	debugfs_create_file("dma_size",
1682				0200,
1683				root,
1684				dev_entry,
1685				&hl_dma_size_fops);
1686
1687	debugfs_create_blob("data_dma",
1688				0400,
1689				root,
1690				&dev_entry->data_dma_blob_desc);
1691
1692	debugfs_create_file("monitor_dump_trig",
1693				0200,
1694				root,
1695				dev_entry,
1696				&hl_monitor_dump_fops);
1697
1698	debugfs_create_blob("monitor_dump",
1699				0400,
1700				root,
1701				&dev_entry->mon_dump_blob_desc);
1702
1703	debugfs_create_x8("skip_reset_on_timeout",
1704				0644,
1705				root,
1706				&hdev->reset_info.skip_reset_on_timeout);
1707
1708	debugfs_create_file("state_dump",
1709				0644,
1710				root,
1711				dev_entry,
1712				&hl_state_dump_fops);
1713
1714	debugfs_create_file("timeout_locked",
1715				0644,
1716				root,
1717				dev_entry,
1718				&hl_timeout_locked_fops);
1719
1720	debugfs_create_u32("device_release_watchdog_timeout",
1721				0644,
1722				root,
1723				&hdev->device_release_watchdog_timeout_sec);
1724
1725	for (i = 0, entry = dev_entry->entry_arr ; i < count ; i++, entry++) {
1726		debugfs_create_file(hl_debugfs_list[i].name,
1727					0644,
1728					root,
1729					entry,
1730					&hl_debugfs_fops);
1731		entry->info_ent = &hl_debugfs_list[i];
1732		entry->dev_entry = dev_entry;
1733	}
1734}
1735
1736int hl_debugfs_device_init(struct hl_device *hdev)
1737{
1738	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1739	int count = ARRAY_SIZE(hl_debugfs_list);
1740
1741	dev_entry->hdev = hdev;
1742	dev_entry->entry_arr = kmalloc_array(count, sizeof(struct hl_debugfs_entry), GFP_KERNEL);
1743	if (!dev_entry->entry_arr)
1744		return -ENOMEM;
1745
1746	dev_entry->data_dma_blob_desc.size = 0;
1747	dev_entry->data_dma_blob_desc.data = NULL;
1748	dev_entry->mon_dump_blob_desc.size = 0;
1749	dev_entry->mon_dump_blob_desc.data = NULL;
1750
1751	INIT_LIST_HEAD(&dev_entry->file_list);
1752	INIT_LIST_HEAD(&dev_entry->cb_list);
1753	INIT_LIST_HEAD(&dev_entry->cs_list);
1754	INIT_LIST_HEAD(&dev_entry->cs_job_list);
1755	INIT_LIST_HEAD(&dev_entry->userptr_list);
1756	INIT_LIST_HEAD(&dev_entry->ctx_mem_hash_list);
1757	mutex_init(&dev_entry->file_mutex);
1758	init_rwsem(&dev_entry->state_dump_sem);
1759	spin_lock_init(&dev_entry->cb_spinlock);
1760	spin_lock_init(&dev_entry->cs_spinlock);
1761	spin_lock_init(&dev_entry->cs_job_spinlock);
1762	spin_lock_init(&dev_entry->userptr_spinlock);
1763	mutex_init(&dev_entry->ctx_mem_hash_mutex);
1764
1765	return 0;
1766}
1767
1768void hl_debugfs_device_fini(struct hl_device *hdev)
1769{
1770	struct hl_dbg_device_entry *entry = &hdev->hl_debugfs;
1771	int i;
1772
1773	mutex_destroy(&entry->ctx_mem_hash_mutex);
1774	mutex_destroy(&entry->file_mutex);
1775
1776	vfree(entry->data_dma_blob_desc.data);
1777	vfree(entry->mon_dump_blob_desc.data);
1778
1779	for (i = 0; i < ARRAY_SIZE(entry->state_dump); ++i)
1780		vfree(entry->state_dump[i]);
1781
1782	kfree(entry->entry_arr);
1783}
1784
1785void hl_debugfs_add_device(struct hl_device *hdev)
1786{
1787	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1788
1789	dev_entry->root = hdev->drm.accel->debugfs_root;
1790
1791	add_files_to_device(hdev, dev_entry, dev_entry->root);
1792
1793	if (!hdev->asic_prop.fw_security_enabled)
1794		add_secured_nodes(dev_entry, dev_entry->root);
1795}
1796
1797void hl_debugfs_add_file(struct hl_fpriv *hpriv)
1798{
1799	struct hl_dbg_device_entry *dev_entry = &hpriv->hdev->hl_debugfs;
1800
1801	mutex_lock(&dev_entry->file_mutex);
1802	list_add(&hpriv->debugfs_list, &dev_entry->file_list);
1803	mutex_unlock(&dev_entry->file_mutex);
1804}
1805
1806void hl_debugfs_remove_file(struct hl_fpriv *hpriv)
1807{
1808	struct hl_dbg_device_entry *dev_entry = &hpriv->hdev->hl_debugfs;
1809
1810	mutex_lock(&dev_entry->file_mutex);
1811	list_del(&hpriv->debugfs_list);
1812	mutex_unlock(&dev_entry->file_mutex);
1813}
1814
1815void hl_debugfs_add_cb(struct hl_cb *cb)
1816{
1817	struct hl_dbg_device_entry *dev_entry = &cb->hdev->hl_debugfs;
1818
1819	spin_lock(&dev_entry->cb_spinlock);
1820	list_add(&cb->debugfs_list, &dev_entry->cb_list);
1821	spin_unlock(&dev_entry->cb_spinlock);
1822}
1823
1824void hl_debugfs_remove_cb(struct hl_cb *cb)
1825{
1826	struct hl_dbg_device_entry *dev_entry = &cb->hdev->hl_debugfs;
1827
1828	spin_lock(&dev_entry->cb_spinlock);
1829	list_del(&cb->debugfs_list);
1830	spin_unlock(&dev_entry->cb_spinlock);
1831}
1832
1833void hl_debugfs_add_cs(struct hl_cs *cs)
1834{
1835	struct hl_dbg_device_entry *dev_entry = &cs->ctx->hdev->hl_debugfs;
1836
1837	spin_lock(&dev_entry->cs_spinlock);
1838	list_add(&cs->debugfs_list, &dev_entry->cs_list);
1839	spin_unlock(&dev_entry->cs_spinlock);
1840}
1841
1842void hl_debugfs_remove_cs(struct hl_cs *cs)
1843{
1844	struct hl_dbg_device_entry *dev_entry = &cs->ctx->hdev->hl_debugfs;
1845
1846	spin_lock(&dev_entry->cs_spinlock);
1847	list_del(&cs->debugfs_list);
1848	spin_unlock(&dev_entry->cs_spinlock);
1849}
1850
1851void hl_debugfs_add_job(struct hl_device *hdev, struct hl_cs_job *job)
1852{
1853	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1854
1855	spin_lock(&dev_entry->cs_job_spinlock);
1856	list_add(&job->debugfs_list, &dev_entry->cs_job_list);
1857	spin_unlock(&dev_entry->cs_job_spinlock);
1858}
1859
1860void hl_debugfs_remove_job(struct hl_device *hdev, struct hl_cs_job *job)
1861{
1862	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1863
1864	spin_lock(&dev_entry->cs_job_spinlock);
1865	list_del(&job->debugfs_list);
1866	spin_unlock(&dev_entry->cs_job_spinlock);
1867}
1868
1869void hl_debugfs_add_userptr(struct hl_device *hdev, struct hl_userptr *userptr)
1870{
1871	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1872
1873	spin_lock(&dev_entry->userptr_spinlock);
1874	list_add(&userptr->debugfs_list, &dev_entry->userptr_list);
1875	spin_unlock(&dev_entry->userptr_spinlock);
1876}
1877
1878void hl_debugfs_remove_userptr(struct hl_device *hdev,
1879				struct hl_userptr *userptr)
1880{
1881	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1882
1883	spin_lock(&dev_entry->userptr_spinlock);
1884	list_del(&userptr->debugfs_list);
1885	spin_unlock(&dev_entry->userptr_spinlock);
1886}
1887
1888void hl_debugfs_add_ctx_mem_hash(struct hl_device *hdev, struct hl_ctx *ctx)
1889{
1890	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1891
1892	mutex_lock(&dev_entry->ctx_mem_hash_mutex);
1893	list_add(&ctx->debugfs_list, &dev_entry->ctx_mem_hash_list);
1894	mutex_unlock(&dev_entry->ctx_mem_hash_mutex);
1895}
1896
1897void hl_debugfs_remove_ctx_mem_hash(struct hl_device *hdev, struct hl_ctx *ctx)
1898{
1899	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1900
1901	mutex_lock(&dev_entry->ctx_mem_hash_mutex);
1902	list_del(&ctx->debugfs_list);
1903	mutex_unlock(&dev_entry->ctx_mem_hash_mutex);
1904}
1905
1906/**
1907 * hl_debugfs_set_state_dump - register state dump making it accessible via
1908 *                             debugfs
1909 * @hdev: pointer to the device structure
1910 * @data: the actual dump data
1911 * @length: the length of the data
1912 */
1913void hl_debugfs_set_state_dump(struct hl_device *hdev, char *data,
1914					unsigned long length)
1915{
1916	struct hl_dbg_device_entry *dev_entry = &hdev->hl_debugfs;
1917
1918	down_write(&dev_entry->state_dump_sem);
1919
1920	dev_entry->state_dump_head = (dev_entry->state_dump_head + 1) %
1921					ARRAY_SIZE(dev_entry->state_dump);
1922	vfree(dev_entry->state_dump[dev_entry->state_dump_head]);
1923	dev_entry->state_dump[dev_entry->state_dump_head] = data;
1924
1925	up_write(&dev_entry->state_dump_sem);
1926}
1927