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