Commit | Line | Data |
---|---|---|
4e43d779 | 1 | // SPDX-License-Identifier: GPL-2.0-only |
3a6a9201 SD |
2 | /* |
3 | * Intel MIC Platform Software Stack (MPSS) | |
4 | * | |
5 | * Copyright(c) 2013 Intel Corporation. | |
6 | * | |
3a6a9201 | 7 | * Intel MIC Host driver. |
3a6a9201 SD |
8 | */ |
9 | #include <linux/debugfs.h> | |
10 | #include <linux/pci.h> | |
11 | #include <linux/seq_file.h> | |
12 | ||
13 | #include <linux/mic_common.h> | |
4aa79961 | 14 | #include "../common/mic_dev.h" |
3a6a9201 SD |
15 | #include "mic_device.h" |
16 | #include "mic_smpt.h" | |
17 | ||
18 | /* Debugfs parent dir */ | |
19 | static struct dentry *mic_dbg; | |
20 | ||
3a6a9201 SD |
21 | static int mic_smpt_show(struct seq_file *s, void *pos) |
22 | { | |
23 | int i; | |
24 | struct mic_device *mdev = s->private; | |
25 | unsigned long flags; | |
26 | ||
27 | seq_printf(s, "MIC %-2d |%-10s| %-14s %-10s\n", | |
ced2c60f | 28 | mdev->id, "SMPT entry", "SW DMA addr", "RefCount"); |
3a6a9201 SD |
29 | seq_puts(s, "====================================================\n"); |
30 | ||
31 | if (mdev->smpt) { | |
32 | struct mic_smpt_info *smpt_info = mdev->smpt; | |
33 | spin_lock_irqsave(&smpt_info->smpt_lock, flags); | |
34 | for (i = 0; i < smpt_info->info.num_reg; i++) { | |
35 | seq_printf(s, "%9s|%-10d| %-#14llx %-10lld\n", | |
ced2c60f AD |
36 | " ", i, smpt_info->entry[i].dma_addr, |
37 | smpt_info->entry[i].ref_count); | |
3a6a9201 SD |
38 | } |
39 | spin_unlock_irqrestore(&smpt_info->smpt_lock, flags); | |
40 | } | |
41 | seq_puts(s, "====================================================\n"); | |
42 | return 0; | |
43 | } | |
44 | ||
2796b43f | 45 | DEFINE_SHOW_ATTRIBUTE(mic_smpt); |
3a6a9201 | 46 | |
3a6a9201 SD |
47 | static int mic_post_code_show(struct seq_file *s, void *pos) |
48 | { | |
49 | struct mic_device *mdev = s->private; | |
50 | u32 reg = mdev->ops->get_postcode(mdev); | |
51 | ||
52 | seq_printf(s, "%c%c", reg & 0xff, (reg >> 8) & 0xff); | |
53 | return 0; | |
54 | } | |
55 | ||
2796b43f | 56 | DEFINE_SHOW_ATTRIBUTE(mic_post_code); |
3a6a9201 | 57 | |
3a6a9201 SD |
58 | static int mic_msi_irq_info_show(struct seq_file *s, void *pos) |
59 | { | |
60 | struct mic_device *mdev = s->private; | |
61 | int reg; | |
62 | int i, j; | |
63 | u16 entry; | |
64 | u16 vector; | |
1da2b3ee | 65 | struct pci_dev *pdev = mdev->pdev; |
3a6a9201 SD |
66 | |
67 | if (pci_dev_msi_enabled(pdev)) { | |
68 | for (i = 0; i < mdev->irq_info.num_vectors; i++) { | |
69 | if (pdev->msix_enabled) { | |
70 | entry = mdev->irq_info.msix_entries[i].entry; | |
71 | vector = mdev->irq_info.msix_entries[i].vector; | |
72 | } else { | |
73 | entry = 0; | |
74 | vector = pdev->irq; | |
75 | } | |
76 | ||
77 | reg = mdev->intr_ops->read_msi_to_src_map(mdev, entry); | |
78 | ||
79 | seq_printf(s, "%s %-10d %s %-10d MXAR[%d]: %08X\n", | |
ced2c60f | 80 | "IRQ:", vector, "Entry:", entry, i, reg); |
3a6a9201 SD |
81 | |
82 | seq_printf(s, "%-10s", "offset:"); | |
83 | for (j = (MIC_NUM_OFFSETS - 1); j >= 0; j--) | |
84 | seq_printf(s, "%4d ", j); | |
85 | seq_puts(s, "\n"); | |
86 | ||
87 | ||
88 | seq_printf(s, "%-10s", "count:"); | |
89 | for (j = (MIC_NUM_OFFSETS - 1); j >= 0; j--) | |
90 | seq_printf(s, "%4d ", | |
ced2c60f AD |
91 | (mdev->irq_info.mic_msi_map[i] & |
92 | BIT(j)) ? 1 : 0); | |
3a6a9201 SD |
93 | seq_puts(s, "\n\n"); |
94 | } | |
95 | } else { | |
96 | seq_puts(s, "MSI/MSIx interrupts not enabled\n"); | |
97 | } | |
98 | ||
99 | return 0; | |
3a6a9201 SD |
100 | } |
101 | ||
2796b43f | 102 | DEFINE_SHOW_ATTRIBUTE(mic_msi_irq_info); |
3a6a9201 | 103 | |
438ad368 | 104 | /* |
3a6a9201 SD |
105 | * mic_create_debug_dir - Initialize MIC debugfs entries. |
106 | */ | |
107 | void mic_create_debug_dir(struct mic_device *mdev) | |
108 | { | |
1da2b3ee AD |
109 | char name[16]; |
110 | ||
3a6a9201 SD |
111 | if (!mic_dbg) |
112 | return; | |
113 | ||
1da2b3ee AD |
114 | scnprintf(name, sizeof(name), "mic%d", mdev->id); |
115 | mdev->dbg_dir = debugfs_create_dir(name, mic_dbg); | |
3a6a9201 | 116 | |
2796b43f YL |
117 | debugfs_create_file("smpt", 0444, mdev->dbg_dir, mdev, |
118 | &mic_smpt_fops); | |
3a6a9201 | 119 | |
ced2c60f | 120 | debugfs_create_file("post_code", 0444, mdev->dbg_dir, mdev, |
2796b43f | 121 | &mic_post_code_fops); |
3a6a9201 | 122 | |
ced2c60f | 123 | debugfs_create_file("msi_irq_info", 0444, mdev->dbg_dir, mdev, |
2796b43f | 124 | &mic_msi_irq_info_fops); |
3a6a9201 SD |
125 | } |
126 | ||
438ad368 | 127 | /* |
3a6a9201 SD |
128 | * mic_delete_debug_dir - Uninitialize MIC debugfs entries. |
129 | */ | |
130 | void mic_delete_debug_dir(struct mic_device *mdev) | |
131 | { | |
3a6a9201 SD |
132 | debugfs_remove_recursive(mdev->dbg_dir); |
133 | } | |
134 | ||
438ad368 | 135 | /* |
3a6a9201 SD |
136 | * mic_init_debugfs - Initialize global debugfs entry. |
137 | */ | |
138 | void __init mic_init_debugfs(void) | |
139 | { | |
140 | mic_dbg = debugfs_create_dir(KBUILD_MODNAME, NULL); | |
3a6a9201 SD |
141 | } |
142 | ||
438ad368 | 143 | /* |
3a6a9201 SD |
144 | * mic_exit_debugfs - Uninitialize global debugfs entry |
145 | */ | |
146 | void mic_exit_debugfs(void) | |
147 | { | |
148 | debugfs_remove(mic_dbg); | |
149 | } |