Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

crypto: qat - relocate power management debugfs helper APIs

Relocate the power management debugfs helper APIs in a common file
adf_pm_dbgfs_utils.h and adf_pm_dbgfs_utils.c so that it can be shared
between device generations.

When moving logic from adf_gen4_pm_debugfs.c to adf_pm_dbgfs_utils.c, the
include kernel.h has been replaced with the required include.

This does not introduce any functional change.

Signed-off-by: George Abraham P <george.abraham.p@intel.com>
Signed-off-by: Suman Kumar Chakraborty <suman.kumar.chakraborty@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

George Abraham P and committed by
Herbert Xu
7c68005a e83cfb8f

+108 -86
+1
drivers/crypto/intel/qat/qat_common/Makefile
··· 52 52 adf_heartbeat_dbgfs.o \ 53 53 adf_heartbeat.o \ 54 54 adf_pm_dbgfs.o \ 55 + adf_pm_dbgfs_utils.o \ 55 56 adf_telemetry.o \ 56 57 adf_tl_debugfs.o \ 57 58 adf_transport_debug.o
+19 -86
drivers/crypto/intel/qat/qat_common/adf_gen4_pm_debugfs.c
··· 1 1 // SPDX-License-Identifier: GPL-2.0-only 2 2 /* Copyright(c) 2023 Intel Corporation */ 3 3 #include <linux/dma-mapping.h> 4 - #include <linux/kernel.h> 5 4 #include <linux/string_helpers.h> 6 - #include <linux/stringify.h> 7 5 8 6 #include "adf_accel_devices.h" 9 7 #include "adf_admin.h" 10 8 #include "adf_common_drv.h" 11 9 #include "adf_gen4_pm.h" 10 + #include "adf_pm_dbgfs_utils.h" 12 11 #include "icp_qat_fw_init_admin.h" 13 - 14 - /* 15 - * This is needed because a variable is used to index the mask at 16 - * pm_scnprint_table(), making it not compile time constant, so the compile 17 - * asserts from FIELD_GET() or u32_get_bits() won't be fulfilled. 18 - */ 19 - #define field_get(_mask, _reg) (((_reg) & (_mask)) >> (ffs(_mask) - 1)) 20 - 21 - #define PM_INFO_MEMBER_OFF(member) \ 22 - (offsetof(struct icp_qat_fw_init_admin_pm_info, member) / sizeof(u32)) 23 - 24 - #define PM_INFO_REGSET_ENTRY_MASK(_reg_, _field_, _mask_) \ 25 - { \ 26 - .reg_offset = PM_INFO_MEMBER_OFF(_reg_), \ 27 - .key = __stringify(_field_), \ 28 - .field_mask = _mask_, \ 29 - } 30 - 31 - #define PM_INFO_REGSET_ENTRY32(_reg_, _field_) \ 32 - PM_INFO_REGSET_ENTRY_MASK(_reg_, _field_, GENMASK(31, 0)) 33 12 34 13 #define PM_INFO_REGSET_ENTRY(_reg_, _field_) \ 35 14 PM_INFO_REGSET_ENTRY_MASK(_reg_, _field_, ADF_GEN4_PM_##_field_##_MASK) 36 - 37 - #define PM_INFO_MAX_KEY_LEN 21 38 - 39 - struct pm_status_row { 40 - int reg_offset; 41 - u32 field_mask; 42 - const char *key; 43 - }; 44 15 45 16 static const struct pm_status_row pm_fuse_rows[] = { 46 17 PM_INFO_REGSET_ENTRY(fusectl0, ENABLE_PM), ··· 80 109 PM_INFO_REGSET_ENTRY32(pm.pwrreq, CPM_PM_PWRREQ), 81 110 }; 82 111 83 - static int pm_scnprint_table(char *buff, const struct pm_status_row *table, 84 - u32 *pm_info_regs, size_t buff_size, int table_len, 85 - bool lowercase) 86 - { 87 - char key[PM_INFO_MAX_KEY_LEN]; 88 - int wr = 0; 89 - int i; 90 - 91 - for (i = 0; i < table_len; i++) { 92 - if (lowercase) 93 - string_lower(key, table[i].key); 94 - else 95 - string_upper(key, table[i].key); 96 - 97 - wr += scnprintf(&buff[wr], buff_size - wr, "%s: %#x\n", key, 98 - field_get(table[i].field_mask, 99 - pm_info_regs[table[i].reg_offset])); 100 - } 101 - 102 - return wr; 103 - } 104 - 105 - static int pm_scnprint_table_upper_keys(char *buff, const struct pm_status_row *table, 106 - u32 *pm_info_regs, size_t buff_size, 107 - int table_len) 108 - { 109 - return pm_scnprint_table(buff, table, pm_info_regs, buff_size, 110 - table_len, false); 111 - } 112 - 113 - static int pm_scnprint_table_lower_keys(char *buff, const struct pm_status_row *table, 114 - u32 *pm_info_regs, size_t buff_size, 115 - int table_len) 116 - { 117 - return pm_scnprint_table(buff, table, pm_info_regs, buff_size, 118 - table_len, true); 119 - } 120 - 121 112 static_assert(sizeof(struct icp_qat_fw_init_admin_pm_info) < PAGE_SIZE); 122 113 123 114 static ssize_t adf_gen4_print_pm_status(struct adf_accel_dev *accel_dev, ··· 124 191 /* Fusectl related */ 125 192 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, 126 193 "----------- PM Fuse info ---------\n"); 127 - len += pm_scnprint_table_lower_keys(&pm_kv[len], pm_fuse_rows, 128 - pm_info_regs, PAGE_SIZE - len, 129 - ARRAY_SIZE(pm_fuse_rows)); 194 + len += adf_pm_scnprint_table_lower_keys(&pm_kv[len], pm_fuse_rows, 195 + pm_info_regs, PAGE_SIZE - len, 196 + ARRAY_SIZE(pm_fuse_rows)); 130 197 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, "max_pwrreq: %#x\n", 131 198 pm_info->max_pwrreq); 132 199 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, "min_pwrreq: %#x\n", ··· 137 204 "------------ PM Info ------------\n"); 138 205 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, "power_level: %s\n", 139 206 pm_info->pwr_state == PM_SET_MIN ? "min" : "max"); 140 - len += pm_scnprint_table_lower_keys(&pm_kv[len], pm_info_rows, 141 - pm_info_regs, PAGE_SIZE - len, 142 - ARRAY_SIZE(pm_info_rows)); 207 + len += adf_pm_scnprint_table_lower_keys(&pm_kv[len], pm_info_rows, 208 + pm_info_regs, PAGE_SIZE - len, 209 + ARRAY_SIZE(pm_info_rows)); 143 210 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, "pm_mode: STATIC\n"); 144 211 145 212 /* SSM related */ 146 213 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, 147 214 "----------- SSM_PM Info ----------\n"); 148 - len += pm_scnprint_table_lower_keys(&pm_kv[len], pm_ssm_rows, 149 - pm_info_regs, PAGE_SIZE - len, 150 - ARRAY_SIZE(pm_ssm_rows)); 215 + len += adf_pm_scnprint_table_lower_keys(&pm_kv[len], pm_ssm_rows, 216 + pm_info_regs, PAGE_SIZE - len, 217 + ARRAY_SIZE(pm_ssm_rows)); 151 218 152 219 /* Log related */ 153 220 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, 154 221 "------------- PM Log -------------\n"); 155 - len += pm_scnprint_table_lower_keys(&pm_kv[len], pm_log_rows, 156 - pm_info_regs, PAGE_SIZE - len, 157 - ARRAY_SIZE(pm_log_rows)); 222 + len += adf_pm_scnprint_table_lower_keys(&pm_kv[len], pm_log_rows, 223 + pm_info_regs, PAGE_SIZE - len, 224 + ARRAY_SIZE(pm_log_rows)); 158 225 159 - len += pm_scnprint_table_lower_keys(&pm_kv[len], pm_event_rows, 160 - pm_info_regs, PAGE_SIZE - len, 161 - ARRAY_SIZE(pm_event_rows)); 226 + len += adf_pm_scnprint_table_lower_keys(&pm_kv[len], pm_event_rows, 227 + pm_info_regs, PAGE_SIZE - len, 228 + ARRAY_SIZE(pm_event_rows)); 162 229 163 230 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, "idle_irq_count: %#x\n", 164 231 pm->idle_irq_counters); ··· 174 241 /* CSRs content */ 175 242 len += scnprintf(&pm_kv[len], PAGE_SIZE - len, 176 243 "----------- HW PM CSRs -----------\n"); 177 - len += pm_scnprint_table_upper_keys(&pm_kv[len], pm_csrs_rows, 178 - pm_info_regs, PAGE_SIZE - len, 179 - ARRAY_SIZE(pm_csrs_rows)); 244 + len += adf_pm_scnprint_table_upper_keys(&pm_kv[len], pm_csrs_rows, 245 + pm_info_regs, PAGE_SIZE - len, 246 + ARRAY_SIZE(pm_csrs_rows)); 180 247 181 248 val = ADF_CSR_RD(pmisc, ADF_GEN4_PM_HOST_MSG); 182 249 len += scnprintf(&pm_kv[len], PAGE_SIZE - len,
+52
drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs_utils.c
··· 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 + }
+36
drivers/crypto/intel/qat/qat_common/adf_pm_dbgfs_utils.h
··· 1 + /* SPDX-License-Identifier: GPL-2.0-only */ 2 + /* Copyright(c) 2025 Intel Corporation */ 3 + #ifndef ADF_PM_DBGFS_UTILS_H_ 4 + #define ADF_PM_DBGFS_UTILS_H_ 5 + 6 + #include <linux/stddef.h> 7 + #include <linux/stringify.h> 8 + #include <linux/types.h> 9 + #include "icp_qat_fw_init_admin.h" 10 + 11 + #define PM_INFO_MEMBER_OFF(member) \ 12 + (offsetof(struct icp_qat_fw_init_admin_pm_info, member) / sizeof(u32)) 13 + 14 + #define PM_INFO_REGSET_ENTRY_MASK(_reg_, _field_, _mask_) \ 15 + { \ 16 + .reg_offset = PM_INFO_MEMBER_OFF(_reg_), \ 17 + .key = __stringify(_field_), \ 18 + .field_mask = _mask_, \ 19 + } 20 + 21 + #define PM_INFO_REGSET_ENTRY32(_reg_, _field_) \ 22 + PM_INFO_REGSET_ENTRY_MASK(_reg_, _field_, GENMASK(31, 0)) 23 + 24 + struct pm_status_row { 25 + int reg_offset; 26 + u32 field_mask; 27 + const char *key; 28 + }; 29 + 30 + int adf_pm_scnprint_table_upper_keys(char *buff, const struct pm_status_row *table, 31 + u32 *pm_info_regs, size_t buff_size, int table_len); 32 + 33 + int adf_pm_scnprint_table_lower_keys(char *buff, const struct pm_status_row *table, 34 + u32 *pm_info_regs, size_t buff_size, int table_len); 35 + 36 + #endif /* ADF_PM_DBGFS_UTILS_H_ */