xref: /freebsd/sys/dev/qat/qat_common/adf_cfg_device.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
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