xref: /dpdk/drivers/net/bnxt/tf_core/tf_resources.h (revision e77506397fc8005c5129e22e9e2d15d5876790fd)
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2019-2024 Broadcom
3  * All rights reserved.
4  */
5 
6 #ifndef _TF_RESOURCES_H_
7 #define _TF_RESOURCES_H_
8 #include <rte_common.h>
9 #include <tf_rm.h>
10 #include "bnxt.h"
11 
12 #define TF_NUM_TBL_SCOPE           16      /* < Number of TBL scopes */
13 
14 #ifdef TF_FLOW_SCALE_QUERY
15 /* Feature of flow scale query */
16 enum tf_resc_opt {
17 	TF_RESC_FREE,
18 	TF_RESC_ALLOC
19 };
20 
21 /**
22  *  WC TCAM includes a set of rows, and each row have 4-slices;
23  *  each slice has 160bit
24  */
25 typedef struct __rte_packed_begin tf_resc_wc_tcam_usage {
26 	uint16_t max_row_number;      /* Max number of rows (excluding AFM), 160bit row */
27 	uint16_t slice_row_1_p_used;  /* 1-slice rows partially used */
28 	uint16_t slice_row_1_f_used;  /* 1-slice rows fully used */
29 	uint16_t slice_row_2_p_used;  /* 2-slice rows partially used */
30 	uint16_t slice_row_2_f_used;  /* 2-slice rows fully used */
31 	uint16_t slice_row_4_used;    /* 4-slice rows fully used */
32 	uint16_t unused_row_number;   /* number of unused rows */
33 	uint8_t  reserved[2];
34 } __rte_packed_end tf_resc_wc_tcam_usage_t;
35 
36 /* Resource Internal EM memory pool; vary size records */
37 typedef struct __rte_packed_begin tf_resc_em_usage {
38 	uint16_t max_entries;   /* Max 16-Bytes entries */
39 	uint16_t used_entries;  /* each record takes up to 7 entries by design */
40 } __rte_packed_end tf_resc_em_usage_t;
41 
42 /* Resource Meter */
43 typedef struct __rte_packed_begin tf_resc_meter_usage {
44 	uint16_t max_meter_instance;    /* 1023 for Thor, app can reserve some entries */
45 	uint16_t max_meter_profile;     /* 256 for Thor, app can reserve some profiles  */
46 	uint16_t used_meter_instance;   /* meter instance: fixed size record */
47 	uint16_t used_meter_profile;    /* meter profile: fixed size record */
48 } __rte_packed_end tf_resc_meter_usage_t;
49 
50 /* Resource Counter */
51 typedef struct __rte_packed_begin tf_resc_cnt_usage {
52 	uint16_t max_entries;           /* each counter take 64-Bytes */
53 	uint16_t used_entries;          /* each record uses one entry */
54 } __rte_packed_end tf_resc_cnt_usage_t;
55 
56 /* Resource Action */
57 typedef struct __rte_packed_begin tf_resc_act_usage {
58 	uint16_t max_entries;              /* Max 8-Bytes entries */
59 	uint16_t num_compact_act_records;  /* 8-Bytes records */
60 	uint16_t num_full_act_records;     /* 16-Bytes records */
61 	uint16_t free_entries;             /* unused entries */
62 } __rte_packed_end tf_resc_act_usage_t;
63 
64 /* Resource SP SMAC  */
65 typedef struct __rte_packed_begin tf_resc_act_sp_smac_usage {
66 	uint16_t max_entries;              /* Max 8-Bytes entries */
67 	uint16_t num_sp_smac_records;      /* 8-Bytes records */
68 	uint16_t num_sp_smac_ipv4_records; /* 8-Bytes records */
69 	uint16_t num_sp_smac_ipv6_records; /* 16-Bytes records */
70 	uint16_t free_entries;             /* unused entries */
71 } __rte_packed_end tf_resc_act_sp_smac_usage_t;
72 
73 /* Resource ACT MODIFY and ACT ENCAP */
74 typedef struct __rte_packed_begin tf_resc_act_mod_enc_usage {
75 	uint16_t max_entries;	            /* Max 8-Bytes entries */
76 	struct {
77 		uint16_t num_8b_records;    /* 8-bytes records */
78 		uint16_t num_16b_records;   /* 16-bytes records  */
79 		uint16_t num_32b_records;   /* 32-bytes records  */
80 		uint16_t num_64b_records;   /* 64-bytes records  */
81 		uint16_t num_128b_records;  /* 128-bytes records  */
82 	} data;
83 	int16_t free_entries; /* unused entries */
84 } __rte_packed_end tf_resc_act_mod_enc_usage_t;
85 
86 /* All types of resource usage on both direction */
87 typedef struct __rte_packed_begin cfa_tf_resc_usage {
88 	tf_resc_em_usage_t           em_int_usage;
89 	tf_resc_wc_tcam_usage_t      wc_tcam_usage;
90 	tf_resc_cnt_usage_t          cnt_usage;
91 	tf_resc_act_usage_t          act_usage;
92 	tf_resc_meter_usage_t        meter_usage;
93 	tf_resc_act_mod_enc_usage_t  mod_encap_usage;
94 	tf_resc_act_sp_smac_usage_t  sp_smac_usage;
95 } __rte_packed_end cfa_tf_resc_usage_t;
96 
97 /* global data stored in firmware memory and TruFlow driver */
98 extern cfa_tf_resc_usage_t tf_resc_usage[TF_DIR_MAX];
99 
100 void tf_resc_usage_reset(struct tf *tfp, enum tf_device_type type);
101 
102 void tf_tcam_usage_init(struct tf *tfp);
103 
104 int tf_tcam_usage_update(struct tf *tfp,
105 			 enum tf_dir dir,
106 			 int tcam_tbl_type,
107 			 void *key_row,
108 			 enum tf_resc_opt resc_opt);
109 
110 void tf_em_usage_init(struct tf *tfp, enum tf_dir dir, uint16_t max_entries);
111 
112 int tf_em_usage_update(struct tf *tfp,
113 		       enum tf_dir dir,
114 		       uint16_t size,
115 		       enum tf_resc_opt resc_opt);
116 
117 void tf_tbl_usage_init(struct tf *tfp,
118 		       enum tf_dir dir,
119 		       uint32_t tbl_type,
120 		       uint16_t max_entries);
121 
122 int tf_tbl_usage_update(struct tf *tfp,
123 			enum tf_dir dir,
124 			uint32_t tbl_type,
125 			enum tf_resc_opt resc_opt);
126 
127 void dump_tf_resc_usage(enum tf_dir dir, void *data, uint32_t size);
128 
129 extern struct tf_rm_element_cfg tf_tbl_p58[TF_DIR_MAX][TF_TBL_TYPE_MAX];
130 
131 void tf_resc_pause_usage_update(void);
132 
133 void tf_resc_resume_usage_update(void);
134 
135 void tf_resc_usage_update_all(struct bnxt *bp);
136 
137 #endif /* TF_FLOW_SCALE_QUERY */
138 
139 #endif /* _TF_RESOURCES_H_ */
140