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