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