Skip to content

Commit

Permalink
bus/dpaa: add port bmi stats
Browse files Browse the repository at this point in the history
Add BMI statistics and fixing the existing extended
statistics

Signed-off-by: Hemant Agrawal <hemant.agrawal@nxp.com>
Signed-off-by: Gagandeep Singh <g.singh@nxp.com>
Signed-off-by: 0-day Robot <robot@bytheb.org>
  • Loading branch information
hemantagr authored and ovsrobot committed Jul 22, 2024
1 parent ab02fda commit cab0e53
Show file tree
Hide file tree
Showing 6 changed files with 134 additions and 9 deletions.
65 changes: 63 additions & 2 deletions drivers/bus/dpaa/base/fman/fman_hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -244,8 +244,8 @@ fman_if_stats_get_all(struct fman_if *p, uint64_t *value, int n)
uint64_t base_offset = offsetof(struct memac_regs, reoct_l);

for (i = 0; i < n; i++)
value[i] = (((u64)in_be32((char *)regs + base_offset + 8 * i) |
(u64)in_be32((char *)regs + base_offset +
value[i] = ((u64)in_be32((char *)regs + base_offset + 8 * i) |
((u64)in_be32((char *)regs + base_offset +
8 * i + 4)) << 32);
}

Expand All @@ -266,6 +266,67 @@ fman_if_stats_reset(struct fman_if *p)
;
}

void
fman_if_bmi_stats_enable(struct fman_if *p)
{
struct __fman_if *m = container_of(p, struct __fman_if, __if);
struct rx_bmi_regs *regs = (struct rx_bmi_regs *)m->bmi_map;
uint32_t tmp;

tmp = in_be32(&regs->fmbm_rstc);

tmp |= FMAN_BMI_COUNTERS_EN;

out_be32(&regs->fmbm_rstc, tmp);
}

void
fman_if_bmi_stats_disable(struct fman_if *p)
{
struct __fman_if *m = container_of(p, struct __fman_if, __if);
struct rx_bmi_regs *regs = (struct rx_bmi_regs *)m->bmi_map;
uint32_t tmp;

tmp = in_be32(&regs->fmbm_rstc);

tmp &= ~FMAN_BMI_COUNTERS_EN;

out_be32(&regs->fmbm_rstc, tmp);
}

void
fman_if_bmi_stats_get_all(struct fman_if *p, uint64_t *value)
{
struct __fman_if *m = container_of(p, struct __fman_if, __if);
struct rx_bmi_regs *regs = (struct rx_bmi_regs *)m->bmi_map;
int i = 0;

value[i++] = (u32)in_be32(&regs->fmbm_rfrc);
value[i++] = (u32)in_be32(&regs->fmbm_rfbc);
value[i++] = (u32)in_be32(&regs->fmbm_rlfc);
value[i++] = (u32)in_be32(&regs->fmbm_rffc);
value[i++] = (u32)in_be32(&regs->fmbm_rfdc);
value[i++] = (u32)in_be32(&regs->fmbm_rfldec);
value[i++] = (u32)in_be32(&regs->fmbm_rodc);
value[i++] = (u32)in_be32(&regs->fmbm_rbdc);
}

void
fman_if_bmi_stats_reset(struct fman_if *p)
{
struct __fman_if *m = container_of(p, struct __fman_if, __if);
struct rx_bmi_regs *regs = (struct rx_bmi_regs *)m->bmi_map;

out_be32(&regs->fmbm_rfrc, 0);
out_be32(&regs->fmbm_rfbc, 0);
out_be32(&regs->fmbm_rlfc, 0);
out_be32(&regs->fmbm_rffc, 0);
out_be32(&regs->fmbm_rfdc, 0);
out_be32(&regs->fmbm_rfldec, 0);
out_be32(&regs->fmbm_rodc, 0);
out_be32(&regs->fmbm_rbdc, 0);
}

void
fman_if_promiscuous_enable(struct fman_if *p)
{
Expand Down
4 changes: 3 additions & 1 deletion drivers/bus/dpaa/include/fman.h
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,8 @@
#define FMAN_PORT_BMI_FIFO_UNITS 0x100
#define FMAN_PORT_IC_OFFSET_UNITS 0x10

#define FMAN_BMI_COUNTERS_EN 0x80000000

#define FMAN_ENABLE_BPOOL_DEPLETION 0xF00000F0

#define HASH_CTRL_MCAST_EN 0x00000100
Expand Down Expand Up @@ -260,7 +262,7 @@ struct rx_bmi_regs {
/**< Buffer Manager pool Information-*/
uint32_t fmbm_acnt[FMAN_PORT_MAX_EXT_POOLS_NUM];
/**< Allocate Counter-*/
uint32_t reserved0130[8];
uint32_t reserved0120[16];
/**< 0x130/0x140 - 0x15F reserved -*/
uint32_t fmbm_rcgm[FMAN_PORT_CG_MAP_NUM];
/**< Congestion Group Map*/
Expand Down
12 changes: 12 additions & 0 deletions drivers/bus/dpaa/include/fsl_fman.h
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,18 @@ void fman_if_stats_reset(struct fman_if *p);
__rte_internal
void fman_if_stats_get_all(struct fman_if *p, uint64_t *value, int n);

__rte_internal
void fman_if_bmi_stats_enable(struct fman_if *p);

__rte_internal
void fman_if_bmi_stats_disable(struct fman_if *p);

__rte_internal
void fman_if_bmi_stats_get_all(struct fman_if *p, uint64_t *value);

__rte_internal
void fman_if_bmi_stats_reset(struct fman_if *p);

/* Set ignore pause option for a specific interface */
void fman_if_set_rx_ignore_pause_frames(struct fman_if *p, bool enable);

Expand Down
4 changes: 4 additions & 0 deletions drivers/bus/dpaa/version.map
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ INTERNAL {
fman_dealloc_bufs_mask_hi;
fman_dealloc_bufs_mask_lo;
fman_if_add_mac_addr;
fman_if_bmi_stats_enable;
fman_if_bmi_stats_disable;
fman_if_bmi_stats_get_all;
fman_if_bmi_stats_reset;
fman_if_clear_mac_addr;
fman_if_disable_rx;
fman_if_discard_rx_errors;
Expand Down
46 changes: 40 additions & 6 deletions drivers/net/dpaa/dpaa_ethdev.c
Original file line number Diff line number Diff line change
Expand Up @@ -131,6 +131,22 @@ static const struct rte_dpaa_xstats_name_off dpaa_xstats_strings[] = {
offsetof(struct dpaa_if_stats, tvlan)},
{"rx_undersized",
offsetof(struct dpaa_if_stats, tund)},
{"rx_frame_counter",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rfrc)},
{"rx_bad_frames_count",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rfbc)},
{"rx_large_frames_count",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rlfc)},
{"rx_filter_frames_count",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rffc)},
{"rx_frame_discrad_count",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rfdc)},
{"rx_frame_list_dma_err_count",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rfldec)},
{"rx_out_of_buffer_discard ",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rodc)},
{"rx_buf_diallocate",
offsetof(struct dpaa_if_rx_bmi_stats, fmbm_rbdc)},
};

static struct rte_dpaa_driver rte_dpaa_pmd;
Expand Down Expand Up @@ -430,6 +446,7 @@ static void dpaa_interrupt_handler(void *param)
static int dpaa_eth_dev_start(struct rte_eth_dev *dev)
{
struct dpaa_if *dpaa_intf = dev->data->dev_private;
struct fman_if *fif = dev->process_private;
uint16_t i;

PMD_INIT_FUNC_TRACE();
Expand All @@ -443,7 +460,9 @@ static int dpaa_eth_dev_start(struct rte_eth_dev *dev)
else
dev->tx_pkt_burst = dpaa_eth_queue_tx;

fman_if_enable_rx(dev->process_private);
fman_if_bmi_stats_enable(fif);
fman_if_bmi_stats_reset(fif);
fman_if_enable_rx(fif);

for (i = 0; i < dev->data->nb_rx_queues; i++)
dev->data->rx_queue_state[i] = RTE_ETH_QUEUE_STATE_STARTED;
Expand All @@ -461,8 +480,10 @@ static int dpaa_eth_dev_stop(struct rte_eth_dev *dev)
PMD_INIT_FUNC_TRACE();
dev->data->dev_started = 0;

if (!fif->is_shared_mac)
if (!fif->is_shared_mac) {
fman_if_bmi_stats_disable(fif);
fman_if_disable_rx(fif);
}
dev->tx_pkt_burst = dpaa_eth_tx_drop_all;

for (i = 0; i < dev->data->nb_rx_queues; i++)
Expand Down Expand Up @@ -769,6 +790,7 @@ static int dpaa_eth_stats_reset(struct rte_eth_dev *dev)
PMD_INIT_FUNC_TRACE();

fman_if_stats_reset(dev->process_private);
fman_if_bmi_stats_reset(dev->process_private);

return 0;
}
Expand All @@ -777,8 +799,9 @@ static int
dpaa_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
unsigned int n)
{
unsigned int i = 0, num = RTE_DIM(dpaa_xstats_strings);
unsigned int i = 0, j, num = RTE_DIM(dpaa_xstats_strings);
uint64_t values[sizeof(struct dpaa_if_stats) / 8];
unsigned int bmi_count = sizeof(struct dpaa_if_rx_bmi_stats) / 4;

if (n < num)
return num;
Expand All @@ -789,10 +812,16 @@ dpaa_dev_xstats_get(struct rte_eth_dev *dev, struct rte_eth_xstat *xstats,
fman_if_stats_get_all(dev->process_private, values,
sizeof(struct dpaa_if_stats) / 8);

for (i = 0; i < num; i++) {
for (i = 0; i < num - (bmi_count - 1); i++) {
xstats[i].id = i;
xstats[i].value = values[dpaa_xstats_strings[i].offset / 8];
}
fman_if_bmi_stats_get_all(dev->process_private, values);
for (j = 0; i < num; i++, j++) {
xstats[i].id = i;
xstats[i].value = values[j];
}

return i;
}

Expand All @@ -819,8 +848,9 @@ static int
dpaa_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
uint64_t *values, unsigned int n)
{
unsigned int i, stat_cnt = RTE_DIM(dpaa_xstats_strings);
unsigned int i, j, stat_cnt = RTE_DIM(dpaa_xstats_strings);
uint64_t values_copy[sizeof(struct dpaa_if_stats) / 8];
unsigned int bmi_count = sizeof(struct dpaa_if_rx_bmi_stats) / 4;

if (!ids) {
if (n < stat_cnt)
Expand All @@ -832,10 +862,14 @@ dpaa_xstats_get_by_id(struct rte_eth_dev *dev, const uint64_t *ids,
fman_if_stats_get_all(dev->process_private, values_copy,
sizeof(struct dpaa_if_stats) / 8);

for (i = 0; i < stat_cnt; i++)
for (i = 0; i < stat_cnt - (bmi_count - 1); i++)
values[i] =
values_copy[dpaa_xstats_strings[i].offset / 8];

fman_if_bmi_stats_get_all(dev->process_private, values);
for (j = 0; i < stat_cnt; i++, j++)
values[i] = values_copy[j];

return stat_cnt;
}

Expand Down
12 changes: 12 additions & 0 deletions drivers/net/dpaa/dpaa_ethdev.h
Original file line number Diff line number Diff line change
Expand Up @@ -212,6 +212,18 @@ dpaa_rx_cb_atomic(void *event,
const struct qm_dqrr_entry *dqrr,
void **bufs);

struct dpaa_if_rx_bmi_stats {
uint32_t fmbm_rstc; /**< Rx Statistics Counters*/
uint32_t fmbm_rfrc; /**< Rx Frame Counter*/
uint32_t fmbm_rfbc; /**< Rx Bad Frames Counter*/
uint32_t fmbm_rlfc; /**< Rx Large Frames Counter*/
uint32_t fmbm_rffc; /**< Rx Filter Frames Counter*/
uint32_t fmbm_rfdc; /**< Rx Frame Discard Counter*/
uint32_t fmbm_rfldec; /**< Rx Frames List DMA Error Counter*/
uint32_t fmbm_rodc; /**< Rx Out of Buffers Discard nntr*/
uint32_t fmbm_rbdc; /**< Rx Buffers Deallocate Counter*/
};

/* PMD related logs */
extern int dpaa_logtype_pmd;
#define RTE_LOGTYPE_DPAA_PMD dpaa_logtype_pmd
Expand Down

0 comments on commit cab0e53

Please sign in to comment.