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