root/sys/dev/qat/qat_common/adf_cfg_instance.c
/* SPDX-License-Identifier: BSD-3-Clause */
/* Copyright(c) 2007-2022 Intel Corporation */
#include "adf_cfg_instance.h"

void
crypto_instance_init(struct adf_cfg_instance *instance,
                     struct adf_cfg_bundle *bundle)
{
        int i = 0;

        instance->stype = CRYPTO;
        for (i = 0; i < bundle->num_of_rings / 2; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_ASYM &&
                    bundle->rings[i]->mode == TX) {
                        instance->asym_tx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }

        for (i = 0; i < bundle->num_of_rings / 2; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_SYM &&
                    bundle->rings[i]->mode == TX) {
                        instance->sym_tx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }

        for (i = bundle->num_of_rings / 2; i < bundle->num_of_rings; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_ASYM &&
                    bundle->rings[i]->mode == RX) {
                        instance->asym_rx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }

        for (i = bundle->num_of_rings / 2; i < bundle->num_of_rings; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_SYM &&
                    bundle->rings[i]->mode == RX) {
                        instance->sym_rx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }
}

void
dc_instance_init(struct adf_cfg_instance *instance,
                 struct adf_cfg_bundle *bundle)
{
        int i = 0;

        instance->stype = COMP;
        for (i = 0; i < bundle->num_of_rings / 2; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_DC &&
                    bundle->rings[i]->mode == TX) {
                        instance->dc_tx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }

        for (i = bundle->num_of_rings / 2; i < bundle->num_of_rings; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_DC &&
                    bundle->rings[i]->mode == RX) {
                        instance->dc_rx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }
}

void
asym_instance_init(struct adf_cfg_instance *instance,
                   struct adf_cfg_bundle *bundle)
{
        int i = 0;

        instance->stype = ASYM;
        for (i = 0; i < bundle->num_of_rings / 2; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_ASYM &&
                    bundle->rings[i]->mode == TX) {
                        instance->asym_tx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }

        for (i = bundle->num_of_rings / 2; i < bundle->num_of_rings; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_ASYM &&
                    bundle->rings[i]->mode == RX) {
                        instance->asym_rx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }
}

void
sym_instance_init(struct adf_cfg_instance *instance,
                  struct adf_cfg_bundle *bundle)
{
        int i = 0;

        instance->stype = SYM;
        for (i = 0; i < bundle->num_of_rings / 2; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_SYM &&
                    bundle->rings[i]->mode == TX) {
                        instance->sym_tx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }

        for (i = 0 + bundle->num_of_rings / 2; i < bundle->num_of_rings; i++) {
                if ((bundle->in_use >> bundle->rings[i]->number) & 0x1)
                        continue;

                if (bundle->rings[i]->serv_type == ADF_ACCEL_SERV_SYM &&
                    bundle->rings[i]->mode == RX) {
                        instance->sym_rx = bundle->rings[i]->number;
                        bundle->in_use |= 1 << bundle->rings[i]->number;
                        break;
                }
        }
}