f4204526848fe1d17fbac79fb40a400124ed754c
[dpdk.git] / drivers / net / bnxt / tf_core / tf_global_cfg.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2021 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
14 struct tf;
15 /**
16  * Global Cfg DBs.
17  */
18 static void *global_cfg_db[TF_DIR_MAX];
19
20 /**
21  * Init flag, set on bind and cleared on unbind
22  */
23 static uint8_t init;
24
25 /**
26  * Get HCAPI type parameters for a single element
27  */
28 struct 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  */
57 static int
58 tf_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
74 int
75 tf_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
97 int
98 tf_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
114 int
115 tf_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
157 int
158 tf_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 }