1 // SPDX-License-Identifier: GPL-2.0-only 2 /* Copyright(c) 2023 Intel Corporation */ 3 #include "adf_accel_devices.h" 4 #include "adf_cfg.h" 5 #include "adf_cfg_services.h" 6 #include "adf_cfg_strings.h" 7 #include "adf_common_drv.h" 8 #include "adf_gen4_config.h" 9 #include "adf_heartbeat.h" 10 #include "adf_transport_access_macros.h" 11 #include "qat_compression.h" 12 #include "qat_crypto.h" 13 14 static int adf_crypto_dev_config(struct adf_accel_dev *accel_dev) 15 { 16 char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES]; 17 int banks = GET_MAX_BANKS(accel_dev); 18 int cpus = num_online_cpus(); 19 unsigned long bank, val; 20 int instances; 21 int ret; 22 int i; 23 24 if (adf_hw_dev_has_crypto(accel_dev)) 25 instances = min(cpus, banks / 2); 26 else 27 instances = 0; 28 29 for (i = 0; i < instances; i++) { 30 val = i; 31 bank = i * 2; 32 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_BANK_NUM, i); 33 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 34 key, &bank, ADF_DEC); 35 if (ret) 36 goto err; 37 38 bank += 1; 39 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_BANK_NUM, i); 40 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 41 key, &bank, ADF_DEC); 42 if (ret) 43 goto err; 44 45 snprintf(key, sizeof(key), ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY, 46 i); 47 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 48 key, &val, ADF_DEC); 49 if (ret) 50 goto err; 51 52 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_SIZE, i); 53 val = 128; 54 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 55 key, &val, ADF_DEC); 56 if (ret) 57 goto err; 58 59 val = 512; 60 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_SIZE, i); 61 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 62 key, &val, ADF_DEC); 63 if (ret) 64 goto err; 65 66 val = 0; 67 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_TX, i); 68 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 69 key, &val, ADF_DEC); 70 if (ret) 71 goto err; 72 73 val = 0; 74 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_TX, i); 75 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 76 key, &val, ADF_DEC); 77 if (ret) 78 goto err; 79 80 val = 1; 81 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_ASYM_RX, i); 82 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 83 key, &val, ADF_DEC); 84 if (ret) 85 goto err; 86 87 val = 1; 88 snprintf(key, sizeof(key), ADF_CY "%d" ADF_RING_SYM_RX, i); 89 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 90 key, &val, ADF_DEC); 91 if (ret) 92 goto err; 93 94 val = ADF_COALESCING_DEF_TIME; 95 snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i); 96 ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0", 97 key, &val, ADF_DEC); 98 if (ret) 99 goto err; 100 } 101 102 val = i; 103 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY, 104 &val, ADF_DEC); 105 if (ret) 106 goto err; 107 108 val = 0; 109 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC, 110 &val, ADF_DEC); 111 if (ret) 112 goto err; 113 114 return 0; 115 err: 116 dev_err(&GET_DEV(accel_dev), "Failed to add configuration for crypto\n"); 117 return ret; 118 } 119 120 static int adf_comp_dev_config(struct adf_accel_dev *accel_dev) 121 { 122 char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES]; 123 int banks = GET_MAX_BANKS(accel_dev); 124 int cpus = num_online_cpus(); 125 unsigned long val; 126 int instances; 127 int ret; 128 int i; 129 130 if (adf_hw_dev_has_compression(accel_dev)) 131 instances = min(cpus, banks); 132 else 133 instances = 0; 134 135 for (i = 0; i < instances; i++) { 136 val = i; 137 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_BANK_NUM, i); 138 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 139 key, &val, ADF_DEC); 140 if (ret) 141 goto err; 142 143 val = 512; 144 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_SIZE, i); 145 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 146 key, &val, ADF_DEC); 147 if (ret) 148 goto err; 149 150 val = 0; 151 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_TX, i); 152 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 153 key, &val, ADF_DEC); 154 if (ret) 155 goto err; 156 157 val = 1; 158 snprintf(key, sizeof(key), ADF_DC "%d" ADF_RING_DC_RX, i); 159 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, 160 key, &val, ADF_DEC); 161 if (ret) 162 goto err; 163 164 val = ADF_COALESCING_DEF_TIME; 165 snprintf(key, sizeof(key), ADF_ETRMGR_COALESCE_TIMER_FORMAT, i); 166 ret = adf_cfg_add_key_value_param(accel_dev, "Accelerator0", 167 key, &val, ADF_DEC); 168 if (ret) 169 goto err; 170 } 171 172 val = i; 173 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC, 174 &val, ADF_DEC); 175 if (ret) 176 goto err; 177 178 val = 0; 179 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY, 180 &val, ADF_DEC); 181 if (ret) 182 goto err; 183 184 return 0; 185 err: 186 dev_err(&GET_DEV(accel_dev), "Failed to add configuration for compression\n"); 187 return ret; 188 } 189 190 static int adf_no_dev_config(struct adf_accel_dev *accel_dev) 191 { 192 unsigned long val; 193 int ret; 194 195 val = 0; 196 ret = adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_DC, 197 &val, ADF_DEC); 198 if (ret) 199 return ret; 200 201 return adf_cfg_add_key_value_param(accel_dev, ADF_KERNEL_SEC, ADF_NUM_CY, 202 &val, ADF_DEC); 203 } 204 205 /** 206 * adf_gen4_dev_config() - create dev config required to create instances 207 * 208 * @accel_dev: Pointer to acceleration device. 209 * 210 * Function creates device configuration required to create instances 211 * 212 * Return: 0 on success, error code otherwise. 213 */ 214 int adf_gen4_dev_config(struct adf_accel_dev *accel_dev) 215 { 216 char services[ADF_CFG_MAX_VAL_LEN_IN_BYTES] = {0}; 217 int ret; 218 219 ret = adf_cfg_section_add(accel_dev, ADF_KERNEL_SEC); 220 if (ret) 221 goto err; 222 223 ret = adf_cfg_section_add(accel_dev, "Accelerator0"); 224 if (ret) 225 goto err; 226 227 ret = adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC, 228 ADF_SERVICES_ENABLED, services); 229 if (ret) 230 goto err; 231 232 ret = sysfs_match_string(adf_cfg_services, services); 233 if (ret < 0) 234 goto err; 235 236 switch (ret) { 237 case SVC_CY: 238 case SVC_CY2: 239 ret = adf_crypto_dev_config(accel_dev); 240 break; 241 case SVC_DC: 242 case SVC_DCC: 243 ret = adf_comp_dev_config(accel_dev); 244 break; 245 default: 246 ret = adf_no_dev_config(accel_dev); 247 break; 248 } 249 250 if (ret) 251 goto err; 252 253 set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status); 254 255 return ret; 256 257 err: 258 dev_err(&GET_DEV(accel_dev), "Failed to configure QAT driver\n"); 259 return ret; 260 } 261 EXPORT_SYMBOL_GPL(adf_gen4_dev_config); 262 263 int adf_gen4_cfg_dev_init(struct adf_accel_dev *accel_dev) 264 { 265 const char *config; 266 int ret; 267 268 config = accel_dev->accel_id % 2 ? ADF_CFG_DC : ADF_CFG_CY; 269 270 ret = adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC); 271 if (ret) 272 return ret; 273 274 /* Default configuration is crypto only for even devices 275 * and compression for odd devices 276 */ 277 ret = adf_cfg_add_key_value_param(accel_dev, ADF_GENERAL_SEC, 278 ADF_SERVICES_ENABLED, config, 279 ADF_STR); 280 if (ret) 281 return ret; 282 283 adf_heartbeat_save_cfg_param(accel_dev, ADF_CFG_HB_TIMER_MIN_MS); 284 285 return 0; 286 } 287 EXPORT_SYMBOL_GPL(adf_gen4_cfg_dev_init); 288