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