dpdk/drivers/net/bnxt/tf_core/tf_global_cfg.c
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(c) 2019-2020 Broadcom
   3 * All rights reserved.
   4 */
   5
   6#include <rte_common.h>
   7
   8#include "tf_global_cfg.h"
   9#include "tf_common.h"
  10#include "tf_util.h"
  11#include "tf_msg.h"
  12#include "tfp.h"
  13
  14struct tf;
  15/**
  16 * Global Cfg DBs.
  17 */
  18static void *global_cfg_db[TF_DIR_MAX];
  19
  20/**
  21 * Init flag, set on bind and cleared on unbind
  22 */
  23static uint8_t init;
  24
  25/**
  26 * Get HCAPI type parameters for a single element
  27 */
  28struct tf_global_cfg_get_hcapi_parms {
  29        /**
  30         * [in] Global Cfg DB Handle
  31         */
  32        void *global_cfg_db;
  33        /**
  34         * [in] DB Index, indicates which DB entry to perform the
  35         * action on.
  36         */
  37        uint16_t db_index;
  38        /**
  39         * [out] Pointer to the hcapi type for the specified db_index
  40         */
  41        uint16_t *hcapi_type;
  42};
  43
  44/**
  45 * Check global_cfg_type and return hwrm type.
  46 *
  47 * [in] global_cfg_type
  48 *   Global Cfg type
  49 *
  50 * [out] hwrm_type
  51 *   HWRM device data type
  52 *
  53 * Returns:
  54 *    0          - Success
  55 *   -EOPNOTSUPP - Type not supported
  56 */
  57static int
  58tf_global_cfg_get_hcapi_type(struct tf_global_cfg_get_hcapi_parms *parms)
  59{
  60        struct tf_global_cfg_cfg *global_cfg;
  61        enum tf_global_cfg_cfg_type cfg_type;
  62
  63        global_cfg = (struct tf_global_cfg_cfg *)parms->global_cfg_db;
  64        cfg_type = global_cfg[parms->db_index].cfg_type;
  65
  66        if (cfg_type != TF_GLOBAL_CFG_CFG_HCAPI)
  67                return -ENOTSUP;
  68
  69        *parms->hcapi_type = global_cfg[parms->db_index].hcapi_type;
  70
  71        return 0;
  72}
  73
  74int
  75tf_global_cfg_bind(struct tf *tfp __rte_unused,
  76                   struct tf_global_cfg_cfg_parms *parms)
  77{
  78        TF_CHECK_PARMS2(tfp, parms);
  79
  80        if (init) {
  81                TFP_DRV_LOG(ERR,
  82                            "Global Cfg DB already initialized\n");
  83                return -EINVAL;
  84        }
  85
  86        global_cfg_db[TF_DIR_RX] = parms->cfg;
  87        global_cfg_db[TF_DIR_TX] = parms->cfg;
  88
  89        init = 1;
  90
  91        TFP_DRV_LOG(INFO,
  92                    "Global Cfg - initialized\n");
  93
  94        return 0;
  95}
  96
  97int
  98tf_global_cfg_unbind(struct tf *tfp __rte_unused)
  99{
 100        /* Bail if nothing has been initialized */
 101        if (!init) {
 102                TFP_DRV_LOG(INFO,
 103                            "No Global Cfg DBs created\n");
 104                return 0;
 105        }
 106
 107        global_cfg_db[TF_DIR_RX] = NULL;
 108        global_cfg_db[TF_DIR_TX] = NULL;
 109        init = 0;
 110
 111        return 0;
 112}
 113
 114int
 115tf_global_cfg_set(struct tf *tfp,
 116                  struct tf_global_cfg_parms *parms)
 117{
 118        int rc;
 119        struct tf_global_cfg_get_hcapi_parms hparms;
 120        uint16_t hcapi_type;
 121
 122        TF_CHECK_PARMS3(tfp, parms, parms->config);
 123
 124        if (!init) {
 125                TFP_DRV_LOG(ERR,
 126                            "%s: No Global Cfg DBs created\n",
 127                            tf_dir_2_str(parms->dir));
 128                return -EINVAL;
 129        }
 130
 131        /* Convert TF type to HCAPI type */
 132        hparms.global_cfg_db = global_cfg_db[parms->dir];
 133        hparms.db_index = parms->type;
 134        hparms.hcapi_type = &hcapi_type;
 135        rc = tf_global_cfg_get_hcapi_type(&hparms);
 136        if (rc) {
 137                TFP_DRV_LOG(ERR,
 138                            "%s, Failed type lookup, type:%d, rc:%s\n",
 139                            tf_dir_2_str(parms->dir),
 140                            parms->type,
 141                            strerror(-rc));
 142                return rc;
 143        }
 144
 145        rc = tf_msg_set_global_cfg(tfp, parms);
 146        if (rc) {
 147                TFP_DRV_LOG(ERR,
 148                            "%s, Set failed, type:%d, rc:%s\n",
 149                            tf_dir_2_str(parms->dir),
 150                            parms->type,
 151                            strerror(-rc));
 152        }
 153
 154        return 0;
 155}
 156
 157int
 158tf_global_cfg_get(struct tf *tfp,
 159                  struct tf_global_cfg_parms *parms)
 160
 161{
 162        int rc;
 163        struct tf_global_cfg_get_hcapi_parms hparms;
 164        uint16_t hcapi_type;
 165
 166        TF_CHECK_PARMS3(tfp, parms, parms->config);
 167
 168        if (!init) {
 169                TFP_DRV_LOG(ERR,
 170                            "%s: No Global Cfg DBs created\n",
 171                            tf_dir_2_str(parms->dir));
 172                return -EINVAL;
 173        }
 174
 175        hparms.global_cfg_db = global_cfg_db[parms->dir];
 176        hparms.db_index = parms->type;
 177        hparms.hcapi_type = &hcapi_type;
 178        rc = tf_global_cfg_get_hcapi_type(&hparms);
 179        if (rc) {
 180                TFP_DRV_LOG(ERR,
 181                            "%s, Failed type lookup, type:%d, rc:%s\n",
 182                            tf_dir_2_str(parms->dir),
 183                            parms->type,
 184                            strerror(-rc));
 185                return rc;
 186        }
 187
 188        /* Get the entry */
 189        rc = tf_msg_get_global_cfg(tfp, parms);
 190        if (rc) {
 191                TFP_DRV_LOG(ERR,
 192                            "%s, Get failed, type:%d, rc:%s\n",
 193                            tf_dir_2_str(parms->dir),
 194                            parms->type,
 195                            strerror(-rc));
 196        }
 197
 198        return 0;
 199}
 200