162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0+ 262306a36Sopenharmony_ci/* Microchip Sparx5 Switch driver 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright (c) 2023 Microchip Technology Inc. and its subsidiaries. 562306a36Sopenharmony_ci */ 662306a36Sopenharmony_ci 762306a36Sopenharmony_ci#include "sparx5_main_regs.h" 862306a36Sopenharmony_ci#include "sparx5_main.h" 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistatic int sparx5_policer_service_conf_set(struct sparx5 *sparx5, 1162306a36Sopenharmony_ci struct sparx5_policer *pol) 1262306a36Sopenharmony_ci{ 1362306a36Sopenharmony_ci u32 idx, pup_tokens, max_pup_tokens, burst, thres; 1462306a36Sopenharmony_ci struct sparx5_sdlb_group *g; 1562306a36Sopenharmony_ci u64 rate; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ci g = &sdlb_groups[pol->group]; 1862306a36Sopenharmony_ci idx = pol->idx; 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci rate = pol->rate * 1000; 2162306a36Sopenharmony_ci burst = pol->burst; 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_ci pup_tokens = sparx5_sdlb_pup_token_get(sparx5, g->pup_interval, rate); 2462306a36Sopenharmony_ci max_pup_tokens = 2562306a36Sopenharmony_ci sparx5_sdlb_pup_token_get(sparx5, g->pup_interval, g->max_rate); 2662306a36Sopenharmony_ci 2762306a36Sopenharmony_ci thres = DIV_ROUND_UP(burst, g->min_burst); 2862306a36Sopenharmony_ci 2962306a36Sopenharmony_ci spx5_wr(ANA_AC_SDLB_PUP_TOKENS_PUP_TOKENS_SET(pup_tokens), sparx5, 3062306a36Sopenharmony_ci ANA_AC_SDLB_PUP_TOKENS(idx, 0)); 3162306a36Sopenharmony_ci 3262306a36Sopenharmony_ci spx5_rmw(ANA_AC_SDLB_INH_CTRL_PUP_TOKENS_MAX_SET(max_pup_tokens), 3362306a36Sopenharmony_ci ANA_AC_SDLB_INH_CTRL_PUP_TOKENS_MAX, sparx5, 3462306a36Sopenharmony_ci ANA_AC_SDLB_INH_CTRL(idx, 0)); 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ci spx5_rmw(ANA_AC_SDLB_THRES_THRES_SET(thres), ANA_AC_SDLB_THRES_THRES, 3762306a36Sopenharmony_ci sparx5, ANA_AC_SDLB_THRES(idx, 0)); 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_ci return 0; 4062306a36Sopenharmony_ci} 4162306a36Sopenharmony_ci 4262306a36Sopenharmony_ciint sparx5_policer_conf_set(struct sparx5 *sparx5, struct sparx5_policer *pol) 4362306a36Sopenharmony_ci{ 4462306a36Sopenharmony_ci /* More policer types will be added later */ 4562306a36Sopenharmony_ci switch (pol->type) { 4662306a36Sopenharmony_ci case SPX5_POL_SERVICE: 4762306a36Sopenharmony_ci return sparx5_policer_service_conf_set(sparx5, pol); 4862306a36Sopenharmony_ci default: 4962306a36Sopenharmony_ci break; 5062306a36Sopenharmony_ci } 5162306a36Sopenharmony_ci 5262306a36Sopenharmony_ci return 0; 5362306a36Sopenharmony_ci} 54