net/ngbe: support register dump
Support to dump registers. Signed-off-by: Jiawen Wu <jiawenwu@trustnetic.com>
This commit is contained in:
parent
9459ea29d1
commit
71aec12796
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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,
|
||||
|
54
drivers/net/ngbe/ngbe_regs_group.h
Normal file
54
drivers/net/ngbe/ngbe_regs_group.h
Normal 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, ®s[i++], ®_buf[count]);
|
||||
return count;
|
||||
};
|
||||
|
||||
#endif /* _NGBE_REGS_GROUP_H_ */
|
Loading…
Reference in New Issue
Block a user