net/bnxt: add external action allocate and free
[dpdk.git] / drivers / net / bnxt / tf_core / tf_identifier.c
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_identifier.h"
9 #include "tf_common.h"
10 #include "tf_rm.h"
11 #include "tf_util.h"
12 #include "tfp.h"
13
14 struct tf;
15
16 /**
17  * Identifier DBs.
18  */
19 static void *ident_db[TF_DIR_MAX];
20
21 /**
22  * Init flag, set on bind and cleared on unbind
23  */
24 static uint8_t init;
25
26 int
27 tf_ident_bind(struct tf *tfp,
28               struct tf_ident_cfg_parms *parms)
29 {
30         int rc;
31         int i;
32         struct tf_rm_create_db_parms db_cfg = { 0 };
33
34         TF_CHECK_PARMS2(tfp, parms);
35
36         if (init) {
37                 TFP_DRV_LOG(ERR,
38                             "Identifier DB already initialized\n");
39                 return -EINVAL;
40         }
41
42         db_cfg.type = TF_DEVICE_MODULE_TYPE_IDENTIFIER;
43         db_cfg.num_elements = parms->num_elements;
44         db_cfg.cfg = parms->cfg;
45
46         for (i = 0; i < TF_DIR_MAX; i++) {
47                 db_cfg.dir = i;
48                 db_cfg.alloc_cnt = parms->resources->ident_cnt[i].cnt;
49                 db_cfg.rm_db = &ident_db[i];
50                 rc = tf_rm_create_db(tfp, &db_cfg);
51                 if (rc) {
52                         TFP_DRV_LOG(ERR,
53                                     "%s: Identifier DB creation failed\n",
54                                     tf_dir_2_str(i));
55
56                         return rc;
57                 }
58         }
59
60         init = 1;
61
62         printf("Identifier - initialized\n");
63
64         return 0;
65 }
66
67 int
68 tf_ident_unbind(struct tf *tfp)
69 {
70         int rc;
71         int i;
72         struct tf_rm_free_db_parms fparms = { 0 };
73
74         TF_CHECK_PARMS1(tfp);
75
76         /* Bail if nothing has been initialized */
77         if (!init) {
78                 TFP_DRV_LOG(INFO,
79                             "No Identifier DBs created\n");
80                 return 0;
81         }
82
83         for (i = 0; i < TF_DIR_MAX; i++) {
84                 fparms.dir = i;
85                 fparms.rm_db = ident_db[i];
86                 rc = tf_rm_free_db(tfp, &fparms);
87                 if (rc) {
88                         TFP_DRV_LOG(ERR,
89                                     "rm free failed on unbind\n");
90                 }
91
92                 ident_db[i] = NULL;
93         }
94
95         init = 0;
96
97         return 0;
98 }
99
100 int
101 tf_ident_alloc(struct tf *tfp __rte_unused,
102                struct tf_ident_alloc_parms *parms)
103 {
104         int rc;
105         uint32_t id;
106         struct tf_rm_allocate_parms aparms = { 0 };
107
108         TF_CHECK_PARMS2(tfp, parms);
109
110         if (!init) {
111                 TFP_DRV_LOG(ERR,
112                             "%s: No Identifier DBs created\n",
113                             tf_dir_2_str(parms->dir));
114                 return -EINVAL;
115         }
116
117         /* Allocate requested element */
118         aparms.rm_db = ident_db[parms->dir];
119         aparms.db_index = parms->type;
120         aparms.index = &id;
121         rc = tf_rm_allocate(&aparms);
122         if (rc) {
123                 TFP_DRV_LOG(ERR,
124                             "%s: Failed allocate, type:%d\n",
125                             tf_dir_2_str(parms->dir),
126                             parms->type);
127                 return rc;
128         }
129
130         *parms->id = id;
131
132         return 0;
133 }
134
135 int
136 tf_ident_free(struct tf *tfp __rte_unused,
137               struct tf_ident_free_parms *parms)
138 {
139         int rc;
140         struct tf_rm_is_allocated_parms aparms = { 0 };
141         struct tf_rm_free_parms fparms = { 0 };
142         int allocated = 0;
143
144         TF_CHECK_PARMS2(tfp, parms);
145
146         if (!init) {
147                 TFP_DRV_LOG(ERR,
148                             "%s: No Identifier DBs created\n",
149                             tf_dir_2_str(parms->dir));
150                 return -EINVAL;
151         }
152
153         /* Check if element is in use */
154         aparms.rm_db = ident_db[parms->dir];
155         aparms.db_index = parms->type;
156         aparms.index = parms->id;
157         aparms.allocated = &allocated;
158         rc = tf_rm_is_allocated(&aparms);
159         if (rc)
160                 return rc;
161
162         if (allocated != TF_RM_ALLOCATED_ENTRY_IN_USE) {
163                 TFP_DRV_LOG(ERR,
164                             "%s: Entry already free, type:%d, index:%d\n",
165                             tf_dir_2_str(parms->dir),
166                             parms->type,
167                             parms->id);
168                 return -EINVAL;
169         }
170
171         /* Free requested element */
172         fparms.rm_db = ident_db[parms->dir];
173         fparms.db_index = parms->type;
174         fparms.index = parms->id;
175         rc = tf_rm_free(&fparms);
176         if (rc) {
177                 TFP_DRV_LOG(ERR,
178                             "%s: Free failed, type:%d, index:%d\n",
179                             tf_dir_2_str(parms->dir),
180                             parms->type,
181                             parms->id);
182                 return rc;
183         }
184
185         return 0;
186 }