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