common/cnxk: support NIX traffic management
[dpdk.git] / drivers / common / cnxk / roc_nix_tm_utils.c
1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(C) 2021 Marvell.
3  */
4
5 #include "roc_api.h"
6 #include "roc_priv.h"
7
8 struct nix_tm_node *
9 nix_tm_node_search(struct nix *nix, uint32_t node_id, enum roc_nix_tm_tree tree)
10 {
11         struct nix_tm_node_list *list;
12         struct nix_tm_node *node;
13
14         list = nix_tm_node_list(nix, tree);
15         TAILQ_FOREACH(node, list, node) {
16                 if (node->id == node_id)
17                         return node;
18         }
19         return NULL;
20 }
21
22 uint8_t
23 nix_tm_sw_xoff_prep(struct nix_tm_node *node, bool enable,
24                     volatile uint64_t *reg, volatile uint64_t *regval)
25 {
26         uint32_t hw_lvl = node->hw_lvl;
27         uint32_t schq = node->hw_id;
28         uint8_t k = 0;
29
30         plt_tm_dbg("sw xoff config node %s(%u) lvl %u id %u, enable %u (%p)",
31                    nix_tm_hwlvl2str(hw_lvl), schq, node->lvl, node->id, enable,
32                    node);
33
34         regval[k] = enable;
35
36         switch (hw_lvl) {
37         case NIX_TXSCH_LVL_MDQ:
38                 reg[k] = NIX_AF_MDQX_SW_XOFF(schq);
39                 k++;
40                 break;
41         case NIX_TXSCH_LVL_TL4:
42                 reg[k] = NIX_AF_TL4X_SW_XOFF(schq);
43                 k++;
44                 break;
45         case NIX_TXSCH_LVL_TL3:
46                 reg[k] = NIX_AF_TL3X_SW_XOFF(schq);
47                 k++;
48                 break;
49         case NIX_TXSCH_LVL_TL2:
50                 reg[k] = NIX_AF_TL2X_SW_XOFF(schq);
51                 k++;
52                 break;
53         case NIX_TXSCH_LVL_TL1:
54                 reg[k] = NIX_AF_TL1X_SW_XOFF(schq);
55                 k++;
56                 break;
57         default:
58                 break;
59         }
60
61         return k;
62 }