dpdk/drivers/common/cnxk/roc_nix.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: BSD-3-Clause
   2 * Copyright(C) 2021 Marvell.
   3 */
   4
   5#ifndef _ROC_NIX_H_
   6#define _ROC_NIX_H_
   7
   8/* Constants */
   9#define ROC_NIX_BPF_PER_PFFUNC        64
  10#define ROC_NIX_BPF_ID_INVALID        0xFFFF
  11#define ROC_NIX_BPF_LEVEL_IDX_INVALID 0xFF
  12#define ROC_NIX_BPF_LEVEL_MAX         3
  13#define ROC_NIX_BPF_STATS_MAX         12
  14#define ROC_NIX_MTR_ID_INVALID        UINT32_MAX
  15#define ROC_NIX_PFC_CLASS_INVALID     UINT8_MAX
  16
  17enum roc_nix_rss_reta_sz {
  18        ROC_NIX_RSS_RETA_SZ_64 = 64,
  19        ROC_NIX_RSS_RETA_SZ_128 = 128,
  20        ROC_NIX_RSS_RETA_SZ_256 = 256,
  21};
  22
  23enum roc_nix_sq_max_sqe_sz {
  24        roc_nix_maxsqesz_w16 = NIX_MAXSQESZ_W16,
  25        roc_nix_maxsqesz_w8 = NIX_MAXSQESZ_W8,
  26};
  27
  28enum roc_nix_fc_mode {
  29        ROC_NIX_FC_NONE = 0,
  30        ROC_NIX_FC_RX,
  31        ROC_NIX_FC_TX,
  32        ROC_NIX_FC_FULL
  33};
  34
  35enum roc_nix_vlan_type {
  36        ROC_NIX_VLAN_TYPE_INNER = 0x01,
  37        ROC_NIX_VLAN_TYPE_OUTER = 0x02,
  38};
  39
  40enum roc_nix_bpf_level_flag {
  41        ROC_NIX_BPF_LEVEL_F_LEAF = BIT(0),
  42        ROC_NIX_BPF_LEVEL_F_MID = BIT(1),
  43        ROC_NIX_BPF_LEVEL_F_TOP = BIT(2),
  44};
  45
  46enum roc_nix_bpf_pc_mode {
  47        ROC_NIX_BPF_PC_MODE_VLAN_INNER,
  48        ROC_NIX_BPF_PC_MODE_VLAN_OUTER,
  49        ROC_NIX_BPF_PC_MODE_DSCP_INNER,
  50        ROC_NIX_BPF_PC_MODE_DSCP_OUTER,
  51        ROC_NIX_BPF_PC_MODE_GEN_INNER,
  52        ROC_NIX_BPF_PC_MODE_GEN_OUTER
  53};
  54
  55enum roc_nix_bpf_color {
  56        ROC_NIX_BPF_COLOR_GREEN,
  57        ROC_NIX_BPF_COLOR_YELLOW,
  58        ROC_NIX_BPF_COLOR_RED,
  59        ROC_NIX_BPF_COLOR_MAX
  60};
  61
  62enum roc_nix_bpf_algo {
  63        ROC_NIX_BPF_ALGO_NONE,
  64        ROC_NIX_BPF_ALGO_2698,
  65        ROC_NIX_BPF_ALGO_4115,
  66        ROC_NIX_BPF_ALGO_2697
  67};
  68
  69enum roc_nix_bpf_lmode { ROC_NIX_BPF_LMODE_BYTE, ROC_NIX_BPF_LMODE_PACKET };
  70
  71enum roc_nix_bpf_action {
  72        ROC_NIX_BPF_ACTION_PASS,
  73        ROC_NIX_BPF_ACTION_DROP,
  74        ROC_NIX_BPF_ACTION_RED
  75};
  76
  77enum roc_nix_bpf_stats {
  78        ROC_NIX_BPF_GREEN_PKT_F_PASS = BIT_ULL(0),
  79        ROC_NIX_BPF_GREEN_OCTS_F_PASS = BIT_ULL(1),
  80        ROC_NIX_BPF_GREEN_PKT_F_DROP = BIT_ULL(2),
  81        ROC_NIX_BPF_GREEN_OCTS_F_DROP = BIT_ULL(3),
  82        ROC_NIX_BPF_YELLOW_PKT_F_PASS = BIT_ULL(4),
  83        ROC_NIX_BPF_YELLOW_OCTS_F_PASS = BIT_ULL(5),
  84        ROC_NIX_BPF_YELLOW_PKT_F_DROP = BIT_ULL(6),
  85        ROC_NIX_BPF_YELLOW_OCTS_F_DROP = BIT_ULL(7),
  86        ROC_NIX_BPF_RED_PKT_F_PASS = BIT_ULL(8),
  87        ROC_NIX_BPF_RED_OCTS_F_PASS = BIT_ULL(9),
  88        ROC_NIX_BPF_RED_PKT_F_DROP = BIT_ULL(10),
  89        ROC_NIX_BPF_RED_OCTS_F_DROP = BIT_ULL(11),
  90};
  91
  92struct roc_nix_bpf_cfg {
  93        enum roc_nix_bpf_algo alg;
  94        enum roc_nix_bpf_lmode lmode;
  95        enum roc_nix_bpf_color icolor;
  96        enum roc_nix_bpf_pc_mode pc_mode;
  97        bool tnl_ena;
  98        union {
  99                /* Valid when *alg* is set to ROC_NIX_BPF_ALGO_2697. */
 100                struct {
 101                        uint64_t cir;
 102                        uint64_t cbs;
 103                        uint64_t ebs;
 104                } algo2697;
 105
 106                /* Valid when *alg* is set to ROC_NIX_BPF_ALGO_2698. */
 107                struct {
 108                        uint64_t cir;
 109                        uint64_t pir;
 110                        uint64_t cbs;
 111                        uint64_t pbs;
 112                } algo2698;
 113
 114                /* Valid when *alg* is set to ROC_NIX_BPF_ALGO_4115. */
 115                struct {
 116                        uint64_t cir;
 117                        uint64_t eir;
 118                        uint64_t cbs;
 119                        uint64_t ebs;
 120                } algo4115;
 121        };
 122
 123        enum roc_nix_bpf_action action[ROC_NIX_BPF_COLOR_MAX];
 124
 125        /* Reserved for future config*/
 126        uint32_t rsvd[3];
 127};
 128
 129struct roc_nix_bpf_objs {
 130        uint16_t level;
 131        uint16_t count;
 132        uint16_t ids[ROC_NIX_BPF_PER_PFFUNC];
 133};
 134
 135struct roc_nix_bpf_precolor {
 136#define ROC_NIX_BPF_PRE_COLOR_MAX 64
 137        uint8_t count;
 138        enum roc_nix_bpf_pc_mode mode;
 139        enum roc_nix_bpf_color color[ROC_NIX_BPF_PRE_COLOR_MAX];
 140};
 141
 142struct roc_nix_vlan_config {
 143        uint32_t type;
 144        union {
 145                struct {
 146                        uint32_t vtag_inner;
 147                        uint32_t vtag_outer;
 148                } vlan;
 149
 150                struct {
 151                        int idx_inner;
 152                        int idx_outer;
 153                } mcam;
 154        };
 155};
 156
 157struct roc_nix_fc_cfg {
 158#define ROC_NIX_FC_RXCHAN_CFG 0
 159#define ROC_NIX_FC_CQ_CFG     1
 160#define ROC_NIX_FC_TM_CFG     2
 161#define ROC_NIX_FC_RQ_CFG     3
 162        uint8_t type;
 163        union {
 164                struct {
 165                        bool enable;
 166                } rxchan_cfg;
 167
 168                struct {
 169                        uint32_t rq;
 170                        uint16_t tc;
 171                        uint16_t cq_drop;
 172                        bool enable;
 173                } cq_cfg;
 174
 175                struct {
 176                        uint32_t rq;
 177                        uint16_t tc;
 178                        uint16_t cq_drop;
 179                        bool enable;
 180                        uint64_t pool;
 181                } rq_cfg;
 182
 183                struct {
 184                        uint32_t sq;
 185                        uint16_t tc;
 186                        bool enable;
 187                } tm_cfg;
 188        };
 189};
 190
 191struct roc_nix_pfc_cfg {
 192        enum roc_nix_fc_mode mode;
 193        /* For SET, tc must be [0, 15].
 194         * For GET, TC will represent bitmap
 195         */
 196        uint16_t tc;
 197};
 198
 199struct roc_nix_eeprom_info {
 200#define ROC_NIX_EEPROM_SIZE 256
 201        uint16_t sff_id;
 202        uint8_t buf[ROC_NIX_EEPROM_SIZE];
 203};
 204
 205/* Range to adjust PTP frequency. Valid range is
 206 * (-ROC_NIX_PTP_FREQ_ADJUST, ROC_NIX_PTP_FREQ_ADJUST)
 207 */
 208#define ROC_NIX_PTP_FREQ_ADJUST (1 << 9)
 209
 210/* NIX LF RX offload configuration flags.
 211 * These are input flags to roc_nix_lf_alloc:rx_cfg
 212 */
 213#define ROC_NIX_LF_RX_CFG_DROP_RE     BIT_ULL(32)
 214#define ROC_NIX_LF_RX_CFG_L2_LEN_ERR  BIT_ULL(33)
 215#define ROC_NIX_LF_RX_CFG_IP6_UDP_OPT BIT_ULL(34)
 216#define ROC_NIX_LF_RX_CFG_DIS_APAD    BIT_ULL(35)
 217#define ROC_NIX_LF_RX_CFG_CSUM_IL4    BIT_ULL(36)
 218#define ROC_NIX_LF_RX_CFG_CSUM_OL4    BIT_ULL(37)
 219#define ROC_NIX_LF_RX_CFG_LEN_IL4     BIT_ULL(38)
 220#define ROC_NIX_LF_RX_CFG_LEN_IL3     BIT_ULL(39)
 221#define ROC_NIX_LF_RX_CFG_LEN_OL4     BIT_ULL(40)
 222#define ROC_NIX_LF_RX_CFG_LEN_OL3     BIT_ULL(41)
 223
 224/* Group 0 will be used for RSS, 1 -7 will be used for npc_flow RSS action*/
 225#define ROC_NIX_RSS_GROUP_DEFAULT    0
 226#define ROC_NIX_RSS_GRPS             8
 227#define ROC_NIX_RSS_RETA_MAX         ROC_NIX_RSS_RETA_SZ_256
 228#define ROC_NIX_RSS_KEY_LEN          48 /* 352 Bits */
 229#define ROC_NIX_RSS_MCAM_IDX_DEFAULT (-1)
 230
 231#define ROC_NIX_DEFAULT_HW_FRS 1514
 232
 233#define ROC_NIX_VWQE_MAX_SIZE_LOG2 11
 234#define ROC_NIX_VWQE_MIN_SIZE_LOG2 2
 235
 236struct roc_nix_stats {
 237        /* Rx */
 238        uint64_t rx_octs;
 239        uint64_t rx_ucast;
 240        uint64_t rx_bcast;
 241        uint64_t rx_mcast;
 242        uint64_t rx_drop;
 243        uint64_t rx_drop_octs;
 244        uint64_t rx_fcs;
 245        uint64_t rx_err;
 246        uint64_t rx_drop_bcast;
 247        uint64_t rx_drop_mcast;
 248        uint64_t rx_drop_l3_bcast;
 249        uint64_t rx_drop_l3_mcast;
 250        /* Tx */
 251        uint64_t tx_ucast;
 252        uint64_t tx_bcast;
 253        uint64_t tx_mcast;
 254        uint64_t tx_drop;
 255        uint64_t tx_octs;
 256};
 257
 258struct roc_nix_stats_queue {
 259        PLT_STD_C11
 260        union {
 261                struct {
 262                        /* Rx */
 263                        uint64_t rx_pkts;
 264                        uint64_t rx_octs;
 265                        uint64_t rx_drop_pkts;
 266                        uint64_t rx_drop_octs;
 267                        uint64_t rx_error_pkts;
 268                };
 269                struct {
 270                        /* Tx */
 271                        uint64_t tx_pkts;
 272                        uint64_t tx_octs;
 273                        uint64_t tx_drop_pkts;
 274                        uint64_t tx_drop_octs;
 275                };
 276        };
 277};
 278
 279struct roc_nix_rq {
 280        /* Input parameters */
 281        uint16_t qid;
 282        uint16_t bpf_id;
 283        uint64_t aura_handle;
 284        bool ipsech_ena;
 285        uint16_t first_skip;
 286        uint16_t later_skip;
 287        uint16_t wqe_skip;
 288        uint16_t lpb_size;
 289        uint32_t tag_mask;
 290        uint32_t flow_tag_width;
 291        uint8_t tt;     /* Valid when SSO is enabled */
 292        uint16_t hwgrp; /* Valid when SSO is enabled */
 293        bool sso_ena;
 294        bool vwqe_ena;
 295        uint64_t spb_aura_handle; /* Valid when SPB is enabled */
 296        uint16_t spb_size;        /* Valid when SPB is enabled */
 297        bool spb_ena;
 298        uint8_t vwqe_first_skip;
 299        uint32_t vwqe_max_sz_exp;
 300        uint64_t vwqe_wait_tmo;
 301        uint64_t vwqe_aura_handle;
 302        /* Average LPB aura level drop threshold for RED */
 303        uint8_t red_drop;
 304        /* Average LPB aura level pass threshold for RED */
 305        uint8_t red_pass;
 306        /* Average SPB aura level drop threshold for RED */
 307        uint8_t spb_red_drop;
 308        /* Average SPB aura level pass threshold for RED */
 309        uint8_t spb_red_pass;
 310        /* LPB aura drop enable */
 311        bool lpb_drop_ena;
 312        /* SPB aura drop enable */
 313        bool spb_drop_ena;
 314        /* End of Input parameters */
 315        struct roc_nix *roc_nix;
 316        uint16_t inl_dev_refs;
 317};
 318
 319struct roc_nix_cq {
 320        /* Input parameters */
 321        uint16_t qid;
 322        uint32_t nb_desc;
 323        /* End of Input parameters */
 324        uint16_t drop_thresh;
 325        struct roc_nix *roc_nix;
 326        uintptr_t door;
 327        int64_t *status;
 328        uint64_t wdata;
 329        void *desc_base;
 330        uint32_t qmask;
 331        uint32_t head;
 332};
 333
 334struct roc_nix_sq {
 335        /* Input parameters */
 336        enum roc_nix_sq_max_sqe_sz max_sqe_sz;
 337        uint32_t nb_desc;
 338        uint16_t qid;
 339        uint16_t cqid;
 340        bool sso_ena;
 341        bool cq_ena;
 342        /* End of Input parameters */
 343        uint16_t sqes_per_sqb_log2;
 344        struct roc_nix *roc_nix;
 345        uint64_t aura_handle;
 346        int16_t nb_sqb_bufs_adj;
 347        uint16_t nb_sqb_bufs;
 348        uint16_t aura_sqb_bufs;
 349        plt_iova_t io_addr;
 350        void *lmt_addr;
 351        void *sqe_mem;
 352        void *fc;
 353        uint8_t tc;
 354};
 355
 356struct roc_nix_link_info {
 357        uint64_t status : 1;
 358        uint64_t full_duplex : 1;
 359        uint64_t lmac_type_id : 4;
 360        uint64_t speed : 20;
 361        uint64_t autoneg : 1;
 362        uint64_t fec : 2;
 363        uint64_t port : 8;
 364};
 365
 366/** Maximum name length for extended statistics counters */
 367#define ROC_NIX_XSTATS_NAME_SIZE 64
 368
 369struct roc_nix_xstat {
 370        uint64_t id;    /**< The index in xstats name array. */
 371        uint64_t value; /**< The statistic counter value. */
 372};
 373
 374struct roc_nix_xstat_name {
 375        char name[ROC_NIX_XSTATS_NAME_SIZE];
 376};
 377
 378struct roc_nix_ipsec_cfg {
 379        uint32_t sa_size;
 380        uint32_t tag_const;
 381        plt_iova_t iova;
 382        uint16_t max_sa;
 383        uint8_t tt;
 384};
 385
 386/* Link status update callback */
 387typedef void (*link_status_t)(struct roc_nix *roc_nix,
 388                              struct roc_nix_link_info *link);
 389
 390/* PTP info update callback */
 391typedef int (*ptp_info_update_t)(struct roc_nix *roc_nix, bool enable);
 392
 393/* Link status get callback */
 394typedef void (*link_info_get_t)(struct roc_nix *roc_nix,
 395                                struct roc_nix_link_info *link);
 396
 397struct roc_nix {
 398        /* Input parameters */
 399        struct plt_pci_device *pci_dev;
 400        uint16_t port_id;
 401        bool rss_tag_as_xor;
 402        uint16_t max_sqb_count;
 403        enum roc_nix_rss_reta_sz reta_sz;
 404        bool enable_loop;
 405        bool hw_vlan_ins;
 406        uint8_t lock_rx_ctx;
 407        uint32_t outb_nb_desc;
 408        uint16_t outb_nb_crypto_qs;
 409        uint32_t ipsec_in_min_spi;
 410        uint32_t ipsec_in_max_spi;
 411        uint32_t ipsec_out_max_sa;
 412        bool ipsec_out_sso_pffunc;
 413        /* End of input parameters */
 414        /* LMT line base for "Per Core Tx LMT line" mode*/
 415        uintptr_t lmt_base;
 416        bool io_enabled;
 417        bool rx_ptp_ena;
 418        uint16_t cints;
 419        bool custom_sa_action;
 420
 421#define ROC_NIX_MEM_SZ (6 * 1024)
 422        uint8_t reserved[ROC_NIX_MEM_SZ] __plt_cache_aligned;
 423} __plt_cache_aligned;
 424
 425enum roc_nix_lso_tun_type {
 426        ROC_NIX_LSO_TUN_V4V4,
 427        ROC_NIX_LSO_TUN_V4V6,
 428        ROC_NIX_LSO_TUN_V6V4,
 429        ROC_NIX_LSO_TUN_V6V6,
 430        ROC_NIX_LSO_TUN_MAX,
 431};
 432
 433/* Restrict CN9K sched weight to have a minimum quantum */
 434#define ROC_NIX_CN9K_TM_RR_WEIGHT_MAX 255u
 435
 436/* NIX TM Inlines */
 437static inline uint64_t
 438roc_nix_tm_max_sched_wt_get(void)
 439{
 440        if (roc_model_is_cn9k())
 441                return ROC_NIX_CN9K_TM_RR_WEIGHT_MAX;
 442        else
 443                return NIX_TM_RR_WEIGHT_MAX;
 444}
 445
 446static inline uint64_t
 447roc_nix_tm_max_shaper_burst_get(void)
 448{
 449        if (roc_model_is_cn9k())
 450                return NIX_CN9K_TM_MAX_SHAPER_BURST;
 451        else
 452                return NIX_TM_MAX_SHAPER_BURST;
 453}
 454
 455/* Dev */
 456int __roc_api roc_nix_dev_init(struct roc_nix *roc_nix);
 457int __roc_api roc_nix_dev_fini(struct roc_nix *roc_nix);
 458
 459/* Type */
 460bool __roc_api roc_nix_is_lbk(struct roc_nix *roc_nix);
 461bool __roc_api roc_nix_is_sdp(struct roc_nix *roc_nix);
 462bool __roc_api roc_nix_is_pf(struct roc_nix *roc_nix);
 463bool __roc_api roc_nix_is_vf_or_sdp(struct roc_nix *roc_nix);
 464int __roc_api roc_nix_get_base_chan(struct roc_nix *roc_nix);
 465int __roc_api roc_nix_get_pf(struct roc_nix *roc_nix);
 466int __roc_api roc_nix_get_vf(struct roc_nix *roc_nix);
 467uint16_t __roc_api roc_nix_get_pf_func(struct roc_nix *roc_nix);
 468uint16_t __roc_api roc_nix_get_vwqe_interval(struct roc_nix *roc_nix);
 469int __roc_api roc_nix_max_pkt_len(struct roc_nix *roc_nix);
 470
 471/* LF ops */
 472int __roc_api roc_nix_lf_alloc(struct roc_nix *roc_nix, uint32_t nb_rxq,
 473                               uint32_t nb_txq, uint64_t rx_cfg);
 474int __roc_api roc_nix_lf_free(struct roc_nix *roc_nix);
 475int __roc_api roc_nix_lf_inl_ipsec_cfg(struct roc_nix *roc_nix,
 476                                       struct roc_nix_ipsec_cfg *cfg, bool enb);
 477int __roc_api roc_nix_cpt_ctx_cache_sync(struct roc_nix *roc_nix);
 478int __roc_api roc_nix_rx_drop_re_set(struct roc_nix *roc_nix, bool ena);
 479
 480/* Debug */
 481int __roc_api roc_nix_lf_get_reg_count(struct roc_nix *roc_nix);
 482int __roc_api roc_nix_lf_reg_dump(struct roc_nix *roc_nix, uint64_t *data);
 483int __roc_api roc_nix_queues_ctx_dump(struct roc_nix *roc_nix);
 484void __roc_api roc_nix_cqe_dump(const struct nix_cqe_hdr_s *cq);
 485void __roc_api roc_nix_rq_dump(struct roc_nix_rq *rq);
 486void __roc_api roc_nix_cq_dump(struct roc_nix_cq *cq);
 487void __roc_api roc_nix_sq_dump(struct roc_nix_sq *sq);
 488void __roc_api roc_nix_tm_dump(struct roc_nix *roc_nix);
 489void __roc_api roc_nix_dump(struct roc_nix *roc_nix);
 490
 491/* IRQ */
 492void __roc_api roc_nix_rx_queue_intr_enable(struct roc_nix *roc_nix,
 493                                            uint16_t rxq_id);
 494void __roc_api roc_nix_rx_queue_intr_disable(struct roc_nix *roc_nix,
 495                                             uint16_t rxq_id);
 496void __roc_api roc_nix_err_intr_ena_dis(struct roc_nix *roc_nix, bool enb);
 497void __roc_api roc_nix_ras_intr_ena_dis(struct roc_nix *roc_nix, bool enb);
 498int __roc_api roc_nix_register_queue_irqs(struct roc_nix *roc_nix);
 499void __roc_api roc_nix_unregister_queue_irqs(struct roc_nix *roc_nix);
 500int __roc_api roc_nix_register_cq_irqs(struct roc_nix *roc_nix);
 501void __roc_api roc_nix_unregister_cq_irqs(struct roc_nix *roc_nix);
 502
 503/* Traffic Management */
 504#define ROC_NIX_TM_SHAPER_PROFILE_NONE UINT32_MAX
 505#define ROC_NIX_TM_NODE_ID_INVALID     UINT32_MAX
 506
 507enum roc_nix_tm_tree {
 508        ROC_NIX_TM_DEFAULT = 0,
 509        ROC_NIX_TM_RLIMIT,
 510        ROC_NIX_TM_PFC,
 511        ROC_NIX_TM_USER,
 512        ROC_NIX_TM_TREE_MAX,
 513};
 514
 515enum roc_tm_node_level {
 516        ROC_TM_LVL_ROOT = 0,
 517        ROC_TM_LVL_SCH1,
 518        ROC_TM_LVL_SCH2,
 519        ROC_TM_LVL_SCH3,
 520        ROC_TM_LVL_SCH4,
 521        ROC_TM_LVL_QUEUE,
 522        ROC_TM_LVL_MAX,
 523};
 524
 525/*
 526 * TM runtime hierarchy init API.
 527 */
 528int __roc_api roc_nix_tm_init(struct roc_nix *roc_nix);
 529void __roc_api roc_nix_tm_fini(struct roc_nix *roc_nix);
 530int __roc_api roc_nix_tm_sq_aura_fc(struct roc_nix_sq *sq, bool enable);
 531int __roc_api roc_nix_tm_sq_flush_spin(struct roc_nix_sq *sq);
 532
 533/*
 534 * TM User hierarchy API.
 535 */
 536
 537struct roc_nix_tm_node {
 538#define ROC_NIX_TM_NODE_SZ (128)
 539        uint8_t reserved[ROC_NIX_TM_NODE_SZ];
 540
 541        uint32_t id;
 542        uint32_t parent_id;
 543        uint32_t priority;
 544        uint32_t weight;
 545        uint32_t shaper_profile_id;
 546        uint16_t lvl;
 547        bool pkt_mode;
 548        bool pkt_mode_set;
 549        /* Function to free this memory */
 550        void (*free_fn)(void *node);
 551};
 552
 553struct roc_nix_tm_shaper_profile {
 554#define ROC_NIX_TM_SHAPER_PROFILE_SZ (128)
 555        uint8_t reserved[ROC_NIX_TM_SHAPER_PROFILE_SZ];
 556
 557        uint32_t id;
 558        uint64_t commit_rate;
 559        uint64_t commit_sz;
 560        uint64_t peak_rate;
 561        uint64_t peak_sz;
 562        int32_t pkt_len_adj;
 563        bool pkt_mode;
 564        int8_t accuracy;
 565        /* Function to free this memory */
 566        void (*free_fn)(void *profile);
 567};
 568
 569enum roc_nix_tm_node_stats_type {
 570        ROC_NIX_TM_NODE_PKTS_DROPPED,
 571        ROC_NIX_TM_NODE_BYTES_DROPPED,
 572        ROC_NIX_TM_NODE_GREEN_PKTS,
 573        ROC_NIX_TM_NODE_GREEN_BYTES,
 574        ROC_NIX_TM_NODE_YELLOW_PKTS,
 575        ROC_NIX_TM_NODE_YELLOW_BYTES,
 576        ROC_NIX_TM_NODE_RED_PKTS,
 577        ROC_NIX_TM_NODE_RED_BYTES,
 578        ROC_NIX_TM_NODE_STATS_MAX,
 579};
 580
 581struct roc_nix_tm_node_stats {
 582        uint64_t stats[ROC_NIX_TM_NODE_STATS_MAX];
 583};
 584
 585enum roc_nix_tm_mark {
 586        ROC_NIX_TM_MARK_VLAN_DEI,
 587        ROC_NIX_TM_MARK_IPV4_DSCP,
 588        ROC_NIX_TM_MARK_IPV4_ECN,
 589        ROC_NIX_TM_MARK_IPV6_DSCP,
 590        ROC_NIX_TM_MARK_IPV6_ECN,
 591        ROC_NIX_TM_MARK_MAX
 592};
 593
 594enum roc_nix_tm_mark_color {
 595        ROC_NIX_TM_MARK_COLOR_Y,
 596        ROC_NIX_TM_MARK_COLOR_R,
 597        ROC_NIX_TM_MARK_COLOR_Y_R,
 598        ROC_NIX_TM_MARK_COLOR_MAX
 599};
 600
 601int __roc_api roc_nix_tm_node_add(struct roc_nix *roc_nix,
 602                                  struct roc_nix_tm_node *roc_node);
 603int __roc_api roc_nix_tm_node_delete(struct roc_nix *roc_nix, uint32_t node_id,
 604                                     bool free);
 605int __roc_api roc_nix_tm_free_resources(struct roc_nix *roc_nix, bool hw_only);
 606int __roc_api roc_nix_tm_node_suspend_resume(struct roc_nix *roc_nix,
 607                                             uint32_t node_id, bool suspend);
 608int __roc_api roc_nix_tm_node_parent_update(struct roc_nix *roc_nix,
 609                                            uint32_t node_id,
 610                                            uint32_t new_parent_id,
 611                                            uint32_t priority, uint32_t weight);
 612int __roc_api roc_nix_tm_node_shaper_update(struct roc_nix *roc_nix,
 613                                            uint32_t node_id,
 614                                            uint32_t profile_id,
 615                                            bool force_update);
 616int __roc_api roc_nix_tm_node_pkt_mode_update(struct roc_nix *roc_nix,
 617                                              uint32_t node_id, bool pkt_mode);
 618int __roc_api roc_nix_tm_shaper_profile_add(
 619        struct roc_nix *roc_nix, struct roc_nix_tm_shaper_profile *profile);
 620int __roc_api roc_nix_tm_shaper_profile_update(
 621        struct roc_nix *roc_nix, struct roc_nix_tm_shaper_profile *profile);
 622int __roc_api roc_nix_tm_shaper_profile_delete(struct roc_nix *roc_nix,
 623                                               uint32_t id);
 624
 625int __roc_api roc_nix_tm_prealloc_res(struct roc_nix *roc_nix, uint8_t lvl,
 626                                      uint16_t discontig, uint16_t contig);
 627uint16_t __roc_api roc_nix_tm_leaf_cnt(struct roc_nix *roc_nix);
 628
 629struct roc_nix_tm_node *__roc_api roc_nix_tm_node_get(struct roc_nix *roc_nix,
 630                                                      uint32_t node_id);
 631struct roc_nix_tm_node *__roc_api
 632roc_nix_tm_node_next(struct roc_nix *roc_nix, struct roc_nix_tm_node *__prev);
 633struct roc_nix_tm_shaper_profile *__roc_api
 634roc_nix_tm_shaper_profile_get(struct roc_nix *roc_nix, uint32_t profile_id);
 635struct roc_nix_tm_shaper_profile *__roc_api roc_nix_tm_shaper_profile_next(
 636        struct roc_nix *roc_nix, struct roc_nix_tm_shaper_profile *__prev);
 637
 638int __roc_api roc_nix_tm_node_stats_get(struct roc_nix *roc_nix,
 639                                        uint32_t node_id, bool clear,
 640                                        struct roc_nix_tm_node_stats *stats);
 641/*
 642 * TM ratelimit tree API.
 643 */
 644int __roc_api roc_nix_tm_rlimit_sq(struct roc_nix *roc_nix, uint16_t qid,
 645                                   uint64_t rate);
 646/*
 647 * TM hierarchy enable/disable API.
 648 */
 649int __roc_api roc_nix_tm_hierarchy_disable(struct roc_nix *roc_nix);
 650int __roc_api roc_nix_tm_hierarchy_enable(struct roc_nix *roc_nix,
 651                                          enum roc_nix_tm_tree tree,
 652                                          bool xmit_enable);
 653
 654/*
 655 * TM utilities API.
 656 */
 657int __roc_api roc_nix_tm_node_lvl(struct roc_nix *roc_nix, uint32_t node_id);
 658bool __roc_api roc_nix_tm_root_has_sp(struct roc_nix *roc_nix);
 659void __roc_api roc_nix_tm_rsrc_max(bool pf, uint16_t schq[ROC_TM_LVL_MAX]);
 660int __roc_api roc_nix_tm_rsrc_count(struct roc_nix *roc_nix,
 661                                    uint16_t schq[ROC_TM_LVL_MAX]);
 662int __roc_api roc_nix_tm_node_name_get(struct roc_nix *roc_nix,
 663                                       uint32_t node_id, char *buf,
 664                                       size_t buflen);
 665int __roc_api roc_nix_smq_flush(struct roc_nix *roc_nix);
 666int __roc_api roc_nix_tm_max_prio(struct roc_nix *roc_nix, int lvl);
 667int __roc_api roc_nix_tm_lvl_is_leaf(struct roc_nix *roc_nix, int lvl);
 668void __roc_api
 669roc_nix_tm_shaper_default_red_algo(struct roc_nix_tm_node *node,
 670                                   struct roc_nix_tm_shaper_profile *profile);
 671int __roc_api roc_nix_tm_lvl_cnt_get(struct roc_nix *roc_nix);
 672int __roc_api roc_nix_tm_lvl_have_link_access(struct roc_nix *roc_nix, int lvl);
 673int __roc_api roc_nix_tm_prepare_rate_limited_tree(struct roc_nix *roc_nix);
 674int __roc_api roc_nix_tm_pfc_prepare_tree(struct roc_nix *roc_nix);
 675bool __roc_api roc_nix_tm_is_user_hierarchy_enabled(struct roc_nix *nix);
 676int __roc_api roc_nix_tm_tree_type_get(struct roc_nix *nix);
 677int __roc_api roc_nix_tm_mark_config(struct roc_nix *roc_nix,
 678                                     enum roc_nix_tm_mark type, int mark_yellow,
 679                                     int mark_red);
 680uint64_t __roc_api roc_nix_tm_mark_format_get(struct roc_nix *roc_nix,
 681                                              uint64_t *flags);
 682
 683/* Ingress Policer API */
 684int __roc_api roc_nix_bpf_timeunit_get(struct roc_nix *roc_nix,
 685                                       uint32_t *time_unit);
 686
 687int __roc_api
 688roc_nix_bpf_count_get(struct roc_nix *roc_nix, uint8_t lvl_mask,
 689                      uint16_t count[ROC_NIX_BPF_LEVEL_MAX] /* Out */);
 690
 691int __roc_api roc_nix_bpf_alloc(struct roc_nix *roc_nix, uint8_t lvl_mask,
 692                                uint16_t per_lvl_cnt[ROC_NIX_BPF_LEVEL_MAX],
 693                                struct roc_nix_bpf_objs *profs /* Out */);
 694
 695int __roc_api roc_nix_bpf_free(struct roc_nix *roc_nix,
 696                               struct roc_nix_bpf_objs *profs,
 697                               uint8_t num_prof);
 698
 699int __roc_api roc_nix_bpf_free_all(struct roc_nix *roc_nix);
 700
 701int __roc_api roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
 702                                 enum roc_nix_bpf_level_flag lvl_flag,
 703                                 struct roc_nix_bpf_cfg *cfg);
 704
 705int __roc_api roc_nix_bpf_ena_dis(struct roc_nix *roc_nix, uint16_t id,
 706                                  struct roc_nix_rq *rq, bool enable);
 707
 708int __roc_api roc_nix_bpf_dump(struct roc_nix *roc_nix, uint16_t id,
 709                               enum roc_nix_bpf_level_flag lvl_flag);
 710
 711int __roc_api roc_nix_bpf_pre_color_tbl_setup(
 712        struct roc_nix *roc_nix, uint16_t id,
 713        enum roc_nix_bpf_level_flag lvl_flag, struct roc_nix_bpf_precolor *tbl);
 714
 715/* Use ROC_NIX_BPF_ID_INVALID as dst_id to disconnect */
 716int __roc_api roc_nix_bpf_connect(struct roc_nix *roc_nix,
 717                                  enum roc_nix_bpf_level_flag lvl_flag,
 718                                  uint16_t src_id, uint16_t dst_id);
 719
 720int __roc_api
 721roc_nix_bpf_stats_read(struct roc_nix *roc_nix, uint16_t id, uint64_t mask,
 722                       enum roc_nix_bpf_level_flag lvl_flag,
 723                       uint64_t stats[ROC_NIX_BPF_STATS_MAX] /* Out */);
 724
 725int __roc_api roc_nix_bpf_stats_reset(struct roc_nix *roc_nix, uint16_t id,
 726                                      uint64_t mask,
 727                                      enum roc_nix_bpf_level_flag lvl_flag);
 728
 729int __roc_api
 730roc_nix_bpf_lf_stats_read(struct roc_nix *roc_nix, uint64_t mask,
 731                          uint64_t stats[ROC_NIX_BPF_STATS_MAX] /* Out */);
 732
 733int __roc_api roc_nix_bpf_lf_stats_reset(struct roc_nix *roc_nix,
 734                                         uint64_t mask);
 735
 736uint8_t __roc_api
 737roc_nix_bpf_level_to_idx(enum roc_nix_bpf_level_flag lvl_flag);
 738
 739uint8_t __roc_api roc_nix_bpf_stats_to_idx(enum roc_nix_bpf_stats lvl_flag);
 740
 741/* MAC */
 742int __roc_api roc_nix_mac_rxtx_start_stop(struct roc_nix *roc_nix, bool start);
 743int __roc_api roc_nix_mac_link_event_start_stop(struct roc_nix *roc_nix,
 744                                                bool start);
 745int __roc_api roc_nix_mac_loopback_enable(struct roc_nix *roc_nix, bool enable);
 746int __roc_api roc_nix_mac_addr_set(struct roc_nix *roc_nix,
 747                                   const uint8_t addr[]);
 748int __roc_api roc_nix_mac_max_entries_get(struct roc_nix *roc_nix);
 749int __roc_api roc_nix_mac_addr_add(struct roc_nix *roc_nix, uint8_t addr[]);
 750int __roc_api roc_nix_mac_addr_del(struct roc_nix *roc_nix, uint32_t index);
 751int __roc_api roc_nix_mac_promisc_mode_enable(struct roc_nix *roc_nix,
 752                                              int enable);
 753int __roc_api roc_nix_mac_link_state_set(struct roc_nix *roc_nix, uint8_t up);
 754int __roc_api roc_nix_mac_link_info_set(struct roc_nix *roc_nix,
 755                                        struct roc_nix_link_info *link_info);
 756int __roc_api roc_nix_mac_link_info_get(struct roc_nix *roc_nix,
 757                                        struct roc_nix_link_info *link_info);
 758int __roc_api roc_nix_mac_mtu_set(struct roc_nix *roc_nix, uint16_t mtu);
 759int __roc_api roc_nix_mac_max_rx_len_set(struct roc_nix *roc_nix,
 760                                         uint16_t maxlen);
 761int __roc_api roc_nix_mac_link_cb_register(struct roc_nix *roc_nix,
 762                                           link_status_t link_update);
 763void __roc_api roc_nix_mac_link_cb_unregister(struct roc_nix *roc_nix);
 764int __roc_api roc_nix_mac_link_info_get_cb_register(
 765        struct roc_nix *roc_nix, link_info_get_t link_info_get);
 766void __roc_api roc_nix_mac_link_info_get_cb_unregister(struct roc_nix *roc_nix);
 767
 768/* Ops */
 769int __roc_api roc_nix_switch_hdr_set(struct roc_nix *roc_nix,
 770                                     uint64_t switch_header_type,
 771                                     uint8_t pre_l2_size_offset,
 772                                     uint8_t pre_l2_size_offset_mask,
 773                                     uint8_t pre_l2_size_shift_dir);
 774int __roc_api roc_nix_lso_fmt_setup(struct roc_nix *roc_nix);
 775int __roc_api roc_nix_lso_fmt_get(struct roc_nix *roc_nix,
 776                                  uint8_t udp_tun[ROC_NIX_LSO_TUN_MAX],
 777                                  uint8_t tun[ROC_NIX_LSO_TUN_MAX]);
 778int __roc_api roc_nix_lso_custom_fmt_setup(struct roc_nix *roc_nix,
 779                                           struct nix_lso_format *fields,
 780                                           uint16_t nb_fields);
 781
 782int __roc_api roc_nix_eeprom_info_get(struct roc_nix *roc_nix,
 783                                      struct roc_nix_eeprom_info *info);
 784
 785/* Flow control */
 786int __roc_api roc_nix_fc_config_set(struct roc_nix *roc_nix,
 787                                    struct roc_nix_fc_cfg *fc_cfg);
 788
 789int __roc_api roc_nix_fc_config_get(struct roc_nix *roc_nix,
 790                                    struct roc_nix_fc_cfg *fc_cfg);
 791
 792int __roc_api roc_nix_fc_mode_set(struct roc_nix *roc_nix,
 793                                  enum roc_nix_fc_mode mode);
 794
 795int __roc_api roc_nix_pfc_mode_set(struct roc_nix *roc_nix,
 796                                   struct roc_nix_pfc_cfg *pfc_cfg);
 797
 798int __roc_api roc_nix_pfc_mode_get(struct roc_nix *roc_nix,
 799                                   struct roc_nix_pfc_cfg *pfc_cfg);
 800
 801uint16_t __roc_api roc_nix_chan_count_get(struct roc_nix *roc_nix);
 802
 803enum roc_nix_fc_mode __roc_api roc_nix_fc_mode_get(struct roc_nix *roc_nix);
 804
 805void __roc_api roc_nix_fc_npa_bp_cfg(struct roc_nix *roc_nix, uint64_t pool_id,
 806                                     uint8_t ena, uint8_t force, uint8_t tc);
 807
 808/* NPC */
 809int __roc_api roc_nix_npc_promisc_ena_dis(struct roc_nix *roc_nix, int enable);
 810
 811int __roc_api roc_nix_npc_mac_addr_set(struct roc_nix *roc_nix, uint8_t addr[]);
 812
 813int __roc_api roc_nix_npc_mac_addr_get(struct roc_nix *roc_nix, uint8_t *addr);
 814
 815int __roc_api roc_nix_npc_rx_ena_dis(struct roc_nix *roc_nix, bool enable);
 816
 817int __roc_api roc_nix_npc_mcast_config(struct roc_nix *roc_nix,
 818                                       bool mcast_enable, bool prom_enable);
 819
 820/* RSS */
 821void __roc_api roc_nix_rss_key_default_fill(struct roc_nix *roc_nix,
 822                                            uint8_t key[ROC_NIX_RSS_KEY_LEN]);
 823void __roc_api roc_nix_rss_key_set(struct roc_nix *roc_nix,
 824                                   const uint8_t key[ROC_NIX_RSS_KEY_LEN]);
 825void __roc_api roc_nix_rss_key_get(struct roc_nix *roc_nix,
 826                                   uint8_t key[ROC_NIX_RSS_KEY_LEN]);
 827int __roc_api roc_nix_rss_reta_set(struct roc_nix *roc_nix, uint8_t group,
 828                                   uint16_t reta[ROC_NIX_RSS_RETA_MAX]);
 829int __roc_api roc_nix_rss_reta_get(struct roc_nix *roc_nix, uint8_t group,
 830                                   uint16_t reta[ROC_NIX_RSS_RETA_MAX]);
 831int __roc_api roc_nix_rss_flowkey_set(struct roc_nix *roc_nix, uint8_t *alg_idx,
 832                                      uint32_t flowkey, uint8_t group,
 833                                      int mcam_index);
 834int __roc_api roc_nix_rss_default_setup(struct roc_nix *roc_nix,
 835                                        uint32_t flowkey);
 836
 837/* Stats */
 838int __roc_api roc_nix_stats_get(struct roc_nix *roc_nix,
 839                                struct roc_nix_stats *stats);
 840int __roc_api roc_nix_stats_reset(struct roc_nix *roc_nix);
 841int __roc_api roc_nix_stats_queue_get(struct roc_nix *roc_nix, uint16_t qid,
 842                                      bool is_rx,
 843                                      struct roc_nix_stats_queue *qstats);
 844int __roc_api roc_nix_stats_queue_reset(struct roc_nix *roc_nix, uint16_t qid,
 845                                        bool is_rx);
 846int __roc_api roc_nix_num_xstats_get(struct roc_nix *roc_nix);
 847int __roc_api roc_nix_xstats_get(struct roc_nix *roc_nix,
 848                                 struct roc_nix_xstat *xstats, unsigned int n);
 849int __roc_api roc_nix_xstats_names_get(struct roc_nix *roc_nix,
 850                                       struct roc_nix_xstat_name *xstats_names,
 851                                       unsigned int limit);
 852
 853/* Queue */
 854int __roc_api roc_nix_rq_init(struct roc_nix *roc_nix, struct roc_nix_rq *rq,
 855                              bool ena);
 856int __roc_api roc_nix_rq_modify(struct roc_nix *roc_nix, struct roc_nix_rq *rq,
 857                                bool ena);
 858int __roc_api roc_nix_rq_ena_dis(struct roc_nix_rq *rq, bool enable);
 859int __roc_api roc_nix_rq_is_sso_enable(struct roc_nix *roc_nix, uint32_t qid);
 860int __roc_api roc_nix_rq_fini(struct roc_nix_rq *rq);
 861int __roc_api roc_nix_cq_init(struct roc_nix *roc_nix, struct roc_nix_cq *cq);
 862int __roc_api roc_nix_cq_fini(struct roc_nix_cq *cq);
 863void __roc_api roc_nix_cq_head_tail_get(struct roc_nix *roc_nix, uint16_t qid,
 864                                        uint32_t *head, uint32_t *tail);
 865int __roc_api roc_nix_sq_init(struct roc_nix *roc_nix, struct roc_nix_sq *sq);
 866int __roc_api roc_nix_sq_fini(struct roc_nix_sq *sq);
 867void __roc_api roc_nix_sq_head_tail_get(struct roc_nix *roc_nix, uint16_t qid,
 868                                        uint32_t *head, uint32_t *tail);
 869
 870/* PTP */
 871int __roc_api roc_nix_ptp_rx_ena_dis(struct roc_nix *roc_nix, int enable);
 872int __roc_api roc_nix_ptp_tx_ena_dis(struct roc_nix *roc_nix, int enable);
 873int __roc_api roc_nix_ptp_clock_read(struct roc_nix *roc_nix, uint64_t *clock,
 874                                     uint64_t *tsc, uint8_t is_pmu);
 875int __roc_api roc_nix_ptp_sync_time_adjust(struct roc_nix *roc_nix,
 876                                           int64_t delta);
 877int __roc_api roc_nix_ptp_info_cb_register(struct roc_nix *roc_nix,
 878                                           ptp_info_update_t ptp_update);
 879void __roc_api roc_nix_ptp_info_cb_unregister(struct roc_nix *roc_nix);
 880bool __roc_api roc_nix_ptp_is_enable(struct roc_nix *roc_nix);
 881
 882/* VLAN */
 883int __roc_api
 884roc_nix_vlan_mcam_entry_read(struct roc_nix *roc_nix, uint32_t index,
 885                             struct npc_mcam_read_entry_rsp **rsp);
 886int __roc_api roc_nix_vlan_mcam_entry_write(struct roc_nix *roc_nix,
 887                                            uint32_t index,
 888                                            struct mcam_entry *entry,
 889                                            uint8_t intf, uint8_t enable);
 890int __roc_api roc_nix_vlan_mcam_entry_alloc_and_write(struct roc_nix *roc_nix,
 891                                                      struct mcam_entry *entry,
 892                                                      uint8_t intf,
 893                                                      uint8_t priority,
 894                                                      uint8_t ref_entry);
 895int __roc_api roc_nix_vlan_mcam_entry_free(struct roc_nix *roc_nix,
 896                                           uint32_t index);
 897int __roc_api roc_nix_vlan_mcam_entry_ena_dis(struct roc_nix *roc_nix,
 898                                              uint32_t index, const int enable);
 899int __roc_api roc_nix_vlan_strip_vtag_ena_dis(struct roc_nix *roc_nix,
 900                                              bool enable);
 901int __roc_api roc_nix_vlan_insert_ena_dis(struct roc_nix *roc_nix,
 902                                          struct roc_nix_vlan_config *vlan_cfg,
 903                                          uint64_t *mcam_index, bool enable);
 904int __roc_api roc_nix_vlan_tpid_set(struct roc_nix *roc_nix, uint32_t type,
 905                                    uint16_t tpid);
 906
 907/* MCAST*/
 908int __roc_api roc_nix_mcast_mcam_entry_alloc(struct roc_nix *roc_nix,
 909                                             uint16_t nb_entries,
 910                                             uint8_t priority,
 911                                             uint16_t index[]);
 912int __roc_api roc_nix_mcast_mcam_entry_free(struct roc_nix *roc_nix,
 913                                            uint32_t index);
 914int __roc_api roc_nix_mcast_mcam_entry_write(struct roc_nix *roc_nix,
 915                                             struct mcam_entry *entry,
 916                                             uint32_t index, uint8_t intf,
 917                                             uint64_t action);
 918int __roc_api roc_nix_mcast_mcam_entry_ena_dis(struct roc_nix *roc_nix,
 919                                               uint32_t index, bool enable);
 920#endif /* _ROC_NIX_H_ */
 921