net/bnxt: support freeing key and action tables
[dpdk.git] / drivers / net / bnxt / tf_ulp / ulp_flow_db.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2014-2019 Broadcom
3  * All rights reserved.
4  */
5
6 #ifndef _ULP_FLOW_DB_H_
7 #define _ULP_FLOW_DB_H_
8
9 #include "bnxt_ulp.h"
10 #include "ulp_template_db.h"
11
12 #define BNXT_FLOW_DB_DEFAULT_NUM_FLOWS          128
13 #define BNXT_FLOW_DB_DEFAULT_NUM_RESOURCES      5
14
15 /* Structure for the flow database resource information. */
16 struct ulp_fdb_resource_info {
17         /* Points to next resource in the chained list. */
18         uint32_t        nxt_resource_idx;
19         union {
20                 uint64_t        resource_em_handle;
21                 struct {
22                         uint32_t        resource_type;
23                         uint32_t        resource_hndl;
24                 };
25         };
26 };
27
28 /* Structure for the flow database resource information. */
29 struct bnxt_ulp_flow_tbl {
30         /* Flow tbl is the resource object list for each flow id. */
31         struct ulp_fdb_resource_info    *flow_resources;
32
33         /* Flow table stack to track free list of resources. */
34         uint32_t        *flow_tbl_stack;
35         uint32_t        head_index;
36         uint32_t        tail_index;
37
38         /* Table to track the active flows. */
39         uint64_t        *active_flow_tbl;
40         uint32_t        num_flows;
41         uint32_t        num_resources;
42 };
43
44 /* Flow database supports two tables. */
45 enum bnxt_ulp_flow_db_tables {
46         BNXT_ULP_REGULAR_FLOW_TABLE,
47         BNXT_ULP_DEFAULT_FLOW_TABLE,
48         BNXT_ULP_FLOW_TABLE_MAX
49 };
50
51 /* Structure for the flow database resource information. */
52 struct bnxt_ulp_flow_db {
53         struct bnxt_ulp_flow_tbl        flow_tbl[BNXT_ULP_FLOW_TABLE_MAX];
54 };
55
56 /* flow db resource params to add resources */
57 struct ulp_flow_db_res_params {
58         enum tf_dir                     direction;
59         enum bnxt_ulp_resource_func     resource_func;
60         uint64_t                        resource_hndl;
61         uint32_t                        resource_type;
62         uint32_t                        critical_resource;
63 };
64
65 /*
66  * Initialize the flow database. Memory is allocated in this
67  * call and assigned to the flow database.
68  *
69  * ulp_ctxt [in] Ptr to ulp context
70  *
71  * Returns 0 on success or negative number on failure.
72  */
73 int32_t ulp_flow_db_init(struct bnxt_ulp_context *ulp_ctxt);
74
75 /*
76  * Deinitialize the flow database. Memory is deallocated in
77  * this call and all flows should have been purged before this
78  * call.
79  *
80  * ulp_ctxt [in] Ptr to ulp context
81  *
82  * Returns 0 on success.
83  */
84 int32_t ulp_flow_db_deinit(struct bnxt_ulp_context *ulp_ctxt);
85
86 /*
87  * Allocate the flow database entry.
88  * The params->critical_resource has to be set to 0 to allocate a new resource.
89  *
90  * ulp_ctxt [in] Ptr to ulp_context
91  * tbl_idx [in] Specify it is regular or default flow
92  * fid [in] The index to the flow entry
93  * params [in] The contents to be copied into resource
94  *
95  * returns 0 on success and negative on failure.
96  */
97 int32_t ulp_flow_db_resource_add(struct bnxt_ulp_context        *ulp_ctxt,
98                                  enum bnxt_ulp_flow_db_tables   tbl_idx,
99                                  uint32_t                       fid,
100                                  struct ulp_flow_db_res_params  *params);
101
102 /*
103  * Free the flow database entry.
104  * The params->critical_resource has to be set to 1 to free the first resource.
105  *
106  * ulp_ctxt [in] Ptr to ulp_context
107  * tbl_idx [in] Specify it is regular or default flow
108  * fid [in] The index to the flow entry
109  * params [in/out] The contents to be copied into params.
110  * Only the critical_resource needs to be set by the caller.
111  *
112  * Returns 0 on success and negative on failure.
113  */
114 int32_t ulp_flow_db_resource_del(struct bnxt_ulp_context        *ulp_ctxt,
115                                  enum bnxt_ulp_flow_db_tables   tbl_idx,
116                                  uint32_t                       fid,
117                                  struct ulp_flow_db_res_params  *params);
118
119 /*
120  * Free the flow database entry
121  *
122  * ulp_ctxt [in] Ptr to ulp_context
123  * tbl_idx [in] Specify it is regular or default flow
124  * fid [in] The index to the flow entry
125  *
126  * returns 0 on success and negative on failure.
127  */
128 int32_t ulp_flow_db_fid_free(struct bnxt_ulp_context            *ulp_ctxt,
129                              enum bnxt_ulp_flow_db_tables       tbl_idx,
130                              uint32_t                           fid);
131
132 #endif /* _ULP_FLOW_DB_H_ */