178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski #include "adf_cfg_instance.h"
478ee8d1cSJulian Grajkowski #include "adf_cfg_device.h"
578ee8d1cSJulian Grajkowski #include "adf_cfg_section.h"
678ee8d1cSJulian Grajkowski
778ee8d1cSJulian Grajkowski static bool
adf_cfg_is_svc_enabled(struct adf_accel_dev * accel_dev,const u8 svc)878ee8d1cSJulian Grajkowski adf_cfg_is_svc_enabled(struct adf_accel_dev *accel_dev, const u8 svc)
978ee8d1cSJulian Grajkowski {
1078ee8d1cSJulian Grajkowski int ring_pair_index = 0;
1178ee8d1cSJulian Grajkowski u8 serv_type = NA;
1278ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
1378ee8d1cSJulian Grajkowski
1478ee8d1cSJulian Grajkowski for (ring_pair_index = 0; ring_pair_index < ADF_CFG_NUM_SERVICES;
1578ee8d1cSJulian Grajkowski ring_pair_index++) {
1678ee8d1cSJulian Grajkowski serv_type =
1778ee8d1cSJulian Grajkowski GET_SRV_TYPE(hw_data->ring_to_svc_map, ring_pair_index);
1878ee8d1cSJulian Grajkowski if (serv_type == svc)
1978ee8d1cSJulian Grajkowski return true;
2078ee8d1cSJulian Grajkowski }
2178ee8d1cSJulian Grajkowski return false;
2278ee8d1cSJulian Grajkowski }
2378ee8d1cSJulian Grajkowski
2478ee8d1cSJulian Grajkowski static int
adf_cfg_set_core_number_for_instance(struct adf_accel_dev * accel_dev,const char * sec_name,const char * inst_name,int process_num,unsigned long * core_number)2578ee8d1cSJulian Grajkowski adf_cfg_set_core_number_for_instance(struct adf_accel_dev *accel_dev,
2678ee8d1cSJulian Grajkowski const char *sec_name,
2778ee8d1cSJulian Grajkowski const char *inst_name,
2878ee8d1cSJulian Grajkowski int process_num,
2978ee8d1cSJulian Grajkowski unsigned long *core_number)
3078ee8d1cSJulian Grajkowski {
3178ee8d1cSJulian Grajkowski char *core_val = NULL;
3278ee8d1cSJulian Grajkowski char *pos = NULL;
3378ee8d1cSJulian Grajkowski char **tokens = NULL;
3478ee8d1cSJulian Grajkowski int token_index = 0;
3578ee8d1cSJulian Grajkowski int core_arr_index = 0;
3678ee8d1cSJulian Grajkowski int i = 0;
3778ee8d1cSJulian Grajkowski int ret = EFAULT;
3878ee8d1cSJulian Grajkowski unsigned long *core_num_arr = NULL;
3978ee8d1cSJulian Grajkowski unsigned long core_num;
4078ee8d1cSJulian Grajkowski unsigned long start, end;
4178ee8d1cSJulian Grajkowski
4278ee8d1cSJulian Grajkowski /* do memory allocation */
4378ee8d1cSJulian Grajkowski core_val =
4478ee8d1cSJulian Grajkowski malloc(ADF_CFG_MAX_VAL_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
4578ee8d1cSJulian Grajkowski
4678ee8d1cSJulian Grajkowski tokens = malloc(sizeof(char *) * ADF_CFG_MAX_TOKENS,
4778ee8d1cSJulian Grajkowski M_QAT,
4878ee8d1cSJulian Grajkowski M_WAITOK | M_ZERO);
4978ee8d1cSJulian Grajkowski
5078ee8d1cSJulian Grajkowski for (i = 0; i < ADF_CFG_MAX_TOKENS; i++) {
5178ee8d1cSJulian Grajkowski tokens[i] =
5278ee8d1cSJulian Grajkowski malloc(ADF_CFG_MAX_TOKEN_LEN, M_QAT, M_WAITOK | M_ZERO);
5378ee8d1cSJulian Grajkowski }
5478ee8d1cSJulian Grajkowski
5578ee8d1cSJulian Grajkowski core_num_arr = malloc(sizeof(unsigned long) * ADF_CFG_MAX_CORE_NUM,
5678ee8d1cSJulian Grajkowski M_QAT,
5778ee8d1cSJulian Grajkowski M_WAITOK | M_ZERO);
5878ee8d1cSJulian Grajkowski
5978ee8d1cSJulian Grajkowski /* parse the core_val */
6078ee8d1cSJulian Grajkowski ret = EFAULT;
6178ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, sec_name, inst_name, core_val))
6278ee8d1cSJulian Grajkowski goto failed;
6378ee8d1cSJulian Grajkowski
6478ee8d1cSJulian Grajkowski pos = strchr(core_val, ',');
6578ee8d1cSJulian Grajkowski while (pos) {
6678ee8d1cSJulian Grajkowski pos[0] = '\0';
6778ee8d1cSJulian Grajkowski strlcpy(tokens[token_index++], core_val, ADF_CFG_MAX_TOKEN_LEN);
6878ee8d1cSJulian Grajkowski strlcpy(core_val, pos + 1, ADF_CFG_MAX_VAL_LEN_IN_BYTES);
6978ee8d1cSJulian Grajkowski pos = strchr(core_val, ',');
7078ee8d1cSJulian Grajkowski if (!pos)
7178ee8d1cSJulian Grajkowski strlcpy(tokens[token_index++],
7278ee8d1cSJulian Grajkowski core_val,
7378ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES);
7478ee8d1cSJulian Grajkowski }
7578ee8d1cSJulian Grajkowski
7678ee8d1cSJulian Grajkowski /* in case there is only N-M */
7778ee8d1cSJulian Grajkowski if (token_index == 0)
7878ee8d1cSJulian Grajkowski strlcpy(tokens[token_index++],
7978ee8d1cSJulian Grajkowski core_val,
8078ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES);
8178ee8d1cSJulian Grajkowski
8278ee8d1cSJulian Grajkowski /* parse the tokens such as N-M */
8378ee8d1cSJulian Grajkowski for (i = 0; i < token_index; i++) {
8478ee8d1cSJulian Grajkowski pos = strchr(tokens[i], '-');
8578ee8d1cSJulian Grajkowski if (pos) {
8678ee8d1cSJulian Grajkowski pos[0] = '\0';
8778ee8d1cSJulian Grajkowski ret = compat_strtoul(tokens[i], 10, &start);
8878ee8d1cSJulian Grajkowski if (ret)
8978ee8d1cSJulian Grajkowski goto failed;
9078ee8d1cSJulian Grajkowski ret = compat_strtoul(pos + 1, 10, &end);
9178ee8d1cSJulian Grajkowski if (ret)
9278ee8d1cSJulian Grajkowski goto failed;
9378ee8d1cSJulian Grajkowski if (start > end) {
9478ee8d1cSJulian Grajkowski ret = EFAULT;
9578ee8d1cSJulian Grajkowski goto failed;
9678ee8d1cSJulian Grajkowski }
9778ee8d1cSJulian Grajkowski for (core_num = start; core_num < end + 1; core_num++)
9878ee8d1cSJulian Grajkowski core_num_arr[core_arr_index++] = core_num;
9978ee8d1cSJulian Grajkowski } else {
10078ee8d1cSJulian Grajkowski ret = compat_strtoul(tokens[i], 10, &core_num);
10178ee8d1cSJulian Grajkowski if (ret)
10278ee8d1cSJulian Grajkowski goto failed;
10378ee8d1cSJulian Grajkowski core_num_arr[core_arr_index++] = core_num;
10478ee8d1cSJulian Grajkowski }
10578ee8d1cSJulian Grajkowski }
10678ee8d1cSJulian Grajkowski
10778ee8d1cSJulian Grajkowski if (core_arr_index == 0) {
10878ee8d1cSJulian Grajkowski ret = compat_strtoul(core_val, 10, &core_num);
10978ee8d1cSJulian Grajkowski if (ret)
11078ee8d1cSJulian Grajkowski goto failed;
11178ee8d1cSJulian Grajkowski else
11278ee8d1cSJulian Grajkowski core_num_arr[core_arr_index++] = core_num;
11378ee8d1cSJulian Grajkowski }
11478ee8d1cSJulian Grajkowski
11578ee8d1cSJulian Grajkowski *core_number = core_num_arr[process_num % core_arr_index];
11678ee8d1cSJulian Grajkowski ret = 0;
11778ee8d1cSJulian Grajkowski failed:
11878ee8d1cSJulian Grajkowski free(core_val, M_QAT);
11978ee8d1cSJulian Grajkowski if (tokens) {
12078ee8d1cSJulian Grajkowski for (i = 0; i < ADF_CFG_MAX_TOKENS; i++)
12178ee8d1cSJulian Grajkowski free(tokens[i], M_QAT);
12278ee8d1cSJulian Grajkowski free(tokens, M_QAT);
12378ee8d1cSJulian Grajkowski }
12478ee8d1cSJulian Grajkowski free(core_num_arr, M_QAT);
12578ee8d1cSJulian Grajkowski
12678ee8d1cSJulian Grajkowski if (ret)
12778ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
12878ee8d1cSJulian Grajkowski "Get core number failed with error %d\n",
12978ee8d1cSJulian Grajkowski ret);
13078ee8d1cSJulian Grajkowski return ret;
13178ee8d1cSJulian Grajkowski }
13278ee8d1cSJulian Grajkowski
13378ee8d1cSJulian Grajkowski static int
adf_cfg_set_value(struct adf_accel_dev * accel_dev,const char * sec,const char * key,unsigned long * value)13478ee8d1cSJulian Grajkowski adf_cfg_set_value(struct adf_accel_dev *accel_dev,
13578ee8d1cSJulian Grajkowski const char *sec,
13678ee8d1cSJulian Grajkowski const char *key,
13778ee8d1cSJulian Grajkowski unsigned long *value)
13878ee8d1cSJulian Grajkowski {
13978ee8d1cSJulian Grajkowski char *val = NULL;
14078ee8d1cSJulian Grajkowski int ret = EFAULT;
14178ee8d1cSJulian Grajkowski
14278ee8d1cSJulian Grajkowski val = malloc(ADF_CFG_MAX_VAL_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
14378ee8d1cSJulian Grajkowski
14478ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, sec, key, val))
14578ee8d1cSJulian Grajkowski goto out;
14678ee8d1cSJulian Grajkowski
14778ee8d1cSJulian Grajkowski /* as the key type can be either ADF_DEC or ADF_HEX */
14878ee8d1cSJulian Grajkowski if (compat_strtoul(val, 10, value) && compat_strtoul(val, 16, value))
14978ee8d1cSJulian Grajkowski goto out;
15078ee8d1cSJulian Grajkowski
15178ee8d1cSJulian Grajkowski ret = 0;
15278ee8d1cSJulian Grajkowski out:
15378ee8d1cSJulian Grajkowski free(val, M_QAT);
15478ee8d1cSJulian Grajkowski return ret;
15578ee8d1cSJulian Grajkowski }
15678ee8d1cSJulian Grajkowski
15778ee8d1cSJulian Grajkowski static void
adf_cfg_add_cy_inst_info(struct adf_accel_dev * accel_dev,struct adf_cfg_instance * crypto_inst,const char * derived_sec,int inst_index)15878ee8d1cSJulian Grajkowski adf_cfg_add_cy_inst_info(struct adf_accel_dev *accel_dev,
15978ee8d1cSJulian Grajkowski struct adf_cfg_instance *crypto_inst,
16078ee8d1cSJulian Grajkowski const char *derived_sec,
16178ee8d1cSJulian Grajkowski int inst_index)
16278ee8d1cSJulian Grajkowski {
16378ee8d1cSJulian Grajkowski char *key = NULL;
16478ee8d1cSJulian Grajkowski unsigned long bank_number = 0;
16578ee8d1cSJulian Grajkowski unsigned long ring_number = 0;
16678ee8d1cSJulian Grajkowski unsigned long asym_req = 0;
16778ee8d1cSJulian Grajkowski unsigned long sym_req = 0;
16878ee8d1cSJulian Grajkowski
16978ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
17078ee8d1cSJulian Grajkowski
17178ee8d1cSJulian Grajkowski snprintf(key,
17278ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
17378ee8d1cSJulian Grajkowski ADF_CY_BANK_NUM_FORMAT,
17478ee8d1cSJulian Grajkowski inst_index);
17578ee8d1cSJulian Grajkowski bank_number = crypto_inst->bundle;
17678ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
17778ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&bank_number, ADF_DEC);
17878ee8d1cSJulian Grajkowski
17978ee8d1cSJulian Grajkowski snprintf(key,
18078ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
18178ee8d1cSJulian Grajkowski ADF_CY_ASYM_TX_FORMAT,
18278ee8d1cSJulian Grajkowski inst_index);
18378ee8d1cSJulian Grajkowski ring_number = crypto_inst->asym_tx;
18478ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
18578ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
18678ee8d1cSJulian Grajkowski
18778ee8d1cSJulian Grajkowski snprintf(key,
18878ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
18978ee8d1cSJulian Grajkowski ADF_CY_SYM_TX_FORMAT,
19078ee8d1cSJulian Grajkowski inst_index);
19178ee8d1cSJulian Grajkowski ring_number = crypto_inst->sym_tx;
19278ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
19378ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
19478ee8d1cSJulian Grajkowski
19578ee8d1cSJulian Grajkowski snprintf(key,
19678ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
19778ee8d1cSJulian Grajkowski ADF_CY_ASYM_RX_FORMAT,
19878ee8d1cSJulian Grajkowski inst_index);
19978ee8d1cSJulian Grajkowski ring_number = crypto_inst->asym_rx;
20078ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
20178ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
20278ee8d1cSJulian Grajkowski
20378ee8d1cSJulian Grajkowski snprintf(key,
20478ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
20578ee8d1cSJulian Grajkowski ADF_CY_SYM_RX_FORMAT,
20678ee8d1cSJulian Grajkowski inst_index);
20778ee8d1cSJulian Grajkowski ring_number = crypto_inst->sym_rx;
20878ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
20978ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
21078ee8d1cSJulian Grajkowski
21178ee8d1cSJulian Grajkowski strlcpy(key, ADF_CY_RING_ASYM_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
21278ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, ADF_GENERAL_SEC, key, &asym_req))
21378ee8d1cSJulian Grajkowski asym_req = ADF_CFG_DEF_CY_RING_ASYM_SIZE;
21478ee8d1cSJulian Grajkowski
21578ee8d1cSJulian Grajkowski snprintf(key,
21678ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
21778ee8d1cSJulian Grajkowski ADF_CY_RING_ASYM_SIZE_FORMAT,
21878ee8d1cSJulian Grajkowski inst_index);
21978ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
22078ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&asym_req, ADF_DEC);
22178ee8d1cSJulian Grajkowski
22278ee8d1cSJulian Grajkowski strlcpy(key, ADF_CY_RING_SYM_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
22378ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, ADF_GENERAL_SEC, key, &sym_req))
22478ee8d1cSJulian Grajkowski sym_req = ADF_CFG_DEF_CY_RING_SYM_SIZE;
22578ee8d1cSJulian Grajkowski
22678ee8d1cSJulian Grajkowski snprintf(key,
22778ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
22878ee8d1cSJulian Grajkowski ADF_CY_RING_SYM_SIZE_FORMAT,
22978ee8d1cSJulian Grajkowski inst_index);
23078ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
23178ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&sym_req, ADF_DEC);
23278ee8d1cSJulian Grajkowski
23378ee8d1cSJulian Grajkowski free(key, M_QAT);
23478ee8d1cSJulian Grajkowski }
23578ee8d1cSJulian Grajkowski
23678ee8d1cSJulian Grajkowski static void
adf_cfg_add_dc_inst_info(struct adf_accel_dev * accel_dev,struct adf_cfg_instance * dc_inst,const char * derived_sec,int inst_index)23778ee8d1cSJulian Grajkowski adf_cfg_add_dc_inst_info(struct adf_accel_dev *accel_dev,
23878ee8d1cSJulian Grajkowski struct adf_cfg_instance *dc_inst,
23978ee8d1cSJulian Grajkowski const char *derived_sec,
24078ee8d1cSJulian Grajkowski int inst_index)
24178ee8d1cSJulian Grajkowski {
24278ee8d1cSJulian Grajkowski char *key = NULL;
24378ee8d1cSJulian Grajkowski unsigned long bank_number = 0;
24478ee8d1cSJulian Grajkowski unsigned long ring_number = 0;
24578ee8d1cSJulian Grajkowski unsigned long dc_req = 0;
24678ee8d1cSJulian Grajkowski
24778ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
24878ee8d1cSJulian Grajkowski
24978ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_STR_LEN, ADF_DC_BANK_NUM_FORMAT, inst_index);
25078ee8d1cSJulian Grajkowski bank_number = dc_inst->bundle;
25178ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
25278ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&bank_number, ADF_DEC);
25378ee8d1cSJulian Grajkowski
25478ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_STR_LEN, ADF_DC_TX_FORMAT, inst_index);
25578ee8d1cSJulian Grajkowski ring_number = dc_inst->dc_tx;
25678ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
25778ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
25878ee8d1cSJulian Grajkowski
25978ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_STR_LEN, ADF_DC_RX_FORMAT, inst_index);
26078ee8d1cSJulian Grajkowski ring_number = dc_inst->dc_rx;
26178ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
26278ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
26378ee8d1cSJulian Grajkowski
26478ee8d1cSJulian Grajkowski strlcpy(key, ADF_DC_RING_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
26578ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, ADF_GENERAL_SEC, key, &dc_req))
26678ee8d1cSJulian Grajkowski dc_req = ADF_CFG_DEF_DC_RING_SIZE;
26778ee8d1cSJulian Grajkowski
26878ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_STR_LEN, ADF_DC_RING_SIZE_FORMAT, inst_index);
26978ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
27078ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&dc_req, ADF_DEC);
27178ee8d1cSJulian Grajkowski
27278ee8d1cSJulian Grajkowski free(key, M_QAT);
27378ee8d1cSJulian Grajkowski }
27478ee8d1cSJulian Grajkowski
27578ee8d1cSJulian Grajkowski static void
adf_cfg_add_asym_inst_info(struct adf_accel_dev * accel_dev,struct adf_cfg_instance * asym_inst,const char * derived_sec,int inst_index)27678ee8d1cSJulian Grajkowski adf_cfg_add_asym_inst_info(struct adf_accel_dev *accel_dev,
27778ee8d1cSJulian Grajkowski struct adf_cfg_instance *asym_inst,
27878ee8d1cSJulian Grajkowski const char *derived_sec,
27978ee8d1cSJulian Grajkowski int inst_index)
28078ee8d1cSJulian Grajkowski {
28178ee8d1cSJulian Grajkowski char *key = NULL;
28278ee8d1cSJulian Grajkowski unsigned long bank_number = 0;
28378ee8d1cSJulian Grajkowski unsigned long ring_number = 0;
28478ee8d1cSJulian Grajkowski unsigned long asym_req = 0;
28578ee8d1cSJulian Grajkowski
28678ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
28778ee8d1cSJulian Grajkowski
288*a977168cSMichal Gulbicki if (adf_cy_inst_cross_banks(accel_dev))
289*a977168cSMichal Gulbicki snprintf(key,
290*a977168cSMichal Gulbicki ADF_CFG_MAX_KEY_LEN_IN_BYTES,
291*a977168cSMichal Gulbicki ADF_CY_ASYM_BANK_NUM_FORMAT,
292*a977168cSMichal Gulbicki inst_index);
293*a977168cSMichal Gulbicki else
29478ee8d1cSJulian Grajkowski snprintf(key,
29578ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
29678ee8d1cSJulian Grajkowski ADF_CY_BANK_NUM_FORMAT,
29778ee8d1cSJulian Grajkowski inst_index);
29878ee8d1cSJulian Grajkowski bank_number = asym_inst->bundle;
29978ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
30078ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&bank_number, ADF_DEC);
30178ee8d1cSJulian Grajkowski
30278ee8d1cSJulian Grajkowski snprintf(key,
30378ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
30478ee8d1cSJulian Grajkowski ADF_CY_ASYM_TX_FORMAT,
30578ee8d1cSJulian Grajkowski inst_index);
30678ee8d1cSJulian Grajkowski ring_number = asym_inst->asym_tx;
30778ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
30878ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
30978ee8d1cSJulian Grajkowski
31078ee8d1cSJulian Grajkowski snprintf(key,
31178ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
31278ee8d1cSJulian Grajkowski ADF_CY_ASYM_RX_FORMAT,
31378ee8d1cSJulian Grajkowski inst_index);
31478ee8d1cSJulian Grajkowski ring_number = asym_inst->asym_rx;
31578ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
31678ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
31778ee8d1cSJulian Grajkowski
31878ee8d1cSJulian Grajkowski strlcpy(key, ADF_CY_RING_ASYM_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
31978ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, ADF_GENERAL_SEC, key, &asym_req))
32078ee8d1cSJulian Grajkowski asym_req = ADF_CFG_DEF_CY_RING_ASYM_SIZE;
32178ee8d1cSJulian Grajkowski
32278ee8d1cSJulian Grajkowski snprintf(key,
32378ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
32478ee8d1cSJulian Grajkowski ADF_CY_RING_ASYM_SIZE_FORMAT,
32578ee8d1cSJulian Grajkowski inst_index);
32678ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
32778ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&asym_req, ADF_DEC);
32878ee8d1cSJulian Grajkowski
32978ee8d1cSJulian Grajkowski free(key, M_QAT);
33078ee8d1cSJulian Grajkowski }
33178ee8d1cSJulian Grajkowski
33278ee8d1cSJulian Grajkowski static void
adf_cfg_add_sym_inst_info(struct adf_accel_dev * accel_dev,struct adf_cfg_instance * sym_inst,const char * derived_sec,int inst_index)33378ee8d1cSJulian Grajkowski adf_cfg_add_sym_inst_info(struct adf_accel_dev *accel_dev,
33478ee8d1cSJulian Grajkowski struct adf_cfg_instance *sym_inst,
33578ee8d1cSJulian Grajkowski const char *derived_sec,
33678ee8d1cSJulian Grajkowski int inst_index)
33778ee8d1cSJulian Grajkowski {
33878ee8d1cSJulian Grajkowski char *key = NULL;
33978ee8d1cSJulian Grajkowski unsigned long bank_number = 0;
34078ee8d1cSJulian Grajkowski unsigned long ring_number = 0;
34178ee8d1cSJulian Grajkowski unsigned long sym_req = 0;
34278ee8d1cSJulian Grajkowski
34378ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
34478ee8d1cSJulian Grajkowski
345*a977168cSMichal Gulbicki if (adf_cy_inst_cross_banks(accel_dev))
346*a977168cSMichal Gulbicki snprintf(key,
347*a977168cSMichal Gulbicki ADF_CFG_MAX_KEY_LEN_IN_BYTES,
348*a977168cSMichal Gulbicki ADF_CY_SYM_BANK_NUM_FORMAT,
349*a977168cSMichal Gulbicki inst_index);
350*a977168cSMichal Gulbicki else
35178ee8d1cSJulian Grajkowski snprintf(key,
35278ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
35378ee8d1cSJulian Grajkowski ADF_CY_BANK_NUM_FORMAT,
35478ee8d1cSJulian Grajkowski inst_index);
355*a977168cSMichal Gulbicki
35678ee8d1cSJulian Grajkowski bank_number = sym_inst->bundle;
35778ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
35878ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&bank_number, ADF_DEC);
35978ee8d1cSJulian Grajkowski
36078ee8d1cSJulian Grajkowski snprintf(key,
36178ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
36278ee8d1cSJulian Grajkowski ADF_CY_SYM_TX_FORMAT,
36378ee8d1cSJulian Grajkowski inst_index);
36478ee8d1cSJulian Grajkowski ring_number = sym_inst->sym_tx;
36578ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
36678ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
36778ee8d1cSJulian Grajkowski
36878ee8d1cSJulian Grajkowski snprintf(key,
36978ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
37078ee8d1cSJulian Grajkowski ADF_CY_SYM_RX_FORMAT,
37178ee8d1cSJulian Grajkowski inst_index);
37278ee8d1cSJulian Grajkowski ring_number = sym_inst->sym_rx;
37378ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
37478ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&ring_number, ADF_DEC);
37578ee8d1cSJulian Grajkowski
37678ee8d1cSJulian Grajkowski strlcpy(key, ADF_CY_RING_SYM_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
37778ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, ADF_GENERAL_SEC, key, &sym_req))
37878ee8d1cSJulian Grajkowski sym_req = ADF_CFG_DEF_CY_RING_SYM_SIZE;
37978ee8d1cSJulian Grajkowski
38078ee8d1cSJulian Grajkowski snprintf(key,
38178ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
38278ee8d1cSJulian Grajkowski ADF_CY_RING_SYM_SIZE_FORMAT,
38378ee8d1cSJulian Grajkowski inst_index);
38478ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(
38578ee8d1cSJulian Grajkowski accel_dev, derived_sec, key, (void *)&sym_req, ADF_DEC);
38678ee8d1cSJulian Grajkowski
38778ee8d1cSJulian Grajkowski free(key, M_QAT);
38878ee8d1cSJulian Grajkowski }
38978ee8d1cSJulian Grajkowski
39078ee8d1cSJulian Grajkowski static int
adf_cfg_section_copy(struct adf_accel_dev * accel_dev,const char * processed_sec,const char * derived_sec)39178ee8d1cSJulian Grajkowski adf_cfg_section_copy(struct adf_accel_dev *accel_dev,
39278ee8d1cSJulian Grajkowski const char *processed_sec,
39378ee8d1cSJulian Grajkowski const char *derived_sec)
39478ee8d1cSJulian Grajkowski {
39578ee8d1cSJulian Grajkowski unsigned long val = 0;
39678ee8d1cSJulian Grajkowski struct list_head *list;
39778ee8d1cSJulian Grajkowski struct adf_cfg_section *sec_process =
39878ee8d1cSJulian Grajkowski adf_cfg_sec_find(accel_dev, processed_sec);
39978ee8d1cSJulian Grajkowski if (!sec_process)
40078ee8d1cSJulian Grajkowski return EFAULT;
40178ee8d1cSJulian Grajkowski
40278ee8d1cSJulian Grajkowski list_for_each(list, &sec_process->param_head)
40378ee8d1cSJulian Grajkowski {
40478ee8d1cSJulian Grajkowski struct adf_cfg_key_val *ptr =
40578ee8d1cSJulian Grajkowski list_entry(list, struct adf_cfg_key_val, list);
40678ee8d1cSJulian Grajkowski
40778ee8d1cSJulian Grajkowski /*
40878ee8d1cSJulian Grajkowski * ignore CoreAffinity since it will be generated later, and
40978ee8d1cSJulian Grajkowski * there is no need to keep NumProcesses and LimitDevAccess.
41078ee8d1cSJulian Grajkowski */
41178ee8d1cSJulian Grajkowski if (strstr(ptr->key, ADF_ETRMGR_CORE_AFFINITY) ||
41278ee8d1cSJulian Grajkowski strstr(ptr->key, ADF_NUM_PROCESSES) ||
41378ee8d1cSJulian Grajkowski strstr(ptr->key, ADF_LIMIT_DEV_ACCESS))
41478ee8d1cSJulian Grajkowski continue;
41578ee8d1cSJulian Grajkowski
41678ee8d1cSJulian Grajkowski if (ptr->type == ADF_DEC) {
41778ee8d1cSJulian Grajkowski if (!compat_strtoul(ptr->val, 10, &val))
41878ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(accel_dev,
41978ee8d1cSJulian Grajkowski derived_sec,
42078ee8d1cSJulian Grajkowski ptr->key,
42178ee8d1cSJulian Grajkowski (void *)&val,
42278ee8d1cSJulian Grajkowski ptr->type);
42378ee8d1cSJulian Grajkowski } else if (ptr->type == ADF_STR) {
42478ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(accel_dev,
42578ee8d1cSJulian Grajkowski derived_sec,
42678ee8d1cSJulian Grajkowski ptr->key,
42778ee8d1cSJulian Grajkowski (void *)ptr->val,
42878ee8d1cSJulian Grajkowski ptr->type);
42978ee8d1cSJulian Grajkowski } else if (ptr->type == ADF_HEX) {
43078ee8d1cSJulian Grajkowski if (!compat_strtoul(ptr->val, 16, &val))
43178ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(accel_dev,
43278ee8d1cSJulian Grajkowski derived_sec,
43378ee8d1cSJulian Grajkowski ptr->key,
43478ee8d1cSJulian Grajkowski (void *)val,
43578ee8d1cSJulian Grajkowski ptr->type);
43678ee8d1cSJulian Grajkowski }
43778ee8d1cSJulian Grajkowski }
43878ee8d1cSJulian Grajkowski return 0;
43978ee8d1cSJulian Grajkowski }
44078ee8d1cSJulian Grajkowski
44178ee8d1cSJulian Grajkowski static int
adf_cfg_create_rings_entries_for_cy_inst(struct adf_accel_dev * accel_dev,const char * processed_sec,const char * derived_sec,int process_num,enum adf_cfg_service_type serv_type)44278ee8d1cSJulian Grajkowski adf_cfg_create_rings_entries_for_cy_inst(struct adf_accel_dev *accel_dev,
44378ee8d1cSJulian Grajkowski const char *processed_sec,
44478ee8d1cSJulian Grajkowski const char *derived_sec,
44578ee8d1cSJulian Grajkowski int process_num,
44678ee8d1cSJulian Grajkowski enum adf_cfg_service_type serv_type)
44778ee8d1cSJulian Grajkowski {
44878ee8d1cSJulian Grajkowski int i = 0;
44978ee8d1cSJulian Grajkowski int ret = EFAULT;
45078ee8d1cSJulian Grajkowski unsigned long num_inst = 0, num_dc_inst = 0;
45178ee8d1cSJulian Grajkowski unsigned long core_number = 0;
45278ee8d1cSJulian Grajkowski unsigned long polling_mode = 0;
45378ee8d1cSJulian Grajkowski struct adf_cfg_instance *crypto_inst = NULL;
45478ee8d1cSJulian Grajkowski
45578ee8d1cSJulian Grajkowski char *key = NULL;
45678ee8d1cSJulian Grajkowski char *val = NULL;
45778ee8d1cSJulian Grajkowski
45878ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
45978ee8d1cSJulian Grajkowski
46078ee8d1cSJulian Grajkowski val = malloc(ADF_CFG_MAX_VAL_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
46178ee8d1cSJulian Grajkowski
46278ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_SERVICES_ENABLED);
46378ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC, key, val))
46478ee8d1cSJulian Grajkowski goto failed;
46578ee8d1cSJulian Grajkowski if ((!strncmp(val, ADF_CFG_CY, ADF_CFG_MAX_VAL_LEN_IN_BYTES)) ||
46678ee8d1cSJulian Grajkowski (!strncmp(val, ADF_CFG_ASYM, ADF_CFG_MAX_VAL_LEN_IN_BYTES)) ||
46778ee8d1cSJulian Grajkowski (!strncmp(val, ADF_CFG_SYM, ADF_CFG_MAX_VAL_LEN_IN_BYTES))) {
46878ee8d1cSJulian Grajkowski strlcpy(key, ADF_NUM_DC, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
46978ee8d1cSJulian Grajkowski if (adf_cfg_set_value(
47078ee8d1cSJulian Grajkowski accel_dev, processed_sec, key, &num_dc_inst))
47178ee8d1cSJulian Grajkowski goto failed;
47278ee8d1cSJulian Grajkowski if (num_dc_inst > 0) {
47378ee8d1cSJulian Grajkowski device_printf(
47478ee8d1cSJulian Grajkowski GET_DEV(accel_dev),
47578ee8d1cSJulian Grajkowski "NumDcInstances > 0,when CY only is enabled\n");
47678ee8d1cSJulian Grajkowski goto failed;
47778ee8d1cSJulian Grajkowski }
47878ee8d1cSJulian Grajkowski }
47978ee8d1cSJulian Grajkowski ret = EFAULT;
48078ee8d1cSJulian Grajkowski
48178ee8d1cSJulian Grajkowski strlcpy(key, ADF_NUM_CY, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
48278ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, processed_sec, key, &num_inst))
48378ee8d1cSJulian Grajkowski goto failed;
48478ee8d1cSJulian Grajkowski
48578ee8d1cSJulian Grajkowski crypto_inst = malloc(sizeof(*crypto_inst), M_QAT, M_WAITOK | M_ZERO);
48678ee8d1cSJulian Grajkowski
48778ee8d1cSJulian Grajkowski for (i = 0; i < num_inst; i++) {
48878ee8d1cSJulian Grajkowski memset(crypto_inst, 0, sizeof(*crypto_inst));
48978ee8d1cSJulian Grajkowski crypto_inst->stype = serv_type;
49078ee8d1cSJulian Grajkowski snprintf(key,
49178ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
49278ee8d1cSJulian Grajkowski ADF_CY_CORE_AFFINITY_FORMAT,
49378ee8d1cSJulian Grajkowski i);
49478ee8d1cSJulian Grajkowski if (adf_cfg_set_core_number_for_instance(accel_dev,
49578ee8d1cSJulian Grajkowski processed_sec,
49678ee8d1cSJulian Grajkowski key,
49778ee8d1cSJulian Grajkowski process_num,
49878ee8d1cSJulian Grajkowski &core_number))
49978ee8d1cSJulian Grajkowski goto failed;
50078ee8d1cSJulian Grajkowski
50178ee8d1cSJulian Grajkowski if (strcmp(processed_sec, ADF_KERNEL_SEC) &&
50278ee8d1cSJulian Grajkowski strcmp(processed_sec, ADF_KERNEL_SAL_SEC))
50378ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(accel_dev,
50478ee8d1cSJulian Grajkowski derived_sec,
50578ee8d1cSJulian Grajkowski key,
50678ee8d1cSJulian Grajkowski (void *)&core_number,
50778ee8d1cSJulian Grajkowski ADF_DEC);
50878ee8d1cSJulian Grajkowski
50978ee8d1cSJulian Grajkowski snprintf(key,
51078ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
51178ee8d1cSJulian Grajkowski ADF_CY_NAME_FORMAT,
51278ee8d1cSJulian Grajkowski i);
51378ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, processed_sec, key, val))
51478ee8d1cSJulian Grajkowski goto failed;
51578ee8d1cSJulian Grajkowski
51678ee8d1cSJulian Grajkowski strlcpy(crypto_inst->name, val, sizeof(crypto_inst->name));
51778ee8d1cSJulian Grajkowski
51878ee8d1cSJulian Grajkowski snprintf(key,
51978ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
52078ee8d1cSJulian Grajkowski ADF_CY_POLL_MODE_FORMAT,
52178ee8d1cSJulian Grajkowski i);
52278ee8d1cSJulian Grajkowski if (adf_cfg_set_value(
52378ee8d1cSJulian Grajkowski accel_dev, processed_sec, key, &polling_mode))
52478ee8d1cSJulian Grajkowski goto failed;
52578ee8d1cSJulian Grajkowski
52678ee8d1cSJulian Grajkowski crypto_inst->polling_mode = polling_mode;
52778ee8d1cSJulian Grajkowski CPU_ZERO(&crypto_inst->affinity_mask);
52878ee8d1cSJulian Grajkowski CPU_SET(core_number, &crypto_inst->affinity_mask);
52978ee8d1cSJulian Grajkowski
53078ee8d1cSJulian Grajkowski if (adf_cfg_get_ring_pairs(accel_dev->cfg->dev,
53178ee8d1cSJulian Grajkowski crypto_inst,
53278ee8d1cSJulian Grajkowski derived_sec,
53378ee8d1cSJulian Grajkowski accel_dev))
53478ee8d1cSJulian Grajkowski goto failed;
53578ee8d1cSJulian Grajkowski
53678ee8d1cSJulian Grajkowski switch (serv_type) {
53778ee8d1cSJulian Grajkowski case CRYPTO:
53878ee8d1cSJulian Grajkowski adf_cfg_add_cy_inst_info(accel_dev,
53978ee8d1cSJulian Grajkowski crypto_inst,
54078ee8d1cSJulian Grajkowski derived_sec,
54178ee8d1cSJulian Grajkowski i);
54278ee8d1cSJulian Grajkowski break;
54378ee8d1cSJulian Grajkowski case ASYM:
54478ee8d1cSJulian Grajkowski adf_cfg_add_asym_inst_info(accel_dev,
54578ee8d1cSJulian Grajkowski crypto_inst,
54678ee8d1cSJulian Grajkowski derived_sec,
54778ee8d1cSJulian Grajkowski i);
54878ee8d1cSJulian Grajkowski break;
54978ee8d1cSJulian Grajkowski case SYM:
55078ee8d1cSJulian Grajkowski adf_cfg_add_sym_inst_info(accel_dev,
55178ee8d1cSJulian Grajkowski crypto_inst,
55278ee8d1cSJulian Grajkowski derived_sec,
55378ee8d1cSJulian Grajkowski i);
55478ee8d1cSJulian Grajkowski break;
55578ee8d1cSJulian Grajkowski default:
55678ee8d1cSJulian Grajkowski pr_err("unknown crypto instance type %d.\n", serv_type);
55778ee8d1cSJulian Grajkowski goto failed;
55878ee8d1cSJulian Grajkowski }
55978ee8d1cSJulian Grajkowski }
56078ee8d1cSJulian Grajkowski
56178ee8d1cSJulian Grajkowski ret = 0;
56278ee8d1cSJulian Grajkowski failed:
56378ee8d1cSJulian Grajkowski free(crypto_inst, M_QAT);
56478ee8d1cSJulian Grajkowski free(val, M_QAT);
56578ee8d1cSJulian Grajkowski free(key, M_QAT);
56678ee8d1cSJulian Grajkowski
56778ee8d1cSJulian Grajkowski if (ret)
56878ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
56978ee8d1cSJulian Grajkowski "Failed to create rings for cy\n");
57078ee8d1cSJulian Grajkowski
57178ee8d1cSJulian Grajkowski return ret;
57278ee8d1cSJulian Grajkowski }
57378ee8d1cSJulian Grajkowski
57478ee8d1cSJulian Grajkowski static int
adf_cfg_create_rings_entries_for_dc_inst(struct adf_accel_dev * accel_dev,const char * processed_sec,const char * derived_sec,int process_num)57578ee8d1cSJulian Grajkowski adf_cfg_create_rings_entries_for_dc_inst(struct adf_accel_dev *accel_dev,
57678ee8d1cSJulian Grajkowski const char *processed_sec,
57778ee8d1cSJulian Grajkowski const char *derived_sec,
57878ee8d1cSJulian Grajkowski int process_num)
57978ee8d1cSJulian Grajkowski {
58078ee8d1cSJulian Grajkowski int i = 0;
58178ee8d1cSJulian Grajkowski int ret = EFAULT;
58278ee8d1cSJulian Grajkowski unsigned long num_inst = 0, num_cy_inst = 0;
58378ee8d1cSJulian Grajkowski unsigned long core_number = 0;
58478ee8d1cSJulian Grajkowski unsigned long polling_mode = 0;
58578ee8d1cSJulian Grajkowski struct adf_cfg_instance *dc_inst = NULL;
58678ee8d1cSJulian Grajkowski
58778ee8d1cSJulian Grajkowski char *key = NULL;
58878ee8d1cSJulian Grajkowski char *val = NULL;
58978ee8d1cSJulian Grajkowski
59078ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
59178ee8d1cSJulian Grajkowski
59278ee8d1cSJulian Grajkowski val = malloc(ADF_CFG_MAX_VAL_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
59378ee8d1cSJulian Grajkowski
59478ee8d1cSJulian Grajkowski ret = EFAULT;
59578ee8d1cSJulian Grajkowski
59678ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_STR_LEN, ADF_SERVICES_ENABLED);
59778ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC, key, val))
59878ee8d1cSJulian Grajkowski goto failed;
59978ee8d1cSJulian Grajkowski
60078ee8d1cSJulian Grajkowski if (!strncmp(val, ADF_CFG_DC, ADF_CFG_MAX_VAL_LEN_IN_BYTES)) {
60178ee8d1cSJulian Grajkowski strlcpy(key, ADF_NUM_CY, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
60278ee8d1cSJulian Grajkowski if (adf_cfg_set_value(
60378ee8d1cSJulian Grajkowski accel_dev, processed_sec, key, &num_cy_inst))
60478ee8d1cSJulian Grajkowski goto failed;
60578ee8d1cSJulian Grajkowski if (num_cy_inst > 0) {
60678ee8d1cSJulian Grajkowski device_printf(
60778ee8d1cSJulian Grajkowski GET_DEV(accel_dev),
60878ee8d1cSJulian Grajkowski "NumCyInstances > 0,when DC only is enabled\n");
60978ee8d1cSJulian Grajkowski goto failed;
61078ee8d1cSJulian Grajkowski }
61178ee8d1cSJulian Grajkowski }
61278ee8d1cSJulian Grajkowski
61378ee8d1cSJulian Grajkowski strlcpy(key, ADF_NUM_DC, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
61478ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, processed_sec, key, &num_inst))
61578ee8d1cSJulian Grajkowski goto failed;
61678ee8d1cSJulian Grajkowski
61778ee8d1cSJulian Grajkowski dc_inst = malloc(sizeof(*dc_inst), M_QAT, M_WAITOK | M_ZERO);
61878ee8d1cSJulian Grajkowski
61978ee8d1cSJulian Grajkowski for (i = 0; i < num_inst; i++) {
62078ee8d1cSJulian Grajkowski memset(dc_inst, 0, sizeof(*dc_inst));
62178ee8d1cSJulian Grajkowski dc_inst->stype = COMP;
62278ee8d1cSJulian Grajkowski snprintf(key,
62378ee8d1cSJulian Grajkowski ADF_CFG_MAX_STR_LEN,
62478ee8d1cSJulian Grajkowski ADF_DC_CORE_AFFINITY_FORMAT,
62578ee8d1cSJulian Grajkowski i);
62678ee8d1cSJulian Grajkowski
62778ee8d1cSJulian Grajkowski if (adf_cfg_set_core_number_for_instance(accel_dev,
62878ee8d1cSJulian Grajkowski processed_sec,
62978ee8d1cSJulian Grajkowski key,
63078ee8d1cSJulian Grajkowski process_num,
63178ee8d1cSJulian Grajkowski &core_number))
63278ee8d1cSJulian Grajkowski goto failed;
63378ee8d1cSJulian Grajkowski
63478ee8d1cSJulian Grajkowski if (strcmp(processed_sec, ADF_KERNEL_SEC) &&
63578ee8d1cSJulian Grajkowski strcmp(processed_sec, ADF_KERNEL_SAL_SEC)) {
63678ee8d1cSJulian Grajkowski adf_cfg_add_key_value_param(accel_dev,
63778ee8d1cSJulian Grajkowski derived_sec,
63878ee8d1cSJulian Grajkowski key,
63978ee8d1cSJulian Grajkowski (void *)&core_number,
64078ee8d1cSJulian Grajkowski ADF_DEC);
64178ee8d1cSJulian Grajkowski }
64278ee8d1cSJulian Grajkowski
64378ee8d1cSJulian Grajkowski snprintf(key,
64478ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
64578ee8d1cSJulian Grajkowski ADF_DC_NAME_FORMAT,
64678ee8d1cSJulian Grajkowski i);
64778ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, processed_sec, key, val))
64878ee8d1cSJulian Grajkowski goto failed;
64978ee8d1cSJulian Grajkowski
65078ee8d1cSJulian Grajkowski strlcpy(dc_inst->name, val, sizeof(dc_inst->name));
65178ee8d1cSJulian Grajkowski
65278ee8d1cSJulian Grajkowski snprintf(key,
65378ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
65478ee8d1cSJulian Grajkowski ADF_DC_POLL_MODE_FORMAT,
65578ee8d1cSJulian Grajkowski i);
65678ee8d1cSJulian Grajkowski if (adf_cfg_set_value(
65778ee8d1cSJulian Grajkowski accel_dev, processed_sec, key, &polling_mode))
65878ee8d1cSJulian Grajkowski goto failed;
65978ee8d1cSJulian Grajkowski
66078ee8d1cSJulian Grajkowski dc_inst->polling_mode = polling_mode;
66178ee8d1cSJulian Grajkowski CPU_ZERO(&dc_inst->affinity_mask);
66278ee8d1cSJulian Grajkowski CPU_SET(core_number, &dc_inst->affinity_mask);
66378ee8d1cSJulian Grajkowski
66478ee8d1cSJulian Grajkowski if (adf_cfg_get_ring_pairs(
66578ee8d1cSJulian Grajkowski accel_dev->cfg->dev, dc_inst, derived_sec, accel_dev))
66678ee8d1cSJulian Grajkowski goto failed;
66778ee8d1cSJulian Grajkowski
66878ee8d1cSJulian Grajkowski adf_cfg_add_dc_inst_info(accel_dev, dc_inst, derived_sec, i);
66978ee8d1cSJulian Grajkowski }
67078ee8d1cSJulian Grajkowski
67178ee8d1cSJulian Grajkowski ret = 0;
67278ee8d1cSJulian Grajkowski failed:
67378ee8d1cSJulian Grajkowski free(dc_inst, M_QAT);
67478ee8d1cSJulian Grajkowski free(val, M_QAT);
67578ee8d1cSJulian Grajkowski free(key, M_QAT);
67678ee8d1cSJulian Grajkowski
67778ee8d1cSJulian Grajkowski if (ret)
67878ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
67978ee8d1cSJulian Grajkowski "Failed to create rings for dc\n");
68078ee8d1cSJulian Grajkowski
68178ee8d1cSJulian Grajkowski return ret;
68278ee8d1cSJulian Grajkowski }
68378ee8d1cSJulian Grajkowski
68478ee8d1cSJulian Grajkowski static int
adf_cfg_process_user_section(struct adf_accel_dev * accel_dev,const char * sec_name,int dev)68578ee8d1cSJulian Grajkowski adf_cfg_process_user_section(struct adf_accel_dev *accel_dev,
68678ee8d1cSJulian Grajkowski const char *sec_name,
68778ee8d1cSJulian Grajkowski int dev)
68878ee8d1cSJulian Grajkowski {
68978ee8d1cSJulian Grajkowski int i = 0;
69078ee8d1cSJulian Grajkowski int ret = EFAULT;
69178ee8d1cSJulian Grajkowski unsigned long num_processes = 0;
69278ee8d1cSJulian Grajkowski unsigned long limit_dev_acc = 0;
69378ee8d1cSJulian Grajkowski u8 serv_type = 0;
69478ee8d1cSJulian Grajkowski
69578ee8d1cSJulian Grajkowski char *key = NULL;
69678ee8d1cSJulian Grajkowski char *val = NULL;
69778ee8d1cSJulian Grajkowski char *derived_sec_name = NULL;
69878ee8d1cSJulian Grajkowski
69978ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
70078ee8d1cSJulian Grajkowski
70178ee8d1cSJulian Grajkowski val = malloc(ADF_CFG_MAX_VAL_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
70278ee8d1cSJulian Grajkowski
70378ee8d1cSJulian Grajkowski derived_sec_name =
70478ee8d1cSJulian Grajkowski malloc(ADF_CFG_MAX_STR_LEN, M_QAT, M_WAITOK | M_ZERO);
70578ee8d1cSJulian Grajkowski
70678ee8d1cSJulian Grajkowski strlcpy(key, ADF_NUM_PROCESSES, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
70778ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, sec_name, key, &num_processes))
70878ee8d1cSJulian Grajkowski num_processes = 0;
70978ee8d1cSJulian Grajkowski
71078ee8d1cSJulian Grajkowski strlcpy(key, ADF_LIMIT_DEV_ACCESS, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
71178ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, sec_name, key, &limit_dev_acc))
71278ee8d1cSJulian Grajkowski limit_dev_acc = 0;
71378ee8d1cSJulian Grajkowski
71478ee8d1cSJulian Grajkowski for (i = 0; i < num_processes; i++) {
71578ee8d1cSJulian Grajkowski if (limit_dev_acc)
71678ee8d1cSJulian Grajkowski snprintf(derived_sec_name,
71778ee8d1cSJulian Grajkowski ADF_CFG_MAX_STR_LEN,
71878ee8d1cSJulian Grajkowski ADF_LIMITED_USER_SECTION_NAME_FORMAT,
71978ee8d1cSJulian Grajkowski sec_name,
72078ee8d1cSJulian Grajkowski dev,
72178ee8d1cSJulian Grajkowski i);
72278ee8d1cSJulian Grajkowski else
72378ee8d1cSJulian Grajkowski snprintf(derived_sec_name,
72478ee8d1cSJulian Grajkowski ADF_CFG_MAX_STR_LEN,
72578ee8d1cSJulian Grajkowski ADF_USER_SECTION_NAME_FORMAT,
72678ee8d1cSJulian Grajkowski sec_name,
72778ee8d1cSJulian Grajkowski i);
72878ee8d1cSJulian Grajkowski
72978ee8d1cSJulian Grajkowski if (adf_cfg_derived_section_add(accel_dev, derived_sec_name))
73078ee8d1cSJulian Grajkowski goto failed;
73178ee8d1cSJulian Grajkowski
73278ee8d1cSJulian Grajkowski /* copy items to the derived section */
73378ee8d1cSJulian Grajkowski adf_cfg_section_copy(accel_dev, sec_name, derived_sec_name);
73478ee8d1cSJulian Grajkowski
73578ee8d1cSJulian Grajkowski for (serv_type = NA; serv_type <= USED; serv_type++) {
73678ee8d1cSJulian Grajkowski switch (serv_type) {
73778ee8d1cSJulian Grajkowski case NA:
73878ee8d1cSJulian Grajkowski break;
73978ee8d1cSJulian Grajkowski case CRYPTO:
74078ee8d1cSJulian Grajkowski case ASYM:
74178ee8d1cSJulian Grajkowski case SYM:
74278ee8d1cSJulian Grajkowski if (adf_cfg_is_svc_enabled(accel_dev,
74378ee8d1cSJulian Grajkowski serv_type))
74478ee8d1cSJulian Grajkowski if (adf_cfg_create_rings_entries_for_cy_inst(
74578ee8d1cSJulian Grajkowski accel_dev,
74678ee8d1cSJulian Grajkowski sec_name,
74778ee8d1cSJulian Grajkowski derived_sec_name,
74878ee8d1cSJulian Grajkowski i,
74978ee8d1cSJulian Grajkowski (enum adf_cfg_service_type)
75078ee8d1cSJulian Grajkowski serv_type))
75178ee8d1cSJulian Grajkowski goto failed;
75278ee8d1cSJulian Grajkowski break;
75378ee8d1cSJulian Grajkowski case COMP:
75478ee8d1cSJulian Grajkowski if (adf_cfg_is_svc_enabled(accel_dev,
75578ee8d1cSJulian Grajkowski serv_type))
75678ee8d1cSJulian Grajkowski if (adf_cfg_create_rings_entries_for_dc_inst(
75778ee8d1cSJulian Grajkowski accel_dev,
75878ee8d1cSJulian Grajkowski sec_name,
75978ee8d1cSJulian Grajkowski derived_sec_name,
76078ee8d1cSJulian Grajkowski i))
76178ee8d1cSJulian Grajkowski goto failed;
76278ee8d1cSJulian Grajkowski break;
76378ee8d1cSJulian Grajkowski case USED:
76478ee8d1cSJulian Grajkowski break;
76578ee8d1cSJulian Grajkowski default:
76678ee8d1cSJulian Grajkowski pr_err("Unknown service type %d.\n", serv_type);
76778ee8d1cSJulian Grajkowski }
76878ee8d1cSJulian Grajkowski }
76978ee8d1cSJulian Grajkowski }
77078ee8d1cSJulian Grajkowski
77178ee8d1cSJulian Grajkowski ret = 0;
77278ee8d1cSJulian Grajkowski failed:
77378ee8d1cSJulian Grajkowski
77478ee8d1cSJulian Grajkowski free(val, M_QAT);
77578ee8d1cSJulian Grajkowski free(key, M_QAT);
77678ee8d1cSJulian Grajkowski free(derived_sec_name, M_QAT);
77778ee8d1cSJulian Grajkowski
77878ee8d1cSJulian Grajkowski if (ret)
77978ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
78078ee8d1cSJulian Grajkowski "Failed to process user section %s\n",
78178ee8d1cSJulian Grajkowski sec_name);
78278ee8d1cSJulian Grajkowski
78378ee8d1cSJulian Grajkowski return ret;
78478ee8d1cSJulian Grajkowski }
78578ee8d1cSJulian Grajkowski
78678ee8d1cSJulian Grajkowski static int
adf_cfg_cleanup_user_section(struct adf_accel_dev * accel_dev,const char * sec_name)78778ee8d1cSJulian Grajkowski adf_cfg_cleanup_user_section(struct adf_accel_dev *accel_dev,
78878ee8d1cSJulian Grajkowski const char *sec_name)
78978ee8d1cSJulian Grajkowski {
79078ee8d1cSJulian Grajkowski struct adf_cfg_section *sec = adf_cfg_sec_find(accel_dev, sec_name);
79178ee8d1cSJulian Grajkowski struct list_head *head;
79278ee8d1cSJulian Grajkowski struct list_head *list_ptr, *tmp;
79378ee8d1cSJulian Grajkowski
79478ee8d1cSJulian Grajkowski if (!sec)
79578ee8d1cSJulian Grajkowski return EFAULT;
79678ee8d1cSJulian Grajkowski
79778ee8d1cSJulian Grajkowski if (sec->is_derived)
79878ee8d1cSJulian Grajkowski return 0;
79978ee8d1cSJulian Grajkowski
80078ee8d1cSJulian Grajkowski head = &sec->param_head;
80178ee8d1cSJulian Grajkowski list_for_each_prev_safe(list_ptr, tmp, head)
80278ee8d1cSJulian Grajkowski {
80378ee8d1cSJulian Grajkowski struct adf_cfg_key_val *ptr =
80478ee8d1cSJulian Grajkowski list_entry(list_ptr, struct adf_cfg_key_val, list);
80578ee8d1cSJulian Grajkowski
80678ee8d1cSJulian Grajkowski if (!strcmp(ptr->key, ADF_LIMIT_DEV_ACCESS))
80778ee8d1cSJulian Grajkowski continue;
80878ee8d1cSJulian Grajkowski
80978ee8d1cSJulian Grajkowski list_del(list_ptr);
81078ee8d1cSJulian Grajkowski free(ptr, M_QAT);
81178ee8d1cSJulian Grajkowski }
81278ee8d1cSJulian Grajkowski return 0;
81378ee8d1cSJulian Grajkowski }
81478ee8d1cSJulian Grajkowski
81578ee8d1cSJulian Grajkowski static int
adf_cfg_process_section_no_op(struct adf_accel_dev * accel_dev,const char * sec_name)81678ee8d1cSJulian Grajkowski adf_cfg_process_section_no_op(struct adf_accel_dev *accel_dev,
81778ee8d1cSJulian Grajkowski const char *sec_name)
81878ee8d1cSJulian Grajkowski {
81978ee8d1cSJulian Grajkowski return 0;
82078ee8d1cSJulian Grajkowski }
82178ee8d1cSJulian Grajkowski
82278ee8d1cSJulian Grajkowski static int
adf_cfg_cleanup_general_section(struct adf_accel_dev * accel_dev,const char * sec_name)82378ee8d1cSJulian Grajkowski adf_cfg_cleanup_general_section(struct adf_accel_dev *accel_dev,
82478ee8d1cSJulian Grajkowski const char *sec_name)
82578ee8d1cSJulian Grajkowski {
82678ee8d1cSJulian Grajkowski unsigned long first_used_bundle = 0;
82778ee8d1cSJulian Grajkowski int ret = EFAULT;
82878ee8d1cSJulian Grajkowski char *key = NULL;
82978ee8d1cSJulian Grajkowski char *val = NULL;
83078ee8d1cSJulian Grajkowski
83178ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
83278ee8d1cSJulian Grajkowski
83378ee8d1cSJulian Grajkowski val = malloc(ADF_CFG_MAX_VAL_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
83478ee8d1cSJulian Grajkowski
83578ee8d1cSJulian Grajkowski /* Remove sections that not needed after processing */
83678ee8d1cSJulian Grajkowski strlcpy(key, ADF_CONFIG_VERSION, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
83778ee8d1cSJulian Grajkowski if (adf_cfg_remove_key_param(accel_dev, sec_name, key))
83878ee8d1cSJulian Grajkowski goto failed;
83978ee8d1cSJulian Grajkowski
84078ee8d1cSJulian Grajkowski strlcpy(key, ADF_CY ADF_RING_ASYM_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
84178ee8d1cSJulian Grajkowski if (adf_cfg_remove_key_param(accel_dev, sec_name, key))
84278ee8d1cSJulian Grajkowski goto failed;
84378ee8d1cSJulian Grajkowski
84478ee8d1cSJulian Grajkowski strlcpy(key, ADF_CY ADF_RING_SYM_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
84578ee8d1cSJulian Grajkowski if (adf_cfg_remove_key_param(accel_dev, sec_name, key))
84678ee8d1cSJulian Grajkowski goto failed;
84778ee8d1cSJulian Grajkowski
84878ee8d1cSJulian Grajkowski strlcpy(key, ADF_DC ADF_RING_DC_SIZE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
84978ee8d1cSJulian Grajkowski if (adf_cfg_remove_key_param(accel_dev, sec_name, key))
85078ee8d1cSJulian Grajkowski goto failed;
85178ee8d1cSJulian Grajkowski
85278ee8d1cSJulian Grajkowski /* After all processing done, set the "FirstUserBundle" value */
85378ee8d1cSJulian Grajkowski first_used_bundle = accel_dev->cfg->dev->max_kernel_bundle_nr + 1;
85478ee8d1cSJulian Grajkowski strlcpy(key, ADF_FIRST_USER_BUNDLE, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
85578ee8d1cSJulian Grajkowski if (adf_cfg_add_key_value_param(
85678ee8d1cSJulian Grajkowski accel_dev, sec_name, key, (void *)&first_used_bundle, ADF_DEC))
85778ee8d1cSJulian Grajkowski goto failed;
85878ee8d1cSJulian Grajkowski
85978ee8d1cSJulian Grajkowski ret = 0;
86078ee8d1cSJulian Grajkowski failed:
86178ee8d1cSJulian Grajkowski free(key, M_QAT);
86278ee8d1cSJulian Grajkowski free(val, M_QAT);
86378ee8d1cSJulian Grajkowski
86478ee8d1cSJulian Grajkowski if (ret)
86578ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
86678ee8d1cSJulian Grajkowski "Failed to clean up general section\n");
86778ee8d1cSJulian Grajkowski
86878ee8d1cSJulian Grajkowski return ret;
86978ee8d1cSJulian Grajkowski }
87078ee8d1cSJulian Grajkowski
87178ee8d1cSJulian Grajkowski static int
adf_cfg_process_kernel_section(struct adf_accel_dev * accel_dev,const char * sec_name)87278ee8d1cSJulian Grajkowski adf_cfg_process_kernel_section(struct adf_accel_dev *accel_dev,
87378ee8d1cSJulian Grajkowski const char *sec_name)
87478ee8d1cSJulian Grajkowski {
87578ee8d1cSJulian Grajkowski u8 serv_type = 0;
87678ee8d1cSJulian Grajkowski
87778ee8d1cSJulian Grajkowski for (serv_type = NA; serv_type <= USED; serv_type++) {
87878ee8d1cSJulian Grajkowski switch (serv_type) {
87978ee8d1cSJulian Grajkowski case NA:
88078ee8d1cSJulian Grajkowski break;
88178ee8d1cSJulian Grajkowski case CRYPTO:
88278ee8d1cSJulian Grajkowski case ASYM:
88378ee8d1cSJulian Grajkowski case SYM:
88478ee8d1cSJulian Grajkowski if (adf_cfg_is_svc_enabled(accel_dev, serv_type))
88578ee8d1cSJulian Grajkowski if (adf_cfg_create_rings_entries_for_cy_inst(
88678ee8d1cSJulian Grajkowski accel_dev,
88778ee8d1cSJulian Grajkowski sec_name,
88878ee8d1cSJulian Grajkowski sec_name,
88978ee8d1cSJulian Grajkowski 0,
89078ee8d1cSJulian Grajkowski (enum adf_cfg_service_type)serv_type))
89178ee8d1cSJulian Grajkowski goto failed;
89278ee8d1cSJulian Grajkowski break;
89378ee8d1cSJulian Grajkowski case COMP:
89478ee8d1cSJulian Grajkowski if (adf_cfg_is_svc_enabled(accel_dev, serv_type))
89578ee8d1cSJulian Grajkowski if (adf_cfg_create_rings_entries_for_dc_inst(
89678ee8d1cSJulian Grajkowski accel_dev, sec_name, sec_name, 0))
89778ee8d1cSJulian Grajkowski goto failed;
89878ee8d1cSJulian Grajkowski break;
89978ee8d1cSJulian Grajkowski case USED:
90078ee8d1cSJulian Grajkowski break;
90178ee8d1cSJulian Grajkowski default:
90278ee8d1cSJulian Grajkowski pr_err("Unknown service type of instance %d.\n",
90378ee8d1cSJulian Grajkowski serv_type);
90478ee8d1cSJulian Grajkowski }
90578ee8d1cSJulian Grajkowski }
90678ee8d1cSJulian Grajkowski
90778ee8d1cSJulian Grajkowski return 0;
90878ee8d1cSJulian Grajkowski
90978ee8d1cSJulian Grajkowski failed:
91078ee8d1cSJulian Grajkowski return EFAULT;
91178ee8d1cSJulian Grajkowski }
91278ee8d1cSJulian Grajkowski
91378ee8d1cSJulian Grajkowski static int
adf_cfg_cleanup_kernel_section(struct adf_accel_dev * accel_dev,const char * sec_name)91478ee8d1cSJulian Grajkowski adf_cfg_cleanup_kernel_section(struct adf_accel_dev *accel_dev,
91578ee8d1cSJulian Grajkowski const char *sec_name)
91678ee8d1cSJulian Grajkowski {
91778ee8d1cSJulian Grajkowski return 0;
91878ee8d1cSJulian Grajkowski }
91978ee8d1cSJulian Grajkowski
92078ee8d1cSJulian Grajkowski static int
adf_cfg_create_accel_section(struct adf_accel_dev * accel_dev,const char * sec_name)92178ee8d1cSJulian Grajkowski adf_cfg_create_accel_section(struct adf_accel_dev *accel_dev,
92278ee8d1cSJulian Grajkowski const char *sec_name)
92378ee8d1cSJulian Grajkowski {
92478ee8d1cSJulian Grajkowski /* Find global settings for coalescing. Use defaults if not found */
92578ee8d1cSJulian Grajkowski unsigned long accel_coales = 0;
92678ee8d1cSJulian Grajkowski unsigned long accel_coales_timer = 0;
92778ee8d1cSJulian Grajkowski unsigned long accel_coales_num_msg = 0;
92878ee8d1cSJulian Grajkowski unsigned long cpu;
92978ee8d1cSJulian Grajkowski char *key = NULL;
93078ee8d1cSJulian Grajkowski char *val = NULL;
93178ee8d1cSJulian Grajkowski int ret = EFAULT;
93278ee8d1cSJulian Grajkowski int index = 0;
93378ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_device = accel_dev->hw_device;
93478ee8d1cSJulian Grajkowski
93578ee8d1cSJulian Grajkowski if (!hw_device)
93678ee8d1cSJulian Grajkowski goto failed;
93778ee8d1cSJulian Grajkowski
93878ee8d1cSJulian Grajkowski key = malloc(ADF_CFG_MAX_KEY_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
93978ee8d1cSJulian Grajkowski
94078ee8d1cSJulian Grajkowski val = malloc(ADF_CFG_MAX_VAL_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
94178ee8d1cSJulian Grajkowski
94278ee8d1cSJulian Grajkowski strlcpy(key,
94378ee8d1cSJulian Grajkowski ADF_ETRMGR_COALESCING_ENABLED,
94478ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES);
94578ee8d1cSJulian Grajkowski if (adf_cfg_set_value(accel_dev, ADF_GENERAL_SEC, key, &accel_coales))
94678ee8d1cSJulian Grajkowski accel_coales = ADF_CFG_ACCEL_DEF_COALES;
94778ee8d1cSJulian Grajkowski
94878ee8d1cSJulian Grajkowski strlcpy(key, ADF_ETRMGR_COALESCE_TIMER, ADF_CFG_MAX_KEY_LEN_IN_BYTES);
94978ee8d1cSJulian Grajkowski if (adf_cfg_set_value(
95078ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, &accel_coales_timer))
95178ee8d1cSJulian Grajkowski accel_coales_timer = ADF_CFG_ACCEL_DEF_COALES_TIMER;
95278ee8d1cSJulian Grajkowski
95378ee8d1cSJulian Grajkowski strlcpy(key,
95478ee8d1cSJulian Grajkowski ADF_ETRMGR_COALESCING_MSG_ENABLED,
95578ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES);
95678ee8d1cSJulian Grajkowski if (adf_cfg_set_value(
95778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, &accel_coales_num_msg))
95878ee8d1cSJulian Grajkowski accel_coales_num_msg = ADF_CFG_ACCEL_DEF_COALES_NUM_MSG;
95978ee8d1cSJulian Grajkowski
96078ee8d1cSJulian Grajkowski for (index = 0; index < hw_device->num_banks; index++) {
96178ee8d1cSJulian Grajkowski snprintf(key,
96278ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
96378ee8d1cSJulian Grajkowski ADF_ETRMGR_COALESCING_ENABLED_FORMAT,
96478ee8d1cSJulian Grajkowski index);
96578ee8d1cSJulian Grajkowski ret = adf_cfg_add_key_value_param(
96678ee8d1cSJulian Grajkowski accel_dev, sec_name, key, &accel_coales, ADF_DEC);
96778ee8d1cSJulian Grajkowski if (ret != 0)
96878ee8d1cSJulian Grajkowski goto failed;
96978ee8d1cSJulian Grajkowski
97078ee8d1cSJulian Grajkowski snprintf(key,
97178ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
97278ee8d1cSJulian Grajkowski ADF_ETRMGR_COALESCE_TIMER_FORMAT,
97378ee8d1cSJulian Grajkowski index);
97478ee8d1cSJulian Grajkowski ret = adf_cfg_add_key_value_param(
97578ee8d1cSJulian Grajkowski accel_dev, sec_name, key, &accel_coales_timer, ADF_DEC);
97678ee8d1cSJulian Grajkowski if (ret != 0)
97778ee8d1cSJulian Grajkowski goto failed;
97878ee8d1cSJulian Grajkowski
97978ee8d1cSJulian Grajkowski snprintf(key,
98078ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
98178ee8d1cSJulian Grajkowski ADF_ETRMGR_COALESCING_MSG_ENABLED_FORMAT,
98278ee8d1cSJulian Grajkowski index);
98378ee8d1cSJulian Grajkowski ret = adf_cfg_add_key_value_param(
98478ee8d1cSJulian Grajkowski accel_dev, sec_name, key, &accel_coales_num_msg, ADF_DEC);
98578ee8d1cSJulian Grajkowski if (ret != 0)
98678ee8d1cSJulian Grajkowski goto failed;
98778ee8d1cSJulian Grajkowski
98878ee8d1cSJulian Grajkowski cpu = ADF_CFG_AFFINITY_WHATEVER;
98978ee8d1cSJulian Grajkowski
99078ee8d1cSJulian Grajkowski snprintf(key,
99178ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
99278ee8d1cSJulian Grajkowski ADF_ETRMGR_CORE_AFFINITY_FORMAT,
99378ee8d1cSJulian Grajkowski index);
99478ee8d1cSJulian Grajkowski ret = adf_cfg_add_key_value_param(
99578ee8d1cSJulian Grajkowski accel_dev, sec_name, key, &cpu, ADF_DEC);
99678ee8d1cSJulian Grajkowski if (ret != 0)
99778ee8d1cSJulian Grajkowski goto failed;
99878ee8d1cSJulian Grajkowski }
99978ee8d1cSJulian Grajkowski
100078ee8d1cSJulian Grajkowski ret = 0;
100178ee8d1cSJulian Grajkowski
100278ee8d1cSJulian Grajkowski failed:
100378ee8d1cSJulian Grajkowski free(key, M_QAT);
100478ee8d1cSJulian Grajkowski free(val, M_QAT);
100578ee8d1cSJulian Grajkowski
100678ee8d1cSJulian Grajkowski if (ret)
100778ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
100878ee8d1cSJulian Grajkowski "Failed to create accel section\n");
100978ee8d1cSJulian Grajkowski
101078ee8d1cSJulian Grajkowski return ret;
101178ee8d1cSJulian Grajkowski }
101278ee8d1cSJulian Grajkowski
101378ee8d1cSJulian Grajkowski static int
adf_cfg_cleanup_accel_section(struct adf_accel_dev * accel_dev,const char * sec_name)101478ee8d1cSJulian Grajkowski adf_cfg_cleanup_accel_section(struct adf_accel_dev *accel_dev,
101578ee8d1cSJulian Grajkowski const char *sec_name)
101678ee8d1cSJulian Grajkowski {
101778ee8d1cSJulian Grajkowski return 0;
101878ee8d1cSJulian Grajkowski }
101978ee8d1cSJulian Grajkowski
102078ee8d1cSJulian Grajkowski static int
adf_cfg_process_accel_section(struct adf_accel_dev * accel_dev,const char * sec_name)102178ee8d1cSJulian Grajkowski adf_cfg_process_accel_section(struct adf_accel_dev *accel_dev,
102278ee8d1cSJulian Grajkowski const char *sec_name)
102378ee8d1cSJulian Grajkowski {
102478ee8d1cSJulian Grajkowski int accel_num = 0;
102578ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_device = accel_dev->hw_device;
102678ee8d1cSJulian Grajkowski char *derived_name = NULL;
102778ee8d1cSJulian Grajkowski int ret = EFAULT;
102878ee8d1cSJulian Grajkowski
102978ee8d1cSJulian Grajkowski if (!hw_device)
103078ee8d1cSJulian Grajkowski goto failed;
103178ee8d1cSJulian Grajkowski
103278ee8d1cSJulian Grajkowski if (hw_device->num_logical_accel == 0)
103378ee8d1cSJulian Grajkowski goto failed;
103478ee8d1cSJulian Grajkowski
103578ee8d1cSJulian Grajkowski derived_name =
103678ee8d1cSJulian Grajkowski malloc(ADF_CFG_MAX_SECTION_LEN_IN_BYTES, M_QAT, M_WAITOK | M_ZERO);
103778ee8d1cSJulian Grajkowski
103878ee8d1cSJulian Grajkowski for (accel_num = 0; accel_num < hw_device->num_logical_accel;
103978ee8d1cSJulian Grajkowski accel_num++) {
104078ee8d1cSJulian Grajkowski snprintf(derived_name,
104178ee8d1cSJulian Grajkowski ADF_CFG_MAX_SECTION_LEN_IN_BYTES,
104278ee8d1cSJulian Grajkowski ADF_ACCEL_STR,
104378ee8d1cSJulian Grajkowski accel_num);
104478ee8d1cSJulian Grajkowski ret = adf_cfg_section_add(accel_dev, derived_name);
104578ee8d1cSJulian Grajkowski if (ret != 0)
104678ee8d1cSJulian Grajkowski goto failed;
104778ee8d1cSJulian Grajkowski
104878ee8d1cSJulian Grajkowski ret = adf_cfg_create_accel_section(accel_dev, derived_name);
104978ee8d1cSJulian Grajkowski if (ret != 0)
105078ee8d1cSJulian Grajkowski goto failed;
105178ee8d1cSJulian Grajkowski }
105278ee8d1cSJulian Grajkowski
105378ee8d1cSJulian Grajkowski ret = 0;
105478ee8d1cSJulian Grajkowski failed:
105578ee8d1cSJulian Grajkowski free(derived_name, M_QAT);
105678ee8d1cSJulian Grajkowski
105778ee8d1cSJulian Grajkowski if (ret)
105878ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
105978ee8d1cSJulian Grajkowski "Failed to process accel section\n");
106078ee8d1cSJulian Grajkowski
106178ee8d1cSJulian Grajkowski return ret;
106278ee8d1cSJulian Grajkowski }
106378ee8d1cSJulian Grajkowski
106478ee8d1cSJulian Grajkowski int
adf_cfg_process_section(struct adf_accel_dev * accel_dev,const char * sec_name,int dev)106578ee8d1cSJulian Grajkowski adf_cfg_process_section(struct adf_accel_dev *accel_dev,
106678ee8d1cSJulian Grajkowski const char *sec_name,
106778ee8d1cSJulian Grajkowski int dev)
106878ee8d1cSJulian Grajkowski {
106978ee8d1cSJulian Grajkowski if (!strcmp(sec_name, ADF_GENERAL_SEC) ||
107078ee8d1cSJulian Grajkowski !strcmp(sec_name, ADF_INLINE_SEC))
107178ee8d1cSJulian Grajkowski return adf_cfg_process_section_no_op(accel_dev, sec_name);
107278ee8d1cSJulian Grajkowski else if (!strcmp(sec_name, ADF_KERNEL_SEC) ||
107378ee8d1cSJulian Grajkowski !strcmp(sec_name, ADF_KERNEL_SAL_SEC))
107478ee8d1cSJulian Grajkowski return adf_cfg_process_kernel_section(accel_dev, sec_name);
107578ee8d1cSJulian Grajkowski else if (!strcmp(sec_name, ADF_ACCEL_SEC))
107678ee8d1cSJulian Grajkowski return adf_cfg_process_accel_section(accel_dev, sec_name);
107778ee8d1cSJulian Grajkowski else
107878ee8d1cSJulian Grajkowski return adf_cfg_process_user_section(accel_dev, sec_name, dev);
107978ee8d1cSJulian Grajkowski }
108078ee8d1cSJulian Grajkowski
108178ee8d1cSJulian Grajkowski int
adf_cfg_cleanup_section(struct adf_accel_dev * accel_dev,const char * sec_name,int dev)108278ee8d1cSJulian Grajkowski adf_cfg_cleanup_section(struct adf_accel_dev *accel_dev,
108378ee8d1cSJulian Grajkowski const char *sec_name,
108478ee8d1cSJulian Grajkowski int dev)
108578ee8d1cSJulian Grajkowski {
108678ee8d1cSJulian Grajkowski if (!strcmp(sec_name, ADF_GENERAL_SEC))
108778ee8d1cSJulian Grajkowski return adf_cfg_cleanup_general_section(accel_dev, sec_name);
108878ee8d1cSJulian Grajkowski else if (!strcmp(sec_name, ADF_INLINE_SEC))
108978ee8d1cSJulian Grajkowski return adf_cfg_process_section_no_op(accel_dev, sec_name);
109078ee8d1cSJulian Grajkowski else if (!strcmp(sec_name, ADF_KERNEL_SEC) ||
109178ee8d1cSJulian Grajkowski !strcmp(sec_name, ADF_KERNEL_SAL_SEC))
109278ee8d1cSJulian Grajkowski return adf_cfg_cleanup_kernel_section(accel_dev, sec_name);
109378ee8d1cSJulian Grajkowski else if (strstr(sec_name, ADF_ACCEL_SEC))
109478ee8d1cSJulian Grajkowski return adf_cfg_cleanup_accel_section(accel_dev, sec_name);
109578ee8d1cSJulian Grajkowski else
109678ee8d1cSJulian Grajkowski return adf_cfg_cleanup_user_section(accel_dev, sec_name);
109778ee8d1cSJulian Grajkowski }
109878ee8d1cSJulian Grajkowski
109978ee8d1cSJulian Grajkowski int
adf_cfg_setup_irq(struct adf_accel_dev * accel_dev)110078ee8d1cSJulian Grajkowski adf_cfg_setup_irq(struct adf_accel_dev *accel_dev)
110178ee8d1cSJulian Grajkowski {
110278ee8d1cSJulian Grajkowski int ret = EFAULT;
110378ee8d1cSJulian Grajkowski struct adf_accel_pci *info_pci_dev = &accel_dev->accel_pci_dev;
110478ee8d1cSJulian Grajkowski struct adf_cfg_device *cfg_dev = NULL;
110578ee8d1cSJulian Grajkowski struct msix_entry *msixe = NULL;
110678ee8d1cSJulian Grajkowski u32 num_msix = 0;
110778ee8d1cSJulian Grajkowski int index = 0;
110878ee8d1cSJulian Grajkowski int computed_core = 0;
110978ee8d1cSJulian Grajkowski
111078ee8d1cSJulian Grajkowski if (!accel_dev || !accel_dev->cfg || !accel_dev->hw_device)
111178ee8d1cSJulian Grajkowski goto failed;
111278ee8d1cSJulian Grajkowski
111378ee8d1cSJulian Grajkowski cfg_dev = accel_dev->cfg->dev;
111478ee8d1cSJulian Grajkowski if (!cfg_dev)
111578ee8d1cSJulian Grajkowski goto failed;
111678ee8d1cSJulian Grajkowski
111778ee8d1cSJulian Grajkowski msixe =
111878ee8d1cSJulian Grajkowski (struct msix_entry *)accel_dev->accel_pci_dev.msix_entries.entries;
111978ee8d1cSJulian Grajkowski num_msix = accel_dev->accel_pci_dev.msix_entries.num_entries;
112078ee8d1cSJulian Grajkowski if (!msixe)
112178ee8d1cSJulian Grajkowski goto cleanup_and_fail;
112278ee8d1cSJulian Grajkowski
112378ee8d1cSJulian Grajkowski /*
112478ee8d1cSJulian Grajkowski * Here we want to set the affinity of kernel and epoll mode
112578ee8d1cSJulian Grajkowski * bundle into user defined value.
112678ee8d1cSJulian Grajkowski * Because in adf_isr.c we setup core affinity by round-robin
112778ee8d1cSJulian Grajkowski * we need to reset it after device up done.
112878ee8d1cSJulian Grajkowski */
112978ee8d1cSJulian Grajkowski for (index = 0; index < accel_dev->hw_device->num_banks; index++) {
113078ee8d1cSJulian Grajkowski struct adf_cfg_bundle *bundle = cfg_dev->bundles[index];
113178ee8d1cSJulian Grajkowski
113278ee8d1cSJulian Grajkowski if (!bundle)
113378ee8d1cSJulian Grajkowski continue;
113478ee8d1cSJulian Grajkowski
113578ee8d1cSJulian Grajkowski if (bundle->type != KERNEL &&
113678ee8d1cSJulian Grajkowski bundle->polling_mode != ADF_CFG_RESP_EPOLL)
113778ee8d1cSJulian Grajkowski continue;
113878ee8d1cSJulian Grajkowski
113978ee8d1cSJulian Grajkowski if (bundle->number >= num_msix)
114078ee8d1cSJulian Grajkowski goto cleanup_and_fail;
114178ee8d1cSJulian Grajkowski
114278ee8d1cSJulian Grajkowski computed_core = CPU_FFS(&bundle->affinity_mask) - 1;
114378ee8d1cSJulian Grajkowski bus_bind_intr(info_pci_dev->pci_dev,
114478ee8d1cSJulian Grajkowski msixe[index].irq,
114578ee8d1cSJulian Grajkowski computed_core);
114678ee8d1cSJulian Grajkowski }
114778ee8d1cSJulian Grajkowski ret = 0;
114878ee8d1cSJulian Grajkowski
114978ee8d1cSJulian Grajkowski cleanup_and_fail:
115078ee8d1cSJulian Grajkowski adf_cfg_device_clear(cfg_dev, accel_dev);
115178ee8d1cSJulian Grajkowski free(cfg_dev, M_QAT);
115278ee8d1cSJulian Grajkowski accel_dev->cfg->dev = NULL;
115378ee8d1cSJulian Grajkowski
115478ee8d1cSJulian Grajkowski failed:
115578ee8d1cSJulian Grajkowski return ret;
115678ee8d1cSJulian Grajkowski }
1157