162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0+ */
262306a36Sopenharmony_ci/* Microchip Sparx5 Switch driver
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Copyright (c) 2022 Microchip Technology Inc. and its subsidiaries.
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#ifndef __SPARX5_QOS_H__
862306a36Sopenharmony_ci#define __SPARX5_QOS_H__
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ci#include <linux/netdevice.h>
1162306a36Sopenharmony_ci
1262306a36Sopenharmony_ci/* Number of Layers */
1362306a36Sopenharmony_ci#define SPX5_HSCH_LAYER_CNT 3
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_ci/* Scheduling elements per layer */
1662306a36Sopenharmony_ci#define SPX5_HSCH_L0_SE_CNT 5040
1762306a36Sopenharmony_ci#define SPX5_HSCH_L1_SE_CNT 64
1862306a36Sopenharmony_ci#define SPX5_HSCH_L2_SE_CNT 64
1962306a36Sopenharmony_ci
2062306a36Sopenharmony_ci/* Calculate Layer 0 Scheduler Element when using normal hierarchy */
2162306a36Sopenharmony_ci#define SPX5_HSCH_L0_GET_IDX(port, queue) ((64 * (port)) + (8 * (queue)))
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci/* Number of leak groups */
2462306a36Sopenharmony_ci#define SPX5_HSCH_LEAK_GRP_CNT 4
2562306a36Sopenharmony_ci
2662306a36Sopenharmony_ci/* Scheduler modes */
2762306a36Sopenharmony_ci#define SPX5_SE_MODE_LINERATE 0
2862306a36Sopenharmony_ci#define SPX5_SE_MODE_DATARATE 1
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* Rate and burst */
3162306a36Sopenharmony_ci#define SPX5_SE_RATE_MAX 262143
3262306a36Sopenharmony_ci#define SPX5_SE_BURST_MAX 127
3362306a36Sopenharmony_ci#define SPX5_SE_RATE_MIN 1
3462306a36Sopenharmony_ci#define SPX5_SE_BURST_MIN 1
3562306a36Sopenharmony_ci#define SPX5_SE_BURST_UNIT 4096
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci/* Dwrr */
3862306a36Sopenharmony_ci#define SPX5_DWRR_COST_MAX 63
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct sparx5_shaper {
4162306a36Sopenharmony_ci	u32 mode;
4262306a36Sopenharmony_ci	u32 rate;
4362306a36Sopenharmony_ci	u32 burst;
4462306a36Sopenharmony_ci};
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistruct sparx5_lg {
4762306a36Sopenharmony_ci	u32 max_rate;
4862306a36Sopenharmony_ci	u32 resolution;
4962306a36Sopenharmony_ci	u32 leak_time;
5062306a36Sopenharmony_ci	u32 max_ses;
5162306a36Sopenharmony_ci};
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistruct sparx5_layer {
5462306a36Sopenharmony_ci	struct sparx5_lg leak_groups[SPX5_HSCH_LEAK_GRP_CNT];
5562306a36Sopenharmony_ci};
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistruct sparx5_dwrr {
5862306a36Sopenharmony_ci	u32 count; /* Number of inputs running dwrr */
5962306a36Sopenharmony_ci	u8 cost[SPX5_PRIOS];
6062306a36Sopenharmony_ci};
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ciint sparx5_qos_init(struct sparx5 *sparx5);
6362306a36Sopenharmony_ci
6462306a36Sopenharmony_ci/* Multi-Queue Priority */
6562306a36Sopenharmony_ciint sparx5_tc_mqprio_add(struct net_device *ndev, u8 num_tc);
6662306a36Sopenharmony_ciint sparx5_tc_mqprio_del(struct net_device *ndev);
6762306a36Sopenharmony_ci
6862306a36Sopenharmony_ci/* Token Bucket Filter */
6962306a36Sopenharmony_cistruct tc_tbf_qopt_offload_replace_params;
7062306a36Sopenharmony_ciint sparx5_tc_tbf_add(struct sparx5_port *port,
7162306a36Sopenharmony_ci		      struct tc_tbf_qopt_offload_replace_params *params,
7262306a36Sopenharmony_ci		      u32 layer, u32 idx);
7362306a36Sopenharmony_ciint sparx5_tc_tbf_del(struct sparx5_port *port, u32 layer, u32 idx);
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_ci/* Enhanced Transmission Selection */
7662306a36Sopenharmony_cistruct tc_ets_qopt_offload_replace_params;
7762306a36Sopenharmony_ciint sparx5_tc_ets_add(struct sparx5_port *port,
7862306a36Sopenharmony_ci		      struct tc_ets_qopt_offload_replace_params *params);
7962306a36Sopenharmony_ci
8062306a36Sopenharmony_ciint sparx5_tc_ets_del(struct sparx5_port *port);
8162306a36Sopenharmony_ci
8262306a36Sopenharmony_ci#endif	/* __SPARX5_QOS_H__ */
83