xref: /dpdk/drivers/net/bnxt/tf_core/tf_identifier.c (revision cb440babbd45a80c059f8bc80e87c48d09086fd7)
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 	TFP_DRV_LOG(INFO,
63 		    "Identifier - initialized\n");
64 
65 	return 0;
66 }
67 
68 int
69 tf_ident_unbind(struct tf *tfp)
70 {
71 	int rc = 0;
72 	int i;
73 	struct tf_rm_free_db_parms fparms = { 0 };
74 
75 	TF_CHECK_PARMS1(tfp);
76 
77 	/* Bail if nothing has been initialized */
78 	if (!init) {
79 		TFP_DRV_LOG(INFO,
80 			    "No Identifier DBs created\n");
81 		return 0;
82 	}
83 
84 	for (i = 0; i < TF_DIR_MAX; i++) {
85 		fparms.dir = i;
86 		fparms.rm_db = ident_db[i];
87 		rc = tf_rm_free_db(tfp, &fparms);
88 		if (rc) {
89 			TFP_DRV_LOG(ERR,
90 				    "rm free failed on unbind\n");
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 }
187