162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci/* Marvell RVU Ethernet driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (C) 2023 Marvell. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci */ 762306a36Sopenharmony_ci#ifndef OTX2_QOS_H 862306a36Sopenharmony_ci#define OTX2_QOS_H 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci#include <linux/netdevice.h> 1262306a36Sopenharmony_ci#include <linux/rhashtable.h> 1362306a36Sopenharmony_ci 1462306a36Sopenharmony_ci#define OTX2_QOS_MAX_LVL 4 1562306a36Sopenharmony_ci#define OTX2_QOS_MAX_PRIO 7 1662306a36Sopenharmony_ci#define OTX2_QOS_MAX_LEAF_NODES 16 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cienum qos_smq_operations { 1962306a36Sopenharmony_ci QOS_CFG_SQ, 2062306a36Sopenharmony_ci QOS_SMQ_FLUSH, 2162306a36Sopenharmony_ci}; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ciu64 otx2_get_txschq_rate_regval(struct otx2_nic *nic, u64 maxrate, u32 burst); 2462306a36Sopenharmony_ci 2562306a36Sopenharmony_ciint otx2_setup_tc_htb(struct net_device *ndev, struct tc_htb_qopt_offload *htb); 2662306a36Sopenharmony_ciint otx2_qos_get_qid(struct otx2_nic *pfvf); 2762306a36Sopenharmony_civoid otx2_qos_free_qid(struct otx2_nic *pfvf, int qidx); 2862306a36Sopenharmony_ciint otx2_qos_enable_sq(struct otx2_nic *pfvf, int qidx); 2962306a36Sopenharmony_civoid otx2_qos_disable_sq(struct otx2_nic *pfvf, int qidx); 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_cistruct otx2_qos_cfg { 3262306a36Sopenharmony_ci u16 schq[NIX_TXSCH_LVL_CNT]; 3362306a36Sopenharmony_ci u16 schq_contig[NIX_TXSCH_LVL_CNT]; 3462306a36Sopenharmony_ci int static_node_pos[NIX_TXSCH_LVL_CNT]; 3562306a36Sopenharmony_ci int dwrr_node_pos[NIX_TXSCH_LVL_CNT]; 3662306a36Sopenharmony_ci u16 schq_contig_list[NIX_TXSCH_LVL_CNT][MAX_TXSCHQ_PER_FUNC]; 3762306a36Sopenharmony_ci u16 schq_list[NIX_TXSCH_LVL_CNT][MAX_TXSCHQ_PER_FUNC]; 3862306a36Sopenharmony_ci bool schq_index_used[NIX_TXSCH_LVL_CNT][MAX_TXSCHQ_PER_FUNC]; 3962306a36Sopenharmony_ci}; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_cistruct otx2_qos { 4262306a36Sopenharmony_ci DECLARE_HASHTABLE(qos_hlist, order_base_2(OTX2_QOS_MAX_LEAF_NODES)); 4362306a36Sopenharmony_ci struct mutex qos_lock; /* child list lock */ 4462306a36Sopenharmony_ci u16 qid_to_sqmap[OTX2_QOS_MAX_LEAF_NODES]; 4562306a36Sopenharmony_ci struct list_head qos_tree; 4662306a36Sopenharmony_ci DECLARE_BITMAP(qos_sq_bmap, OTX2_QOS_MAX_LEAF_NODES); 4762306a36Sopenharmony_ci u16 maj_id; 4862306a36Sopenharmony_ci u16 defcls; 4962306a36Sopenharmony_ci u8 link_cfg_lvl; /* LINKX_CFG CSRs mapped to TL3 or TL2's index ? */ 5062306a36Sopenharmony_ci}; 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_cistruct otx2_qos_node { 5362306a36Sopenharmony_ci struct list_head list; /* list management */ 5462306a36Sopenharmony_ci struct list_head child_list; 5562306a36Sopenharmony_ci struct list_head child_schq_list; 5662306a36Sopenharmony_ci struct hlist_node hlist; 5762306a36Sopenharmony_ci DECLARE_BITMAP(prio_bmap, OTX2_QOS_MAX_PRIO + 1); 5862306a36Sopenharmony_ci struct otx2_qos_node *parent; /* parent qos node */ 5962306a36Sopenharmony_ci u64 rate; /* htb params */ 6062306a36Sopenharmony_ci u64 ceil; 6162306a36Sopenharmony_ci u32 classid; 6262306a36Sopenharmony_ci u32 prio; 6362306a36Sopenharmony_ci u32 quantum; 6462306a36Sopenharmony_ci /* hw txschq */ 6562306a36Sopenharmony_ci u16 schq; 6662306a36Sopenharmony_ci u16 qid; 6762306a36Sopenharmony_ci u16 prio_anchor; 6862306a36Sopenharmony_ci u16 max_static_prio; 6962306a36Sopenharmony_ci u16 child_dwrr_cnt; 7062306a36Sopenharmony_ci u16 child_static_cnt; 7162306a36Sopenharmony_ci u16 child_dwrr_prio; 7262306a36Sopenharmony_ci u16 txschq_idx; /* txschq allocation index */ 7362306a36Sopenharmony_ci u8 level; 7462306a36Sopenharmony_ci bool is_static; 7562306a36Sopenharmony_ci}; 7662306a36Sopenharmony_ci 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_ci#endif 79