xref: /freebsd/sys/dev/qat/qat_common/adf_freebsd_transport_debug.c (revision 8aa51e6d7de0a828020de64560d1385e15955a1c)
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2025 Intel Corporation */
3 #include "qat_freebsd.h"
4 #include "adf_cfg.h"
5 #include "adf_common_drv.h"
6 #include "adf_accel_devices.h"
7 #include "icp_qat_uclo.h"
8 #include "icp_qat_fw.h"
9 #include "icp_qat_fw_init_admin.h"
10 #include "adf_cfg_strings.h"
11 #include "adf_transport_access_macros.h"
12 #include "adf_transport_internal.h"
13 #include <sys/malloc.h>
14 #include <sys/sbuf.h>
15 #include <sys/sysctl.h>
16 #include <sys/systm.h>
17 #include <sys/priv.h>
18 
adf_ring_show(SYSCTL_HANDLER_ARGS)19 static int adf_ring_show(SYSCTL_HANDLER_ARGS)
20 {
21 	struct adf_etr_ring_data *ring = arg1;
22 	struct adf_etr_bank_data *bank = ring->bank;
23 	struct adf_hw_csr_ops *csr_ops = GET_CSR_OPS(bank->accel_dev);
24 	struct resource *csr = ring->bank->csr_addr;
25 	struct sbuf sb;
26 	int error, word;
27 	uint32_t *wp, *end;
28 
29 	if (priv_check(curthread, PRIV_DRIVER) != 0)
30 		return EPERM;
31 
32 	sbuf_new_for_sysctl(&sb, NULL, 128, req);
33 	{
34 		int head, tail, empty;
35 
36 		head = csr_ops->read_csr_ring_head(csr,
37 						   bank->bank_number,
38 						   ring->ring_number);
39 		tail = csr_ops->read_csr_ring_tail(csr,
40 						   bank->bank_number,
41 						   ring->ring_number);
42 		empty = csr_ops->read_csr_e_stat(csr, bank->bank_number);
43 
44 		sbuf_cat(&sb, "\n------- Ring configuration -------\n");
45 		sbuf_printf(&sb,
46 			    "ring name: %s\n",
47 			    ring->ring_debug->ring_name);
48 		sbuf_printf(&sb,
49 			    "ring num %d, bank num %d\n",
50 			    ring->ring_number,
51 			    ring->bank->bank_number);
52 		sbuf_printf(&sb,
53 			    "head %x, tail %x, empty: %d\n",
54 			    head,
55 			    tail,
56 			    (empty & 1 << ring->ring_number) >>
57 				ring->ring_number);
58 		sbuf_printf(&sb,
59 			    "ring size %d, msg size %d\n",
60 			    ADF_SIZE_TO_RING_SIZE_IN_BYTES(ring->ring_size),
61 			    ADF_MSG_SIZE_TO_BYTES(ring->msg_size));
62 		sbuf_cat(&sb, "----------- Ring data ------------\n");
63 	}
64 	wp = ring->base_addr;
65 	end = (uint32_t *)((char *)ring->base_addr +
66 			   ADF_SIZE_TO_RING_SIZE_IN_BYTES(ring->ring_size));
67 	while (wp < end) {
68 		sbuf_printf(&sb, "%p:", wp);
69 		for (word = 0; word < 32 / 4; word++, wp++)
70 			sbuf_printf(&sb, " %08x", *wp);
71 		sbuf_printf(&sb, "\n");
72 	}
73 	error = sbuf_finish(&sb);
74 	sbuf_delete(&sb);
75 	return (error);
76 }
77 
78 int
adf_ring_debugfs_add(struct adf_etr_ring_data * ring,const char * name)79 adf_ring_debugfs_add(struct adf_etr_ring_data *ring, const char *name)
80 {
81 	struct adf_etr_ring_debug_entry *ring_debug;
82 	char entry_name[8];
83 
84 	ring_debug = malloc(sizeof(*ring_debug), M_QAT, M_WAITOK | M_ZERO);
85 
86 	strlcpy(ring_debug->ring_name, name, sizeof(ring_debug->ring_name));
87 	snprintf(entry_name,
88 		 sizeof(entry_name),
89 		 "ring_%02d",
90 		 ring->ring_number);
91 
92 	ring_debug->debug =
93 	    SYSCTL_ADD_PROC(&ring->bank->accel_dev->sysctl_ctx,
94 			    SYSCTL_CHILDREN(ring->bank->bank_debug_dir),
95 			    OID_AUTO,
96 			    entry_name,
97 			    CTLFLAG_RD | CTLTYPE_STRING,
98 			    ring,
99 			    0,
100 			    adf_ring_show,
101 			    "A",
102 			    "Ring configuration");
103 
104 	if (!ring_debug->debug) {
105 		printf("QAT: Failed to create ring debug entry.\n");
106 		free(ring_debug, M_QAT);
107 		return EFAULT;
108 	}
109 	ring->ring_debug = ring_debug;
110 	return 0;
111 }
112 
113 void
adf_ring_debugfs_rm(struct adf_etr_ring_data * ring)114 adf_ring_debugfs_rm(struct adf_etr_ring_data *ring)
115 {
116 	if (ring->ring_debug) {
117 		free(ring->ring_debug, M_QAT);
118 		ring->ring_debug = NULL;
119 	}
120 }
121 
adf_bank_show(SYSCTL_HANDLER_ARGS)122 static int adf_bank_show(SYSCTL_HANDLER_ARGS)
123 {
124 	struct adf_etr_bank_data *bank;
125 	struct adf_accel_dev *accel_dev = NULL;
126 	struct adf_hw_csr_ops *csr_ops = NULL;
127 	struct adf_hw_device_data *hw_data = NULL;
128 	u8 num_rings_per_bank = 0;
129 	struct sbuf sb;
130 	int error, ring_id;
131 
132 	if (priv_check(curthread, PRIV_DRIVER) != 0)
133 		return EPERM;
134 
135 	sbuf_new_for_sysctl(&sb, NULL, 128, req);
136 	bank = arg1;
137 	accel_dev = bank->accel_dev;
138 	csr_ops = GET_CSR_OPS(bank->accel_dev);
139 	hw_data = accel_dev->hw_device;
140 	num_rings_per_bank = hw_data->num_rings_per_bank;
141 	sbuf_printf(&sb,
142 		    "\n------- Bank %d configuration -------\n",
143 		    bank->bank_number);
144 	for (ring_id = 0; ring_id < num_rings_per_bank; ring_id++) {
145 		struct adf_etr_ring_data *ring = &bank->rings[ring_id];
146 		struct resource *csr = bank->csr_addr;
147 		int head, tail, empty;
148 
149 		if (!(bank->ring_mask & 1 << ring_id))
150 			continue;
151 
152 		head = csr_ops->read_csr_ring_head(csr,
153 						   bank->bank_number,
154 						   ring->ring_number);
155 		tail = csr_ops->read_csr_ring_tail(csr,
156 						   bank->bank_number,
157 						   ring->ring_number);
158 		empty = csr_ops->read_csr_e_stat(csr, bank->bank_number);
159 
160 		sbuf_printf(&sb,
161 			    "ring num %02d, head %04x, tail %04x, empty: %d\n",
162 			    ring->ring_number,
163 			    head,
164 			    tail,
165 			    (empty & 1 << ring->ring_number) >>
166 				ring->ring_number);
167 	}
168 	error = sbuf_finish(&sb);
169 	sbuf_delete(&sb);
170 	return (error);
171 }
172 
173 int
adf_bank_debugfs_add(struct adf_etr_bank_data * bank)174 adf_bank_debugfs_add(struct adf_etr_bank_data *bank)
175 {
176 	struct adf_accel_dev *accel_dev = bank->accel_dev;
177 	struct sysctl_oid *parent = accel_dev->transport->debug;
178 	char name[9];
179 
180 	snprintf(name, sizeof(name), "bank_%03d", bank->bank_number);
181 
182 	bank->bank_debug_dir = SYSCTL_ADD_NODE(&accel_dev->sysctl_ctx,
183 					       SYSCTL_CHILDREN(parent),
184 					       OID_AUTO,
185 					       name,
186 					       CTLFLAG_RD | CTLFLAG_SKIP,
187 					       NULL,
188 					       "");
189 
190 	if (!bank->bank_debug_dir) {
191 		printf("QAT: Failed to create bank debug dir.\n");
192 		return EFAULT;
193 	}
194 
195 	bank->bank_debug_cfg =
196 	    SYSCTL_ADD_PROC(&accel_dev->sysctl_ctx,
197 			    SYSCTL_CHILDREN(bank->bank_debug_dir),
198 			    OID_AUTO,
199 			    "config",
200 			    CTLFLAG_RD | CTLTYPE_STRING,
201 			    bank,
202 			    0,
203 			    adf_bank_show,
204 			    "A",
205 			    "Bank configuration");
206 
207 	if (!bank->bank_debug_cfg) {
208 		printf("QAT: Failed to create bank debug entry.\n");
209 		return EFAULT;
210 	}
211 
212 	return 0;
213 }
214 
215 void
adf_bank_debugfs_rm(struct adf_etr_bank_data * bank)216 adf_bank_debugfs_rm(struct adf_etr_bank_data *bank)
217 {
218 }
219