net/bnxt: update copyright year
[dpdk.git] / drivers / net / bnxt / tf_core / tf_if_tbl.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_if_tbl.h"
9 #include "tf_common.h"
10 #include "tf_rm.h"
11 #include "tf_util.h"
12 #include "tf_msg.h"
13 #include "tfp.h"
14
15 struct tf;
16
17 /**
18  * IF Table DBs.
19  */
20 static void *if_tbl_db[TF_DIR_MAX];
21
22 /**
23  * IF Table Shadow DBs
24  */
25 /* static void *shadow_if_tbl_db[TF_DIR_MAX]; */
26
27 /**
28  * Init flag, set on bind and cleared on unbind
29  */
30 static uint8_t init;
31
32 /**
33  * Shadow init flag, set on bind and cleared on unbind
34  */
35 /* static uint8_t shadow_init; */
36
37 /**
38  * Convert if_tbl_type to hwrm type.
39  *
40  * [in] if_tbl_type
41  *   Interface table type
42  *
43  * [out] hwrm_type
44  *   HWRM device data type
45  *
46  * Returns:
47  *    0          - Success
48  *   -EOPNOTSUPP - Type not supported
49  */
50 static int
51 tf_if_tbl_get_hcapi_type(struct tf_if_tbl_get_hcapi_parms *parms)
52 {
53         struct tf_if_tbl_cfg *tbl_cfg;
54         enum tf_if_tbl_cfg_type cfg_type;
55
56         tbl_cfg = (struct tf_if_tbl_cfg *)parms->tbl_db;
57         cfg_type = tbl_cfg[parms->db_index].cfg_type;
58
59         if (cfg_type != TF_IF_TBL_CFG)
60                 return -ENOTSUP;
61
62         *parms->hcapi_type = tbl_cfg[parms->db_index].hcapi_type;
63
64         return 0;
65 }
66
67 int
68 tf_if_tbl_bind(struct tf *tfp __rte_unused,
69                struct tf_if_tbl_cfg_parms *parms)
70 {
71         TF_CHECK_PARMS2(tfp, parms);
72
73         if (init) {
74                 TFP_DRV_LOG(ERR,
75                             "IF TBL DB already initialized\n");
76                 return -EINVAL;
77         }
78
79         if_tbl_db[TF_DIR_RX] = parms->cfg;
80         if_tbl_db[TF_DIR_TX] = parms->cfg;
81
82         init = 1;
83
84         TFP_DRV_LOG(INFO,
85                     "Table Type - initialized\n");
86
87         return 0;
88 }
89
90 int
91 tf_if_tbl_unbind(struct tf *tfp __rte_unused)
92 {
93         /* Bail if nothing has been initialized */
94         if (!init) {
95                 TFP_DRV_LOG(INFO,
96                             "No Table DBs created\n");
97                 return 0;
98         }
99
100         if_tbl_db[TF_DIR_RX] = NULL;
101         if_tbl_db[TF_DIR_TX] = NULL;
102         init = 0;
103
104         return 0;
105 }
106
107 int
108 tf_if_tbl_set(struct tf *tfp,
109               struct tf_if_tbl_set_parms *parms)
110 {
111         int rc;
112         struct tf_if_tbl_get_hcapi_parms hparms;
113
114         TF_CHECK_PARMS3(tfp, parms, parms->data);
115
116         if (!init) {
117                 TFP_DRV_LOG(ERR,
118                             "%s: No Table DBs created\n",
119                             tf_dir_2_str(parms->dir));
120                 return -EINVAL;
121         }
122
123         /* Convert TF type to HCAPI type */
124         hparms.tbl_db = if_tbl_db[parms->dir];
125         hparms.db_index = parms->type;
126         hparms.hcapi_type = &parms->hcapi_type;
127         rc = tf_if_tbl_get_hcapi_type(&hparms);
128         if (rc)
129                 return rc;
130
131         rc = tf_msg_set_if_tbl_entry(tfp, parms);
132         if (rc) {
133                 TFP_DRV_LOG(ERR,
134                             "%s, If Tbl set failed, type:%d, rc:%s\n",
135                             tf_dir_2_str(parms->dir),
136                             parms->type,
137                             strerror(-rc));
138         }
139
140         return 0;
141 }
142
143 int
144 tf_if_tbl_get(struct tf *tfp,
145               struct tf_if_tbl_get_parms *parms)
146 {
147         int rc;
148         struct tf_if_tbl_get_hcapi_parms hparms;
149
150         TF_CHECK_PARMS3(tfp, parms, parms->data);
151
152         if (!init) {
153                 TFP_DRV_LOG(ERR,
154                             "%s: No Table DBs created\n",
155                             tf_dir_2_str(parms->dir));
156                 return -EINVAL;
157         }
158
159         /* Convert TF type to HCAPI type */
160         hparms.tbl_db = if_tbl_db[parms->dir];
161         hparms.db_index = parms->type;
162         hparms.hcapi_type = &parms->hcapi_type;
163         rc = tf_if_tbl_get_hcapi_type(&hparms);
164         if (rc)
165                 return rc;
166
167         /* Get the entry */
168         rc = tf_msg_get_if_tbl_entry(tfp, parms);
169         if (rc) {
170                 TFP_DRV_LOG(ERR,
171                             "%s, If Tbl get failed, type:%d, rc:%s\n",
172                             tf_dir_2_str(parms->dir),
173                             parms->type,
174                             strerror(-rc));
175         }
176
177         return 0;
178 }