xref: /freebsd-src/sys/dev/qat/qat_common/adf_cfg_bundle.c (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
178ee8d1cSJulian Grajkowski /* SPDX-License-Identifier: BSD-3-Clause */
278ee8d1cSJulian Grajkowski /* Copyright(c) 2007-2022 Intel Corporation */
378ee8d1cSJulian Grajkowski #include "adf_cfg_bundle.h"
478ee8d1cSJulian Grajkowski #include "adf_cfg_strings.h"
578ee8d1cSJulian Grajkowski #include "adf_cfg_instance.h"
678ee8d1cSJulian Grajkowski #include <sys/cpuset.h>
778ee8d1cSJulian Grajkowski 
878ee8d1cSJulian Grajkowski static bool
adf_cfg_is_interrupt_mode(struct adf_cfg_bundle * bundle)978ee8d1cSJulian Grajkowski adf_cfg_is_interrupt_mode(struct adf_cfg_bundle *bundle)
1078ee8d1cSJulian Grajkowski {
1178ee8d1cSJulian Grajkowski 	return (bundle->polling_mode == ADF_CFG_RESP_EPOLL) ||
1278ee8d1cSJulian Grajkowski 	    (bundle->type == KERNEL &&
1378ee8d1cSJulian Grajkowski 	     (bundle->polling_mode != ADF_CFG_RESP_POLL));
1478ee8d1cSJulian Grajkowski }
1578ee8d1cSJulian Grajkowski 
1678ee8d1cSJulian Grajkowski static bool
adf_cfg_can_be_shared(struct adf_cfg_bundle * bundle,const char * process_name,int polling_mode)1778ee8d1cSJulian Grajkowski adf_cfg_can_be_shared(struct adf_cfg_bundle *bundle,
1878ee8d1cSJulian Grajkowski 		      const char *process_name,
1978ee8d1cSJulian Grajkowski 		      int polling_mode)
2078ee8d1cSJulian Grajkowski {
2178ee8d1cSJulian Grajkowski 	if (adf_cfg_is_free(bundle))
2278ee8d1cSJulian Grajkowski 		return true;
2378ee8d1cSJulian Grajkowski 
2478ee8d1cSJulian Grajkowski 	if (bundle->polling_mode != polling_mode)
2578ee8d1cSJulian Grajkowski 		return false;
2678ee8d1cSJulian Grajkowski 
2778ee8d1cSJulian Grajkowski 	return !adf_cfg_is_interrupt_mode(bundle) ||
2878ee8d1cSJulian Grajkowski 	    !strncmp(process_name,
2978ee8d1cSJulian Grajkowski 		     bundle->sections[0],
3078ee8d1cSJulian Grajkowski 		     ADF_CFG_MAX_SECTION_LEN_IN_BYTES);
3178ee8d1cSJulian Grajkowski }
3278ee8d1cSJulian Grajkowski 
3378ee8d1cSJulian Grajkowski bool
adf_cfg_is_free(struct adf_cfg_bundle * bundle)3478ee8d1cSJulian Grajkowski adf_cfg_is_free(struct adf_cfg_bundle *bundle)
3578ee8d1cSJulian Grajkowski {
3678ee8d1cSJulian Grajkowski 	return bundle->type == FREE;
3778ee8d1cSJulian Grajkowski }
3878ee8d1cSJulian Grajkowski 
3978ee8d1cSJulian Grajkowski struct adf_cfg_instance *
adf_cfg_get_free_instance(struct adf_cfg_device * device,struct adf_cfg_bundle * bundle,struct adf_cfg_instance * inst,const char * process_name)4078ee8d1cSJulian Grajkowski adf_cfg_get_free_instance(struct adf_cfg_device *device,
4178ee8d1cSJulian Grajkowski 			  struct adf_cfg_bundle *bundle,
4278ee8d1cSJulian Grajkowski 			  struct adf_cfg_instance *inst,
4378ee8d1cSJulian Grajkowski 			  const char *process_name)
4478ee8d1cSJulian Grajkowski {
4578ee8d1cSJulian Grajkowski 	int i = 0;
4678ee8d1cSJulian Grajkowski 	struct adf_cfg_instance *ret_instance = NULL;
4778ee8d1cSJulian Grajkowski 
4878ee8d1cSJulian Grajkowski 	if (adf_cfg_can_be_shared(bundle, process_name, inst->polling_mode)) {
4978ee8d1cSJulian Grajkowski 		for (i = 0; i < device->instance_index; i++) {
5078ee8d1cSJulian Grajkowski 			/*
5178ee8d1cSJulian Grajkowski 			 * the selected instance must match two criteria
5278ee8d1cSJulian Grajkowski 			 * 1) instance is from the bundle
5378ee8d1cSJulian Grajkowski 			 * 2) instance type is same
5478ee8d1cSJulian Grajkowski 			 */
5578ee8d1cSJulian Grajkowski 			if (bundle->number == device->instances[i]->bundle &&
5678ee8d1cSJulian Grajkowski 			    inst->stype == device->instances[i]->stype) {
5778ee8d1cSJulian Grajkowski 				ret_instance = device->instances[i];
5878ee8d1cSJulian Grajkowski 				break;
5978ee8d1cSJulian Grajkowski 			}
6078ee8d1cSJulian Grajkowski 			/*
6178ee8d1cSJulian Grajkowski 			 * no opportunity to match,
6278ee8d1cSJulian Grajkowski 			 * quit the loop as early as possible
6378ee8d1cSJulian Grajkowski 			 */
6478ee8d1cSJulian Grajkowski 			if ((bundle->number + 1) ==
6578ee8d1cSJulian Grajkowski 			    device->instances[i]->bundle)
6678ee8d1cSJulian Grajkowski 				break;
6778ee8d1cSJulian Grajkowski 		}
6878ee8d1cSJulian Grajkowski 	}
6978ee8d1cSJulian Grajkowski 
7078ee8d1cSJulian Grajkowski 	return ret_instance;
7178ee8d1cSJulian Grajkowski }
7278ee8d1cSJulian Grajkowski 
7378ee8d1cSJulian Grajkowski int
adf_cfg_get_ring_pairs_from_bundle(struct adf_cfg_bundle * bundle,struct adf_cfg_instance * inst,const char * process_name,struct adf_cfg_instance * bundle_inst)7478ee8d1cSJulian Grajkowski adf_cfg_get_ring_pairs_from_bundle(struct adf_cfg_bundle *bundle,
7578ee8d1cSJulian Grajkowski 				   struct adf_cfg_instance *inst,
7678ee8d1cSJulian Grajkowski 				   const char *process_name,
7778ee8d1cSJulian Grajkowski 				   struct adf_cfg_instance *bundle_inst)
7878ee8d1cSJulian Grajkowski {
7978ee8d1cSJulian Grajkowski 	if (inst->polling_mode == ADF_CFG_RESP_POLL &&
8078ee8d1cSJulian Grajkowski 	    adf_cfg_is_interrupt_mode(bundle)) {
8178ee8d1cSJulian Grajkowski 		pr_err("Trying to get ring pairs for a non-interrupt");
8278ee8d1cSJulian Grajkowski 		pr_err(" bundle from an interrupt bundle\n");
8378ee8d1cSJulian Grajkowski 		return EFAULT;
8478ee8d1cSJulian Grajkowski 	}
8578ee8d1cSJulian Grajkowski 
8678ee8d1cSJulian Grajkowski 	if (inst->stype != bundle_inst->stype) {
8778ee8d1cSJulian Grajkowski 		pr_err("Got an instance of different type (cy/dc) than the");
8878ee8d1cSJulian Grajkowski 		pr_err(" one request\n");
8978ee8d1cSJulian Grajkowski 		return EFAULT;
9078ee8d1cSJulian Grajkowski 	}
9178ee8d1cSJulian Grajkowski 
9278ee8d1cSJulian Grajkowski 	if (strcmp(ADF_KERNEL_SEC, process_name) &&
9378ee8d1cSJulian Grajkowski 	    strcmp(ADF_KERNEL_SAL_SEC, process_name) &&
9478ee8d1cSJulian Grajkowski 	    inst->polling_mode != ADF_CFG_RESP_EPOLL &&
9578ee8d1cSJulian Grajkowski 	    inst->polling_mode != ADF_CFG_RESP_POLL) {
9678ee8d1cSJulian Grajkowski 		pr_err("User instance %s needs to be configured", inst->name);
9778ee8d1cSJulian Grajkowski 		pr_err(" with IsPolled 1 or 2 for poll and epoll mode,");
9878ee8d1cSJulian Grajkowski 		pr_err(" respectively\n");
9978ee8d1cSJulian Grajkowski 		return EFAULT;
10078ee8d1cSJulian Grajkowski 	}
10178ee8d1cSJulian Grajkowski 
10278ee8d1cSJulian Grajkowski 	strlcpy(bundle->sections[bundle->section_index],
10378ee8d1cSJulian Grajkowski 		process_name,
10478ee8d1cSJulian Grajkowski 		ADF_CFG_MAX_STR_LEN);
10578ee8d1cSJulian Grajkowski 	bundle->section_index++;
10678ee8d1cSJulian Grajkowski 
10778ee8d1cSJulian Grajkowski 	if (adf_cfg_is_free(bundle)) {
10878ee8d1cSJulian Grajkowski 		bundle->polling_mode = inst->polling_mode;
10978ee8d1cSJulian Grajkowski 		bundle->type = (!strcmp(ADF_KERNEL_SEC, process_name) ||
11078ee8d1cSJulian Grajkowski 				!strcmp(ADF_KERNEL_SAL_SEC, process_name)) ?
11178ee8d1cSJulian Grajkowski 		    KERNEL :
11278ee8d1cSJulian Grajkowski 		    USER;
11378ee8d1cSJulian Grajkowski 		if (adf_cfg_is_interrupt_mode(bundle)) {
11478ee8d1cSJulian Grajkowski 			CPU_ZERO(&bundle->affinity_mask);
11578ee8d1cSJulian Grajkowski 			CPU_COPY(&inst->affinity_mask, &bundle->affinity_mask);
11678ee8d1cSJulian Grajkowski 		}
11778ee8d1cSJulian Grajkowski 	}
11878ee8d1cSJulian Grajkowski 
11978ee8d1cSJulian Grajkowski 	switch (inst->stype) {
12078ee8d1cSJulian Grajkowski 	case CRYPTO:
12178ee8d1cSJulian Grajkowski 		inst->asym_tx = bundle_inst->asym_tx;
12278ee8d1cSJulian Grajkowski 		inst->asym_rx = bundle_inst->asym_rx;
12378ee8d1cSJulian Grajkowski 		inst->sym_tx = bundle_inst->sym_tx;
12478ee8d1cSJulian Grajkowski 		inst->sym_rx = bundle_inst->sym_rx;
12578ee8d1cSJulian Grajkowski 		break;
12678ee8d1cSJulian Grajkowski 	case COMP:
12778ee8d1cSJulian Grajkowski 		inst->dc_tx = bundle_inst->dc_tx;
12878ee8d1cSJulian Grajkowski 		inst->dc_rx = bundle_inst->dc_rx;
12978ee8d1cSJulian Grajkowski 		break;
13078ee8d1cSJulian Grajkowski 	case ASYM:
13178ee8d1cSJulian Grajkowski 		inst->asym_tx = bundle_inst->asym_tx;
13278ee8d1cSJulian Grajkowski 		inst->asym_rx = bundle_inst->asym_rx;
13378ee8d1cSJulian Grajkowski 		break;
13478ee8d1cSJulian Grajkowski 	case SYM:
13578ee8d1cSJulian Grajkowski 		inst->sym_tx = bundle_inst->sym_tx;
13678ee8d1cSJulian Grajkowski 		inst->sym_rx = bundle_inst->sym_rx;
13778ee8d1cSJulian Grajkowski 		break;
13878ee8d1cSJulian Grajkowski 	default:
13978ee8d1cSJulian Grajkowski 		/* unknown service type of instance */
14078ee8d1cSJulian Grajkowski 		pr_err("1 Unknown service type %d of instance\n", inst->stype);
14178ee8d1cSJulian Grajkowski 	}
14278ee8d1cSJulian Grajkowski 
14378ee8d1cSJulian Grajkowski 	/* mark it as used */
14478ee8d1cSJulian Grajkowski 	bundle_inst->stype = USED;
14578ee8d1cSJulian Grajkowski 
14678ee8d1cSJulian Grajkowski 	inst->bundle = bundle->number;
14778ee8d1cSJulian Grajkowski 
14878ee8d1cSJulian Grajkowski 	return 0;
14978ee8d1cSJulian Grajkowski }
15078ee8d1cSJulian Grajkowski 
15178ee8d1cSJulian Grajkowski static void
adf_cfg_init_and_insert_inst(struct adf_cfg_bundle * bundle,struct adf_cfg_device * device,int bank_num,struct adf_accel_dev * accel_dev)15278ee8d1cSJulian Grajkowski adf_cfg_init_and_insert_inst(struct adf_cfg_bundle *bundle,
15378ee8d1cSJulian Grajkowski 			     struct adf_cfg_device *device,
15478ee8d1cSJulian Grajkowski 			     int bank_num,
15578ee8d1cSJulian Grajkowski 			     struct adf_accel_dev *accel_dev)
15678ee8d1cSJulian Grajkowski {
15778ee8d1cSJulian Grajkowski 	struct adf_cfg_instance *cfg_instance = NULL;
15878ee8d1cSJulian Grajkowski 	int ring_pair_index = 0;
159*a977168cSMichal Gulbicki 	int ring_index = 0;
16078ee8d1cSJulian Grajkowski 	int i = 0;
16178ee8d1cSJulian Grajkowski 	u8 serv_type;
162*a977168cSMichal Gulbicki 	int num_rings_per_srv = 0;
163*a977168cSMichal Gulbicki 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
16478ee8d1cSJulian Grajkowski 	u16 ring_to_svc_map = GET_HW_DATA(accel_dev)->ring_to_svc_map;
16578ee8d1cSJulian Grajkowski 
16678ee8d1cSJulian Grajkowski 	/* init the bundle with instance information */
167*a977168cSMichal Gulbicki 	for (ring_pair_index = 0; ring_pair_index < bundle->max_cfg_svc_num;
16878ee8d1cSJulian Grajkowski 	     ring_pair_index++) {
169*a977168cSMichal Gulbicki 		adf_get_ring_svc_map_data(hw_data,
170*a977168cSMichal Gulbicki 					  bundle->number,
171*a977168cSMichal Gulbicki 					  ring_pair_index,
172*a977168cSMichal Gulbicki 					  &serv_type,
173*a977168cSMichal Gulbicki 					  &ring_index,
174*a977168cSMichal Gulbicki 					  &num_rings_per_srv);
175*a977168cSMichal Gulbicki 
17678ee8d1cSJulian Grajkowski 		for (i = 0; i < num_rings_per_srv; i++) {
17778ee8d1cSJulian Grajkowski 			cfg_instance = malloc(sizeof(*cfg_instance),
17878ee8d1cSJulian Grajkowski 					      M_QAT,
17978ee8d1cSJulian Grajkowski 					      M_WAITOK | M_ZERO);
18078ee8d1cSJulian Grajkowski 
18178ee8d1cSJulian Grajkowski 			switch (serv_type) {
18278ee8d1cSJulian Grajkowski 			case CRYPTO:
18378ee8d1cSJulian Grajkowski 				crypto_instance_init(cfg_instance, bundle);
18478ee8d1cSJulian Grajkowski 				break;
18578ee8d1cSJulian Grajkowski 			case COMP:
18678ee8d1cSJulian Grajkowski 				dc_instance_init(cfg_instance, bundle);
18778ee8d1cSJulian Grajkowski 				break;
18878ee8d1cSJulian Grajkowski 			case ASYM:
18978ee8d1cSJulian Grajkowski 				asym_instance_init(cfg_instance, bundle);
19078ee8d1cSJulian Grajkowski 				break;
19178ee8d1cSJulian Grajkowski 			case SYM:
19278ee8d1cSJulian Grajkowski 				sym_instance_init(cfg_instance, bundle);
19378ee8d1cSJulian Grajkowski 				break;
19478ee8d1cSJulian Grajkowski 			case NA:
19578ee8d1cSJulian Grajkowski 				break;
19678ee8d1cSJulian Grajkowski 
19778ee8d1cSJulian Grajkowski 			default:
19878ee8d1cSJulian Grajkowski 				/* Unknown service type */
19978ee8d1cSJulian Grajkowski 				device_printf(
20078ee8d1cSJulian Grajkowski 				    GET_DEV(accel_dev),
20178ee8d1cSJulian Grajkowski 				    "Unknown service type %d of instance, mask is 0x%x\n",
20278ee8d1cSJulian Grajkowski 				    serv_type,
20378ee8d1cSJulian Grajkowski 				    ring_to_svc_map);
20478ee8d1cSJulian Grajkowski 			}
20578ee8d1cSJulian Grajkowski 			cfg_instance->bundle = bank_num;
20678ee8d1cSJulian Grajkowski 			device->instances[device->instance_index++] =
20778ee8d1cSJulian Grajkowski 			    cfg_instance;
20878ee8d1cSJulian Grajkowski 			cfg_instance = NULL;
20978ee8d1cSJulian Grajkowski 		}
21078ee8d1cSJulian Grajkowski 		if (serv_type == CRYPTO) {
21178ee8d1cSJulian Grajkowski 			ring_pair_index++;
21278ee8d1cSJulian Grajkowski 			serv_type =
21378ee8d1cSJulian Grajkowski 			    GET_SRV_TYPE(ring_to_svc_map, ring_pair_index);
21478ee8d1cSJulian Grajkowski 		}
21578ee8d1cSJulian Grajkowski 	}
21678ee8d1cSJulian Grajkowski 
21778ee8d1cSJulian Grajkowski 	return;
21878ee8d1cSJulian Grajkowski }
21978ee8d1cSJulian Grajkowski 
22078ee8d1cSJulian Grajkowski int
adf_cfg_bundle_init(struct adf_cfg_bundle * bundle,struct adf_cfg_device * device,int bank_num,struct adf_accel_dev * accel_dev)22178ee8d1cSJulian Grajkowski adf_cfg_bundle_init(struct adf_cfg_bundle *bundle,
22278ee8d1cSJulian Grajkowski 		    struct adf_cfg_device *device,
22378ee8d1cSJulian Grajkowski 		    int bank_num,
22478ee8d1cSJulian Grajkowski 		    struct adf_accel_dev *accel_dev)
22578ee8d1cSJulian Grajkowski {
22678ee8d1cSJulian Grajkowski 	int i = 0;
22778ee8d1cSJulian Grajkowski 
228*a977168cSMichal Gulbicki 	bundle->number = bank_num;
22978ee8d1cSJulian Grajkowski 	/* init ring to service mapping for this bundle */
230*a977168cSMichal Gulbicki 	adf_cfg_init_ring2serv_mapping(accel_dev, bundle, device);
23178ee8d1cSJulian Grajkowski 
23278ee8d1cSJulian Grajkowski 	/* init the bundle with instance information */
23378ee8d1cSJulian Grajkowski 	adf_cfg_init_and_insert_inst(bundle, device, bank_num, accel_dev);
23478ee8d1cSJulian Grajkowski 
23578ee8d1cSJulian Grajkowski 	CPU_FILL(&bundle->affinity_mask);
23678ee8d1cSJulian Grajkowski 	bundle->type = FREE;
23778ee8d1cSJulian Grajkowski 	bundle->polling_mode = -1;
23878ee8d1cSJulian Grajkowski 	bundle->section_index = 0;
23978ee8d1cSJulian Grajkowski 
24078ee8d1cSJulian Grajkowski 	bundle->sections = malloc(sizeof(char *) * bundle->max_section,
24178ee8d1cSJulian Grajkowski 				  M_QAT,
24278ee8d1cSJulian Grajkowski 				  M_WAITOK | M_ZERO);
24378ee8d1cSJulian Grajkowski 
24478ee8d1cSJulian Grajkowski 	for (i = 0; i < bundle->max_section; i++) {
24578ee8d1cSJulian Grajkowski 		bundle->sections[i] =
24678ee8d1cSJulian Grajkowski 		    malloc(ADF_CFG_MAX_STR_LEN, M_QAT, M_WAITOK | M_ZERO);
24778ee8d1cSJulian Grajkowski 	}
24878ee8d1cSJulian Grajkowski 	return 0;
24978ee8d1cSJulian Grajkowski }
25078ee8d1cSJulian Grajkowski 
25178ee8d1cSJulian Grajkowski void
adf_cfg_bundle_clear(struct adf_cfg_bundle * bundle,struct adf_accel_dev * accel_dev)25278ee8d1cSJulian Grajkowski adf_cfg_bundle_clear(struct adf_cfg_bundle *bundle,
25378ee8d1cSJulian Grajkowski 		     struct adf_accel_dev *accel_dev)
25478ee8d1cSJulian Grajkowski {
25578ee8d1cSJulian Grajkowski 	int i = 0;
25678ee8d1cSJulian Grajkowski 
25778ee8d1cSJulian Grajkowski 	for (i = 0; i < bundle->max_section; i++) {
25878ee8d1cSJulian Grajkowski 		if (bundle->sections && bundle->sections[i]) {
25978ee8d1cSJulian Grajkowski 			free(bundle->sections[i], M_QAT);
26078ee8d1cSJulian Grajkowski 			bundle->sections[i] = NULL;
26178ee8d1cSJulian Grajkowski 		}
26278ee8d1cSJulian Grajkowski 	}
26378ee8d1cSJulian Grajkowski 
26478ee8d1cSJulian Grajkowski 	free(bundle->sections, M_QAT);
26578ee8d1cSJulian Grajkowski 	bundle->sections = NULL;
26678ee8d1cSJulian Grajkowski 
26778ee8d1cSJulian Grajkowski 	adf_cfg_rel_ring2serv_mapping(bundle);
26878ee8d1cSJulian Grajkowski }
26978ee8d1cSJulian Grajkowski 
27078ee8d1cSJulian Grajkowski static void
adf_cfg_assign_serv_to_rings(struct adf_hw_device_data * hw_data,struct adf_cfg_bundle * bundle,struct adf_cfg_device * device)271*a977168cSMichal Gulbicki adf_cfg_assign_serv_to_rings(struct adf_hw_device_data *hw_data,
272*a977168cSMichal Gulbicki 			     struct adf_cfg_bundle *bundle,
273*a977168cSMichal Gulbicki 			     struct adf_cfg_device *device)
27478ee8d1cSJulian Grajkowski {
27578ee8d1cSJulian Grajkowski 	int ring_pair_index = 0;
27678ee8d1cSJulian Grajkowski 	int ring_index = 0;
27778ee8d1cSJulian Grajkowski 	u8 serv_type = 0;
27878ee8d1cSJulian Grajkowski 	int num_req_rings = bundle->num_of_rings / 2;
279*a977168cSMichal Gulbicki 	int num_rings_per_srv = 0;
28078ee8d1cSJulian Grajkowski 
281*a977168cSMichal Gulbicki 	for (ring_pair_index = 0; ring_pair_index < bundle->max_cfg_svc_num;
28278ee8d1cSJulian Grajkowski 	     ring_pair_index++) {
283*a977168cSMichal Gulbicki 		adf_get_ring_svc_map_data(hw_data,
284*a977168cSMichal Gulbicki 					  bundle->number,
285*a977168cSMichal Gulbicki 					  ring_pair_index,
286*a977168cSMichal Gulbicki 					  &serv_type,
287*a977168cSMichal Gulbicki 					  &ring_index,
288*a977168cSMichal Gulbicki 					  &num_rings_per_srv);
289*a977168cSMichal Gulbicki 
29078ee8d1cSJulian Grajkowski 		switch (serv_type) {
29178ee8d1cSJulian Grajkowski 		case CRYPTO:
29278ee8d1cSJulian Grajkowski 			ASSIGN_SERV_TO_RINGS(bundle,
29378ee8d1cSJulian Grajkowski 					     ring_index,
29478ee8d1cSJulian Grajkowski 					     num_req_rings,
29578ee8d1cSJulian Grajkowski 					     ADF_ACCEL_SERV_ASYM,
29678ee8d1cSJulian Grajkowski 					     num_rings_per_srv);
29778ee8d1cSJulian Grajkowski 			ring_pair_index++;
29878ee8d1cSJulian Grajkowski 			ring_index = num_rings_per_srv * ring_pair_index;
299*a977168cSMichal Gulbicki 			if (ring_pair_index == bundle->max_cfg_svc_num)
30078ee8d1cSJulian Grajkowski 				break;
30178ee8d1cSJulian Grajkowski 			ASSIGN_SERV_TO_RINGS(bundle,
30278ee8d1cSJulian Grajkowski 					     ring_index,
30378ee8d1cSJulian Grajkowski 					     num_req_rings,
30478ee8d1cSJulian Grajkowski 					     ADF_ACCEL_SERV_SYM,
30578ee8d1cSJulian Grajkowski 					     num_rings_per_srv);
30678ee8d1cSJulian Grajkowski 			break;
30778ee8d1cSJulian Grajkowski 		case COMP:
30878ee8d1cSJulian Grajkowski 			ASSIGN_SERV_TO_RINGS(bundle,
30978ee8d1cSJulian Grajkowski 					     ring_index,
31078ee8d1cSJulian Grajkowski 					     num_req_rings,
31178ee8d1cSJulian Grajkowski 					     ADF_ACCEL_SERV_DC,
31278ee8d1cSJulian Grajkowski 					     num_rings_per_srv);
31378ee8d1cSJulian Grajkowski 			break;
31478ee8d1cSJulian Grajkowski 		case SYM:
31578ee8d1cSJulian Grajkowski 			ASSIGN_SERV_TO_RINGS(bundle,
31678ee8d1cSJulian Grajkowski 					     ring_index,
31778ee8d1cSJulian Grajkowski 					     num_req_rings,
31878ee8d1cSJulian Grajkowski 					     ADF_ACCEL_SERV_SYM,
31978ee8d1cSJulian Grajkowski 					     num_rings_per_srv);
32078ee8d1cSJulian Grajkowski 			break;
32178ee8d1cSJulian Grajkowski 		case ASYM:
32278ee8d1cSJulian Grajkowski 			ASSIGN_SERV_TO_RINGS(bundle,
32378ee8d1cSJulian Grajkowski 					     ring_index,
32478ee8d1cSJulian Grajkowski 					     num_req_rings,
32578ee8d1cSJulian Grajkowski 					     ADF_ACCEL_SERV_ASYM,
32678ee8d1cSJulian Grajkowski 					     num_rings_per_srv);
32778ee8d1cSJulian Grajkowski 			break;
32878ee8d1cSJulian Grajkowski 		case NA:
32978ee8d1cSJulian Grajkowski 			ASSIGN_SERV_TO_RINGS(bundle,
33078ee8d1cSJulian Grajkowski 					     ring_index,
33178ee8d1cSJulian Grajkowski 					     num_req_rings,
33278ee8d1cSJulian Grajkowski 					     ADF_ACCEL_SERV_NA,
33378ee8d1cSJulian Grajkowski 					     num_rings_per_srv);
33478ee8d1cSJulian Grajkowski 			break;
33578ee8d1cSJulian Grajkowski 
33678ee8d1cSJulian Grajkowski 		default:
33778ee8d1cSJulian Grajkowski 			/* unknown service type */
33878ee8d1cSJulian Grajkowski 			pr_err("Unknown service type %d, mask 0x%x.\n",
33978ee8d1cSJulian Grajkowski 			       serv_type,
340*a977168cSMichal Gulbicki 			       hw_data->ring_to_svc_map);
34178ee8d1cSJulian Grajkowski 		}
34278ee8d1cSJulian Grajkowski 	}
34378ee8d1cSJulian Grajkowski 
34478ee8d1cSJulian Grajkowski 	return;
34578ee8d1cSJulian Grajkowski }
34678ee8d1cSJulian Grajkowski 
34778ee8d1cSJulian Grajkowski void
adf_cfg_init_ring2serv_mapping(struct adf_accel_dev * accel_dev,struct adf_cfg_bundle * bundle,struct adf_cfg_device * device)34878ee8d1cSJulian Grajkowski adf_cfg_init_ring2serv_mapping(struct adf_accel_dev *accel_dev,
349*a977168cSMichal Gulbicki 			       struct adf_cfg_bundle *bundle,
350*a977168cSMichal Gulbicki 			       struct adf_cfg_device *device)
35178ee8d1cSJulian Grajkowski {
35278ee8d1cSJulian Grajkowski 	struct adf_hw_device_data *hw_data = accel_dev->hw_device;
35378ee8d1cSJulian Grajkowski 	struct adf_cfg_ring *ring_in_bundle;
35478ee8d1cSJulian Grajkowski 	int ring_num = 0;
35578ee8d1cSJulian Grajkowski 
35678ee8d1cSJulian Grajkowski 	bundle->num_of_rings = hw_data->num_rings_per_bank;
357*a977168cSMichal Gulbicki 	if (hw_data->num_rings_per_bank >= (2 * ADF_CFG_NUM_SERVICES))
358*a977168cSMichal Gulbicki 		bundle->max_cfg_svc_num = ADF_CFG_NUM_SERVICES;
359*a977168cSMichal Gulbicki 	else
360*a977168cSMichal Gulbicki 		bundle->max_cfg_svc_num = 1;
36178ee8d1cSJulian Grajkowski 
36278ee8d1cSJulian Grajkowski 	bundle->rings =
36378ee8d1cSJulian Grajkowski 	    malloc(bundle->num_of_rings * sizeof(struct adf_cfg_ring *),
36478ee8d1cSJulian Grajkowski 		   M_QAT,
36578ee8d1cSJulian Grajkowski 		   M_WAITOK | M_ZERO);
36678ee8d1cSJulian Grajkowski 
36778ee8d1cSJulian Grajkowski 	for (ring_num = 0; ring_num < bundle->num_of_rings; ring_num++) {
36878ee8d1cSJulian Grajkowski 		ring_in_bundle = malloc(sizeof(struct adf_cfg_ring),
36978ee8d1cSJulian Grajkowski 					M_QAT,
37078ee8d1cSJulian Grajkowski 					M_WAITOK | M_ZERO);
37178ee8d1cSJulian Grajkowski 		ring_in_bundle->mode =
37278ee8d1cSJulian Grajkowski 		    (ring_num < bundle->num_of_rings / 2) ? TX : RX;
37378ee8d1cSJulian Grajkowski 		ring_in_bundle->number = ring_num;
37478ee8d1cSJulian Grajkowski 		bundle->rings[ring_num] = ring_in_bundle;
37578ee8d1cSJulian Grajkowski 	}
37678ee8d1cSJulian Grajkowski 
377*a977168cSMichal Gulbicki 	adf_cfg_assign_serv_to_rings(hw_data, bundle, device);
37878ee8d1cSJulian Grajkowski 
37978ee8d1cSJulian Grajkowski 	return;
38078ee8d1cSJulian Grajkowski }
38178ee8d1cSJulian Grajkowski 
38278ee8d1cSJulian Grajkowski int
adf_cfg_rel_ring2serv_mapping(struct adf_cfg_bundle * bundle)38378ee8d1cSJulian Grajkowski adf_cfg_rel_ring2serv_mapping(struct adf_cfg_bundle *bundle)
38478ee8d1cSJulian Grajkowski {
38578ee8d1cSJulian Grajkowski 	int i = 0;
38678ee8d1cSJulian Grajkowski 
38778ee8d1cSJulian Grajkowski 	if (bundle->rings) {
38878ee8d1cSJulian Grajkowski 		for (i = 0; i < bundle->num_of_rings; i++)
38978ee8d1cSJulian Grajkowski 			free(bundle->rings[i], M_QAT);
39078ee8d1cSJulian Grajkowski 
39178ee8d1cSJulian Grajkowski 		free(bundle->rings, M_QAT);
39278ee8d1cSJulian Grajkowski 	}
39378ee8d1cSJulian Grajkowski 
39478ee8d1cSJulian Grajkowski 	return 0;
39578ee8d1cSJulian Grajkowski }
396