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