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_section.h"
578ee8d1cSJulian Grajkowski #include "adf_cfg_device.h"
678ee8d1cSJulian Grajkowski #include "icp_qat_hw.h"
778ee8d1cSJulian Grajkowski #include "adf_common_drv.h"
878ee8d1cSJulian Grajkowski
9*266b0663SKrzysztof Zdziarski #define ADF_CFG_SVCS_MAX (12)
1078ee8d1cSJulian Grajkowski #define ADF_CFG_DEPRE_PARAMS_NUM (4)
1178ee8d1cSJulian Grajkowski
1278ee8d1cSJulian Grajkowski #define ADF_CFG_CAP_DC ADF_ACCEL_CAPABILITIES_COMPRESSION
1378ee8d1cSJulian Grajkowski #define ADF_CFG_CAP_ASYM ADF_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC
1478ee8d1cSJulian Grajkowski #define ADF_CFG_CAP_SYM \
1578ee8d1cSJulian Grajkowski (ADF_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC | \
1678ee8d1cSJulian Grajkowski ADF_ACCEL_CAPABILITIES_CIPHER | \
1778ee8d1cSJulian Grajkowski ADF_ACCEL_CAPABILITIES_AUTHENTICATION)
1878ee8d1cSJulian Grajkowski #define ADF_CFG_CAP_CY (ADF_CFG_CAP_ASYM | ADF_CFG_CAP_SYM)
1978ee8d1cSJulian Grajkowski
2078ee8d1cSJulian Grajkowski #define ADF_CFG_FW_CAP_RL ICP_ACCEL_CAPABILITIES_RL
2178ee8d1cSJulian Grajkowski #define ADF_CFG_FW_CAP_HKDF ICP_ACCEL_CAPABILITIES_HKDF
2278ee8d1cSJulian Grajkowski #define ADF_CFG_FW_CAP_ECEDMONT ICP_ACCEL_CAPABILITIES_ECEDMONT
2378ee8d1cSJulian Grajkowski #define ADF_CFG_FW_CAP_EXT_ALGCHAIN ICP_ACCEL_CAPABILITIES_EXT_ALGCHAIN
2478ee8d1cSJulian Grajkowski
2578ee8d1cSJulian Grajkowski #define ADF_CFG_CY_RINGS \
2678ee8d1cSJulian Grajkowski (CRYPTO | CRYPTO << ADF_CFG_SERV_RING_PAIR_1_SHIFT | \
2778ee8d1cSJulian Grajkowski CRYPTO << ADF_CFG_SERV_RING_PAIR_2_SHIFT | \
2878ee8d1cSJulian Grajkowski CRYPTO << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
2978ee8d1cSJulian Grajkowski
3078ee8d1cSJulian Grajkowski #define ADF_CFG_SYM_RINGS \
3178ee8d1cSJulian Grajkowski (SYM | SYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT | \
3278ee8d1cSJulian Grajkowski SYM << ADF_CFG_SERV_RING_PAIR_2_SHIFT | \
3378ee8d1cSJulian Grajkowski SYM << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
3478ee8d1cSJulian Grajkowski
3578ee8d1cSJulian Grajkowski #define ADF_CFG_ASYM_RINGS \
3678ee8d1cSJulian Grajkowski (ASYM | ASYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT | \
3778ee8d1cSJulian Grajkowski ASYM << ADF_CFG_SERV_RING_PAIR_2_SHIFT | \
3878ee8d1cSJulian Grajkowski ASYM << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
3978ee8d1cSJulian Grajkowski
4078ee8d1cSJulian Grajkowski #define ADF_CFG_CY_DC_RINGS \
4178ee8d1cSJulian Grajkowski (CRYPTO | CRYPTO << ADF_CFG_SERV_RING_PAIR_1_SHIFT | \
4278ee8d1cSJulian Grajkowski NA << ADF_CFG_SERV_RING_PAIR_2_SHIFT | \
4378ee8d1cSJulian Grajkowski COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
4478ee8d1cSJulian Grajkowski
4578ee8d1cSJulian Grajkowski #define ADF_CFG_ASYM_DC_RINGS \
4678ee8d1cSJulian Grajkowski (ASYM | ASYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT | \
4778ee8d1cSJulian Grajkowski COMP << ADF_CFG_SERV_RING_PAIR_2_SHIFT | \
4878ee8d1cSJulian Grajkowski COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
4978ee8d1cSJulian Grajkowski
5078ee8d1cSJulian Grajkowski #define ADF_CFG_SYM_DC_RINGS \
5178ee8d1cSJulian Grajkowski (SYM | SYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT | \
5278ee8d1cSJulian Grajkowski COMP << ADF_CFG_SERV_RING_PAIR_2_SHIFT | \
5378ee8d1cSJulian Grajkowski COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
5478ee8d1cSJulian Grajkowski
5578ee8d1cSJulian Grajkowski #define ADF_CFG_DC_RINGS \
5678ee8d1cSJulian Grajkowski (COMP | COMP << ADF_CFG_SERV_RING_PAIR_1_SHIFT | \
5778ee8d1cSJulian Grajkowski COMP << ADF_CFG_SERV_RING_PAIR_2_SHIFT | \
5878ee8d1cSJulian Grajkowski COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
5978ee8d1cSJulian Grajkowski
6078ee8d1cSJulian Grajkowski static char adf_cfg_deprecated_params[][ADF_CFG_MAX_KEY_LEN_IN_BYTES] =
6178ee8d1cSJulian Grajkowski { ADF_DEV_KPT_ENABLE,
6278ee8d1cSJulian Grajkowski ADF_STORAGE_FIRMWARE_ENABLED,
6378ee8d1cSJulian Grajkowski ADF_RL_FIRMWARE_ENABLED,
6478ee8d1cSJulian Grajkowski ADF_PKE_DISABLED };
6578ee8d1cSJulian Grajkowski
6678ee8d1cSJulian Grajkowski struct adf_cfg_enabled_services {
6778ee8d1cSJulian Grajkowski const char svcs_enabled[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
6878ee8d1cSJulian Grajkowski u16 rng_to_svc_msk;
6978ee8d1cSJulian Grajkowski u32 enabled_svc_cap;
7078ee8d1cSJulian Grajkowski u32 enabled_fw_cap;
7178ee8d1cSJulian Grajkowski };
7278ee8d1cSJulian Grajkowski
7378ee8d1cSJulian Grajkowski struct adf_cfg_profile {
7478ee8d1cSJulian Grajkowski enum adf_cfg_fw_image_type fw_image_type;
7578ee8d1cSJulian Grajkowski struct adf_cfg_enabled_services supported_svcs[ADF_CFG_SVCS_MAX];
7678ee8d1cSJulian Grajkowski };
7778ee8d1cSJulian Grajkowski
7878ee8d1cSJulian Grajkowski static struct adf_cfg_profile adf_profiles[] =
7978ee8d1cSJulian Grajkowski { { ADF_FW_IMAGE_DEFAULT,
8078ee8d1cSJulian Grajkowski {
8178ee8d1cSJulian Grajkowski { "cy",
8278ee8d1cSJulian Grajkowski ADF_CFG_CY_RINGS,
8378ee8d1cSJulian Grajkowski ADF_CFG_CAP_CY,
8478ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
85*266b0663SKrzysztof Zdziarski { "asym;sym",
86*266b0663SKrzysztof Zdziarski ADF_CFG_CY_RINGS,
87*266b0663SKrzysztof Zdziarski ADF_CFG_CAP_CY,
88*266b0663SKrzysztof Zdziarski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
89*266b0663SKrzysztof Zdziarski { "sym;asym",
90*266b0663SKrzysztof Zdziarski ADF_CFG_CY_RINGS,
91*266b0663SKrzysztof Zdziarski ADF_CFG_CAP_CY,
92*266b0663SKrzysztof Zdziarski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
9378ee8d1cSJulian Grajkowski { "dc", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
9478ee8d1cSJulian Grajkowski { "sym",
9578ee8d1cSJulian Grajkowski ADF_CFG_SYM_RINGS,
9678ee8d1cSJulian Grajkowski ADF_CFG_CAP_SYM,
9778ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_EXT_ALGCHAIN },
9878ee8d1cSJulian Grajkowski { "asym",
9978ee8d1cSJulian Grajkowski ADF_CFG_ASYM_RINGS,
10078ee8d1cSJulian Grajkowski ADF_CFG_CAP_ASYM,
10178ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_ECEDMONT },
10278ee8d1cSJulian Grajkowski { "cy;dc",
10378ee8d1cSJulian Grajkowski ADF_CFG_CY_DC_RINGS,
10478ee8d1cSJulian Grajkowski ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
10578ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
10678ee8d1cSJulian Grajkowski { "dc;cy",
10778ee8d1cSJulian Grajkowski ADF_CFG_CY_DC_RINGS,
10878ee8d1cSJulian Grajkowski ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
10978ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
11078ee8d1cSJulian Grajkowski { "asym;dc",
11178ee8d1cSJulian Grajkowski ADF_CFG_ASYM_DC_RINGS,
11278ee8d1cSJulian Grajkowski ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
11378ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_ECEDMONT },
11478ee8d1cSJulian Grajkowski { "dc;asym",
11578ee8d1cSJulian Grajkowski ADF_CFG_ASYM_DC_RINGS,
11678ee8d1cSJulian Grajkowski ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
11778ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_ECEDMONT },
11878ee8d1cSJulian Grajkowski { "sym;dc",
11978ee8d1cSJulian Grajkowski ADF_CFG_SYM_DC_RINGS,
12078ee8d1cSJulian Grajkowski ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
12178ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_EXT_ALGCHAIN },
12278ee8d1cSJulian Grajkowski { "dc;sym",
12378ee8d1cSJulian Grajkowski ADF_CFG_SYM_DC_RINGS,
12478ee8d1cSJulian Grajkowski ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
12578ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_EXT_ALGCHAIN },
12678ee8d1cSJulian Grajkowski } },
12778ee8d1cSJulian Grajkowski { ADF_FW_IMAGE_CRYPTO,
12878ee8d1cSJulian Grajkowski {
12978ee8d1cSJulian Grajkowski { "cy",
13078ee8d1cSJulian Grajkowski ADF_CFG_CY_RINGS,
13178ee8d1cSJulian Grajkowski ADF_CFG_CAP_CY,
13278ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
133*266b0663SKrzysztof Zdziarski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
13478ee8d1cSJulian Grajkowski { "sym",
13578ee8d1cSJulian Grajkowski ADF_CFG_SYM_RINGS,
13678ee8d1cSJulian Grajkowski ADF_CFG_CAP_SYM,
13778ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
13878ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_EXT_ALGCHAIN },
13978ee8d1cSJulian Grajkowski { "asym",
14078ee8d1cSJulian Grajkowski ADF_CFG_ASYM_RINGS,
14178ee8d1cSJulian Grajkowski ADF_CFG_CAP_ASYM,
14278ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
14378ee8d1cSJulian Grajkowski } },
14478ee8d1cSJulian Grajkowski { ADF_FW_IMAGE_COMPRESSION,
14578ee8d1cSJulian Grajkowski {
14678ee8d1cSJulian Grajkowski { "dc", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
14778ee8d1cSJulian Grajkowski } },
14878ee8d1cSJulian Grajkowski { ADF_FW_IMAGE_CUSTOM1,
14978ee8d1cSJulian Grajkowski {
15078ee8d1cSJulian Grajkowski { "cy",
15178ee8d1cSJulian Grajkowski ADF_CFG_CY_RINGS,
15278ee8d1cSJulian Grajkowski ADF_CFG_CAP_CY,
15378ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
154*266b0663SKrzysztof Zdziarski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
15578ee8d1cSJulian Grajkowski { "dc", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
15678ee8d1cSJulian Grajkowski { "sym",
15778ee8d1cSJulian Grajkowski ADF_CFG_SYM_RINGS,
15878ee8d1cSJulian Grajkowski ADF_CFG_CAP_SYM,
15978ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
16078ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_EXT_ALGCHAIN },
16178ee8d1cSJulian Grajkowski { "asym",
16278ee8d1cSJulian Grajkowski ADF_CFG_ASYM_RINGS,
16378ee8d1cSJulian Grajkowski ADF_CFG_CAP_ASYM,
16478ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
16578ee8d1cSJulian Grajkowski { "cy;dc",
16678ee8d1cSJulian Grajkowski ADF_CFG_CY_DC_RINGS,
16778ee8d1cSJulian Grajkowski ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
16878ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
169*266b0663SKrzysztof Zdziarski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
17078ee8d1cSJulian Grajkowski { "dc;cy",
17178ee8d1cSJulian Grajkowski ADF_CFG_CY_DC_RINGS,
17278ee8d1cSJulian Grajkowski ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
17378ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
174*266b0663SKrzysztof Zdziarski ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
17578ee8d1cSJulian Grajkowski { "asym;dc",
17678ee8d1cSJulian Grajkowski ADF_CFG_ASYM_DC_RINGS,
17778ee8d1cSJulian Grajkowski ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
17878ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
17978ee8d1cSJulian Grajkowski { "dc;asym",
18078ee8d1cSJulian Grajkowski ADF_CFG_ASYM_DC_RINGS,
18178ee8d1cSJulian Grajkowski ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
18278ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
18378ee8d1cSJulian Grajkowski { "sym;dc",
18478ee8d1cSJulian Grajkowski ADF_CFG_SYM_DC_RINGS,
18578ee8d1cSJulian Grajkowski ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
18678ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
18778ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_EXT_ALGCHAIN },
18878ee8d1cSJulian Grajkowski { "dc;sym",
18978ee8d1cSJulian Grajkowski ADF_CFG_SYM_DC_RINGS,
19078ee8d1cSJulian Grajkowski ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
19178ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
19278ee8d1cSJulian Grajkowski ADF_CFG_FW_CAP_EXT_ALGCHAIN },
19378ee8d1cSJulian Grajkowski } } };
19478ee8d1cSJulian Grajkowski
19578ee8d1cSJulian Grajkowski int
adf_cfg_get_ring_pairs(struct adf_cfg_device * device,struct adf_cfg_instance * inst,const char * process_name,struct adf_accel_dev * accel_dev)19678ee8d1cSJulian Grajkowski adf_cfg_get_ring_pairs(struct adf_cfg_device *device,
19778ee8d1cSJulian Grajkowski struct adf_cfg_instance *inst,
19878ee8d1cSJulian Grajkowski const char *process_name,
19978ee8d1cSJulian Grajkowski struct adf_accel_dev *accel_dev)
20078ee8d1cSJulian Grajkowski {
20178ee8d1cSJulian Grajkowski int i = 0;
20278ee8d1cSJulian Grajkowski int ret = EFAULT;
20378ee8d1cSJulian Grajkowski struct adf_cfg_instance *free_inst = NULL;
20478ee8d1cSJulian Grajkowski enum adf_cfg_bundle_type free_bundle_type;
20578ee8d1cSJulian Grajkowski int first_user_bundle = 0;
20678ee8d1cSJulian Grajkowski
20778ee8d1cSJulian Grajkowski /* Section of user process with poll mode */
20878ee8d1cSJulian Grajkowski if (strcmp(ADF_KERNEL_SEC, process_name) &&
20978ee8d1cSJulian Grajkowski strcmp(ADF_KERNEL_SAL_SEC, process_name) &&
21078ee8d1cSJulian Grajkowski inst->polling_mode == ADF_CFG_RESP_POLL) {
21178ee8d1cSJulian Grajkowski first_user_bundle = device->max_kernel_bundle_nr + 1;
21278ee8d1cSJulian Grajkowski for (i = first_user_bundle; i < device->bundle_num; i++) {
21378ee8d1cSJulian Grajkowski free_inst = adf_cfg_get_free_instance(
21478ee8d1cSJulian Grajkowski device, device->bundles[i], inst, process_name);
21578ee8d1cSJulian Grajkowski
21678ee8d1cSJulian Grajkowski if (!free_inst)
21778ee8d1cSJulian Grajkowski continue;
21878ee8d1cSJulian Grajkowski
21978ee8d1cSJulian Grajkowski ret = adf_cfg_get_ring_pairs_from_bundle(
22078ee8d1cSJulian Grajkowski device->bundles[i], inst, process_name, free_inst);
22178ee8d1cSJulian Grajkowski return ret;
22278ee8d1cSJulian Grajkowski }
22378ee8d1cSJulian Grajkowski } else {
22478ee8d1cSJulian Grajkowski /* Section of in-tree, or kernel API or user process
22578ee8d1cSJulian Grajkowski * with epoll mode
22678ee8d1cSJulian Grajkowski */
22778ee8d1cSJulian Grajkowski if (!strcmp(ADF_KERNEL_SEC, process_name) ||
22878ee8d1cSJulian Grajkowski !strcmp(ADF_KERNEL_SAL_SEC, process_name))
22978ee8d1cSJulian Grajkowski free_bundle_type = KERNEL;
23078ee8d1cSJulian Grajkowski else
23178ee8d1cSJulian Grajkowski free_bundle_type = USER;
23278ee8d1cSJulian Grajkowski
23378ee8d1cSJulian Grajkowski for (i = 0; i < device->bundle_num; i++) {
23478ee8d1cSJulian Grajkowski /* Since both in-tree and kernel API's bundle type
23578ee8d1cSJulian Grajkowski * are kernel, use cpumask_subset to check if the
23678ee8d1cSJulian Grajkowski * ring's affinity mask is a subset of a bundle's
23778ee8d1cSJulian Grajkowski * one.
23878ee8d1cSJulian Grajkowski */
23978ee8d1cSJulian Grajkowski if (free_bundle_type == device->bundles[i]->type &&
24078ee8d1cSJulian Grajkowski CPU_SUBSET(&device->bundles[i]->affinity_mask,
24178ee8d1cSJulian Grajkowski &inst->affinity_mask)) {
24278ee8d1cSJulian Grajkowski free_inst = adf_cfg_get_free_instance(
24378ee8d1cSJulian Grajkowski device,
24478ee8d1cSJulian Grajkowski device->bundles[i],
24578ee8d1cSJulian Grajkowski inst,
24678ee8d1cSJulian Grajkowski process_name);
24778ee8d1cSJulian Grajkowski
24878ee8d1cSJulian Grajkowski if (!free_inst)
24978ee8d1cSJulian Grajkowski continue;
25078ee8d1cSJulian Grajkowski ret = adf_cfg_get_ring_pairs_from_bundle(
25178ee8d1cSJulian Grajkowski device->bundles[i],
25278ee8d1cSJulian Grajkowski inst,
25378ee8d1cSJulian Grajkowski process_name,
25478ee8d1cSJulian Grajkowski free_inst);
25578ee8d1cSJulian Grajkowski
25678ee8d1cSJulian Grajkowski return ret;
25778ee8d1cSJulian Grajkowski
25878ee8d1cSJulian Grajkowski }
25978ee8d1cSJulian Grajkowski }
260a977168cSMichal Gulbicki for (i = 0; i < device->bundle_num; i++) {
261a977168cSMichal Gulbicki if (adf_cfg_is_free(device->bundles[i])) {
262a977168cSMichal Gulbicki free_inst = adf_cfg_get_free_instance(
263a977168cSMichal Gulbicki device,
264a977168cSMichal Gulbicki device->bundles[i],
26578ee8d1cSJulian Grajkowski inst,
26678ee8d1cSJulian Grajkowski process_name);
26778ee8d1cSJulian Grajkowski if (!free_inst)
268a977168cSMichal Gulbicki continue;
26978ee8d1cSJulian Grajkowski
27078ee8d1cSJulian Grajkowski ret = adf_cfg_get_ring_pairs_from_bundle(
271a977168cSMichal Gulbicki device->bundles[i],
272a977168cSMichal Gulbicki inst,
273a977168cSMichal Gulbicki process_name,
274a977168cSMichal Gulbicki free_inst);
27578ee8d1cSJulian Grajkowski return ret;
27678ee8d1cSJulian Grajkowski }
27778ee8d1cSJulian Grajkowski }
278a977168cSMichal Gulbicki }
27978ee8d1cSJulian Grajkowski pr_err("Don't have enough rings for instance %s in process %s\n",
28078ee8d1cSJulian Grajkowski inst->name,
28178ee8d1cSJulian Grajkowski process_name);
28278ee8d1cSJulian Grajkowski
28378ee8d1cSJulian Grajkowski return ret;
28478ee8d1cSJulian Grajkowski }
28578ee8d1cSJulian Grajkowski
28678ee8d1cSJulian Grajkowski int
adf_cfg_get_services_enabled(struct adf_accel_dev * accel_dev,u16 * ring_to_svc_map)28778ee8d1cSJulian Grajkowski adf_cfg_get_services_enabled(struct adf_accel_dev *accel_dev,
28878ee8d1cSJulian Grajkowski u16 *ring_to_svc_map)
28978ee8d1cSJulian Grajkowski {
29078ee8d1cSJulian Grajkowski char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
29178ee8d1cSJulian Grajkowski char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
29278ee8d1cSJulian Grajkowski u32 i = 0;
29378ee8d1cSJulian Grajkowski struct adf_cfg_enabled_services *svcs = NULL;
29478ee8d1cSJulian Grajkowski enum adf_cfg_fw_image_type fw_image_type = ADF_FW_IMAGE_DEFAULT;
29578ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = accel_dev->hw_device;
29678ee8d1cSJulian Grajkowski *ring_to_svc_map = 0;
29778ee8d1cSJulian Grajkowski
29878ee8d1cSJulian Grajkowski /* Get the services enabled by user */
29978ee8d1cSJulian Grajkowski snprintf(key, sizeof(key), ADF_SERVICES_ENABLED);
30078ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC, key, val))
30178ee8d1cSJulian Grajkowski return EFAULT;
30278ee8d1cSJulian Grajkowski
30378ee8d1cSJulian Grajkowski if (hw_data->get_fw_image_type) {
30478ee8d1cSJulian Grajkowski if (hw_data->get_fw_image_type(accel_dev, &fw_image_type))
30578ee8d1cSJulian Grajkowski return EFAULT;
30678ee8d1cSJulian Grajkowski }
30778ee8d1cSJulian Grajkowski
30878ee8d1cSJulian Grajkowski for (i = 0; i < ADF_CFG_SVCS_MAX; i++) {
30978ee8d1cSJulian Grajkowski svcs = &adf_profiles[fw_image_type].supported_svcs[i];
31078ee8d1cSJulian Grajkowski
31178ee8d1cSJulian Grajkowski if (!strncmp(svcs->svcs_enabled,
31278ee8d1cSJulian Grajkowski "",
31378ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES))
31478ee8d1cSJulian Grajkowski break;
31578ee8d1cSJulian Grajkowski
31678ee8d1cSJulian Grajkowski if (!strncmp(val,
31778ee8d1cSJulian Grajkowski svcs->svcs_enabled,
31878ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES)) {
31978ee8d1cSJulian Grajkowski *ring_to_svc_map = svcs->rng_to_svc_msk;
32078ee8d1cSJulian Grajkowski return 0;
32178ee8d1cSJulian Grajkowski }
32278ee8d1cSJulian Grajkowski }
32378ee8d1cSJulian Grajkowski
32478ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
32578ee8d1cSJulian Grajkowski "Invalid ServicesEnabled %s for ServicesProfile: %d\n",
32678ee8d1cSJulian Grajkowski val,
32778ee8d1cSJulian Grajkowski fw_image_type);
32878ee8d1cSJulian Grajkowski
32978ee8d1cSJulian Grajkowski return EFAULT;
33078ee8d1cSJulian Grajkowski }
33178ee8d1cSJulian Grajkowski
33278ee8d1cSJulian Grajkowski void
adf_cfg_set_asym_rings_mask(struct adf_accel_dev * accel_dev)33378ee8d1cSJulian Grajkowski adf_cfg_set_asym_rings_mask(struct adf_accel_dev *accel_dev)
33478ee8d1cSJulian Grajkowski {
335*266b0663SKrzysztof Zdziarski int service;
336*266b0663SKrzysztof Zdziarski u16 ena_srv_mask;
337*266b0663SKrzysztof Zdziarski u16 service_type;
338*266b0663SKrzysztof Zdziarski u16 asym_mask = 0;
339*266b0663SKrzysztof Zdziarski struct adf_cfg_device *cfg_dev = accel_dev->cfg->dev;
34078ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = accel_dev->hw_device;
34178ee8d1cSJulian Grajkowski
342*266b0663SKrzysztof Zdziarski if (!cfg_dev) {
343*266b0663SKrzysztof Zdziarski hw_data->asym_rings_mask = ADF_CFG_DEF_ASYM_MASK;
344*266b0663SKrzysztof Zdziarski return;
345*266b0663SKrzysztof Zdziarski }
346*266b0663SKrzysztof Zdziarski
347*266b0663SKrzysztof Zdziarski ena_srv_mask = accel_dev->hw_device->ring_to_svc_map;
348*266b0663SKrzysztof Zdziarski
349*266b0663SKrzysztof Zdziarski /* parse each service */
350*266b0663SKrzysztof Zdziarski for (service = 0; service < ADF_CFG_MAX_SERVICES; service++) {
351*266b0663SKrzysztof Zdziarski service_type = GET_SRV_TYPE(ena_srv_mask, service);
352*266b0663SKrzysztof Zdziarski switch (service_type) {
353*266b0663SKrzysztof Zdziarski case CRYPTO:
354*266b0663SKrzysztof Zdziarski case ASYM:
355*266b0663SKrzysztof Zdziarski SET_ASYM_MASK(asym_mask, service);
356*266b0663SKrzysztof Zdziarski if (service_type == CRYPTO)
357*266b0663SKrzysztof Zdziarski service++;
358*266b0663SKrzysztof Zdziarski break;
359*266b0663SKrzysztof Zdziarski }
360*266b0663SKrzysztof Zdziarski }
361*266b0663SKrzysztof Zdziarski
362*266b0663SKrzysztof Zdziarski hw_data->asym_rings_mask = asym_mask;
36378ee8d1cSJulian Grajkowski }
36478ee8d1cSJulian Grajkowski
36578ee8d1cSJulian Grajkowski void
adf_cfg_gen_dispatch_arbiter(struct adf_accel_dev * accel_dev,const u32 * thrd_to_arb_map,u32 * thrd_to_arb_map_gen,u32 total_engines)36678ee8d1cSJulian Grajkowski adf_cfg_gen_dispatch_arbiter(struct adf_accel_dev *accel_dev,
36778ee8d1cSJulian Grajkowski const u32 *thrd_to_arb_map,
36878ee8d1cSJulian Grajkowski u32 *thrd_to_arb_map_gen,
36978ee8d1cSJulian Grajkowski u32 total_engines)
37078ee8d1cSJulian Grajkowski {
37178ee8d1cSJulian Grajkowski int engine, thread, service, bits;
37278ee8d1cSJulian Grajkowski u32 thread_ability, ability_map, service_mask, service_type;
37378ee8d1cSJulian Grajkowski u16 ena_srv_mask = GET_HW_DATA(accel_dev)->ring_to_svc_map;
37478ee8d1cSJulian Grajkowski
37578ee8d1cSJulian Grajkowski for (engine = 0; engine < total_engines; engine++) {
37678ee8d1cSJulian Grajkowski if (!(GET_HW_DATA(accel_dev)->ae_mask & (1 << engine)))
37778ee8d1cSJulian Grajkowski continue;
37878ee8d1cSJulian Grajkowski bits = 0;
37978ee8d1cSJulian Grajkowski /* ability_map is used to indicate the threads ability */
38078ee8d1cSJulian Grajkowski ability_map = thrd_to_arb_map[engine];
38178ee8d1cSJulian Grajkowski thrd_to_arb_map_gen[engine] = 0;
38278ee8d1cSJulian Grajkowski /* parse each thread on the engine */
38378ee8d1cSJulian Grajkowski for (thread = 0; thread < ADF_NUM_THREADS_PER_AE; thread++) {
38478ee8d1cSJulian Grajkowski /* get the ability of this thread */
38578ee8d1cSJulian Grajkowski thread_ability = ability_map & ADF_THRD_ABILITY_MASK;
38678ee8d1cSJulian Grajkowski ability_map >>= ADF_THRD_ABILITY_BIT_LEN;
38778ee8d1cSJulian Grajkowski /* parse each service */
38878ee8d1cSJulian Grajkowski for (service = 0; service < ADF_CFG_MAX_SERVICES;
38978ee8d1cSJulian Grajkowski service++) {
39078ee8d1cSJulian Grajkowski service_type =
39178ee8d1cSJulian Grajkowski GET_SRV_TYPE(ena_srv_mask, service);
39278ee8d1cSJulian Grajkowski switch (service_type) {
39378ee8d1cSJulian Grajkowski case CRYPTO:
39478ee8d1cSJulian Grajkowski service_mask = ADF_CFG_ASYM_SRV_MASK;
39578ee8d1cSJulian Grajkowski if (thread_ability & service_mask)
39678ee8d1cSJulian Grajkowski thrd_to_arb_map_gen[engine] |=
39778ee8d1cSJulian Grajkowski (1 << bits);
39878ee8d1cSJulian Grajkowski bits++;
39978ee8d1cSJulian Grajkowski service++;
40078ee8d1cSJulian Grajkowski service_mask = ADF_CFG_SYM_SRV_MASK;
40178ee8d1cSJulian Grajkowski break;
40278ee8d1cSJulian Grajkowski case COMP:
40378ee8d1cSJulian Grajkowski service_mask = ADF_CFG_DC_SRV_MASK;
40478ee8d1cSJulian Grajkowski break;
40578ee8d1cSJulian Grajkowski case SYM:
40678ee8d1cSJulian Grajkowski service_mask = ADF_CFG_SYM_SRV_MASK;
40778ee8d1cSJulian Grajkowski break;
40878ee8d1cSJulian Grajkowski case ASYM:
40978ee8d1cSJulian Grajkowski service_mask = ADF_CFG_ASYM_SRV_MASK;
41078ee8d1cSJulian Grajkowski break;
41178ee8d1cSJulian Grajkowski default:
41278ee8d1cSJulian Grajkowski service_mask = ADF_CFG_UNKNOWN_SRV_MASK;
41378ee8d1cSJulian Grajkowski }
41478ee8d1cSJulian Grajkowski if (thread_ability & service_mask)
41578ee8d1cSJulian Grajkowski thrd_to_arb_map_gen[engine] |=
41678ee8d1cSJulian Grajkowski (1 << bits);
41778ee8d1cSJulian Grajkowski bits++;
41878ee8d1cSJulian Grajkowski }
41978ee8d1cSJulian Grajkowski }
42078ee8d1cSJulian Grajkowski }
42178ee8d1cSJulian Grajkowski }
42278ee8d1cSJulian Grajkowski
42378ee8d1cSJulian Grajkowski int
adf_cfg_get_fw_image_type(struct adf_accel_dev * accel_dev,enum adf_cfg_fw_image_type * fw_image_type)42478ee8d1cSJulian Grajkowski adf_cfg_get_fw_image_type(struct adf_accel_dev *accel_dev,
42578ee8d1cSJulian Grajkowski enum adf_cfg_fw_image_type *fw_image_type)
42678ee8d1cSJulian Grajkowski {
42778ee8d1cSJulian Grajkowski *fw_image_type = ADF_FW_IMAGE_CUSTOM1;
42878ee8d1cSJulian Grajkowski
42978ee8d1cSJulian Grajkowski return 0;
43078ee8d1cSJulian Grajkowski }
43178ee8d1cSJulian Grajkowski
43278ee8d1cSJulian Grajkowski static int
adf_cfg_get_caps_enabled(struct adf_accel_dev * accel_dev,u32 * enabled_svc_caps,u32 * enabled_fw_caps)43378ee8d1cSJulian Grajkowski adf_cfg_get_caps_enabled(struct adf_accel_dev *accel_dev,
43478ee8d1cSJulian Grajkowski u32 *enabled_svc_caps,
43578ee8d1cSJulian Grajkowski u32 *enabled_fw_caps)
43678ee8d1cSJulian Grajkowski {
43778ee8d1cSJulian Grajkowski char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
43878ee8d1cSJulian Grajkowski char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
43978ee8d1cSJulian Grajkowski u8 i = 0;
44078ee8d1cSJulian Grajkowski struct adf_cfg_enabled_services *svcs = NULL;
44178ee8d1cSJulian Grajkowski enum adf_cfg_fw_image_type fw_image_type = ADF_FW_IMAGE_DEFAULT;
44278ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = accel_dev->hw_device;
44378ee8d1cSJulian Grajkowski
44478ee8d1cSJulian Grajkowski *enabled_svc_caps = 0;
44578ee8d1cSJulian Grajkowski *enabled_fw_caps = 0;
44678ee8d1cSJulian Grajkowski
44778ee8d1cSJulian Grajkowski /* Get the services enabled by user */
44878ee8d1cSJulian Grajkowski snprintf(key, sizeof(key), ADF_SERVICES_ENABLED);
44978ee8d1cSJulian Grajkowski if (adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC, key, val))
45078ee8d1cSJulian Grajkowski return EFAULT;
45178ee8d1cSJulian Grajkowski
45278ee8d1cSJulian Grajkowski /*
45378ee8d1cSJulian Grajkowski * Only the PF driver has the hook for get_fw_image_type as the VF's
45478ee8d1cSJulian Grajkowski * enabled service is from PFVF communication. The fw_image_type for
45578ee8d1cSJulian Grajkowski * the VF is set to DEFAULT since this type contains all kinds of
45678ee8d1cSJulian Grajkowski * enabled service.
45778ee8d1cSJulian Grajkowski */
45878ee8d1cSJulian Grajkowski if (hw_data->get_fw_image_type) {
45978ee8d1cSJulian Grajkowski if (hw_data->get_fw_image_type(accel_dev, &fw_image_type))
46078ee8d1cSJulian Grajkowski return EFAULT;
46178ee8d1cSJulian Grajkowski }
46278ee8d1cSJulian Grajkowski
46378ee8d1cSJulian Grajkowski for (i = 0; i < ADF_CFG_SVCS_MAX; i++) {
46478ee8d1cSJulian Grajkowski svcs = &adf_profiles[fw_image_type].supported_svcs[i];
46578ee8d1cSJulian Grajkowski
46678ee8d1cSJulian Grajkowski if (!strncmp(svcs->svcs_enabled,
46778ee8d1cSJulian Grajkowski "",
46878ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES))
46978ee8d1cSJulian Grajkowski break;
47078ee8d1cSJulian Grajkowski
47178ee8d1cSJulian Grajkowski if (!strncmp(val,
47278ee8d1cSJulian Grajkowski svcs->svcs_enabled,
47378ee8d1cSJulian Grajkowski ADF_CFG_MAX_VAL_LEN_IN_BYTES)) {
47478ee8d1cSJulian Grajkowski *enabled_svc_caps = svcs->enabled_svc_cap;
47578ee8d1cSJulian Grajkowski *enabled_fw_caps = svcs->enabled_fw_cap;
47678ee8d1cSJulian Grajkowski return 0;
47778ee8d1cSJulian Grajkowski }
47878ee8d1cSJulian Grajkowski }
47978ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
48078ee8d1cSJulian Grajkowski "Invalid ServicesEnabled %s for ServicesProfile: %d\n",
48178ee8d1cSJulian Grajkowski val,
48278ee8d1cSJulian Grajkowski fw_image_type);
48378ee8d1cSJulian Grajkowski
48478ee8d1cSJulian Grajkowski return EFAULT;
48578ee8d1cSJulian Grajkowski }
48678ee8d1cSJulian Grajkowski
48778ee8d1cSJulian Grajkowski static void
adf_cfg_check_deprecated_params(struct adf_accel_dev * accel_dev)48878ee8d1cSJulian Grajkowski adf_cfg_check_deprecated_params(struct adf_accel_dev *accel_dev)
48978ee8d1cSJulian Grajkowski {
49078ee8d1cSJulian Grajkowski char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
49178ee8d1cSJulian Grajkowski char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
49278ee8d1cSJulian Grajkowski u8 i = 0;
49378ee8d1cSJulian Grajkowski
49478ee8d1cSJulian Grajkowski for (i = 0; i < ADF_CFG_DEPRE_PARAMS_NUM; i++) {
49578ee8d1cSJulian Grajkowski /* give a warning if the deprecated params are set by user */
49678ee8d1cSJulian Grajkowski snprintf(key, sizeof(key), "%s", adf_cfg_deprecated_params[i]);
49778ee8d1cSJulian Grajkowski if (!adf_cfg_get_param_value(
49878ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, val)) {
49978ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev),
50078ee8d1cSJulian Grajkowski "Parameter '%s' has been deprecated\n",
50178ee8d1cSJulian Grajkowski key);
50278ee8d1cSJulian Grajkowski }
50378ee8d1cSJulian Grajkowski }
50478ee8d1cSJulian Grajkowski }
50578ee8d1cSJulian Grajkowski
50678ee8d1cSJulian Grajkowski static int
adf_cfg_check_enabled_services(struct adf_accel_dev * accel_dev,u32 enabled_svc_caps)50778ee8d1cSJulian Grajkowski adf_cfg_check_enabled_services(struct adf_accel_dev *accel_dev,
50878ee8d1cSJulian Grajkowski u32 enabled_svc_caps)
50978ee8d1cSJulian Grajkowski {
51078ee8d1cSJulian Grajkowski u32 hw_caps = GET_HW_DATA(accel_dev)->accel_capabilities_mask;
51178ee8d1cSJulian Grajkowski
51278ee8d1cSJulian Grajkowski if ((enabled_svc_caps & hw_caps) == enabled_svc_caps)
51378ee8d1cSJulian Grajkowski return 0;
51478ee8d1cSJulian Grajkowski
51578ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev), "Unsupported device configuration\n");
51678ee8d1cSJulian Grajkowski
51778ee8d1cSJulian Grajkowski return EFAULT;
51878ee8d1cSJulian Grajkowski }
51978ee8d1cSJulian Grajkowski
52078ee8d1cSJulian Grajkowski static int
adf_cfg_update_pf_accel_cap_mask(struct adf_accel_dev * accel_dev)52178ee8d1cSJulian Grajkowski adf_cfg_update_pf_accel_cap_mask(struct adf_accel_dev *accel_dev)
52278ee8d1cSJulian Grajkowski {
52378ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = accel_dev->hw_device;
52478ee8d1cSJulian Grajkowski u32 enabled_svc_caps = 0;
52578ee8d1cSJulian Grajkowski u32 enabled_fw_caps = 0;
52678ee8d1cSJulian Grajkowski
52778ee8d1cSJulian Grajkowski if (hw_data->get_accel_cap) {
52878ee8d1cSJulian Grajkowski hw_data->accel_capabilities_mask =
52978ee8d1cSJulian Grajkowski hw_data->get_accel_cap(accel_dev);
53078ee8d1cSJulian Grajkowski }
53178ee8d1cSJulian Grajkowski
53278ee8d1cSJulian Grajkowski if (adf_cfg_get_caps_enabled(accel_dev,
53378ee8d1cSJulian Grajkowski &enabled_svc_caps,
53478ee8d1cSJulian Grajkowski &enabled_fw_caps))
53578ee8d1cSJulian Grajkowski return EFAULT;
53678ee8d1cSJulian Grajkowski
53778ee8d1cSJulian Grajkowski if (adf_cfg_check_enabled_services(accel_dev, enabled_svc_caps))
53878ee8d1cSJulian Grajkowski return EFAULT;
53978ee8d1cSJulian Grajkowski
54078ee8d1cSJulian Grajkowski if (!(enabled_svc_caps & ADF_CFG_CAP_ASYM))
54178ee8d1cSJulian Grajkowski hw_data->accel_capabilities_mask &= ~ADF_CFG_CAP_ASYM;
54278ee8d1cSJulian Grajkowski if (!(enabled_svc_caps & ADF_CFG_CAP_SYM))
54378ee8d1cSJulian Grajkowski hw_data->accel_capabilities_mask &= ~ADF_CFG_CAP_SYM;
54478ee8d1cSJulian Grajkowski if (!(enabled_svc_caps & ADF_CFG_CAP_DC))
54578ee8d1cSJulian Grajkowski hw_data->accel_capabilities_mask &= ~ADF_CFG_CAP_DC;
54678ee8d1cSJulian Grajkowski
54778ee8d1cSJulian Grajkowski /* Enable FW defined capabilities*/
54878ee8d1cSJulian Grajkowski if (enabled_fw_caps)
54978ee8d1cSJulian Grajkowski hw_data->accel_capabilities_mask |= enabled_fw_caps;
55078ee8d1cSJulian Grajkowski
55178ee8d1cSJulian Grajkowski return 0;
55278ee8d1cSJulian Grajkowski }
55378ee8d1cSJulian Grajkowski
55478ee8d1cSJulian Grajkowski static int
adf_cfg_update_vf_accel_cap_mask(struct adf_accel_dev * accel_dev)55578ee8d1cSJulian Grajkowski adf_cfg_update_vf_accel_cap_mask(struct adf_accel_dev *accel_dev)
55678ee8d1cSJulian Grajkowski {
55778ee8d1cSJulian Grajkowski u32 enabled_svc_caps = 0;
55878ee8d1cSJulian Grajkowski u32 enabled_fw_caps = 0;
55978ee8d1cSJulian Grajkowski if (adf_cfg_get_caps_enabled(accel_dev,
56078ee8d1cSJulian Grajkowski &enabled_svc_caps,
56178ee8d1cSJulian Grajkowski &enabled_fw_caps))
56278ee8d1cSJulian Grajkowski return EFAULT;
56378ee8d1cSJulian Grajkowski
56478ee8d1cSJulian Grajkowski if (adf_cfg_check_enabled_services(accel_dev, enabled_svc_caps))
56578ee8d1cSJulian Grajkowski return EFAULT;
56678ee8d1cSJulian Grajkowski
56778ee8d1cSJulian Grajkowski return 0;
56878ee8d1cSJulian Grajkowski }
56978ee8d1cSJulian Grajkowski
57078ee8d1cSJulian Grajkowski int
adf_cfg_device_init(struct adf_cfg_device * device,struct adf_accel_dev * accel_dev)57178ee8d1cSJulian Grajkowski adf_cfg_device_init(struct adf_cfg_device *device,
57278ee8d1cSJulian Grajkowski struct adf_accel_dev *accel_dev)
57378ee8d1cSJulian Grajkowski {
57478ee8d1cSJulian Grajkowski int i = 0;
57578ee8d1cSJulian Grajkowski /* max_inst indicates the max instance number one bank can hold */
57678ee8d1cSJulian Grajkowski int max_inst = accel_dev->hw_device->tx_rx_gap;
57778ee8d1cSJulian Grajkowski int ret = ENOMEM;
57878ee8d1cSJulian Grajkowski struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
57978ee8d1cSJulian Grajkowski
58078ee8d1cSJulian Grajkowski adf_cfg_check_deprecated_params(accel_dev);
58178ee8d1cSJulian Grajkowski
58278ee8d1cSJulian Grajkowski device->bundle_num = 0;
58378ee8d1cSJulian Grajkowski device->bundles = (struct adf_cfg_bundle **)malloc(
58478ee8d1cSJulian Grajkowski sizeof(struct adf_cfg_bundle *) * accel_dev->hw_device->num_banks,
58578ee8d1cSJulian Grajkowski M_QAT,
58678ee8d1cSJulian Grajkowski M_WAITOK | M_ZERO);
58778ee8d1cSJulian Grajkowski
58878ee8d1cSJulian Grajkowski device->bundle_num = accel_dev->hw_device->num_banks;
58978ee8d1cSJulian Grajkowski
59078ee8d1cSJulian Grajkowski device->instances = (struct adf_cfg_instance **)malloc(
59178ee8d1cSJulian Grajkowski sizeof(struct adf_cfg_instance *) * device->bundle_num * max_inst,
59278ee8d1cSJulian Grajkowski M_QAT,
59378ee8d1cSJulian Grajkowski M_WAITOK | M_ZERO);
59478ee8d1cSJulian Grajkowski
59578ee8d1cSJulian Grajkowski device->instance_index = 0;
59678ee8d1cSJulian Grajkowski
59778ee8d1cSJulian Grajkowski device->max_kernel_bundle_nr = -1;
59878ee8d1cSJulian Grajkowski
59978ee8d1cSJulian Grajkowski ret = EFAULT;
60078ee8d1cSJulian Grajkowski
60178ee8d1cSJulian Grajkowski /* Update the acceleration capability mask based on User capability */
60278ee8d1cSJulian Grajkowski if (!accel_dev->is_vf) {
60378ee8d1cSJulian Grajkowski if (adf_cfg_update_pf_accel_cap_mask(accel_dev))
60478ee8d1cSJulian Grajkowski goto failed;
60578ee8d1cSJulian Grajkowski } else {
60678ee8d1cSJulian Grajkowski if (adf_cfg_update_vf_accel_cap_mask(accel_dev))
60778ee8d1cSJulian Grajkowski goto failed;
60878ee8d1cSJulian Grajkowski }
60978ee8d1cSJulian Grajkowski
61078ee8d1cSJulian Grajkowski /* Based on the svc configured, get ring_to_svc_map */
61178ee8d1cSJulian Grajkowski if (hw_data->get_ring_to_svc_map) {
61278ee8d1cSJulian Grajkowski if (hw_data->get_ring_to_svc_map(accel_dev,
61378ee8d1cSJulian Grajkowski &hw_data->ring_to_svc_map))
61478ee8d1cSJulian Grajkowski goto failed;
61578ee8d1cSJulian Grajkowski }
61678ee8d1cSJulian Grajkowski
61778ee8d1cSJulian Grajkowski ret = ENOMEM;
61878ee8d1cSJulian Grajkowski /*
61978ee8d1cSJulian Grajkowski * 1) get the config information to generate the ring to service
62078ee8d1cSJulian Grajkowski * mapping table
62178ee8d1cSJulian Grajkowski * 2) init each bundle of this device
62278ee8d1cSJulian Grajkowski */
62378ee8d1cSJulian Grajkowski for (i = 0; i < device->bundle_num; i++) {
62478ee8d1cSJulian Grajkowski device->bundles[i] = malloc(sizeof(struct adf_cfg_bundle),
62578ee8d1cSJulian Grajkowski M_QAT,
62678ee8d1cSJulian Grajkowski M_WAITOK | M_ZERO);
62778ee8d1cSJulian Grajkowski
62878ee8d1cSJulian Grajkowski device->bundles[i]->max_section = max_inst;
62978ee8d1cSJulian Grajkowski adf_cfg_bundle_init(device->bundles[i], device, i, accel_dev);
63078ee8d1cSJulian Grajkowski }
63178ee8d1cSJulian Grajkowski
63278ee8d1cSJulian Grajkowski return 0;
63378ee8d1cSJulian Grajkowski
63478ee8d1cSJulian Grajkowski failed:
63578ee8d1cSJulian Grajkowski for (i = 0; i < device->bundle_num; i++) {
63678ee8d1cSJulian Grajkowski if (device->bundles[i])
63778ee8d1cSJulian Grajkowski adf_cfg_bundle_clear(device->bundles[i], accel_dev);
63878ee8d1cSJulian Grajkowski }
63978ee8d1cSJulian Grajkowski
64078ee8d1cSJulian Grajkowski for (i = 0; i < (device->bundle_num * max_inst); i++) {
64178ee8d1cSJulian Grajkowski if (device->instances && device->instances[i])
64278ee8d1cSJulian Grajkowski free(device->instances[i], M_QAT);
64378ee8d1cSJulian Grajkowski }
64478ee8d1cSJulian Grajkowski
64578ee8d1cSJulian Grajkowski free(device->instances, M_QAT);
64678ee8d1cSJulian Grajkowski device->instances = NULL;
64778ee8d1cSJulian Grajkowski
64878ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev), "Failed to do device init\n");
64978ee8d1cSJulian Grajkowski return ret;
65078ee8d1cSJulian Grajkowski }
65178ee8d1cSJulian Grajkowski
65278ee8d1cSJulian Grajkowski void
adf_cfg_device_clear(struct adf_cfg_device * device,struct adf_accel_dev * accel_dev)65378ee8d1cSJulian Grajkowski adf_cfg_device_clear(struct adf_cfg_device *device,
65478ee8d1cSJulian Grajkowski struct adf_accel_dev *accel_dev)
65578ee8d1cSJulian Grajkowski {
65678ee8d1cSJulian Grajkowski int i = 0;
65778ee8d1cSJulian Grajkowski
65878ee8d1cSJulian Grajkowski for (i = 0; i < device->bundle_num; i++) {
65978ee8d1cSJulian Grajkowski if (device->bundles && device->bundles[i]) {
66078ee8d1cSJulian Grajkowski adf_cfg_bundle_clear(device->bundles[i], accel_dev);
66178ee8d1cSJulian Grajkowski free(device->bundles[i], M_QAT);
66278ee8d1cSJulian Grajkowski device->bundles[i] = NULL;
66378ee8d1cSJulian Grajkowski }
66478ee8d1cSJulian Grajkowski }
66578ee8d1cSJulian Grajkowski
66678ee8d1cSJulian Grajkowski free(device->bundles, M_QAT);
66778ee8d1cSJulian Grajkowski device->bundles = NULL;
66878ee8d1cSJulian Grajkowski
66978ee8d1cSJulian Grajkowski for (i = 0; i < device->instance_index; i++) {
67078ee8d1cSJulian Grajkowski if (device->instances && device->instances[i]) {
67178ee8d1cSJulian Grajkowski free(device->instances[i], M_QAT);
67278ee8d1cSJulian Grajkowski device->instances[i] = NULL;
67378ee8d1cSJulian Grajkowski }
67478ee8d1cSJulian Grajkowski }
67578ee8d1cSJulian Grajkowski
67678ee8d1cSJulian Grajkowski free(device->instances, M_QAT);
67778ee8d1cSJulian Grajkowski device->instances = NULL;
67878ee8d1cSJulian Grajkowski }
67978ee8d1cSJulian Grajkowski
680*266b0663SKrzysztof Zdziarski /*
681*266b0663SKrzysztof Zdziarski * Static configuration for userspace
682*266b0663SKrzysztof Zdziarski */
683*266b0663SKrzysztof Zdziarski static int
adf_cfg_static_conf_user(struct adf_accel_dev * accel_dev,int cy_enabled,int dc_enabled)684*266b0663SKrzysztof Zdziarski adf_cfg_static_conf_user(struct adf_accel_dev *accel_dev,
685*266b0663SKrzysztof Zdziarski int cy_enabled,
686*266b0663SKrzysztof Zdziarski int dc_enabled)
687*266b0663SKrzysztof Zdziarski {
688*266b0663SKrzysztof Zdziarski int ret = 0;
689*266b0663SKrzysztof Zdziarski unsigned long val = 0;
690*266b0663SKrzysztof Zdziarski char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
691*266b0663SKrzysztof Zdziarski char value[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
692*266b0663SKrzysztof Zdziarski int cy_user_instances = 0;
693*266b0663SKrzysztof Zdziarski int dc_user_instances = 0;
694*266b0663SKrzysztof Zdziarski int i = 0;
695*266b0663SKrzysztof Zdziarski int cpus = num_online_cpus();
696*266b0663SKrzysztof Zdziarski
697*266b0663SKrzysztof Zdziarski if (!(IS_QAT_GEN4(pci_get_device(GET_DEV(accel_dev))))) {
698*266b0663SKrzysztof Zdziarski device_printf(
699*266b0663SKrzysztof Zdziarski GET_DEV(accel_dev),
700*266b0663SKrzysztof Zdziarski "User space configuration supported only on QAT 4xxx devices\n");
701*266b0663SKrzysztof Zdziarski return ENXIO;
702*266b0663SKrzysztof Zdziarski }
703*266b0663SKrzysztof Zdziarski
704*266b0663SKrzysztof Zdziarski ret |= adf_cfg_section_add(accel_dev, ADF_SAL_SEC);
705*266b0663SKrzysztof Zdziarski
706*266b0663SKrzysztof Zdziarski if (accel_dev->is_vf) {
707*266b0663SKrzysztof Zdziarski if (cy_enabled)
708*266b0663SKrzysztof Zdziarski cy_user_instances =
709*266b0663SKrzysztof Zdziarski ADF_CFG_STATIC_CONF_USER_INST_NUM_CY_VF;
710*266b0663SKrzysztof Zdziarski
711*266b0663SKrzysztof Zdziarski if (dc_enabled)
712*266b0663SKrzysztof Zdziarski dc_user_instances =
713*266b0663SKrzysztof Zdziarski ADF_CFG_STATIC_CONF_USER_INST_NUM_DC_VF;
714*266b0663SKrzysztof Zdziarski } else {
715*266b0663SKrzysztof Zdziarski if (cy_enabled)
716*266b0663SKrzysztof Zdziarski cy_user_instances =
717*266b0663SKrzysztof Zdziarski ADF_CFG_STATIC_CONF_USER_INST_NUM_CY;
718*266b0663SKrzysztof Zdziarski
719*266b0663SKrzysztof Zdziarski if (dc_enabled)
720*266b0663SKrzysztof Zdziarski dc_user_instances =
721*266b0663SKrzysztof Zdziarski ADF_CFG_STATIC_CONF_USER_INST_NUM_DC;
722*266b0663SKrzysztof Zdziarski }
723*266b0663SKrzysztof Zdziarski
724*266b0663SKrzysztof Zdziarski val = cy_user_instances;
725*266b0663SKrzysztof Zdziarski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_NUM_CY);
726*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
727*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)&val, ADF_DEC);
728*266b0663SKrzysztof Zdziarski
729*266b0663SKrzysztof Zdziarski val = dc_user_instances;
730*266b0663SKrzysztof Zdziarski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_NUM_DC);
731*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
732*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)&val, ADF_DEC);
733*266b0663SKrzysztof Zdziarski
734*266b0663SKrzysztof Zdziarski val = accel_dev->cfg->num_user_processes;
735*266b0663SKrzysztof Zdziarski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_NUM_PROCESSES);
736*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
737*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)&val, ADF_DEC);
738*266b0663SKrzysztof Zdziarski
739*266b0663SKrzysztof Zdziarski for (i = 0; i < cy_user_instances; i++) {
740*266b0663SKrzysztof Zdziarski val = (accel_dev->accel_id * cy_user_instances + i) % cpus;
741*266b0663SKrzysztof Zdziarski snprintf(key,
742*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
743*266b0663SKrzysztof Zdziarski ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
744*266b0663SKrzysztof Zdziarski i);
745*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
746*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)&val, ADF_DEC);
747*266b0663SKrzysztof Zdziarski
748*266b0663SKrzysztof Zdziarski val = ADF_CFG_STATIC_CONF_POLL;
749*266b0663SKrzysztof Zdziarski snprintf(key,
750*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
751*266b0663SKrzysztof Zdziarski ADF_CY "%d" ADF_POLL_MODE,
752*266b0663SKrzysztof Zdziarski i);
753*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
754*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)&val, ADF_DEC);
755*266b0663SKrzysztof Zdziarski
756*266b0663SKrzysztof Zdziarski snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_CY "%d", i);
757*266b0663SKrzysztof Zdziarski snprintf(key,
758*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
759*266b0663SKrzysztof Zdziarski ADF_CY_NAME_FORMAT,
760*266b0663SKrzysztof Zdziarski i);
761*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
762*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)value, ADF_STR);
763*266b0663SKrzysztof Zdziarski }
764*266b0663SKrzysztof Zdziarski
765*266b0663SKrzysztof Zdziarski for (i = 0; i < dc_user_instances; i++) {
766*266b0663SKrzysztof Zdziarski val = (accel_dev->accel_id * dc_user_instances + i) % cpus;
767*266b0663SKrzysztof Zdziarski snprintf(key,
768*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
769*266b0663SKrzysztof Zdziarski ADF_DC "%d" ADF_ETRMGR_CORE_AFFINITY,
770*266b0663SKrzysztof Zdziarski i);
771*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
772*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)&val, ADF_DEC);
773*266b0663SKrzysztof Zdziarski
774*266b0663SKrzysztof Zdziarski val = ADF_CFG_STATIC_CONF_POLL;
775*266b0663SKrzysztof Zdziarski snprintf(key,
776*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
777*266b0663SKrzysztof Zdziarski ADF_DC "%d" ADF_POLL_MODE,
778*266b0663SKrzysztof Zdziarski i);
779*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
780*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)&val, ADF_DEC);
781*266b0663SKrzysztof Zdziarski
782*266b0663SKrzysztof Zdziarski snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_DC "%d", i);
783*266b0663SKrzysztof Zdziarski snprintf(key,
784*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
785*266b0663SKrzysztof Zdziarski ADF_DC_NAME_FORMAT,
786*266b0663SKrzysztof Zdziarski i);
787*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
788*266b0663SKrzysztof Zdziarski accel_dev, ADF_SAL_SEC, key, (void *)value, ADF_STR);
789*266b0663SKrzysztof Zdziarski }
790*266b0663SKrzysztof Zdziarski
791*266b0663SKrzysztof Zdziarski return ret;
792*266b0663SKrzysztof Zdziarski }
793*266b0663SKrzysztof Zdziarski
794*266b0663SKrzysztof Zdziarski static int
adf_cfg_static_conf_kernel(struct adf_accel_dev * accel_dev,int asym_enabled,int sym_enabled,int dc_enabled)795*266b0663SKrzysztof Zdziarski adf_cfg_static_conf_kernel(struct adf_accel_dev *accel_dev,
796*266b0663SKrzysztof Zdziarski int asym_enabled,
797*266b0663SKrzysztof Zdziarski int sym_enabled,
798*266b0663SKrzysztof Zdziarski int dc_enabled)
799*266b0663SKrzysztof Zdziarski {
800*266b0663SKrzysztof Zdziarski int ret = 0;
801*266b0663SKrzysztof Zdziarski char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
802*266b0663SKrzysztof Zdziarski char value[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
803*266b0663SKrzysztof Zdziarski unsigned long val = 0;
804*266b0663SKrzysztof Zdziarski int i = 0;
805*266b0663SKrzysztof Zdziarski int instances = 0;
806*266b0663SKrzysztof Zdziarski int cy_poll_instances = 0;
807*266b0663SKrzysztof Zdziarski int cy_irq_instances = 0;
808*266b0663SKrzysztof Zdziarski int dc_instances = 0;
809*266b0663SKrzysztof Zdziarski int def_cy_poll_inst = ADF_CFG_STATIC_CONF_INST_NUM_CY_POLL;
810*266b0663SKrzysztof Zdziarski int def_cy_irq_inst = ADF_CFG_STATIC_CONF_INST_NUM_CY_IRQ;
811*266b0663SKrzysztof Zdziarski int def_dc_inst = ADF_CFG_STATIC_CONF_INST_NUM_DC;
812*266b0663SKrzysztof Zdziarski int cpus = num_online_cpus();
813*266b0663SKrzysztof Zdziarski
814*266b0663SKrzysztof Zdziarski instances = GET_MAX_BANKS(accel_dev);
815*266b0663SKrzysztof Zdziarski if (!instances)
816*266b0663SKrzysztof Zdziarski return EFAULT;
817*266b0663SKrzysztof Zdziarski
818*266b0663SKrzysztof Zdziarski if (accel_dev->is_vf) {
819*266b0663SKrzysztof Zdziarski def_cy_poll_inst = ADF_CFG_STATIC_CONF_INST_NUM_CY_POLL_VF;
820*266b0663SKrzysztof Zdziarski def_cy_irq_inst = ADF_CFG_STATIC_CONF_INST_NUM_CY_IRQ_VF;
821*266b0663SKrzysztof Zdziarski def_dc_inst = ADF_CFG_STATIC_CONF_INST_NUM_DC_VF;
822*266b0663SKrzysztof Zdziarski }
823*266b0663SKrzysztof Zdziarski
824*266b0663SKrzysztof Zdziarski /* Get the mode enabled by user */
825*266b0663SKrzysztof Zdziarski ret |= adf_cfg_section_add(accel_dev, ADF_KERNEL_SAL_SEC);
826*266b0663SKrzysztof Zdziarski
827*266b0663SKrzysztof Zdziarski if (dc_enabled) {
828*266b0663SKrzysztof Zdziarski if (instances >= def_dc_inst) {
829*266b0663SKrzysztof Zdziarski dc_instances = def_dc_inst;
830*266b0663SKrzysztof Zdziarski instances -= dc_instances;
831*266b0663SKrzysztof Zdziarski } else {
832*266b0663SKrzysztof Zdziarski return EFAULT;
833*266b0663SKrzysztof Zdziarski }
834*266b0663SKrzysztof Zdziarski }
835*266b0663SKrzysztof Zdziarski
836*266b0663SKrzysztof Zdziarski if (asym_enabled || sym_enabled) {
837*266b0663SKrzysztof Zdziarski if (instances >= def_cy_poll_inst) {
838*266b0663SKrzysztof Zdziarski cy_poll_instances = def_cy_poll_inst;
839*266b0663SKrzysztof Zdziarski instances -= cy_poll_instances;
840*266b0663SKrzysztof Zdziarski } else {
841*266b0663SKrzysztof Zdziarski return EFAULT;
842*266b0663SKrzysztof Zdziarski }
843*266b0663SKrzysztof Zdziarski
844*266b0663SKrzysztof Zdziarski if (sym_enabled) {
845*266b0663SKrzysztof Zdziarski if (instances >= def_cy_irq_inst) {
846*266b0663SKrzysztof Zdziarski cy_irq_instances = def_cy_irq_inst;
847*266b0663SKrzysztof Zdziarski instances -= cy_irq_instances;
848*266b0663SKrzysztof Zdziarski } else {
849*266b0663SKrzysztof Zdziarski return EFAULT;
850*266b0663SKrzysztof Zdziarski }
851*266b0663SKrzysztof Zdziarski }
852*266b0663SKrzysztof Zdziarski }
853*266b0663SKrzysztof Zdziarski
854*266b0663SKrzysztof Zdziarski val = (cy_poll_instances + cy_irq_instances);
855*266b0663SKrzysztof Zdziarski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_NUM_CY);
856*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
857*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
858*266b0663SKrzysztof Zdziarski
859*266b0663SKrzysztof Zdziarski val = dc_instances;
860*266b0663SKrzysztof Zdziarski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_NUM_DC);
861*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
862*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
863*266b0663SKrzysztof Zdziarski
864*266b0663SKrzysztof Zdziarski for (i = 0; i < (cy_irq_instances); i++) {
865*266b0663SKrzysztof Zdziarski val = (accel_dev->accel_id * cy_irq_instances + i) % cpus;
866*266b0663SKrzysztof Zdziarski snprintf(key,
867*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
868*266b0663SKrzysztof Zdziarski ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
869*266b0663SKrzysztof Zdziarski i);
870*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
871*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
872*266b0663SKrzysztof Zdziarski
873*266b0663SKrzysztof Zdziarski val = ADF_CFG_STATIC_CONF_IRQ;
874*266b0663SKrzysztof Zdziarski snprintf(key,
875*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
876*266b0663SKrzysztof Zdziarski ADF_CY "%d" ADF_POLL_MODE,
877*266b0663SKrzysztof Zdziarski i);
878*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
879*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
880*266b0663SKrzysztof Zdziarski
881*266b0663SKrzysztof Zdziarski snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_CY "%d", i);
882*266b0663SKrzysztof Zdziarski snprintf(key,
883*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
884*266b0663SKrzysztof Zdziarski ADF_CY_NAME_FORMAT,
885*266b0663SKrzysztof Zdziarski i);
886*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
887*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)value, ADF_STR);
888*266b0663SKrzysztof Zdziarski }
889*266b0663SKrzysztof Zdziarski
890*266b0663SKrzysztof Zdziarski for (i = cy_irq_instances; i < (cy_poll_instances + cy_irq_instances);
891*266b0663SKrzysztof Zdziarski i++) {
892*266b0663SKrzysztof Zdziarski val = (accel_dev->accel_id * cy_poll_instances + i) % cpus;
893*266b0663SKrzysztof Zdziarski snprintf(key,
894*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
895*266b0663SKrzysztof Zdziarski ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
896*266b0663SKrzysztof Zdziarski i);
897*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
898*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
899*266b0663SKrzysztof Zdziarski
900*266b0663SKrzysztof Zdziarski val = ADF_CFG_STATIC_CONF_POLL;
901*266b0663SKrzysztof Zdziarski snprintf(key,
902*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
903*266b0663SKrzysztof Zdziarski ADF_CY "%d" ADF_POLL_MODE,
904*266b0663SKrzysztof Zdziarski i);
905*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
906*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
907*266b0663SKrzysztof Zdziarski
908*266b0663SKrzysztof Zdziarski snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_CY "%d", i);
909*266b0663SKrzysztof Zdziarski snprintf(key,
910*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
911*266b0663SKrzysztof Zdziarski ADF_CY_NAME_FORMAT,
912*266b0663SKrzysztof Zdziarski i);
913*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
914*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)value, ADF_STR);
915*266b0663SKrzysztof Zdziarski }
916*266b0663SKrzysztof Zdziarski
917*266b0663SKrzysztof Zdziarski for (i = 0; i < dc_instances; i++) {
918*266b0663SKrzysztof Zdziarski val = (accel_dev->accel_id * dc_instances + i) % cpus;
919*266b0663SKrzysztof Zdziarski snprintf(key,
920*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
921*266b0663SKrzysztof Zdziarski ADF_DC "%d" ADF_ETRMGR_CORE_AFFINITY,
922*266b0663SKrzysztof Zdziarski i);
923*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
924*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
925*266b0663SKrzysztof Zdziarski
926*266b0663SKrzysztof Zdziarski val = ADF_CFG_STATIC_CONF_POLL;
927*266b0663SKrzysztof Zdziarski snprintf(key,
928*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
929*266b0663SKrzysztof Zdziarski ADF_DC "%d" ADF_POLL_MODE,
930*266b0663SKrzysztof Zdziarski i);
931*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
932*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
933*266b0663SKrzysztof Zdziarski
934*266b0663SKrzysztof Zdziarski snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_DC "%d", i);
935*266b0663SKrzysztof Zdziarski snprintf(key,
936*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
937*266b0663SKrzysztof Zdziarski ADF_DC_NAME_FORMAT,
938*266b0663SKrzysztof Zdziarski i);
939*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
940*266b0663SKrzysztof Zdziarski accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)value, ADF_STR);
941*266b0663SKrzysztof Zdziarski }
942*266b0663SKrzysztof Zdziarski
943*266b0663SKrzysztof Zdziarski return ret;
944*266b0663SKrzysztof Zdziarski }
945*266b0663SKrzysztof Zdziarski
94678ee8d1cSJulian Grajkowski static int
adf_cfg_static_conf(struct adf_accel_dev * accel_dev)94778ee8d1cSJulian Grajkowski adf_cfg_static_conf(struct adf_accel_dev *accel_dev)
94878ee8d1cSJulian Grajkowski {
94978ee8d1cSJulian Grajkowski int ret = 0;
95078ee8d1cSJulian Grajkowski unsigned long val = 0;
95178ee8d1cSJulian Grajkowski char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
95278ee8d1cSJulian Grajkowski char value[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
953*266b0663SKrzysztof Zdziarski char *token, *cur_str;
954*266b0663SKrzysztof Zdziarski int ks_enabled = 0;
955*266b0663SKrzysztof Zdziarski int us_enabled = 0;
956*266b0663SKrzysztof Zdziarski int asym_enabled = 0;
957*266b0663SKrzysztof Zdziarski int sym_enabled = 0;
958*266b0663SKrzysztof Zdziarski int cy_enabled = 0;
959*266b0663SKrzysztof Zdziarski int dc_enabled = 0;
96078ee8d1cSJulian Grajkowski
961*266b0663SKrzysztof Zdziarski strncpy(value, accel_dev->cfg->cfg_mode, ADF_CFG_MAX_VAL);
962*266b0663SKrzysztof Zdziarski cur_str = value;
96378ee8d1cSJulian Grajkowski
964*266b0663SKrzysztof Zdziarski token = strsep(&cur_str, ADF_SERVICES_SEPARATOR);
965*266b0663SKrzysztof Zdziarski while (token) {
966*266b0663SKrzysztof Zdziarski if (!strncmp(token, ADF_CFG_KERNEL, strlen(ADF_CFG_KERNEL)))
967*266b0663SKrzysztof Zdziarski ks_enabled = 1;
968*266b0663SKrzysztof Zdziarski if (!strncmp(token, ADF_CFG_USER, strlen(ADF_CFG_USER)))
969*266b0663SKrzysztof Zdziarski us_enabled = 1;
970*266b0663SKrzysztof Zdziarski token = strsep(&cur_str, ADF_SERVICES_SEPARATOR);
971*266b0663SKrzysztof Zdziarski }
97278ee8d1cSJulian Grajkowski
973*266b0663SKrzysztof Zdziarski /* Get the services enabled by user */
974*266b0663SKrzysztof Zdziarski strncpy(value, accel_dev->cfg->cfg_services, ADF_CFG_MAX_VAL);
975*266b0663SKrzysztof Zdziarski cur_str = value;
97678ee8d1cSJulian Grajkowski
977*266b0663SKrzysztof Zdziarski token = strsep(&cur_str, ADF_SERVICES_SEPARATOR);
978*266b0663SKrzysztof Zdziarski while (token) {
979*266b0663SKrzysztof Zdziarski if (!strncmp(token, ADF_CFG_SYM, strlen(ADF_CFG_SYM))) {
980*266b0663SKrzysztof Zdziarski sym_enabled = 1;
981*266b0663SKrzysztof Zdziarski }
982*266b0663SKrzysztof Zdziarski if (!strncmp(token, ADF_CFG_ASYM, strlen(ADF_CFG_ASYM))) {
983*266b0663SKrzysztof Zdziarski asym_enabled = 1;
984*266b0663SKrzysztof Zdziarski }
985*266b0663SKrzysztof Zdziarski /* cy means both asym & crypto should be enabled
986*266b0663SKrzysztof Zdziarski * Hardware resources allocation check will be done later
987*266b0663SKrzysztof Zdziarski */
988*266b0663SKrzysztof Zdziarski if (!strncmp(token, ADF_CFG_CY, strlen(ADF_CFG_CY))) {
989*266b0663SKrzysztof Zdziarski asym_enabled = 1;
990*266b0663SKrzysztof Zdziarski sym_enabled = 1;
991*266b0663SKrzysztof Zdziarski }
992*266b0663SKrzysztof Zdziarski if (!strncmp(token, ADF_SERVICE_DC, strlen(ADF_SERVICE_DC))) {
993*266b0663SKrzysztof Zdziarski dc_enabled = 1;
994*266b0663SKrzysztof Zdziarski }
995*266b0663SKrzysztof Zdziarski
996*266b0663SKrzysztof Zdziarski token = strsep(&cur_str, ADF_SERVICES_SEPARATOR);
997*266b0663SKrzysztof Zdziarski }
998*266b0663SKrzysztof Zdziarski
999*266b0663SKrzysztof Zdziarski if (asym_enabled || sym_enabled) {
1000*266b0663SKrzysztof Zdziarski cy_enabled = 1;
1001*266b0663SKrzysztof Zdziarski }
100278ee8d1cSJulian Grajkowski
100378ee8d1cSJulian Grajkowski ret |= adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
1004*266b0663SKrzysztof Zdziarski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_SERVICES_ENABLED);
100578ee8d1cSJulian Grajkowski
1006*266b0663SKrzysztof Zdziarski if (strcmp(ADF_CFG_SYM_ASYM, accel_dev->cfg->cfg_services) == 0) {
1007*266b0663SKrzysztof Zdziarski strncpy(value, ADF_CFG_CY, ADF_CFG_MAX_VAL_LEN_IN_BYTES);
1008*266b0663SKrzysztof Zdziarski } else {
1009*266b0663SKrzysztof Zdziarski strncpy(value,
1010*266b0663SKrzysztof Zdziarski accel_dev->cfg->cfg_services,
1011*266b0663SKrzysztof Zdziarski ADF_CFG_MAX_VAL_LEN_IN_BYTES);
1012*266b0663SKrzysztof Zdziarski }
1013*266b0663SKrzysztof Zdziarski
1014*266b0663SKrzysztof Zdziarski ret |= adf_cfg_add_key_value_param(
1015*266b0663SKrzysztof Zdziarski accel_dev, ADF_GENERAL_SEC, key, (void *)value, ADF_STR);
101678ee8d1cSJulian Grajkowski
101778ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_VER;
101878ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_CONFIG_VERSION);
101978ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
102078ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
102178ee8d1cSJulian Grajkowski
102278ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_AUTO_RESET;
102378ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_AUTO_RESET_ON_ERROR);
102478ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
102578ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
102678ee8d1cSJulian Grajkowski
102778ee8d1cSJulian Grajkowski if (accel_dev->hw_device->get_num_accel_units) {
102878ee8d1cSJulian Grajkowski int cy_au = 0;
102978ee8d1cSJulian Grajkowski int dc_au = 0;
103078ee8d1cSJulian Grajkowski int num_au = accel_dev->hw_device->get_num_accel_units(
103178ee8d1cSJulian Grajkowski accel_dev->hw_device);
103278ee8d1cSJulian Grajkowski
103378ee8d1cSJulian Grajkowski if (num_au > ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS) {
103478ee8d1cSJulian Grajkowski cy_au = num_au - ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS;
103578ee8d1cSJulian Grajkowski dc_au = ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS;
103678ee8d1cSJulian Grajkowski } else if (num_au == ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS) {
103778ee8d1cSJulian Grajkowski cy_au = 1;
103878ee8d1cSJulian Grajkowski dc_au = 1;
103978ee8d1cSJulian Grajkowski } else {
104078ee8d1cSJulian Grajkowski return EFAULT;
104178ee8d1cSJulian Grajkowski }
104278ee8d1cSJulian Grajkowski
1043*266b0663SKrzysztof Zdziarski /* User defined adjustement basing on serives enabled */
1044*266b0663SKrzysztof Zdziarski if (cy_enabled && !dc_enabled) {
1045*266b0663SKrzysztof Zdziarski cy_au += dc_au;
1046*266b0663SKrzysztof Zdziarski dc_au = 0;
1047*266b0663SKrzysztof Zdziarski } else if (!cy_enabled && dc_enabled) {
1048*266b0663SKrzysztof Zdziarski dc_au += cy_au;
1049*266b0663SKrzysztof Zdziarski cy_au = 0;
1050*266b0663SKrzysztof Zdziarski }
1051*266b0663SKrzysztof Zdziarski
105278ee8d1cSJulian Grajkowski val = cy_au;
105378ee8d1cSJulian Grajkowski snprintf(key,
105478ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
105578ee8d1cSJulian Grajkowski ADF_NUM_CY_ACCEL_UNITS);
105678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
105778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
105878ee8d1cSJulian Grajkowski
105978ee8d1cSJulian Grajkowski val = dc_au;
106078ee8d1cSJulian Grajkowski snprintf(key,
106178ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
106278ee8d1cSJulian Grajkowski ADF_NUM_DC_ACCEL_UNITS);
106378ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
106478ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
106578ee8d1cSJulian Grajkowski
106678ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_NUM_INLINE_ACCEL_UNITS;
106778ee8d1cSJulian Grajkowski snprintf(key,
106878ee8d1cSJulian Grajkowski ADF_CFG_MAX_KEY_LEN_IN_BYTES,
106978ee8d1cSJulian Grajkowski ADF_NUM_INLINE_ACCEL_UNITS);
107078ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
107178ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
107278ee8d1cSJulian Grajkowski }
107378ee8d1cSJulian Grajkowski
107478ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_CY_ASYM_RING_SIZE;
107578ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_CY ADF_RING_ASYM_SIZE);
107678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
107778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
107878ee8d1cSJulian Grajkowski
107978ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_CY_SYM_RING_SIZE;
108078ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_CY ADF_RING_SYM_SIZE);
108178ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
108278ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
108378ee8d1cSJulian Grajkowski
108478ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_DC_INTER_BUF_SIZE;
108578ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_INTER_BUF_SIZE);
108678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
108778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
108878ee8d1cSJulian Grajkowski
108978ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DC;
109078ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DC);
109178ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
109278ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
109378ee8d1cSJulian Grajkowski
109478ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DH;
109578ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DH);
109678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
109778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
109878ee8d1cSJulian Grajkowski
109978ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DRBG;
110078ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DRBG);
110178ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
110278ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
110378ee8d1cSJulian Grajkowski
110478ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DSA;
110578ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DSA);
110678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
110778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
110878ee8d1cSJulian Grajkowski
110978ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_ECC;
111078ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_ECC);
111178ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
111278ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
111378ee8d1cSJulian Grajkowski
111478ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_ENABLED;
111578ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_ENABLED);
111678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
111778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
111878ee8d1cSJulian Grajkowski
111978ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_KEYGEN;
112078ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_KEYGEN);
112178ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
112278ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
112378ee8d1cSJulian Grajkowski
112478ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_LN;
112578ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_LN);
112678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
112778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
112878ee8d1cSJulian Grajkowski
112978ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_PRIME;
113078ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_PRIME);
113178ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
113278ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
113378ee8d1cSJulian Grajkowski
113478ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_RSA;
113578ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_RSA);
113678ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
113778ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
113878ee8d1cSJulian Grajkowski
113978ee8d1cSJulian Grajkowski val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_SYM;
114078ee8d1cSJulian Grajkowski snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_SYM);
114178ee8d1cSJulian Grajkowski ret |= adf_cfg_add_key_value_param(
114278ee8d1cSJulian Grajkowski accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
114378ee8d1cSJulian Grajkowski
1144*266b0663SKrzysztof Zdziarski if (ks_enabled) {
1145*266b0663SKrzysztof Zdziarski ret |= adf_cfg_static_conf_kernel(accel_dev,
1146*266b0663SKrzysztof Zdziarski asym_enabled,
1147*266b0663SKrzysztof Zdziarski sym_enabled,
1148*266b0663SKrzysztof Zdziarski dc_enabled);
114978ee8d1cSJulian Grajkowski }
115078ee8d1cSJulian Grajkowski
1151*266b0663SKrzysztof Zdziarski if (us_enabled) {
1152*266b0663SKrzysztof Zdziarski ret |=
1153*266b0663SKrzysztof Zdziarski adf_cfg_static_conf_user(accel_dev, cy_enabled, dc_enabled);
115478ee8d1cSJulian Grajkowski }
115578ee8d1cSJulian Grajkowski
115678ee8d1cSJulian Grajkowski if (ret)
1157*266b0663SKrzysztof Zdziarski ret = ENXIO;
115878ee8d1cSJulian Grajkowski return ret;
115978ee8d1cSJulian Grajkowski }
116078ee8d1cSJulian Grajkowski
116178ee8d1cSJulian Grajkowski int
adf_config_device(struct adf_accel_dev * accel_dev)116278ee8d1cSJulian Grajkowski adf_config_device(struct adf_accel_dev *accel_dev)
116378ee8d1cSJulian Grajkowski {
116478ee8d1cSJulian Grajkowski struct adf_cfg_device_data *cfg = NULL;
116578ee8d1cSJulian Grajkowski struct adf_cfg_device *cfg_device = NULL;
116678ee8d1cSJulian Grajkowski struct adf_cfg_section *sec;
116778ee8d1cSJulian Grajkowski struct list_head *list;
116878ee8d1cSJulian Grajkowski int ret = ENOMEM;
116978ee8d1cSJulian Grajkowski
117078ee8d1cSJulian Grajkowski if (!accel_dev)
117178ee8d1cSJulian Grajkowski return ret;
117278ee8d1cSJulian Grajkowski
117378ee8d1cSJulian Grajkowski ret = adf_cfg_static_conf(accel_dev);
117478ee8d1cSJulian Grajkowski if (ret)
117578ee8d1cSJulian Grajkowski goto failed;
117678ee8d1cSJulian Grajkowski
117778ee8d1cSJulian Grajkowski cfg = accel_dev->cfg;
117878ee8d1cSJulian Grajkowski cfg->dev = NULL;
117978ee8d1cSJulian Grajkowski cfg_device = (struct adf_cfg_device *)malloc(sizeof(*cfg_device),
118078ee8d1cSJulian Grajkowski M_QAT,
118178ee8d1cSJulian Grajkowski M_WAITOK | M_ZERO);
118278ee8d1cSJulian Grajkowski
118378ee8d1cSJulian Grajkowski ret = EFAULT;
118478ee8d1cSJulian Grajkowski
118578ee8d1cSJulian Grajkowski if (adf_cfg_device_init(cfg_device, accel_dev))
118678ee8d1cSJulian Grajkowski goto failed;
118778ee8d1cSJulian Grajkowski
118878ee8d1cSJulian Grajkowski cfg->dev = cfg_device;
118978ee8d1cSJulian Grajkowski
119078ee8d1cSJulian Grajkowski /* GENERAL and KERNEL section must be processed before others */
119178ee8d1cSJulian Grajkowski list_for_each(list, &cfg->sec_list)
119278ee8d1cSJulian Grajkowski {
119378ee8d1cSJulian Grajkowski sec = list_entry(list, struct adf_cfg_section, list);
119478ee8d1cSJulian Grajkowski if (!strcmp(sec->name, ADF_GENERAL_SEC)) {
119578ee8d1cSJulian Grajkowski ret = adf_cfg_process_section(accel_dev,
119678ee8d1cSJulian Grajkowski sec->name,
119778ee8d1cSJulian Grajkowski accel_dev->accel_id);
119878ee8d1cSJulian Grajkowski if (ret)
119978ee8d1cSJulian Grajkowski goto failed;
120078ee8d1cSJulian Grajkowski sec->processed = true;
120178ee8d1cSJulian Grajkowski break;
120278ee8d1cSJulian Grajkowski }
120378ee8d1cSJulian Grajkowski }
120478ee8d1cSJulian Grajkowski
120578ee8d1cSJulian Grajkowski list_for_each(list, &cfg->sec_list)
120678ee8d1cSJulian Grajkowski {
120778ee8d1cSJulian Grajkowski sec = list_entry(list, struct adf_cfg_section, list);
120878ee8d1cSJulian Grajkowski if (!strcmp(sec->name, ADF_KERNEL_SEC)) {
120978ee8d1cSJulian Grajkowski ret = adf_cfg_process_section(accel_dev,
121078ee8d1cSJulian Grajkowski sec->name,
121178ee8d1cSJulian Grajkowski accel_dev->accel_id);
121278ee8d1cSJulian Grajkowski if (ret)
121378ee8d1cSJulian Grajkowski goto failed;
121478ee8d1cSJulian Grajkowski sec->processed = true;
121578ee8d1cSJulian Grajkowski break;
121678ee8d1cSJulian Grajkowski }
121778ee8d1cSJulian Grajkowski }
121878ee8d1cSJulian Grajkowski
121978ee8d1cSJulian Grajkowski list_for_each(list, &cfg->sec_list)
122078ee8d1cSJulian Grajkowski {
122178ee8d1cSJulian Grajkowski sec = list_entry(list, struct adf_cfg_section, list);
122278ee8d1cSJulian Grajkowski if (!strcmp(sec->name, ADF_KERNEL_SAL_SEC)) {
122378ee8d1cSJulian Grajkowski ret = adf_cfg_process_section(accel_dev,
122478ee8d1cSJulian Grajkowski sec->name,
122578ee8d1cSJulian Grajkowski accel_dev->accel_id);
122678ee8d1cSJulian Grajkowski if (ret)
122778ee8d1cSJulian Grajkowski goto failed;
122878ee8d1cSJulian Grajkowski sec->processed = true;
122978ee8d1cSJulian Grajkowski break;
123078ee8d1cSJulian Grajkowski }
123178ee8d1cSJulian Grajkowski }
123278ee8d1cSJulian Grajkowski
123378ee8d1cSJulian Grajkowski list_for_each(list, &cfg->sec_list)
123478ee8d1cSJulian Grajkowski {
123578ee8d1cSJulian Grajkowski sec = list_entry(list, struct adf_cfg_section, list);
123678ee8d1cSJulian Grajkowski /* avoid reprocessing one section */
123778ee8d1cSJulian Grajkowski if (!sec->processed && !sec->is_derived) {
123878ee8d1cSJulian Grajkowski ret = adf_cfg_process_section(accel_dev,
123978ee8d1cSJulian Grajkowski sec->name,
124078ee8d1cSJulian Grajkowski accel_dev->accel_id);
124178ee8d1cSJulian Grajkowski if (ret)
124278ee8d1cSJulian Grajkowski goto failed;
124378ee8d1cSJulian Grajkowski sec->processed = true;
124478ee8d1cSJulian Grajkowski }
124578ee8d1cSJulian Grajkowski }
124678ee8d1cSJulian Grajkowski
124778ee8d1cSJulian Grajkowski /* newly added accel section */
124878ee8d1cSJulian Grajkowski ret = adf_cfg_process_section(accel_dev,
124978ee8d1cSJulian Grajkowski ADF_ACCEL_SEC,
125078ee8d1cSJulian Grajkowski accel_dev->accel_id);
125178ee8d1cSJulian Grajkowski if (ret)
125278ee8d1cSJulian Grajkowski goto failed;
125378ee8d1cSJulian Grajkowski
125478ee8d1cSJulian Grajkowski /*
125578ee8d1cSJulian Grajkowski * put item-remove task after item-process
125678ee8d1cSJulian Grajkowski * because during process we may fetch values from those items
125778ee8d1cSJulian Grajkowski */
125878ee8d1cSJulian Grajkowski list_for_each(list, &cfg->sec_list)
125978ee8d1cSJulian Grajkowski {
126078ee8d1cSJulian Grajkowski sec = list_entry(list, struct adf_cfg_section, list);
126178ee8d1cSJulian Grajkowski if (!sec->is_derived) {
126278ee8d1cSJulian Grajkowski ret = adf_cfg_cleanup_section(accel_dev,
126378ee8d1cSJulian Grajkowski sec->name,
126478ee8d1cSJulian Grajkowski accel_dev->accel_id);
126578ee8d1cSJulian Grajkowski if (ret)
126678ee8d1cSJulian Grajkowski goto failed;
126778ee8d1cSJulian Grajkowski }
126878ee8d1cSJulian Grajkowski }
126978ee8d1cSJulian Grajkowski
127078ee8d1cSJulian Grajkowski ret = 0;
127178ee8d1cSJulian Grajkowski set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
127278ee8d1cSJulian Grajkowski failed:
127378ee8d1cSJulian Grajkowski if (ret) {
127478ee8d1cSJulian Grajkowski if (cfg_device) {
127578ee8d1cSJulian Grajkowski adf_cfg_device_clear(cfg_device, accel_dev);
127678ee8d1cSJulian Grajkowski free(cfg_device, M_QAT);
127778ee8d1cSJulian Grajkowski cfg->dev = NULL;
127878ee8d1cSJulian Grajkowski }
127978ee8d1cSJulian Grajkowski adf_cfg_del_all(accel_dev);
128078ee8d1cSJulian Grajkowski device_printf(GET_DEV(accel_dev), "Failed to config device\n");
128178ee8d1cSJulian Grajkowski }
128278ee8d1cSJulian Grajkowski
128378ee8d1cSJulian Grajkowski return ret;
128478ee8d1cSJulian Grajkowski }
1285