common/cnxk: start and stop BPHY LMAC
[dpdk.git] / drivers / common / cnxk / roc_nix_priv.h
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #ifndef _ROC_NIX_PRIV_H_
6 #define _ROC_NIX_PRIV_H_
7
8 /* Constants */
9 #define NIX_CQ_ENTRY_SZ      128
10 #define NIX_CQ_ENTRY64_SZ    512
11 #define NIX_CQ_ALIGN         ((uint16_t)512)
12 #define NIX_MAX_SQB          ((uint16_t)512)
13 #define NIX_DEF_SQB          ((uint16_t)16)
14 #define NIX_MIN_SQB          ((uint16_t)8)
15 #define NIX_SQB_LIST_SPACE   ((uint16_t)2)
16 #define NIX_SQB_LOWER_THRESH ((uint16_t)70)
17
18 /* Apply BP/DROP when CQ is 95% full */
19 #define NIX_CQ_THRESH_LEVEL (5 * 256 / 100)
20
21 /* IRQ triggered when NIX_LF_CINTX_CNT[QCOUNT] crosses this value */
22 #define CQ_CQE_THRESH_DEFAULT   0x1ULL
23 #define CQ_TIMER_THRESH_DEFAULT 0xAULL /* ~1usec i.e (0xA * 100nsec) */
24 #define CQ_TIMER_THRESH_MAX     255
25
26 struct nix_qint {
27         struct nix *nix;
28         uint8_t qintx;
29 };
30
31 /* Traffic Manager */
32 #define NIX_TM_MAX_HW_TXSCHQ 512
33 #define NIX_TM_HW_ID_INVALID UINT32_MAX
34
35 /* TM flags */
36 #define NIX_TM_HIERARCHY_ENA BIT_ULL(0)
37 #define NIX_TM_TL1_NO_SP     BIT_ULL(1)
38 #define NIX_TM_TL1_ACCESS    BIT_ULL(2)
39
40 struct nix_tm_tb {
41         /** Token bucket rate (bytes per second) */
42         uint64_t rate;
43
44         /** Token bucket size (bytes), a.k.a. max burst size */
45         uint64_t size;
46 };
47
48 struct nix_tm_node {
49         TAILQ_ENTRY(nix_tm_node) node;
50
51         /* Input params */
52         enum roc_nix_tm_tree tree;
53         uint32_t id;
54         uint32_t priority;
55         uint32_t weight;
56         uint16_t lvl;
57         uint32_t parent_id;
58         uint32_t shaper_profile_id;
59         void (*free_fn)(void *node);
60
61         /* Derived params */
62         uint32_t hw_id;
63         uint16_t hw_lvl;
64         uint32_t rr_prio;
65         uint32_t rr_num;
66         uint32_t max_prio;
67         uint32_t parent_hw_id;
68         uint32_t flags : 16;
69 #define NIX_TM_NODE_HWRES   BIT_ULL(0)
70 #define NIX_TM_NODE_ENABLED BIT_ULL(1)
71         /* Shaper algorithm for RED state @NIX_REDALG_E */
72         uint32_t red_algo : 2;
73         uint32_t pkt_mode : 1;
74         uint32_t pkt_mode_set : 1;
75
76         bool child_realloc;
77         struct nix_tm_node *parent;
78
79         /* Non-leaf node sp count */
80         uint32_t n_sp_priorities;
81
82         /* Last stats */
83         uint64_t last_pkts;
84         uint64_t last_bytes;
85 };
86
87 struct nix_tm_shaper_profile {
88         TAILQ_ENTRY(nix_tm_shaper_profile) shaper;
89         struct nix_tm_tb commit;
90         struct nix_tm_tb peak;
91         int32_t pkt_len_adj;
92         bool pkt_mode;
93         uint32_t id;
94         void (*free_fn)(void *profile);
95
96         uint32_t ref_cnt;
97 };
98
99 TAILQ_HEAD(nix_tm_node_list, nix_tm_node);
100 TAILQ_HEAD(nix_tm_shaper_profile_list, nix_tm_shaper_profile);
101
102 struct nix {
103         uint16_t reta[ROC_NIX_RSS_GRPS][ROC_NIX_RSS_RETA_MAX];
104         enum roc_nix_rss_reta_sz reta_sz;
105         struct plt_pci_device *pci_dev;
106         uint16_t bpid[NIX_MAX_CHAN];
107         struct nix_qint *qints_mem;
108         struct nix_qint *cints_mem;
109         uint8_t configured_qints;
110         uint8_t configured_cints;
111         struct roc_nix_sq **sqs;
112         uint16_t vwqe_interval;
113         uint16_t tx_chan_base;
114         uint16_t rx_chan_base;
115         uint16_t nb_rx_queues;
116         uint16_t nb_tx_queues;
117         uint8_t lso_tsov6_idx;
118         uint8_t lso_tsov4_idx;
119         uint8_t lso_udp_tun_idx[ROC_NIX_LSO_TUN_MAX];
120         uint8_t lso_tun_idx[ROC_NIX_LSO_TUN_MAX];
121         uint8_t lf_rx_stats;
122         uint8_t lf_tx_stats;
123         uint8_t rx_chan_cnt;
124         uint8_t rss_alg_idx;
125         uint8_t tx_chan_cnt;
126         uintptr_t lmt_base;
127         uint8_t cgx_links;
128         uint8_t lbk_links;
129         uint8_t sdp_links;
130         uint8_t tx_link;
131         uint16_t sqb_size;
132         /* Without FCS, with L2 overhead */
133         uint16_t mtu;
134         uint16_t chan_cnt;
135         uint16_t msixoff;
136         uint8_t rx_pause;
137         uint8_t tx_pause;
138         struct dev dev;
139         uint16_t cints;
140         uint16_t qints;
141         uintptr_t base;
142         bool sdp_link;
143         bool lbk_link;
144         bool ptp_en;
145         bool is_nix1;
146
147         /* Traffic manager info */
148
149         /* Contiguous resources per lvl */
150         struct plt_bitmap *schq_contig_bmp[NIX_TXSCH_LVL_CNT];
151         /* Dis-contiguous resources per lvl */
152         struct plt_bitmap *schq_bmp[NIX_TXSCH_LVL_CNT];
153         void *schq_bmp_mem;
154
155         struct nix_tm_shaper_profile_list shaper_profile_list;
156         struct nix_tm_node_list trees[ROC_NIX_TM_TREE_MAX];
157         enum roc_nix_tm_tree tm_tree;
158         uint64_t tm_rate_min;
159         uint16_t tm_root_lvl;
160         uint16_t tm_flags;
161         uint16_t tm_link_cfg_lvl;
162         uint16_t contig_rsvd[NIX_TXSCH_LVL_CNT];
163         uint16_t discontig_rsvd[NIX_TXSCH_LVL_CNT];
164 } __plt_cache_aligned;
165
166 enum nix_err_status {
167         NIX_ERR_PARAM = -2048,
168         NIX_ERR_NO_MEM,
169         NIX_ERR_INVALID_RANGE,
170         NIX_ERR_INTERNAL,
171         NIX_ERR_OP_NOTSUP,
172         NIX_ERR_QUEUE_INVALID_RANGE,
173         NIX_ERR_AQ_READ_FAILED,
174         NIX_ERR_AQ_WRITE_FAILED,
175         NIX_ERR_TM_LEAF_NODE_GET,
176         NIX_ERR_TM_INVALID_LVL,
177         NIX_ERR_TM_INVALID_PRIO,
178         NIX_ERR_TM_INVALID_PARENT,
179         NIX_ERR_TM_NODE_EXISTS,
180         NIX_ERR_TM_INVALID_NODE,
181         NIX_ERR_TM_INVALID_SHAPER_PROFILE,
182         NIX_ERR_TM_PKT_MODE_MISMATCH,
183         NIX_ERR_TM_WEIGHT_EXCEED,
184         NIX_ERR_TM_CHILD_EXISTS,
185         NIX_ERR_TM_INVALID_PEAK_SZ,
186         NIX_ERR_TM_INVALID_PEAK_RATE,
187         NIX_ERR_TM_INVALID_COMMIT_SZ,
188         NIX_ERR_TM_INVALID_COMMIT_RATE,
189         NIX_ERR_TM_SHAPER_PROFILE_IN_USE,
190         NIX_ERR_TM_SHAPER_PROFILE_EXISTS,
191         NIX_ERR_TM_SHAPER_PKT_LEN_ADJUST,
192         NIX_ERR_TM_INVALID_TREE,
193         NIX_ERR_TM_PARENT_PRIO_UPDATE,
194         NIX_ERR_TM_PRIO_EXCEEDED,
195         NIX_ERR_TM_PRIO_ORDER,
196         NIX_ERR_TM_MULTIPLE_RR_GROUPS,
197         NIX_ERR_TM_SQ_UPDATE_FAIL,
198         NIX_ERR_NDC_SYNC,
199 };
200
201 enum nix_q_size {
202         nix_q_size_16, /* 16 entries */
203         nix_q_size_64, /* 64 entries */
204         nix_q_size_256,
205         nix_q_size_1K,
206         nix_q_size_4K,
207         nix_q_size_16K,
208         nix_q_size_64K,
209         nix_q_size_256K,
210         nix_q_size_1M, /* Million entries */
211         nix_q_size_max
212 };
213
214 static inline struct nix *
215 roc_nix_to_nix_priv(struct roc_nix *roc_nix)
216 {
217         return (struct nix *)&roc_nix->reserved[0];
218 }
219
220 static inline struct roc_nix *
221 nix_priv_to_roc_nix(struct nix *nix)
222 {
223         return (struct roc_nix *)((char *)nix -
224                                   offsetof(struct roc_nix, reserved));
225 }
226
227 /* IRQ */
228 int nix_register_irqs(struct nix *nix);
229 void nix_unregister_irqs(struct nix *nix);
230
231 /* TM */
232 #define NIX_TM_TREE_MASK_ALL                                                   \
233         (BIT(ROC_NIX_TM_DEFAULT) | BIT(ROC_NIX_TM_RLIMIT) |                    \
234          BIT(ROC_NIX_TM_USER))
235
236 /* NIX_MAX_HW_FRS ==
237  * NIX_TM_DFLT_RR_WT * NIX_TM_RR_QUANTUM_MAX / ROC_NIX_TM_MAX_SCHED_WT
238  */
239 #define NIX_TM_DFLT_RR_WT 71
240
241 /* Default TL1 priority and Quantum from AF */
242 #define NIX_TM_TL1_DFLT_RR_QTM  ((1 << 24) - 1)
243 #define NIX_TM_TL1_DFLT_RR_PRIO 1
244
245 struct nix_tm_shaper_data {
246         uint64_t burst_exponent;
247         uint64_t burst_mantissa;
248         uint64_t div_exp;
249         uint64_t exponent;
250         uint64_t mantissa;
251         uint64_t burst;
252         uint64_t rate;
253 };
254
255 static inline uint64_t
256 nix_tm_weight_to_rr_quantum(uint64_t weight)
257 {
258         uint64_t max = (roc_model_is_cn9k() ? NIX_CN9K_TM_RR_QUANTUM_MAX :
259                                                     NIX_TM_RR_QUANTUM_MAX);
260
261         weight &= (uint64_t)ROC_NIX_TM_MAX_SCHED_WT;
262         return (weight * max) / ROC_NIX_TM_MAX_SCHED_WT;
263 }
264
265 static inline bool
266 nix_tm_have_tl1_access(struct nix *nix)
267 {
268         return !!(nix->tm_flags & NIX_TM_TL1_ACCESS);
269 }
270
271 static inline bool
272 nix_tm_is_leaf(struct nix *nix, int lvl)
273 {
274         if (nix_tm_have_tl1_access(nix))
275                 return (lvl == ROC_TM_LVL_QUEUE);
276         return (lvl == ROC_TM_LVL_SCH4);
277 }
278
279 static inline struct nix_tm_node_list *
280 nix_tm_node_list(struct nix *nix, enum roc_nix_tm_tree tree)
281 {
282         return &nix->trees[tree];
283 }
284
285 static inline const char *
286 nix_tm_hwlvl2str(uint32_t hw_lvl)
287 {
288         switch (hw_lvl) {
289         case NIX_TXSCH_LVL_MDQ:
290                 return "SMQ/MDQ";
291         case NIX_TXSCH_LVL_TL4:
292                 return "TL4";
293         case NIX_TXSCH_LVL_TL3:
294                 return "TL3";
295         case NIX_TXSCH_LVL_TL2:
296                 return "TL2";
297         case NIX_TXSCH_LVL_TL1:
298                 return "TL1";
299         default:
300                 break;
301         }
302
303         return "???";
304 }
305
306 static inline const char *
307 nix_tm_tree2str(enum roc_nix_tm_tree tree)
308 {
309         if (tree == ROC_NIX_TM_DEFAULT)
310                 return "Default Tree";
311         else if (tree == ROC_NIX_TM_RLIMIT)
312                 return "Rate Limit Tree";
313         else if (tree == ROC_NIX_TM_USER)
314                 return "User Tree";
315         return "???";
316 }
317
318 /*
319  * TM priv ops.
320  */
321
322 int nix_tm_conf_init(struct roc_nix *roc_nix);
323 void nix_tm_conf_fini(struct roc_nix *roc_nix);
324 int nix_tm_leaf_data_get(struct nix *nix, uint16_t sq, uint32_t *rr_quantum,
325                          uint16_t *smq);
326 int nix_tm_sq_flush_pre(struct roc_nix_sq *sq);
327 int nix_tm_sq_flush_post(struct roc_nix_sq *sq);
328 int nix_tm_smq_xoff(struct nix *nix, struct nix_tm_node *node, bool enable);
329 int nix_tm_prepare_default_tree(struct roc_nix *roc_nix);
330 int nix_tm_node_add(struct roc_nix *roc_nix, struct nix_tm_node *node);
331 int nix_tm_node_delete(struct roc_nix *roc_nix, uint32_t node_id,
332                        enum roc_nix_tm_tree tree, bool free);
333 int nix_tm_free_node_resource(struct nix *nix, struct nix_tm_node *node);
334 int nix_tm_free_resources(struct roc_nix *roc_nix, uint32_t tree_mask,
335                           bool hw_only);
336 int nix_tm_clear_path_xoff(struct nix *nix, struct nix_tm_node *node);
337 void nix_tm_clear_shaper_profiles(struct nix *nix);
338 int nix_tm_alloc_txschq(struct nix *nix, enum roc_nix_tm_tree tree);
339 int nix_tm_assign_resources(struct nix *nix, enum roc_nix_tm_tree tree);
340 int nix_tm_release_resources(struct nix *nix, uint8_t hw_lvl, bool contig,
341                              bool above_thresh);
342 void nix_tm_copy_rsp_to_nix(struct nix *nix, struct nix_txsch_alloc_rsp *rsp);
343
344 int nix_tm_txsch_reg_config(struct nix *nix, enum roc_nix_tm_tree tree);
345 int nix_tm_update_parent_info(struct nix *nix, enum roc_nix_tm_tree tree);
346 int nix_tm_sq_sched_conf(struct nix *nix, struct nix_tm_node *node,
347                          bool rr_quantum_only);
348 int nix_tm_prepare_rate_limited_tree(struct roc_nix *roc_nix);
349
350 /*
351  * TM priv utils.
352  */
353 uint16_t nix_tm_lvl2nix(struct nix *nix, uint32_t lvl);
354 uint16_t nix_tm_lvl2nix_tl1_root(uint32_t lvl);
355 uint16_t nix_tm_lvl2nix_tl2_root(uint32_t lvl);
356 uint16_t nix_tm_resource_avail(struct nix *nix, uint8_t hw_lvl, bool contig);
357 int nix_tm_validate_prio(struct nix *nix, uint32_t lvl, uint32_t parent_id,
358                          uint32_t priority, enum roc_nix_tm_tree tree);
359 struct nix_tm_node *nix_tm_node_search(struct nix *nix, uint32_t node_id,
360                                        enum roc_nix_tm_tree tree);
361 struct nix_tm_shaper_profile *nix_tm_shaper_profile_search(struct nix *nix,
362                                                            uint32_t id);
363 uint8_t nix_tm_sw_xoff_prep(struct nix_tm_node *node, bool enable,
364                             volatile uint64_t *reg, volatile uint64_t *regval);
365 uint32_t nix_tm_check_rr(struct nix *nix, uint32_t parent_id,
366                          enum roc_nix_tm_tree tree, uint32_t *rr_prio,
367                          uint32_t *max_prio);
368 uint64_t nix_tm_shaper_profile_rate_min(struct nix *nix);
369 uint64_t nix_tm_shaper_rate_conv(uint64_t value, uint64_t *exponent_p,
370                                  uint64_t *mantissa_p, uint64_t *div_exp_p);
371 uint64_t nix_tm_shaper_burst_conv(uint64_t value, uint64_t *exponent_p,
372                                   uint64_t *mantissa_p);
373 bool nix_tm_child_res_valid(struct nix_tm_node_list *list,
374                             struct nix_tm_node *parent);
375 uint16_t nix_tm_resource_estimate(struct nix *nix, uint16_t *schq_contig,
376                                   uint16_t *schq, enum roc_nix_tm_tree tree);
377 uint8_t nix_tm_tl1_default_prep(uint32_t schq, volatile uint64_t *reg,
378                                 volatile uint64_t *regval);
379 uint8_t nix_tm_topology_reg_prep(struct nix *nix, struct nix_tm_node *node,
380                                  volatile uint64_t *reg,
381                                  volatile uint64_t *regval,
382                                  volatile uint64_t *regval_mask);
383 uint8_t nix_tm_sched_reg_prep(struct nix *nix, struct nix_tm_node *node,
384                               volatile uint64_t *reg,
385                               volatile uint64_t *regval);
386 uint8_t nix_tm_shaper_reg_prep(struct nix_tm_node *node,
387                                struct nix_tm_shaper_profile *profile,
388                                volatile uint64_t *reg,
389                                volatile uint64_t *regval);
390 struct nix_tm_node *nix_tm_node_alloc(void);
391 void nix_tm_node_free(struct nix_tm_node *node);
392 struct nix_tm_shaper_profile *nix_tm_shaper_profile_alloc(void);
393 void nix_tm_shaper_profile_free(struct nix_tm_shaper_profile *profile);
394
395 #endif /* _ROC_NIX_PRIV_H_ */