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