The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/dev/qat/qat_common/adf_cfg_device.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* SPDX-License-Identifier: BSD-3-Clause */
    2 /* Copyright(c) 2007-2022 Intel Corporation */
    3 /* $FreeBSD$ */
    4 #include "adf_cfg_instance.h"
    5 #include "adf_cfg_section.h"
    6 #include "adf_cfg_device.h"
    7 #include "icp_qat_hw.h"
    8 #include "adf_common_drv.h"
    9 
   10 #define ADF_CFG_SVCS_MAX (25)
   11 #define ADF_CFG_DEPRE_PARAMS_NUM (4)
   12 
   13 #define ADF_CFG_CAP_DC ADF_ACCEL_CAPABILITIES_COMPRESSION
   14 #define ADF_CFG_CAP_ASYM ADF_ACCEL_CAPABILITIES_CRYPTO_ASYMMETRIC
   15 #define ADF_CFG_CAP_SYM                                                        \
   16         (ADF_ACCEL_CAPABILITIES_CRYPTO_SYMMETRIC |                             \
   17          ADF_ACCEL_CAPABILITIES_CIPHER |                                       \
   18          ADF_ACCEL_CAPABILITIES_AUTHENTICATION)
   19 #define ADF_CFG_CAP_CY (ADF_CFG_CAP_ASYM | ADF_CFG_CAP_SYM)
   20 
   21 #define ADF_CFG_FW_CAP_RL ICP_ACCEL_CAPABILITIES_RL
   22 #define ADF_CFG_FW_CAP_HKDF ICP_ACCEL_CAPABILITIES_HKDF
   23 #define ADF_CFG_FW_CAP_ECEDMONT ICP_ACCEL_CAPABILITIES_ECEDMONT
   24 #define ADF_CFG_FW_CAP_EXT_ALGCHAIN ICP_ACCEL_CAPABILITIES_EXT_ALGCHAIN
   25 
   26 #define ADF_CFG_CY_RINGS                                                       \
   27         (CRYPTO | CRYPTO << ADF_CFG_SERV_RING_PAIR_1_SHIFT |                   \
   28          CRYPTO << ADF_CFG_SERV_RING_PAIR_2_SHIFT |                            \
   29          CRYPTO << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
   30 
   31 #define ADF_CFG_SYM_RINGS                                                      \
   32         (SYM | SYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT |                         \
   33          SYM << ADF_CFG_SERV_RING_PAIR_2_SHIFT |                               \
   34          SYM << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
   35 
   36 #define ADF_CFG_ASYM_RINGS                                                     \
   37         (ASYM | ASYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT |                       \
   38          ASYM << ADF_CFG_SERV_RING_PAIR_2_SHIFT |                              \
   39          ASYM << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
   40 
   41 #define ADF_CFG_CY_DC_RINGS                                                    \
   42         (CRYPTO | CRYPTO << ADF_CFG_SERV_RING_PAIR_1_SHIFT |                   \
   43          NA << ADF_CFG_SERV_RING_PAIR_2_SHIFT |                                \
   44          COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
   45 
   46 #define ADF_CFG_ASYM_DC_RINGS                                                  \
   47         (ASYM | ASYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT |                       \
   48          COMP << ADF_CFG_SERV_RING_PAIR_2_SHIFT |                              \
   49          COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
   50 
   51 #define ADF_CFG_SYM_DC_RINGS                                                   \
   52         (SYM | SYM << ADF_CFG_SERV_RING_PAIR_1_SHIFT |                         \
   53          COMP << ADF_CFG_SERV_RING_PAIR_2_SHIFT |                              \
   54          COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
   55 
   56 #define ADF_CFG_DC_RINGS                                                       \
   57         (COMP | COMP << ADF_CFG_SERV_RING_PAIR_1_SHIFT |                       \
   58          COMP << ADF_CFG_SERV_RING_PAIR_2_SHIFT |                              \
   59          COMP << ADF_CFG_SERV_RING_PAIR_3_SHIFT)
   60 
   61 static char adf_cfg_deprecated_params[][ADF_CFG_MAX_KEY_LEN_IN_BYTES] =
   62     { ADF_DEV_KPT_ENABLE,
   63       ADF_STORAGE_FIRMWARE_ENABLED,
   64       ADF_RL_FIRMWARE_ENABLED,
   65       ADF_PKE_DISABLED };
   66 
   67 struct adf_cfg_enabled_services {
   68         const char svcs_enabled[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
   69         u16 rng_to_svc_msk;
   70         u32 enabled_svc_cap;
   71         u32 enabled_fw_cap;
   72 };
   73 
   74 struct adf_cfg_profile {
   75         enum adf_cfg_fw_image_type fw_image_type;
   76         struct adf_cfg_enabled_services supported_svcs[ADF_CFG_SVCS_MAX];
   77 };
   78 
   79 static struct adf_cfg_profile adf_profiles[] =
   80     { { ADF_FW_IMAGE_DEFAULT,
   81         {
   82             { "cy",
   83               ADF_CFG_CY_RINGS,
   84               ADF_CFG_CAP_CY,
   85               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
   86             { "dc", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
   87             { "sym",
   88               ADF_CFG_SYM_RINGS,
   89               ADF_CFG_CAP_SYM,
   90               ADF_CFG_FW_CAP_EXT_ALGCHAIN },
   91             { "asym",
   92               ADF_CFG_ASYM_RINGS,
   93               ADF_CFG_CAP_ASYM,
   94               ADF_CFG_FW_CAP_ECEDMONT },
   95             { "cy;dc",
   96               ADF_CFG_CY_DC_RINGS,
   97               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
   98               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
   99             { "dc;cy",
  100               ADF_CFG_CY_DC_RINGS,
  101               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  102               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  103             { "asym;dc",
  104               ADF_CFG_ASYM_DC_RINGS,
  105               ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
  106               ADF_CFG_FW_CAP_ECEDMONT },
  107             { "dc;asym",
  108               ADF_CFG_ASYM_DC_RINGS,
  109               ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
  110               ADF_CFG_FW_CAP_ECEDMONT },
  111             { "sym;dc",
  112               ADF_CFG_SYM_DC_RINGS,
  113               ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
  114               ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  115             { "dc;sym",
  116               ADF_CFG_SYM_DC_RINGS,
  117               ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
  118               ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  119             { "inline;sym",
  120               ADF_CFG_SYM_RINGS,
  121               ADF_CFG_CAP_SYM,
  122               ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  123             { "sym;inline",
  124               ADF_CFG_SYM_RINGS,
  125               ADF_CFG_CAP_SYM,
  126               ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  127             { "inline;asym",
  128               ADF_CFG_SYM_RINGS,
  129               ADF_CFG_CAP_SYM,
  130               ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  131             { "asym;inline",
  132               ADF_CFG_ASYM_RINGS,
  133               ADF_CFG_CAP_ASYM,
  134               ADF_CFG_FW_CAP_ECEDMONT },
  135             { "inline", 0, 0, 0 },
  136             { "inline;cy",
  137               ADF_CFG_CY_RINGS,
  138               ADF_CFG_CAP_CY,
  139               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  140             { "cy;inline",
  141               ADF_CFG_CY_RINGS,
  142               ADF_CFG_CAP_CY,
  143               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  144             { "dc;inline", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
  145             { "inline;dc", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
  146             { "cy;dc;inline",
  147               ADF_CFG_CY_DC_RINGS,
  148               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  149               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  150             { "cy;inline;dc",
  151               ADF_CFG_CY_DC_RINGS,
  152               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  153               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  154             { "dc;inline;cy",
  155               ADF_CFG_CY_DC_RINGS,
  156               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  157               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  158             { "dc;cy;inline",
  159               ADF_CFG_CY_DC_RINGS,
  160               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  161               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  162             { "inline;cy;dc",
  163               ADF_CFG_CY_DC_RINGS,
  164               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  165               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  166             { "inline;dc;cy",
  167               ADF_CFG_CY_DC_RINGS,
  168               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  169               ADF_CFG_FW_CAP_ECEDMONT | ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  170         } },
  171       { ADF_FW_IMAGE_CRYPTO,
  172         {
  173             { "cy",
  174               ADF_CFG_CY_RINGS,
  175               ADF_CFG_CAP_CY,
  176               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  177                   ADF_CFG_FW_CAP_ECEDMONT |
  178                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  179             { "sym",
  180               ADF_CFG_SYM_RINGS,
  181               ADF_CFG_CAP_SYM,
  182               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  183                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  184             { "asym",
  185               ADF_CFG_ASYM_RINGS,
  186               ADF_CFG_CAP_ASYM,
  187               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
  188         } },
  189       { ADF_FW_IMAGE_COMPRESSION,
  190         {
  191             { "dc", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
  192         } },
  193       { ADF_FW_IMAGE_CUSTOM1,
  194         {
  195             { "cy",
  196               ADF_CFG_CY_RINGS,
  197               ADF_CFG_CAP_CY,
  198               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  199                   ADF_CFG_FW_CAP_ECEDMONT |
  200                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  201             { "dc", ADF_CFG_DC_RINGS, ADF_CFG_CAP_DC, 0 },
  202             { "sym",
  203               ADF_CFG_SYM_RINGS,
  204               ADF_CFG_CAP_SYM,
  205               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  206                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  207             { "asym",
  208               ADF_CFG_ASYM_RINGS,
  209               ADF_CFG_CAP_ASYM,
  210               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
  211             { "cy;dc",
  212               ADF_CFG_CY_DC_RINGS,
  213               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  214               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  215                   ADF_CFG_FW_CAP_ECEDMONT |
  216                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  217             { "dc;cy",
  218               ADF_CFG_CY_DC_RINGS,
  219               ADF_CFG_CAP_CY | ADF_CFG_CAP_DC,
  220               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  221                   ADF_CFG_FW_CAP_ECEDMONT |
  222                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  223             { "asym;dc",
  224               ADF_CFG_ASYM_DC_RINGS,
  225               ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
  226               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
  227             { "dc;asym",
  228               ADF_CFG_ASYM_DC_RINGS,
  229               ADF_CFG_CAP_ASYM | ADF_CFG_CAP_DC,
  230               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_ECEDMONT },
  231             { "sym;dc",
  232               ADF_CFG_SYM_DC_RINGS,
  233               ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
  234               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  235                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  236             { "dc;sym",
  237               ADF_CFG_SYM_DC_RINGS,
  238               ADF_CFG_CAP_SYM | ADF_CFG_CAP_DC,
  239               ADF_CFG_FW_CAP_RL | ADF_CFG_FW_CAP_HKDF |
  240                   ADF_CFG_FW_CAP_EXT_ALGCHAIN },
  241         } } };
  242 
  243 int
  244 adf_cfg_get_ring_pairs(struct adf_cfg_device *device,
  245                        struct adf_cfg_instance *inst,
  246                        const char *process_name,
  247                        struct adf_accel_dev *accel_dev)
  248 {
  249         int i = 0;
  250         int ret = EFAULT;
  251         struct adf_cfg_instance *free_inst = NULL;
  252         enum adf_cfg_bundle_type free_bundle_type;
  253         int first_user_bundle = 0;
  254 
  255         /* Section of user process with poll mode */
  256         if (strcmp(ADF_KERNEL_SEC, process_name) &&
  257             strcmp(ADF_KERNEL_SAL_SEC, process_name) &&
  258             inst->polling_mode == ADF_CFG_RESP_POLL) {
  259                 first_user_bundle = device->max_kernel_bundle_nr + 1;
  260                 for (i = first_user_bundle; i < device->bundle_num; i++) {
  261                         free_inst = adf_cfg_get_free_instance(
  262                             device, device->bundles[i], inst, process_name);
  263 
  264                         if (!free_inst)
  265                                 continue;
  266 
  267                         ret = adf_cfg_get_ring_pairs_from_bundle(
  268                             device->bundles[i], inst, process_name, free_inst);
  269                         return ret;
  270                 }
  271         } else {
  272                 /* Section of in-tree, or kernel API or user process
  273                  * with epoll mode
  274                  */
  275                 if (!strcmp(ADF_KERNEL_SEC, process_name) ||
  276                     !strcmp(ADF_KERNEL_SAL_SEC, process_name))
  277                         free_bundle_type = KERNEL;
  278                 else
  279                         free_bundle_type = USER;
  280 
  281                 for (i = 0; i < device->bundle_num; i++) {
  282                         /* Since both in-tree and kernel API's bundle type
  283                          * are kernel, use cpumask_subset to check if the
  284                          * ring's affinity mask is a subset of a bundle's
  285                          * one.
  286                          */
  287                         if (free_bundle_type == device->bundles[i]->type &&
  288                             CPU_SUBSET(&device->bundles[i]->affinity_mask,
  289                                        &inst->affinity_mask)) {
  290                                 free_inst = adf_cfg_get_free_instance(
  291                                     device,
  292                                     device->bundles[i],
  293                                     inst,
  294                                     process_name);
  295 
  296                                 if (!free_inst)
  297                                         continue;
  298                                 ret = adf_cfg_get_ring_pairs_from_bundle(
  299                                     device->bundles[i],
  300                                     inst,
  301                                     process_name,
  302                                     free_inst);
  303 
  304                                 return ret;
  305 
  306                         }
  307                 }
  308                 for (i = 0; i < device->bundle_num; i++) {
  309                         if (adf_cfg_is_free(device->bundles[i])) {
  310                                 free_inst = adf_cfg_get_free_instance(
  311                                     device,
  312                                     device->bundles[i],
  313                                     inst,
  314                                     process_name);
  315                                 if (!free_inst)
  316                                         continue;
  317 
  318                                 ret = adf_cfg_get_ring_pairs_from_bundle(
  319                                     device->bundles[i],
  320                                     inst,
  321                                     process_name,
  322                                     free_inst);
  323                                 return ret;
  324                         }
  325                 }
  326         }
  327         pr_err("Don't have enough rings for instance %s in process %s\n",
  328                inst->name,
  329                process_name);
  330 
  331         return ret;
  332 }
  333 
  334 int
  335 adf_cfg_get_services_enabled(struct adf_accel_dev *accel_dev,
  336                              u16 *ring_to_svc_map)
  337 {
  338         char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
  339         char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
  340         u32 i = 0;
  341         struct adf_cfg_enabled_services *svcs = NULL;
  342         enum adf_cfg_fw_image_type fw_image_type = ADF_FW_IMAGE_DEFAULT;
  343         struct adf_hw_device_data *hw_data = accel_dev->hw_device;
  344         *ring_to_svc_map = 0;
  345 
  346         /* Get the services enabled by user */
  347         snprintf(key, sizeof(key), ADF_SERVICES_ENABLED);
  348         if (adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC, key, val))
  349                 return EFAULT;
  350 
  351         if (hw_data->get_fw_image_type) {
  352                 if (hw_data->get_fw_image_type(accel_dev, &fw_image_type))
  353                         return EFAULT;
  354         }
  355 
  356         for (i = 0; i < ADF_CFG_SVCS_MAX; i++) {
  357                 svcs = &adf_profiles[fw_image_type].supported_svcs[i];
  358 
  359                 if (!strncmp(svcs->svcs_enabled,
  360                              "",
  361                              ADF_CFG_MAX_VAL_LEN_IN_BYTES))
  362                         break;
  363 
  364                 if (!strncmp(val,
  365                              svcs->svcs_enabled,
  366                              ADF_CFG_MAX_VAL_LEN_IN_BYTES)) {
  367                         *ring_to_svc_map = svcs->rng_to_svc_msk;
  368                         return 0;
  369                 }
  370         }
  371 
  372         device_printf(GET_DEV(accel_dev),
  373                       "Invalid ServicesEnabled %s for ServicesProfile: %d\n",
  374                       val,
  375                       fw_image_type);
  376 
  377         return EFAULT;
  378 }
  379 
  380 void
  381 adf_cfg_set_asym_rings_mask(struct adf_accel_dev *accel_dev)
  382 {
  383         struct adf_hw_device_data *hw_data = accel_dev->hw_device;
  384 
  385         hw_data->asym_rings_mask = 0;
  386 }
  387 
  388 void
  389 adf_cfg_gen_dispatch_arbiter(struct adf_accel_dev *accel_dev,
  390                              const u32 *thrd_to_arb_map,
  391                              u32 *thrd_to_arb_map_gen,
  392                              u32 total_engines)
  393 {
  394         int engine, thread, service, bits;
  395         u32 thread_ability, ability_map, service_mask, service_type;
  396         u16 ena_srv_mask = GET_HW_DATA(accel_dev)->ring_to_svc_map;
  397 
  398         for (engine = 0; engine < total_engines; engine++) {
  399                 if (!(GET_HW_DATA(accel_dev)->ae_mask & (1 << engine)))
  400                         continue;
  401                 bits = 0;
  402                 /* ability_map is used to indicate the threads ability */
  403                 ability_map = thrd_to_arb_map[engine];
  404                 thrd_to_arb_map_gen[engine] = 0;
  405                 /* parse each thread on the engine */
  406                 for (thread = 0; thread < ADF_NUM_THREADS_PER_AE; thread++) {
  407                         /* get the ability of this thread */
  408                         thread_ability = ability_map & ADF_THRD_ABILITY_MASK;
  409                         ability_map >>= ADF_THRD_ABILITY_BIT_LEN;
  410                         /* parse each service */
  411                         for (service = 0; service < ADF_CFG_MAX_SERVICES;
  412                              service++) {
  413                                 service_type =
  414                                     GET_SRV_TYPE(ena_srv_mask, service);
  415                                 switch (service_type) {
  416                                 case CRYPTO:
  417                                         service_mask = ADF_CFG_ASYM_SRV_MASK;
  418                                         if (thread_ability & service_mask)
  419                                                 thrd_to_arb_map_gen[engine] |=
  420                                                     (1 << bits);
  421                                         bits++;
  422                                         service++;
  423                                         service_mask = ADF_CFG_SYM_SRV_MASK;
  424                                         break;
  425                                 case COMP:
  426                                         service_mask = ADF_CFG_DC_SRV_MASK;
  427                                         break;
  428                                 case SYM:
  429                                         service_mask = ADF_CFG_SYM_SRV_MASK;
  430                                         break;
  431                                 case ASYM:
  432                                         service_mask = ADF_CFG_ASYM_SRV_MASK;
  433                                         break;
  434                                 default:
  435                                         service_mask = ADF_CFG_UNKNOWN_SRV_MASK;
  436                                 }
  437                                 if (thread_ability & service_mask)
  438                                         thrd_to_arb_map_gen[engine] |=
  439                                             (1 << bits);
  440                                 bits++;
  441                         }
  442                 }
  443         }
  444 }
  445 
  446 int
  447 adf_cfg_get_fw_image_type(struct adf_accel_dev *accel_dev,
  448                           enum adf_cfg_fw_image_type *fw_image_type)
  449 {
  450         *fw_image_type = ADF_FW_IMAGE_CUSTOM1;
  451 
  452         return 0;
  453 }
  454 
  455 static int
  456 adf_cfg_get_caps_enabled(struct adf_accel_dev *accel_dev,
  457                          u32 *enabled_svc_caps,
  458                          u32 *enabled_fw_caps)
  459 {
  460         char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
  461         char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
  462         u8 i = 0;
  463         struct adf_cfg_enabled_services *svcs = NULL;
  464         enum adf_cfg_fw_image_type fw_image_type = ADF_FW_IMAGE_DEFAULT;
  465         struct adf_hw_device_data *hw_data = accel_dev->hw_device;
  466 
  467         *enabled_svc_caps = 0;
  468         *enabled_fw_caps = 0;
  469 
  470         /* Get the services enabled by user */
  471         snprintf(key, sizeof(key), ADF_SERVICES_ENABLED);
  472         if (adf_cfg_get_param_value(accel_dev, ADF_GENERAL_SEC, key, val))
  473                 return EFAULT;
  474 
  475         /*
  476          * Only the PF driver has the hook for get_fw_image_type as the VF's
  477          * enabled service is from PFVF communication. The fw_image_type for
  478          * the VF is set to DEFAULT since this type contains all kinds of
  479          * enabled service.
  480          */
  481         if (hw_data->get_fw_image_type) {
  482                 if (hw_data->get_fw_image_type(accel_dev, &fw_image_type))
  483                         return EFAULT;
  484         }
  485 
  486         for (i = 0; i < ADF_CFG_SVCS_MAX; i++) {
  487                 svcs = &adf_profiles[fw_image_type].supported_svcs[i];
  488 
  489                 if (!strncmp(svcs->svcs_enabled,
  490                              "",
  491                              ADF_CFG_MAX_VAL_LEN_IN_BYTES))
  492                         break;
  493 
  494                 if (!strncmp(val,
  495                              svcs->svcs_enabled,
  496                              ADF_CFG_MAX_VAL_LEN_IN_BYTES)) {
  497                         *enabled_svc_caps = svcs->enabled_svc_cap;
  498                         *enabled_fw_caps = svcs->enabled_fw_cap;
  499                         return 0;
  500                 }
  501         }
  502         device_printf(GET_DEV(accel_dev),
  503                       "Invalid ServicesEnabled %s for ServicesProfile: %d\n",
  504                       val,
  505                       fw_image_type);
  506 
  507         return EFAULT;
  508 }
  509 
  510 static void
  511 adf_cfg_check_deprecated_params(struct adf_accel_dev *accel_dev)
  512 {
  513         char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
  514         char val[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
  515         u8 i = 0;
  516 
  517         for (i = 0; i < ADF_CFG_DEPRE_PARAMS_NUM; i++) {
  518                 /* give a warning if the deprecated params are set by user */
  519                 snprintf(key, sizeof(key), "%s", adf_cfg_deprecated_params[i]);
  520                 if (!adf_cfg_get_param_value(
  521                         accel_dev, ADF_GENERAL_SEC, key, val)) {
  522                         device_printf(GET_DEV(accel_dev),
  523                                       "Parameter '%s' has been deprecated\n",
  524                                       key);
  525                 }
  526         }
  527 }
  528 
  529 static int
  530 adf_cfg_check_enabled_services(struct adf_accel_dev *accel_dev,
  531                                u32 enabled_svc_caps)
  532 {
  533         u32 hw_caps = GET_HW_DATA(accel_dev)->accel_capabilities_mask;
  534 
  535         if ((enabled_svc_caps & hw_caps) == enabled_svc_caps)
  536                 return 0;
  537 
  538         device_printf(GET_DEV(accel_dev), "Unsupported device configuration\n");
  539 
  540         return EFAULT;
  541 }
  542 
  543 static int
  544 adf_cfg_update_pf_accel_cap_mask(struct adf_accel_dev *accel_dev)
  545 {
  546         struct adf_hw_device_data *hw_data = accel_dev->hw_device;
  547         u32 enabled_svc_caps = 0;
  548         u32 enabled_fw_caps = 0;
  549 
  550         if (hw_data->get_accel_cap) {
  551                 hw_data->accel_capabilities_mask =
  552                     hw_data->get_accel_cap(accel_dev);
  553         }
  554 
  555         if (adf_cfg_get_caps_enabled(accel_dev,
  556                                      &enabled_svc_caps,
  557                                      &enabled_fw_caps))
  558                 return EFAULT;
  559 
  560         if (adf_cfg_check_enabled_services(accel_dev, enabled_svc_caps))
  561                 return EFAULT;
  562 
  563         if (!(enabled_svc_caps & ADF_CFG_CAP_ASYM))
  564                 hw_data->accel_capabilities_mask &= ~ADF_CFG_CAP_ASYM;
  565         if (!(enabled_svc_caps & ADF_CFG_CAP_SYM))
  566                 hw_data->accel_capabilities_mask &= ~ADF_CFG_CAP_SYM;
  567         if (!(enabled_svc_caps & ADF_CFG_CAP_DC))
  568                 hw_data->accel_capabilities_mask &= ~ADF_CFG_CAP_DC;
  569 
  570         /* Enable FW defined capabilities*/
  571         if (enabled_fw_caps)
  572                 hw_data->accel_capabilities_mask |= enabled_fw_caps;
  573 
  574         return 0;
  575 }
  576 
  577 static int
  578 adf_cfg_update_vf_accel_cap_mask(struct adf_accel_dev *accel_dev)
  579 {
  580         u32 enabled_svc_caps = 0;
  581         u32 enabled_fw_caps = 0;
  582 
  583         if (adf_cfg_get_caps_enabled(accel_dev,
  584                                      &enabled_svc_caps,
  585                                      &enabled_fw_caps))
  586                 return EFAULT;
  587 
  588         if (adf_cfg_check_enabled_services(accel_dev, enabled_svc_caps))
  589                 return EFAULT;
  590 
  591         return 0;
  592 }
  593 
  594 int
  595 adf_cfg_device_init(struct adf_cfg_device *device,
  596                     struct adf_accel_dev *accel_dev)
  597 {
  598         int i = 0;
  599         /* max_inst indicates the max instance number one bank can hold */
  600         int max_inst = accel_dev->hw_device->tx_rx_gap;
  601         int ret = ENOMEM;
  602         struct adf_hw_device_data *hw_data = GET_HW_DATA(accel_dev);
  603 
  604         adf_cfg_check_deprecated_params(accel_dev);
  605 
  606         device->bundle_num = 0;
  607         device->bundles = (struct adf_cfg_bundle **)malloc(
  608             sizeof(struct adf_cfg_bundle *) * accel_dev->hw_device->num_banks,
  609             M_QAT,
  610             M_WAITOK | M_ZERO);
  611 
  612         device->bundle_num = accel_dev->hw_device->num_banks;
  613 
  614         device->instances = (struct adf_cfg_instance **)malloc(
  615             sizeof(struct adf_cfg_instance *) * device->bundle_num * max_inst,
  616             M_QAT,
  617             M_WAITOK | M_ZERO);
  618 
  619         device->instance_index = 0;
  620 
  621         device->max_kernel_bundle_nr = -1;
  622 
  623         ret = EFAULT;
  624 
  625         /* Update the acceleration capability mask based on User capability */
  626         if (!accel_dev->is_vf) {
  627                 if (adf_cfg_update_pf_accel_cap_mask(accel_dev))
  628                         goto failed;
  629         } else {
  630                 if (adf_cfg_update_vf_accel_cap_mask(accel_dev))
  631                         goto failed;
  632         }
  633 
  634         /* Based on the svc configured, get ring_to_svc_map */
  635         if (hw_data->get_ring_to_svc_map) {
  636                 if (hw_data->get_ring_to_svc_map(accel_dev,
  637                                                  &hw_data->ring_to_svc_map))
  638                         goto failed;
  639         }
  640 
  641         ret = ENOMEM;
  642         /*
  643          * 1) get the config information to generate the ring to service
  644          *    mapping table
  645          * 2) init each bundle of this device
  646          */
  647         for (i = 0; i < device->bundle_num; i++) {
  648                 device->bundles[i] = malloc(sizeof(struct adf_cfg_bundle),
  649                                             M_QAT,
  650                                             M_WAITOK | M_ZERO);
  651 
  652                 device->bundles[i]->max_section = max_inst;
  653                 adf_cfg_bundle_init(device->bundles[i], device, i, accel_dev);
  654         }
  655 
  656         return 0;
  657 
  658 failed:
  659         for (i = 0; i < device->bundle_num; i++) {
  660                 if (device->bundles[i])
  661                         adf_cfg_bundle_clear(device->bundles[i], accel_dev);
  662         }
  663 
  664         for (i = 0; i < (device->bundle_num * max_inst); i++) {
  665                 if (device->instances && device->instances[i])
  666                         free(device->instances[i], M_QAT);
  667         }
  668 
  669         free(device->instances, M_QAT);
  670         device->instances = NULL;
  671 
  672         device_printf(GET_DEV(accel_dev), "Failed to do device init\n");
  673         return ret;
  674 }
  675 
  676 void
  677 adf_cfg_device_clear(struct adf_cfg_device *device,
  678                      struct adf_accel_dev *accel_dev)
  679 {
  680         int i = 0;
  681 
  682         for (i = 0; i < device->bundle_num; i++) {
  683                 if (device->bundles && device->bundles[i]) {
  684                         adf_cfg_bundle_clear(device->bundles[i], accel_dev);
  685                         free(device->bundles[i], M_QAT);
  686                         device->bundles[i] = NULL;
  687                 }
  688         }
  689 
  690         free(device->bundles, M_QAT);
  691         device->bundles = NULL;
  692 
  693         for (i = 0; i < device->instance_index; i++) {
  694                 if (device->instances && device->instances[i]) {
  695                         free(device->instances[i], M_QAT);
  696                         device->instances[i] = NULL;
  697                 }
  698         }
  699 
  700         free(device->instances, M_QAT);
  701         device->instances = NULL;
  702 }
  703 
  704 static int
  705 adf_cfg_static_conf(struct adf_accel_dev *accel_dev)
  706 {
  707         int ret = 0;
  708         unsigned long val = 0;
  709         char key[ADF_CFG_MAX_KEY_LEN_IN_BYTES];
  710         char value[ADF_CFG_MAX_VAL_LEN_IN_BYTES];
  711         int cpus;
  712         int instances = 0;
  713         int cy_poll_instances;
  714         int cy_irq_instances;
  715         int dc_instances;
  716         int i = 0;
  717 
  718         cpus = num_online_cpus();
  719         instances =
  720             GET_MAX_BANKS(accel_dev) > cpus ? GET_MAX_BANKS(accel_dev) : cpus;
  721         if (!instances)
  722                 return EFAULT;
  723 
  724         if (instances >= ADF_CFG_STATIC_CONF_INST_NUM_DC)
  725                 dc_instances = ADF_CFG_STATIC_CONF_INST_NUM_DC;
  726         else
  727                 return EFAULT;
  728         instances -= dc_instances;
  729 
  730         if (instances >= ADF_CFG_STATIC_CONF_INST_NUM_CY_POLL)
  731                 cy_poll_instances = ADF_CFG_STATIC_CONF_INST_NUM_CY_POLL;
  732         else
  733                 return EFAULT;
  734         instances -= cy_poll_instances;
  735 
  736         if (instances >= ADF_CFG_STATIC_CONF_INST_NUM_CY_IRQ)
  737                 cy_irq_instances = ADF_CFG_STATIC_CONF_INST_NUM_CY_IRQ;
  738         else
  739                 return EFAULT;
  740         instances -= cy_irq_instances;
  741 
  742         ret |= adf_cfg_section_add(accel_dev, ADF_GENERAL_SEC);
  743 
  744         ret |= adf_cfg_section_add(accel_dev, ADF_KERNEL_SAL_SEC);
  745 
  746         val = ADF_CFG_STATIC_CONF_VER;
  747         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_CONFIG_VERSION);
  748         ret |= adf_cfg_add_key_value_param(
  749             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  750 
  751         val = ADF_CFG_STATIC_CONF_AUTO_RESET;
  752         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_AUTO_RESET_ON_ERROR);
  753         ret |= adf_cfg_add_key_value_param(
  754             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  755 
  756         if (accel_dev->hw_device->get_num_accel_units) {
  757                 int cy_au = 0;
  758                 int dc_au = 0;
  759                 int num_au = accel_dev->hw_device->get_num_accel_units(
  760                     accel_dev->hw_device);
  761 
  762                 if (num_au > ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS) {
  763                         cy_au = num_au - ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS;
  764                         dc_au = ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS;
  765                 } else if (num_au == ADF_CFG_STATIC_CONF_NUM_DC_ACCEL_UNITS) {
  766                         cy_au = 1;
  767                         dc_au = 1;
  768                 } else {
  769                         return EFAULT;
  770                 }
  771 
  772                 val = cy_au;
  773                 snprintf(key,
  774                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  775                          ADF_NUM_CY_ACCEL_UNITS);
  776                 ret |= adf_cfg_add_key_value_param(
  777                     accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  778 
  779                 val = dc_au;
  780                 snprintf(key,
  781                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  782                          ADF_NUM_DC_ACCEL_UNITS);
  783                 ret |= adf_cfg_add_key_value_param(
  784                     accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  785 
  786                 val = ADF_CFG_STATIC_CONF_NUM_INLINE_ACCEL_UNITS;
  787                 snprintf(key,
  788                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  789                          ADF_NUM_INLINE_ACCEL_UNITS);
  790                 ret |= adf_cfg_add_key_value_param(
  791                     accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  792         }
  793 
  794         val = ADF_CFG_STATIC_CONF_CY_ASYM_RING_SIZE;
  795         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_CY ADF_RING_ASYM_SIZE);
  796         ret |= adf_cfg_add_key_value_param(
  797             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  798 
  799         val = ADF_CFG_STATIC_CONF_CY_SYM_RING_SIZE;
  800         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_CY ADF_RING_SYM_SIZE);
  801         ret |= adf_cfg_add_key_value_param(
  802             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  803 
  804         val = ADF_CFG_STATIC_CONF_DC_INTER_BUF_SIZE;
  805         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_INTER_BUF_SIZE);
  806         ret |= adf_cfg_add_key_value_param(
  807             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  808 
  809         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_SERVICES_ENABLED);
  810         if ((cy_poll_instances + cy_irq_instances) == 0 && dc_instances > 0) {
  811                 snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_CFG_DC);
  812         } else if (((cy_poll_instances + cy_irq_instances)) > 0 &&
  813                    dc_instances == 0) {
  814                 snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_CFG_SYM);
  815         } else {
  816                 snprintf(value,
  817                          ADF_CFG_MAX_VAL_LEN_IN_BYTES,
  818                          "%s;%s",
  819                          ADF_CFG_SYM,
  820                          ADF_CFG_DC);
  821         }
  822         ret |= adf_cfg_add_key_value_param(
  823             accel_dev, ADF_GENERAL_SEC, key, (void *)value, ADF_STR);
  824 
  825         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DC;
  826         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DC);
  827         ret |= adf_cfg_add_key_value_param(
  828             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  829 
  830         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DH;
  831         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DH);
  832         ret |= adf_cfg_add_key_value_param(
  833             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  834 
  835         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DRBG;
  836         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DRBG);
  837         ret |= adf_cfg_add_key_value_param(
  838             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  839 
  840         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_DSA;
  841         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_DSA);
  842         ret |= adf_cfg_add_key_value_param(
  843             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  844 
  845         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_ECC;
  846         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_ECC);
  847         ret |= adf_cfg_add_key_value_param(
  848             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  849 
  850         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_ENABLED;
  851         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_ENABLED);
  852         ret |= adf_cfg_add_key_value_param(
  853             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  854 
  855         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_KEYGEN;
  856         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_KEYGEN);
  857         ret |= adf_cfg_add_key_value_param(
  858             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  859 
  860         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_LN;
  861         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_LN);
  862         ret |= adf_cfg_add_key_value_param(
  863             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  864 
  865         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_PRIME;
  866         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_PRIME);
  867         ret |= adf_cfg_add_key_value_param(
  868             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  869 
  870         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_RSA;
  871         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_RSA);
  872         ret |= adf_cfg_add_key_value_param(
  873             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  874 
  875         val = ADF_CFG_STATIC_CONF_SAL_STATS_CFG_SYM;
  876         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, SAL_STATS_CFG_SYM);
  877         ret |= adf_cfg_add_key_value_param(
  878             accel_dev, ADF_GENERAL_SEC, key, (void *)&val, ADF_DEC);
  879 
  880         val = (cy_poll_instances + cy_irq_instances);
  881         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_NUM_CY);
  882         ret |= adf_cfg_add_key_value_param(
  883             accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  884 
  885         val = dc_instances;
  886         snprintf(key, ADF_CFG_MAX_KEY_LEN_IN_BYTES, ADF_NUM_DC);
  887         ret |= adf_cfg_add_key_value_param(
  888             accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  889 
  890         for (i = 0; i < (cy_irq_instances); i++) {
  891                 val = i;
  892                 snprintf(key,
  893                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  894                          ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
  895                          i);
  896                 ret |= adf_cfg_add_key_value_param(
  897                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  898 
  899                 val = ADF_CFG_STATIC_CONF_IRQ;
  900                 snprintf(key,
  901                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  902                          ADF_CY "%d" ADF_POLL_MODE,
  903                          i);
  904                 ret |= adf_cfg_add_key_value_param(
  905                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  906 
  907                 snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_CY "%d", i);
  908                 snprintf(key,
  909                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  910                          ADF_CY_NAME_FORMAT,
  911                          i);
  912                 ret |= adf_cfg_add_key_value_param(
  913                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)value, ADF_STR);
  914         }
  915 
  916         for (i = cy_irq_instances; i < (cy_poll_instances + cy_irq_instances);
  917              i++) {
  918                 val = i;
  919                 snprintf(key,
  920                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  921                          ADF_CY "%d" ADF_ETRMGR_CORE_AFFINITY,
  922                          i);
  923                 ret |= adf_cfg_add_key_value_param(
  924                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  925 
  926                 val = ADF_CFG_STATIC_CONF_POLL;
  927                 snprintf(key,
  928                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  929                          ADF_CY "%d" ADF_POLL_MODE,
  930                          i);
  931                 ret |= adf_cfg_add_key_value_param(
  932                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  933 
  934                 snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_CY "%d", i);
  935                 snprintf(key,
  936                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  937                          ADF_CY_NAME_FORMAT,
  938                          i);
  939                 ret |= adf_cfg_add_key_value_param(
  940                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)value, ADF_STR);
  941         }
  942 
  943         for (i = 0; i < dc_instances; i++) {
  944                 val = i;
  945                 snprintf(key,
  946                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  947                          ADF_DC "%d" ADF_ETRMGR_CORE_AFFINITY,
  948                          i);
  949                 ret |= adf_cfg_add_key_value_param(
  950                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  951 
  952                 val = ADF_CFG_STATIC_CONF_POLL;
  953                 snprintf(key,
  954                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  955                          ADF_DC "%d" ADF_POLL_MODE,
  956                          i);
  957                 ret |= adf_cfg_add_key_value_param(
  958                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)&val, ADF_DEC);
  959 
  960                 snprintf(value, ADF_CFG_MAX_VAL_LEN_IN_BYTES, ADF_DC "%d", i);
  961                 snprintf(key,
  962                          ADF_CFG_MAX_KEY_LEN_IN_BYTES,
  963                          ADF_DC_NAME_FORMAT,
  964                          i);
  965                 ret |= adf_cfg_add_key_value_param(
  966                     accel_dev, ADF_KERNEL_SAL_SEC, key, (void *)value, ADF_STR);
  967         }
  968 
  969         if (ret)
  970                 ret = EFAULT;
  971         return ret;
  972 }
  973 
  974 int
  975 adf_config_device(struct adf_accel_dev *accel_dev)
  976 {
  977         struct adf_cfg_device_data *cfg = NULL;
  978         struct adf_cfg_device *cfg_device = NULL;
  979         struct adf_cfg_section *sec;
  980         struct list_head *list;
  981         int ret = ENOMEM;
  982 
  983         if (!accel_dev)
  984                 return ret;
  985 
  986         ret = adf_cfg_static_conf(accel_dev);
  987         if (ret)
  988                 goto failed;
  989 
  990         cfg = accel_dev->cfg;
  991         cfg->dev = NULL;
  992         cfg_device = (struct adf_cfg_device *)malloc(sizeof(*cfg_device),
  993                                                      M_QAT,
  994                                                      M_WAITOK | M_ZERO);
  995 
  996         ret = EFAULT;
  997 
  998         if (adf_cfg_device_init(cfg_device, accel_dev))
  999                 goto failed;
 1000 
 1001         cfg->dev = cfg_device;
 1002 
 1003         /* GENERAL and KERNEL section must be processed before others */
 1004         list_for_each(list, &cfg->sec_list)
 1005         {
 1006                 sec = list_entry(list, struct adf_cfg_section, list);
 1007                 if (!strcmp(sec->name, ADF_GENERAL_SEC)) {
 1008                         ret = adf_cfg_process_section(accel_dev,
 1009                                                       sec->name,
 1010                                                       accel_dev->accel_id);
 1011                         if (ret)
 1012                                 goto failed;
 1013                         sec->processed = true;
 1014                         break;
 1015                 }
 1016         }
 1017 
 1018         list_for_each(list, &cfg->sec_list)
 1019         {
 1020                 sec = list_entry(list, struct adf_cfg_section, list);
 1021                 if (!strcmp(sec->name, ADF_KERNEL_SEC)) {
 1022                         ret = adf_cfg_process_section(accel_dev,
 1023                                                       sec->name,
 1024                                                       accel_dev->accel_id);
 1025                         if (ret)
 1026                                 goto failed;
 1027                         sec->processed = true;
 1028                         break;
 1029                 }
 1030         }
 1031 
 1032         list_for_each(list, &cfg->sec_list)
 1033         {
 1034                 sec = list_entry(list, struct adf_cfg_section, list);
 1035                 if (!strcmp(sec->name, ADF_KERNEL_SAL_SEC)) {
 1036                         ret = adf_cfg_process_section(accel_dev,
 1037                                                       sec->name,
 1038                                                       accel_dev->accel_id);
 1039                         if (ret)
 1040                                 goto failed;
 1041                         sec->processed = true;
 1042                         break;
 1043                 }
 1044         }
 1045 
 1046         list_for_each(list, &cfg->sec_list)
 1047         {
 1048                 sec = list_entry(list, struct adf_cfg_section, list);
 1049                 /* avoid reprocessing one section */
 1050                 if (!sec->processed && !sec->is_derived) {
 1051                         ret = adf_cfg_process_section(accel_dev,
 1052                                                       sec->name,
 1053                                                       accel_dev->accel_id);
 1054                         if (ret)
 1055                                 goto failed;
 1056                         sec->processed = true;
 1057                 }
 1058         }
 1059 
 1060         /* newly added accel section */
 1061         ret = adf_cfg_process_section(accel_dev,
 1062                                       ADF_ACCEL_SEC,
 1063                                       accel_dev->accel_id);
 1064         if (ret)
 1065                 goto failed;
 1066 
 1067         /*
 1068          * put item-remove task after item-process
 1069          * because during process we may fetch values from those items
 1070          */
 1071         list_for_each(list, &cfg->sec_list)
 1072         {
 1073                 sec = list_entry(list, struct adf_cfg_section, list);
 1074                 if (!sec->is_derived) {
 1075                         ret = adf_cfg_cleanup_section(accel_dev,
 1076                                                       sec->name,
 1077                                                       accel_dev->accel_id);
 1078                         if (ret)
 1079                                 goto failed;
 1080                 }
 1081         }
 1082 
 1083         ret = 0;
 1084         set_bit(ADF_STATUS_CONFIGURED, &accel_dev->status);
 1085 failed:
 1086         if (ret) {
 1087                 if (cfg_device) {
 1088                         adf_cfg_device_clear(cfg_device, accel_dev);
 1089                         free(cfg_device, M_QAT);
 1090                         cfg->dev = NULL;
 1091                 }
 1092                 adf_cfg_del_all(accel_dev);
 1093                 device_printf(GET_DEV(accel_dev), "Failed to config device\n");
 1094         }
 1095 
 1096         return ret;
 1097 }

Cache object: 75d470b548a6a1f1e724a594245ca5d2


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.