1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright(c) 2007-2022 Intel Corporation */
3 /* $FreeBSD$ */
4 #include "adf_c4xxx_hw_data.h"
5 #include "adf_c4xxx_pke_replay_stats.h"
6 #include "adf_common_drv.h"
7 #include "icp_qat_fw_init_admin.h"
8 #include <sys/sbuf.h>
9 #include <sys/sysctl.h>
10 
11 #define PKE_REPLAY_DBG_FILE "pke_replay_stats"
12 #define LINE                                                                   \
13 	"+-----------------------------------------------------------------+\n"
14 #define BANNER                                                                 \
15 	"|             PKE Replay Statistics for Qat Device                |\n"
16 
17 static int qat_pke_replay_counters_show(SYSCTL_HANDLER_ARGS)
18 {
19 	struct sbuf sb;
20 	struct adf_accel_dev *accel_dev = arg1;
21 	int ret = 0;
22 	u64 suc_counter = 0;
23 	u64 unsuc_counter = 0;
24 
25 	sbuf_new_for_sysctl(&sb, NULL, 256, req);
26 
27 	sbuf_printf(&sb, "\n");
28 	sbuf_printf(&sb, LINE);
29 
30 	ret = adf_get_fw_pke_stats(accel_dev, &suc_counter, &unsuc_counter);
31 	if (ret)
32 		return ret;
33 
34 	sbuf_printf(
35 	    &sb,
36 	    "| Successful Replays:    %40llu |\n| Unsuccessful Replays:  %40llu |\n",
37 	    (unsigned long long)suc_counter,
38 	    (unsigned long long)unsuc_counter);
39 
40 	sbuf_finish(&sb);
41 	SYSCTL_OUT(req, sbuf_data(&sb), sbuf_len(&sb));
42 	sbuf_delete(&sb);
43 
44 	return 0;
45 }
46 
47 /**
48  * adf_pke_replay_counters_add_c4xxx() - Create debugfs entry for
49  * acceleration device Freq counters.
50  * @accel_dev:  Pointer to acceleration device.
51  *
52  * Return: 0 on success, error code otherwise.
53  */
54 int
55 adf_pke_replay_counters_add_c4xxx(struct adf_accel_dev *accel_dev)
56 {
57 	struct sysctl_ctx_list *qat_sysctl_ctx = NULL;
58 	struct sysctl_oid *qat_sysctl_tree = NULL;
59 	struct sysctl_oid *pke_rep_file = NULL;
60 
61 	qat_sysctl_ctx =
62 	    device_get_sysctl_ctx(accel_dev->accel_pci_dev.pci_dev);
63 	qat_sysctl_tree =
64 	    device_get_sysctl_tree(accel_dev->accel_pci_dev.pci_dev);
65 
66 	pke_rep_file = SYSCTL_ADD_PROC(qat_sysctl_ctx,
67 				       SYSCTL_CHILDREN(qat_sysctl_tree),
68 				       OID_AUTO,
69 				       PKE_REPLAY_DBG_FILE,
70 				       CTLTYPE_STRING | CTLFLAG_RD,
71 				       accel_dev,
72 				       0,
73 				       qat_pke_replay_counters_show,
74 				       "A",
75 				       "QAT PKE Replay Statistics");
76 	accel_dev->pke_replay_dbgfile = pke_rep_file;
77 	if (!accel_dev->pke_replay_dbgfile) {
78 		device_printf(
79 		    GET_DEV(accel_dev),
80 		    "Failed to create qat pke replay debugfs entry.\n");
81 		return ENOENT;
82 	}
83 	return 0;
84 }
85 
86 /**
87  * adf_pke_replay_counters_remove_c4xxx() - Remove debugfs entry for
88  * acceleration device Freq counters.
89  * @accel_dev:  Pointer to acceleration device.
90  *
91  * Return: void
92  */
93 void
94 adf_pke_replay_counters_remove_c4xxx(struct adf_accel_dev *accel_dev)
95 {
96 	if (accel_dev->pke_replay_dbgfile) {
97 		remove_oid(accel_dev, accel_dev->pke_replay_dbgfile);
98 		accel_dev->pke_replay_dbgfile = NULL;
99 	}
100 }
101