xref: /linux/drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs_utils.c (revision 8d2b0853add1d7534dc0794e3c8e0b9e8c4ec640)
1 // SPDX-License-Identifier: GPL-2.0-only
2 /* Copyright(c) 2025 Intel Corporation */
3 #include <linux/bitops.h>
4 #include <linux/sprintf.h>
5 #include <linux/string_helpers.h>
6 
7 #include "adf_pm_dbgfs_utils.h"
8 
9 /*
10  * This is needed because a variable is used to index the mask at
11  * pm_scnprint_table(), making it not compile time constant, so the compile
12  * asserts from FIELD_GET() or u32_get_bits() won't be fulfilled.
13  */
14 #define field_get(_mask, _reg) (((_reg) & (_mask)) >> (ffs(_mask) - 1))
15 
16 #define PM_INFO_MAX_KEY_LEN	21
17 
18 static int pm_scnprint_table(char *buff, const struct pm_status_row *table,
19 			     u32 *pm_info_regs, size_t buff_size, int table_len,
20 			     bool lowercase)
21 {
22 	char key[PM_INFO_MAX_KEY_LEN];
23 	int wr = 0;
24 	int i;
25 
26 	for (i = 0; i < table_len; i++) {
27 		if (lowercase)
28 			string_lower(key, table[i].key);
29 		else
30 			string_upper(key, table[i].key);
31 
32 		wr += scnprintf(&buff[wr], buff_size - wr, "%s: %#x\n", key,
33 				field_get(table[i].field_mask,
34 					  pm_info_regs[table[i].reg_offset]));
35 	}
36 
37 	return wr;
38 }
39 
40 int adf_pm_scnprint_table_upper_keys(char *buff, const struct pm_status_row *table,
41 				     u32 *pm_info_regs, size_t buff_size, int table_len)
42 {
43 	return pm_scnprint_table(buff, table, pm_info_regs, buff_size,
44 				 table_len, false);
45 }
46 
47 int adf_pm_scnprint_table_lower_keys(char *buff, const struct pm_status_row *table,
48 				     u32 *pm_info_regs, size_t buff_size, int table_len)
49 {
50 	return pm_scnprint_table(buff, table, pm_info_regs, buff_size,
51 				 table_len, true);
52 }
53