[2/2] common/cnxk: update meter algorithm in band profile

Message ID 20211130064147.1023321-2-rkudurumalla@marvell.com (mailing list archive)
State Superseded, archived
Delegated to: Jerin Jacob
Headers
Series [1/2] net/cnxk: update meter bpf ID in rq |

Checks

Context Check Description
ci/checkpatch success coding style OK
ci/Intel-compilation success Compilation OK
ci/intel-Testing success Testing PASS
ci/github-robot: build success github build: passed
ci/iol-mellanox-Performance success Performance Testing PASS
ci/iol-broadcom-Performance success Performance Testing PASS
ci/iol-broadcom-Functional success Functional Testing PASS
ci/iol-x86_64-unit-testing success Testing PASS
ci/iol-x86_64-compile-testing success Testing PASS
ci/iol-intel-Functional success Functional Testing PASS
ci/iol-intel-Performance success Performance Testing PASS
ci/iol-aarch64-unit-testing success Testing PASS
ci/iol-aarch64-compile-testing success Testing PASS

Commit Message

Rakesh Kudurumalla Nov. 30, 2021, 6:41 a.m. UTC
  Patch updates meter algorithm in nix band profile
structure

Signed-off-by: Rakesh Kudurumalla <rkudurumalla@marvell.com>
---
 drivers/common/cnxk/hw/nix.h      |  5 ---
 drivers/common/cnxk/roc_nix_bpf.c | 61 +++++++++----------------------
 2 files changed, 17 insertions(+), 49 deletions(-)
  

Comments

Sunil Kumar Kori Nov. 30, 2021, 7:15 a.m. UTC | #1
>-----Original Message-----
>From: Rakesh Kudurumalla <rkudurumalla@marvell.com>
>Sent: Tuesday, November 30, 2021 12:12 PM
>To: Nithin Kumar Dabilpuram <ndabilpuram@marvell.com>; Kiran Kumar
>Kokkilagadda <kirankumark@marvell.com>; Sunil Kumar Kori
><skori@marvell.com>; Satha Koteswara Rao Kottidi
><skoteshwar@marvell.com>
>Cc: dev@dpdk.org; Rakesh Kudurumalla <rkudurumalla@marvell.com>
>Subject: [PATCH 2/2] common/cnxk: update meter algorithm in band profile
>
>Patch updates meter algorithm in nix band profile structure
>
>Signed-off-by: Rakesh Kudurumalla <rkudurumalla@marvell.com>
>---
> drivers/common/cnxk/hw/nix.h      |  5 ---
> drivers/common/cnxk/roc_nix_bpf.c | 61 +++++++++----------------------
> 2 files changed, 17 insertions(+), 49 deletions(-)
>
>diff --git a/drivers/common/cnxk/hw/nix.h b/drivers/common/cnxk/hw/nix.h
>index dd2ebecc6a..6931f1d1d2 100644
>--- a/drivers/common/cnxk/hw/nix.h
>+++ b/drivers/common/cnxk/hw/nix.h
>@@ -2133,11 +2133,6 @@ struct nix_lso_format {
> 	((NIX_BPF_RATE_CONST * ((256 + (mantissa)) << (exponent))) /           \
> 	 (((1ull << (div_exp)) * 256 * policer_timeunit)))
>
>-/* Meter rate limits in Bits/Sec */
>-#define NIX_BPF_RATE_MIN NIX_BPF_RATE(1000000000, 0, 0, 0)
>-#define NIX_BPF_RATE_MAX                                                       \
>-	NIX_BPF_RATE(1, NIX_BPF_MAX_RATE_EXPONENT,
>NIX_BPF_MAX_RATE_MANTISSA, 0)
>-
> #define NIX_BPF_DEFAULT_ADJUST_MANTISSA 511  #define
>NIX_BPF_DEFAULT_ADJUST_EXPONENT 0
>
>diff --git a/drivers/common/cnxk/roc_nix_bpf.c
>b/drivers/common/cnxk/roc_nix_bpf.c
>index 6996a54be0..46ed91e87b 100644
>--- a/drivers/common/cnxk/roc_nix_bpf.c
>+++ b/drivers/common/cnxk/roc_nix_bpf.c
>@@ -38,48 +38,23 @@ meter_rate_to_nix(uint64_t value, uint64_t
>*exponent_p, uint64_t *mantissa_p,
> 		  uint64_t *div_exp_p, uint32_t timeunit_p)  {
> 	uint64_t div_exp, exponent, mantissa;
>-	uint32_t time_us = timeunit_p;
>+	uint32_t time_ns = timeunit_p;
>
> 	/* Boundary checks */
>-	if (value < NIX_BPF_RATE_MIN || value > NIX_BPF_RATE_MAX)
>+	if (value < NIX_BPF_RATE(time_ns, 0, 0, 0) ||
>+	    value > NIX_BPF_RATE(time_ns, NIX_BPF_MAX_RATE_EXPONENT,
>+				 NIX_BPF_MAX_RATE_MANTISSA, 0))
> 		return 0;
>
>-	if (value <= NIX_BPF_RATE(time_us, 0, 0, 0)) {
>-		/* Calculate rate div_exp and mantissa using
>-		 * the following formula:
>-		 *
>-		 * value = (2E6 * (256 + mantissa)
>-		 *              / ((1 << div_exp) * 256))
>-		 */
>-		div_exp = 0;
>-		exponent = 0;
>-		mantissa = NIX_BPF_MAX_RATE_MANTISSA;
>-
>-		while (value < (NIX_BPF_RATE_CONST / (1 << div_exp)))
>-			div_exp += 1;
>-
>-		while (value < ((NIX_BPF_RATE_CONST * (256 + mantissa)) /
>-				((1 << div_exp) * 256)))
>-			mantissa -= 1;
>-	} else {
>-		/* Calculate rate exponent and mantissa using
>-		 * the following formula:
>-		 *
>-		 * value = (2E6 * ((256 + mantissa) << exponent)) / 256
>-		 *
>-		 */
>-		div_exp = 0;
>-		exponent = NIX_BPF_MAX_RATE_EXPONENT;
>-		mantissa = NIX_BPF_MAX_RATE_MANTISSA;
>-
>-		while (value < (NIX_BPF_RATE_CONST * (1 << exponent)))
>-			exponent -= 1;
>-
>-		while (value <
>-		       ((NIX_BPF_RATE_CONST * ((256 + mantissa) << exponent))
>/
>-			256))
>-			mantissa -= 1;
>-	}
>+	div_exp = 0;
>+	exponent = NIX_BPF_MAX_RATE_EXPONENT;
>+	mantissa = NIX_BPF_MAX_RATE_MANTISSA;
>+
>+	while (value < (NIX_BPF_RATE(time_ns, exponent, 0, 0)))
>+		exponent -= 1;
>+
>+	while (value < (NIX_BPF_RATE(time_ns, exponent, mantissa, 0)))
>+		mantissa -= 1;
>
> 	if (div_exp > NIX_BPF_MAX_RATE_DIV_EXP ||
> 	    exponent > NIX_BPF_MAX_RATE_EXPONENT || @@ -94,7 +69,7
>@@ meter_rate_to_nix(uint64_t value, uint64_t *exponent_p, uint64_t
>*mantissa_p,
> 		*mantissa_p = mantissa;
>
> 	/* Calculate real rate value */
>-	return NIX_BPF_RATE(time_us, exponent, mantissa, div_exp);
>+	return NIX_BPF_RATE(time_ns, exponent, mantissa, div_exp);
> }
>
> static inline uint64_t
>@@ -195,11 +170,7 @@ nix_precolor_conv_table_write(struct roc_nix
>*roc_nix, uint64_t val,
> 	int64_t *addr;
>
> 	addr = PLT_PTR_ADD(nix->base, off);
>-	/* FIXME: Currently writing to this register throwing kernel dump.
>-	 * plt_write64(val, addr);
>-	 */
>-	PLT_SET_USED(val);
>-	PLT_SET_USED(addr);
>+	plt_write64(val, addr);
> }
>
> static uint8_t
>@@ -665,6 +636,7 @@ roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t
>id,
>
> 	aq->prof.lmode = cfg->lmode;
> 	aq->prof.icolor = cfg->icolor;
>+	aq->prof.meter_algo = cfg->alg;
> 	aq->prof.pc_mode = cfg->pc_mode;
> 	aq->prof.tnl_ena = cfg->tnl_ena;
> 	aq->prof.gc_action = cfg->action[ROC_NIX_BPF_COLOR_GREEN];
>@@ -673,6 +645,7 @@ roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t
>id,
>
> 	aq->prof_mask.lmode = ~(aq->prof_mask.lmode);
> 	aq->prof_mask.icolor = ~(aq->prof_mask.icolor);
>+	aq->prof_mask.meter_algo = ~(aq->prof_mask.meter_algo);
> 	aq->prof_mask.pc_mode = ~(aq->prof_mask.pc_mode);
> 	aq->prof_mask.tnl_ena = ~(aq->prof_mask.tnl_ena);
> 	aq->prof_mask.gc_action = ~(aq->prof_mask.gc_action);
>--
>2.25.1

Acked-by: Sunil Kumar Kori <skori@mavell.com>
  

Patch

diff --git a/drivers/common/cnxk/hw/nix.h b/drivers/common/cnxk/hw/nix.h
index dd2ebecc6a..6931f1d1d2 100644
--- a/drivers/common/cnxk/hw/nix.h
+++ b/drivers/common/cnxk/hw/nix.h
@@ -2133,11 +2133,6 @@  struct nix_lso_format {
 	((NIX_BPF_RATE_CONST * ((256 + (mantissa)) << (exponent))) /           \
 	 (((1ull << (div_exp)) * 256 * policer_timeunit)))
 
-/* Meter rate limits in Bits/Sec */
-#define NIX_BPF_RATE_MIN NIX_BPF_RATE(1000000000, 0, 0, 0)
-#define NIX_BPF_RATE_MAX                                                       \
-	NIX_BPF_RATE(1, NIX_BPF_MAX_RATE_EXPONENT, NIX_BPF_MAX_RATE_MANTISSA, 0)
-
 #define NIX_BPF_DEFAULT_ADJUST_MANTISSA 511
 #define NIX_BPF_DEFAULT_ADJUST_EXPONENT 0
 
diff --git a/drivers/common/cnxk/roc_nix_bpf.c b/drivers/common/cnxk/roc_nix_bpf.c
index 6996a54be0..46ed91e87b 100644
--- a/drivers/common/cnxk/roc_nix_bpf.c
+++ b/drivers/common/cnxk/roc_nix_bpf.c
@@ -38,48 +38,23 @@  meter_rate_to_nix(uint64_t value, uint64_t *exponent_p, uint64_t *mantissa_p,
 		  uint64_t *div_exp_p, uint32_t timeunit_p)
 {
 	uint64_t div_exp, exponent, mantissa;
-	uint32_t time_us = timeunit_p;
+	uint32_t time_ns = timeunit_p;
 
 	/* Boundary checks */
-	if (value < NIX_BPF_RATE_MIN || value > NIX_BPF_RATE_MAX)
+	if (value < NIX_BPF_RATE(time_ns, 0, 0, 0) ||
+	    value > NIX_BPF_RATE(time_ns, NIX_BPF_MAX_RATE_EXPONENT,
+				 NIX_BPF_MAX_RATE_MANTISSA, 0))
 		return 0;
 
-	if (value <= NIX_BPF_RATE(time_us, 0, 0, 0)) {
-		/* Calculate rate div_exp and mantissa using
-		 * the following formula:
-		 *
-		 * value = (2E6 * (256 + mantissa)
-		 *              / ((1 << div_exp) * 256))
-		 */
-		div_exp = 0;
-		exponent = 0;
-		mantissa = NIX_BPF_MAX_RATE_MANTISSA;
-
-		while (value < (NIX_BPF_RATE_CONST / (1 << div_exp)))
-			div_exp += 1;
-
-		while (value < ((NIX_BPF_RATE_CONST * (256 + mantissa)) /
-				((1 << div_exp) * 256)))
-			mantissa -= 1;
-	} else {
-		/* Calculate rate exponent and mantissa using
-		 * the following formula:
-		 *
-		 * value = (2E6 * ((256 + mantissa) << exponent)) / 256
-		 *
-		 */
-		div_exp = 0;
-		exponent = NIX_BPF_MAX_RATE_EXPONENT;
-		mantissa = NIX_BPF_MAX_RATE_MANTISSA;
-
-		while (value < (NIX_BPF_RATE_CONST * (1 << exponent)))
-			exponent -= 1;
-
-		while (value <
-		       ((NIX_BPF_RATE_CONST * ((256 + mantissa) << exponent)) /
-			256))
-			mantissa -= 1;
-	}
+	div_exp = 0;
+	exponent = NIX_BPF_MAX_RATE_EXPONENT;
+	mantissa = NIX_BPF_MAX_RATE_MANTISSA;
+
+	while (value < (NIX_BPF_RATE(time_ns, exponent, 0, 0)))
+		exponent -= 1;
+
+	while (value < (NIX_BPF_RATE(time_ns, exponent, mantissa, 0)))
+		mantissa -= 1;
 
 	if (div_exp > NIX_BPF_MAX_RATE_DIV_EXP ||
 	    exponent > NIX_BPF_MAX_RATE_EXPONENT ||
@@ -94,7 +69,7 @@  meter_rate_to_nix(uint64_t value, uint64_t *exponent_p, uint64_t *mantissa_p,
 		*mantissa_p = mantissa;
 
 	/* Calculate real rate value */
-	return NIX_BPF_RATE(time_us, exponent, mantissa, div_exp);
+	return NIX_BPF_RATE(time_ns, exponent, mantissa, div_exp);
 }
 
 static inline uint64_t
@@ -195,11 +170,7 @@  nix_precolor_conv_table_write(struct roc_nix *roc_nix, uint64_t val,
 	int64_t *addr;
 
 	addr = PLT_PTR_ADD(nix->base, off);
-	/* FIXME: Currently writing to this register throwing kernel dump.
-	 * plt_write64(val, addr);
-	 */
-	PLT_SET_USED(val);
-	PLT_SET_USED(addr);
+	plt_write64(val, addr);
 }
 
 static uint8_t
@@ -665,6 +636,7 @@  roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
 
 	aq->prof.lmode = cfg->lmode;
 	aq->prof.icolor = cfg->icolor;
+	aq->prof.meter_algo = cfg->alg;
 	aq->prof.pc_mode = cfg->pc_mode;
 	aq->prof.tnl_ena = cfg->tnl_ena;
 	aq->prof.gc_action = cfg->action[ROC_NIX_BPF_COLOR_GREEN];
@@ -673,6 +645,7 @@  roc_nix_bpf_config(struct roc_nix *roc_nix, uint16_t id,
 
 	aq->prof_mask.lmode = ~(aq->prof_mask.lmode);
 	aq->prof_mask.icolor = ~(aq->prof_mask.icolor);
+	aq->prof_mask.meter_algo = ~(aq->prof_mask.meter_algo);
 	aq->prof_mask.pc_mode = ~(aq->prof_mask.pc_mode);
 	aq->prof_mask.tnl_ena = ~(aq->prof_mask.tnl_ena);
 	aq->prof_mask.gc_action = ~(aq->prof_mask.gc_action);