xref: /freebsd/sys/dev/qat/qat_common/adf_freebsd_cfg_dev_dbg.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_common_drv.h"
5 #include "adf_cfg_device.h"
6 #include "adf_cfg_dev_dbg.h"
7 #include <sys/bus.h>
8 #include <sys/libkern.h>
9 #include <sys/lock.h>
10 #include <sys/kernel.h>
11 #include <sys/sbuf.h>
12 #include <sys/sx.h>
13 #include <sys/systm.h>
14 #include <sys/malloc.h>
15 #include <sys/priv.h>
16 
qat_dev_cfg_show(SYSCTL_HANDLER_ARGS)17 static int qat_dev_cfg_show(SYSCTL_HANDLER_ARGS)
18 {
19 	struct adf_cfg_device_data *dev_cfg;
20 	struct adf_cfg_section *sec;
21 	struct adf_cfg_key_val *ptr;
22 	struct sbuf sb;
23 	int error;
24 
25 	if (priv_check(curthread, PRIV_DRIVER) != 0)
26 		return EPERM;
27 
28 	sbuf_new_for_sysctl(&sb, NULL, 128, req);
29 	dev_cfg = arg1;
30 	sx_slock(&dev_cfg->lock);
31 	list_for_each_entry(sec, &dev_cfg->sec_list, list)
32 	{
33 		sbuf_printf(&sb, "[%s]\n", sec->name);
34 		list_for_each_entry(ptr, &sec->param_head, list)
35 		{
36 			sbuf_printf(&sb, "%s = %s\n", ptr->key, ptr->val);
37 		}
38 	}
39 	sx_sunlock(&dev_cfg->lock);
40 	error = sbuf_finish(&sb);
41 	sbuf_delete(&sb);
42 	return error;
43 }
44 
45 int
adf_cfg_dev_dbg_add(struct adf_accel_dev * accel_dev)46 adf_cfg_dev_dbg_add(struct adf_accel_dev *accel_dev)
47 {
48 	struct adf_cfg_device_data *dev_cfg_data = accel_dev->cfg;
49 	device_t dev;
50 
51 	dev = GET_DEV(accel_dev);
52 	dev_cfg_data->debug =
53 	    SYSCTL_ADD_PROC(device_get_sysctl_ctx(dev),
54 			    SYSCTL_CHILDREN(device_get_sysctl_tree(dev)),
55 			    OID_AUTO,
56 			    "dev_cfg",
57 			    CTLFLAG_RD | CTLTYPE_STRING,
58 			    dev_cfg_data,
59 			    0,
60 			    qat_dev_cfg_show,
61 			    "A",
62 			    "Device configuration");
63 
64 	if (!dev_cfg_data->debug) {
65 		device_printf(dev, "Failed to create qat cfg sysctl.\n");
66 		return ENXIO;
67 	}
68 	return 0;
69 }
70 
71 void
adf_cfg_dev_dbg_remove(struct adf_accel_dev * accel_dev)72 adf_cfg_dev_dbg_remove(struct adf_accel_dev *accel_dev)
73 {
74 	struct adf_cfg_device_data *dev_cfg_data = accel_dev->cfg;
75 
76 	if (dev_cfg_data->dev) {
77 		adf_cfg_device_clear(dev_cfg_data->dev, accel_dev);
78 		free(dev_cfg_data->dev, M_QAT);
79 		dev_cfg_data->dev = NULL;
80 	}
81 }
82