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
pm_scnprint_table(char * buff,const struct pm_status_row * table,u32 * pm_info_regs,size_t buff_size,int table_len,bool lowercase)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
adf_pm_scnprint_table_upper_keys(char * buff,const struct pm_status_row * table,u32 * pm_info_regs,size_t buff_size,int table_len)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
adf_pm_scnprint_table_lower_keys(char * buff,const struct pm_status_row * table,u32 * pm_info_regs,size_t buff_size,int table_len)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