1
2
3
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
17
18static void *global_cfg_db[TF_DIR_MAX];
19
20
21
22
23static uint8_t init;
24
25
26
27
28struct tf_global_cfg_get_hcapi_parms {
29
30
31
32 void *global_cfg_db;
33
34
35
36
37 uint16_t db_index;
38
39
40
41 uint16_t *hcapi_type;
42};
43
44
45
46
47
48
49
50
51
52
53
54
55
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
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
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
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