net/ngbe: support register dump

Support to dump registers.

Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
This commit is contained in:
Jiawen Wu 2021-10-21 17:50:19 +08:00 committed by Ferruh Yigit
parent 9459ea29d1
commit 71aec12796
4 changed files with 164 additions and 0 deletions

View File

@ -35,6 +35,7 @@ Extended stats = Y
Stats per queue = Y
FW version = Y
EEPROM dump = Y
Registers dump = Y
LED = Y
Multiprocess aware = Y
Linux = Y

View File

@ -398,6 +398,7 @@ struct ngbe_hw {
u16 sub_device_id;
u16 sub_system_id;
u32 eeprom_id;
u8 revision_id;
bool adapter_stopped;
uint64_t isb_dma;

View File

@ -13,6 +13,67 @@
#include "ngbe.h"
#include "ngbe_ethdev.h"
#include "ngbe_rxtx.h"
#include "ngbe_regs_group.h"
static const struct reg_info ngbe_regs_general[] = {
{NGBE_RST, 1, 1, "NGBE_RST"},
{NGBE_STAT, 1, 1, "NGBE_STAT"},
{NGBE_PORTCTL, 1, 1, "NGBE_PORTCTL"},
{NGBE_GPIODATA, 1, 1, "NGBE_GPIODATA"},
{NGBE_GPIOCTL, 1, 1, "NGBE_GPIOCTL"},
{NGBE_LEDCTL, 1, 1, "NGBE_LEDCTL"},
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_nvm[] = {
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_interrupt[] = {
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_fctl_others[] = {
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_rxdma[] = {
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_rx[] = {
{0, 0, 0, ""}
};
static struct reg_info ngbe_regs_tx[] = {
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_wakeup[] = {
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_mac[] = {
{0, 0, 0, ""}
};
static const struct reg_info ngbe_regs_diagnostic[] = {
{0, 0, 0, ""},
};
/* PF registers */
static const struct reg_info *ngbe_regs_others[] = {
ngbe_regs_general,
ngbe_regs_nvm,
ngbe_regs_interrupt,
ngbe_regs_fctl_others,
ngbe_regs_rxdma,
ngbe_regs_rx,
ngbe_regs_tx,
ngbe_regs_wakeup,
ngbe_regs_mac,
ngbe_regs_diagnostic,
NULL};
static int ngbe_dev_close(struct rte_eth_dev *dev);
static int ngbe_dev_link_update(struct rte_eth_dev *dev,
@ -2669,6 +2730,52 @@ ngbe_dev_set_mc_addr_list(struct rte_eth_dev *dev,
ngbe_dev_addr_list_itr, TRUE);
}
static int
ngbe_get_reg_length(struct rte_eth_dev *dev __rte_unused)
{
int count = 0;
int g_ind = 0;
const struct reg_info *reg_group;
const struct reg_info **reg_set = ngbe_regs_others;
while ((reg_group = reg_set[g_ind++]))
count += ngbe_regs_group_count(reg_group);
return count;
}
static int
ngbe_get_regs(struct rte_eth_dev *dev,
struct rte_dev_reg_info *regs)
{
struct ngbe_hw *hw = ngbe_dev_hw(dev);
uint32_t *data = regs->data;
int g_ind = 0;
int count = 0;
const struct reg_info *reg_group;
const struct reg_info **reg_set = ngbe_regs_others;
if (data == NULL) {
regs->length = ngbe_get_reg_length(dev);
regs->width = sizeof(uint32_t);
return 0;
}
/* Support only full register dump */
if (regs->length == 0 ||
regs->length == (uint32_t)ngbe_get_reg_length(dev)) {
regs->version = hw->mac.type << 24 |
hw->revision_id << 16 |
hw->device_id;
while ((reg_group = reg_set[g_ind++]))
count += ngbe_read_regs_group(dev, &data[count],
reg_group);
return 0;
}
return -ENOTSUP;
}
static int
ngbe_get_eeprom_length(struct rte_eth_dev *dev)
{
@ -2766,6 +2873,7 @@ static const struct eth_dev_ops ngbe_eth_dev_ops = {
.rss_hash_update = ngbe_dev_rss_hash_update,
.rss_hash_conf_get = ngbe_dev_rss_hash_conf_get,
.set_mc_addr_list = ngbe_dev_set_mc_addr_list,
.get_reg = ngbe_get_regs,
.rx_burst_mode_get = ngbe_rx_burst_mode_get,
.tx_burst_mode_get = ngbe_tx_burst_mode_get,
.get_eeprom_length = ngbe_get_eeprom_length,

View File

@ -0,0 +1,54 @@
/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2018-2021 Beijing WangXun Technology Co., Ltd.
* Copyright(c) 2010-2017 Intel Corporation
*/
#ifndef _NGBE_REGS_GROUP_H_
#define _NGBE_REGS_GROUP_H_
#include "ngbe_ethdev.h"
struct ngbe_hw;
struct reg_info {
uint32_t base_addr;
uint32_t count;
uint32_t stride;
const char *name;
};
static inline int
ngbe_read_regs(struct ngbe_hw *hw, const struct reg_info *reg,
uint32_t *reg_buf)
{
unsigned int i;
for (i = 0; i < reg->count; i++)
reg_buf[i] = rd32(hw, reg->base_addr + i * reg->stride);
return reg->count;
};
static inline int
ngbe_regs_group_count(const struct reg_info *regs)
{
int count = 0;
int i = 0;
while (regs[i].count)
count += regs[i++].count;
return count;
};
static inline int
ngbe_read_regs_group(struct rte_eth_dev *dev, uint32_t *reg_buf,
const struct reg_info *regs)
{
int count = 0;
int i = 0;
struct ngbe_hw *hw = ngbe_dev_hw(dev);
while (regs[i].count)
count += ngbe_read_regs(hw, &regs[i++], &reg_buf[count]);
return count;
};
#endif /* _NGBE_REGS_GROUP_H_ */