[v2,24/66] net/ice/base: add support for reading REPC statistics

Message ID 20190611155221.2703-25-leyi.rong@intel.com (mailing list archive)
State Superseded, archived
Delegated to: Qi Zhang
Headers
Series shared code update |

Checks

Context Check Description
ci/Intel-compilation fail Compilation issues
ci/checkpatch success coding style OK

Commit Message

Leyi Rong June 11, 2019, 3:51 p.m. UTC
  Add a new ice_stat_update_repc function which will read the register and
increment the appropriate statistics in the ice_eth_stats structure.

Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
Signed-off-by: Leyi Rong <leyi.rong@intel.com>
---
 drivers/net/ice/base/ice_common.c | 51 +++++++++++++++++++++++++++++++
 drivers/net/ice/base/ice_common.h |  3 ++
 drivers/net/ice/base/ice_type.h   |  2 ++
 3 files changed, 56 insertions(+)
  

Comments

Stillwell Jr, Paul M June 11, 2019, 4:28 p.m. UTC | #1
> -----Original Message-----
> From: Rong, Leyi
> Sent: Tuesday, June 11, 2019 8:52 AM
> To: Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: dev@dpdk.org; Rong, Leyi <leyi.rong@intel.com>; Keller, Jacob E
> <jacob.e.keller@intel.com>; Stillwell Jr, Paul M
> <paul.m.stillwell.jr@intel.com>
> Subject: [PATCH v2 24/66] net/ice/base: add support for reading REPC
> statistics
> 
> Add a new ice_stat_update_repc function which will read the register and
> increment the appropriate statistics in the ice_eth_stats structure.
> 
> Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
> Signed-off-by: Leyi Rong <leyi.rong@intel.com>
> ---
>  drivers/net/ice/base/ice_common.c | 51
> +++++++++++++++++++++++++++++++
> drivers/net/ice/base/ice_common.h |  3 ++
>  drivers/net/ice/base/ice_type.h   |  2 ++
>  3 files changed, 56 insertions(+)
> 
> diff --git a/drivers/net/ice/base/ice_common.c
> b/drivers/net/ice/base/ice_common.c
> index da72434d3..b4a9172b9 100644
> --- a/drivers/net/ice/base/ice_common.c
> +++ b/drivers/net/ice/base/ice_common.c
> @@ -4138,6 +4138,57 @@ ice_stat_update32(struct ice_hw *hw, u32 reg,
> bool prev_stat_loaded,
>  		*cur_stat = (new_data + BIT_ULL(32)) - *prev_stat;  }
> 
> +/**
> + * ice_stat_update_repc - read GLV_REPC stats from chip and update stat
> +values
> + * @hw: ptr to the hardware info
> + * @vsi_handle: VSI handle
> + * @prev_stat_loaded: bool to specify if the previous stat values are
> +loaded
> + * @cur_stats: ptr to current stats structure
> + *
> + * The GLV_REPC statistic register actually tracks two 16bit
> +statistics, and
> + * thus cannot be read using the normal ice_stat_update32 function.
> + *
> + * Read the GLV_REPC register associated with the given VSI, and update
> +the
> + * rx_no_desc and rx_error values in the ice_eth_stats structure.
> + *
> + * Because the statistics in GLV_REPC stick at 0xFFFF, the register
> +must be
> + * cleared each time it's read.
> + *
> + * Note that the GLV_RDPC register also counts the causes that would
> +trigger
> + * GLV_REPC. However, it does not give the finer grained detail about
> +why the
> + * packets are being dropped. The GLV_REPC values can be used to
> +distinguish
> + * whether Rx packets are dropped due to errors or due to no available
> + * descriptors.
> + */
> +void
> +ice_stat_update_repc(struct ice_hw *hw, u16 vsi_handle, bool
> prev_stat_loaded,
> +		     struct ice_eth_stats *cur_stats) {
> +	u16 vsi_num, no_desc, error_cnt;
> +	u32 repc;
> +
> +	if (!ice_is_vsi_valid(hw, vsi_handle))
> +		return;
> +
> +	vsi_num = ice_get_hw_vsi_num(hw, vsi_handle);
> +
> +	/* If we haven't loaded stats yet, just clear the current value */
> +	if (!prev_stat_loaded) {
> +		wr32(hw, GLV_REPC(vsi_num), 0);
> +		return;
> +	}
> +
> +	repc = rd32(hw, GLV_REPC(vsi_num));
> +	no_desc = (repc & GLV_REPC_NO_DESC_CNT_M) >>
> GLV_REPC_NO_DESC_CNT_S;
> +	error_cnt = (repc & GLV_REPC_ERROR_CNT_M) >>
> GLV_REPC_ERROR_CNT_S;
> +
> +	/* Clear the count by writing to the stats register */
> +	wr32(hw, GLV_REPC(vsi_num), 0);
> +
> +	cur_stats->rx_no_desc += no_desc;
> +	cur_stats->rx_errors += error_cnt;
> +}
> +
> 

Is there code in DPDK to call these functions? If not then drop this patch.

>  /**
>   * ice_sched_query_elem - query element information from HW diff --git
> a/drivers/net/ice/base/ice_common.h
> b/drivers/net/ice/base/ice_common.h
> index 10131b473..2ea4a6e8e 100644
> --- a/drivers/net/ice/base/ice_common.h
> +++ b/drivers/net/ice/base/ice_common.h
> @@ -205,6 +205,9 @@ ice_stat_update40(struct ice_hw *hw, u32 hireg, u32
> loreg,  void  ice_stat_update32(struct ice_hw *hw, u32 reg, bool
> prev_stat_loaded,
>  		  u64 *prev_stat, u64 *cur_stat);
> +void
> +ice_stat_update_repc(struct ice_hw *hw, u16 vsi_handle, bool
> prev_stat_loaded,
> +		     struct ice_eth_stats *cur_stats);
>  enum ice_status
>  ice_sched_query_elem(struct ice_hw *hw, u32 node_teid,
>  		     struct ice_aqc_get_elem *buf);
> diff --git a/drivers/net/ice/base/ice_type.h
> b/drivers/net/ice/base/ice_type.h index 3523b0c35..477f34595 100644
> --- a/drivers/net/ice/base/ice_type.h
> +++ b/drivers/net/ice/base/ice_type.h
> @@ -853,6 +853,8 @@ struct ice_eth_stats {
>  	u64 rx_broadcast;		/* bprc */
>  	u64 rx_discards;		/* rdpc */
>  	u64 rx_unknown_protocol;	/* rupp */
> +	u64 rx_no_desc;			/* repc */
> +	u64 rx_errors;			/* repc */
>  	u64 tx_bytes;			/* gotc */
>  	u64 tx_unicast;			/* uptc */
>  	u64 tx_multicast;		/* mptc */
> --
> 2.17.1
  
Leyi Rong June 12, 2019, 2:48 p.m. UTC | #2
> -----Original Message-----
> From: Stillwell Jr, Paul M
> Sent: Wednesday, June 12, 2019 12:28 AM
> To: Rong, Leyi <leyi.rong@intel.com>; Zhang, Qi Z <qi.z.zhang@intel.com>
> Cc: dev@dpdk.org; Keller, Jacob E <jacob.e.keller@intel.com>
> Subject: RE: [PATCH v2 24/66] net/ice/base: add support for reading REPC statistics
> 
> > -----Original Message-----
> > From: Rong, Leyi
> > Sent: Tuesday, June 11, 2019 8:52 AM
> > To: Zhang, Qi Z <qi.z.zhang@intel.com>
> > Cc: dev@dpdk.org; Rong, Leyi <leyi.rong@intel.com>; Keller, Jacob E
> > <jacob.e.keller@intel.com>; Stillwell Jr, Paul M
> > <paul.m.stillwell.jr@intel.com>
> > Subject: [PATCH v2 24/66] net/ice/base: add support for reading REPC
> > statistics
> >
> > Add a new ice_stat_update_repc function which will read the register
> > and increment the appropriate statistics in the ice_eth_stats structure.
> >
> > Signed-off-by: Jacob Keller <jacob.e.keller@intel.com>
> > Signed-off-by: Paul M Stillwell Jr <paul.m.stillwell.jr@intel.com>
> > Signed-off-by: Leyi Rong <leyi.rong@intel.com>
> > ---
> >  drivers/net/ice/base/ice_common.c | 51
> > +++++++++++++++++++++++++++++++
> > drivers/net/ice/base/ice_common.h |  3 ++
> >  drivers/net/ice/base/ice_type.h   |  2 ++
> >  3 files changed, 56 insertions(+)
> >
> > diff --git a/drivers/net/ice/base/ice_common.c
> > b/drivers/net/ice/base/ice_common.c
> > index da72434d3..b4a9172b9 100644
> > --- a/drivers/net/ice/base/ice_common.c
> > +++ b/drivers/net/ice/base/ice_common.c
> > @@ -4138,6 +4138,57 @@ ice_stat_update32(struct ice_hw *hw, u32 reg,
> > bool prev_stat_loaded,
> >  		*cur_stat = (new_data + BIT_ULL(32)) - *prev_stat;  }
> >
> > +/**
> > + * ice_stat_update_repc - read GLV_REPC stats from chip and update
> > +stat values
> > + * @hw: ptr to the hardware info
> > + * @vsi_handle: VSI handle
> > + * @prev_stat_loaded: bool to specify if the previous stat values are
> > +loaded
> > + * @cur_stats: ptr to current stats structure
> > + *
> > + * The GLV_REPC statistic register actually tracks two 16bit
> > +statistics, and
> > + * thus cannot be read using the normal ice_stat_update32 function.
> > + *
> > + * Read the GLV_REPC register associated with the given VSI, and
> > +update the
> > + * rx_no_desc and rx_error values in the ice_eth_stats structure.
> > + *
> > + * Because the statistics in GLV_REPC stick at 0xFFFF, the register
> > +must be
> > + * cleared each time it's read.
> > + *
> > + * Note that the GLV_RDPC register also counts the causes that would
> > +trigger
> > + * GLV_REPC. However, it does not give the finer grained detail about
> > +why the
> > + * packets are being dropped. The GLV_REPC values can be used to
> > +distinguish
> > + * whether Rx packets are dropped due to errors or due to no
> > +available
> > + * descriptors.
> > + */
> > +void
> > +ice_stat_update_repc(struct ice_hw *hw, u16 vsi_handle, bool
> > prev_stat_loaded,
> > +		     struct ice_eth_stats *cur_stats) {
> > +	u16 vsi_num, no_desc, error_cnt;
> > +	u32 repc;
> > +
> > +	if (!ice_is_vsi_valid(hw, vsi_handle))
> > +		return;
> > +
> > +	vsi_num = ice_get_hw_vsi_num(hw, vsi_handle);
> > +
> > +	/* If we haven't loaded stats yet, just clear the current value */
> > +	if (!prev_stat_loaded) {
> > +		wr32(hw, GLV_REPC(vsi_num), 0);
> > +		return;
> > +	}
> > +
> > +	repc = rd32(hw, GLV_REPC(vsi_num));
> > +	no_desc = (repc & GLV_REPC_NO_DESC_CNT_M) >>
> > GLV_REPC_NO_DESC_CNT_S;
> > +	error_cnt = (repc & GLV_REPC_ERROR_CNT_M) >>
> > GLV_REPC_ERROR_CNT_S;
> > +
> > +	/* Clear the count by writing to the stats register */
> > +	wr32(hw, GLV_REPC(vsi_num), 0);
> > +
> > +	cur_stats->rx_no_desc += no_desc;
> > +	cur_stats->rx_errors += error_cnt;
> > +}
> > +
> >
> 
> Is there code in DPDK to call these functions? If not then drop this patch.
> 

This function will not be called.
  

Patch

diff --git a/drivers/net/ice/base/ice_common.c b/drivers/net/ice/base/ice_common.c
index da72434d3..b4a9172b9 100644
--- a/drivers/net/ice/base/ice_common.c
+++ b/drivers/net/ice/base/ice_common.c
@@ -4138,6 +4138,57 @@  ice_stat_update32(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,
 		*cur_stat = (new_data + BIT_ULL(32)) - *prev_stat;
 }
 
+/**
+ * ice_stat_update_repc - read GLV_REPC stats from chip and update stat values
+ * @hw: ptr to the hardware info
+ * @vsi_handle: VSI handle
+ * @prev_stat_loaded: bool to specify if the previous stat values are loaded
+ * @cur_stats: ptr to current stats structure
+ *
+ * The GLV_REPC statistic register actually tracks two 16bit statistics, and
+ * thus cannot be read using the normal ice_stat_update32 function.
+ *
+ * Read the GLV_REPC register associated with the given VSI, and update the
+ * rx_no_desc and rx_error values in the ice_eth_stats structure.
+ *
+ * Because the statistics in GLV_REPC stick at 0xFFFF, the register must be
+ * cleared each time it's read.
+ *
+ * Note that the GLV_RDPC register also counts the causes that would trigger
+ * GLV_REPC. However, it does not give the finer grained detail about why the
+ * packets are being dropped. The GLV_REPC values can be used to distinguish
+ * whether Rx packets are dropped due to errors or due to no available
+ * descriptors.
+ */
+void
+ice_stat_update_repc(struct ice_hw *hw, u16 vsi_handle, bool prev_stat_loaded,
+		     struct ice_eth_stats *cur_stats)
+{
+	u16 vsi_num, no_desc, error_cnt;
+	u32 repc;
+
+	if (!ice_is_vsi_valid(hw, vsi_handle))
+		return;
+
+	vsi_num = ice_get_hw_vsi_num(hw, vsi_handle);
+
+	/* If we haven't loaded stats yet, just clear the current value */
+	if (!prev_stat_loaded) {
+		wr32(hw, GLV_REPC(vsi_num), 0);
+		return;
+	}
+
+	repc = rd32(hw, GLV_REPC(vsi_num));
+	no_desc = (repc & GLV_REPC_NO_DESC_CNT_M) >> GLV_REPC_NO_DESC_CNT_S;
+	error_cnt = (repc & GLV_REPC_ERROR_CNT_M) >> GLV_REPC_ERROR_CNT_S;
+
+	/* Clear the count by writing to the stats register */
+	wr32(hw, GLV_REPC(vsi_num), 0);
+
+	cur_stats->rx_no_desc += no_desc;
+	cur_stats->rx_errors += error_cnt;
+}
+
 
 /**
  * ice_sched_query_elem - query element information from HW
diff --git a/drivers/net/ice/base/ice_common.h b/drivers/net/ice/base/ice_common.h
index 10131b473..2ea4a6e8e 100644
--- a/drivers/net/ice/base/ice_common.h
+++ b/drivers/net/ice/base/ice_common.h
@@ -205,6 +205,9 @@  ice_stat_update40(struct ice_hw *hw, u32 hireg, u32 loreg,
 void
 ice_stat_update32(struct ice_hw *hw, u32 reg, bool prev_stat_loaded,
 		  u64 *prev_stat, u64 *cur_stat);
+void
+ice_stat_update_repc(struct ice_hw *hw, u16 vsi_handle, bool prev_stat_loaded,
+		     struct ice_eth_stats *cur_stats);
 enum ice_status
 ice_sched_query_elem(struct ice_hw *hw, u32 node_teid,
 		     struct ice_aqc_get_elem *buf);
diff --git a/drivers/net/ice/base/ice_type.h b/drivers/net/ice/base/ice_type.h
index 3523b0c35..477f34595 100644
--- a/drivers/net/ice/base/ice_type.h
+++ b/drivers/net/ice/base/ice_type.h
@@ -853,6 +853,8 @@  struct ice_eth_stats {
 	u64 rx_broadcast;		/* bprc */
 	u64 rx_discards;		/* rdpc */
 	u64 rx_unknown_protocol;	/* rupp */
+	u64 rx_no_desc;			/* repc */
+	u64 rx_errors;			/* repc */
 	u64 tx_bytes;			/* gotc */
 	u64 tx_unicast;			/* uptc */
 	u64 tx_multicast;		/* mptc */