f-stack/dpdk/drivers/net/hinic/base/hinic_pmd_hwdev.h

492 lines
9.2 KiB
C

/* SPDX-License-Identifier: BSD-3-Clause
* Copyright(c) 2017 Huawei Technologies Co., Ltd
*/
#ifndef _HINIC_PMD_HWDEV_H_
#define _HINIC_PMD_HWDEV_H_
#include "hinic_pmd_cmd.h"
#define HINIC_PAGE_SIZE_MAX 20
#define HINIC_MGMT_CMD_UNSUPPORTED 0xFF
#define HINIC_PF_SET_VF_ALREADY 0x4
#define MAX_PCIE_DFX_BUF_SIZE 1024
#define HINIC_DEV_BUSY_ACTIVE_FW 0xFE
/* dma pool */
struct dma_pool {
rte_atomic32_t inuse;
size_t elem_size;
size_t align;
size_t boundary;
void *hwdev;
char name[32];
};
enum hinic_res_state {
HINIC_RES_CLEAN = 0,
HINIC_RES_ACTIVE = 1,
};
enum hilink_info_print_event {
HILINK_EVENT_LINK_UP = 1,
HILINK_EVENT_LINK_DOWN,
HILINK_EVENT_CABLE_PLUGGED,
HILINK_EVENT_MAX_TYPE,
};
struct hinic_port_link_status {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_id;
u8 link;
u8 port_id;
};
enum link_err_status {
LINK_ERR_MODULE_UNRECOGENIZED,
LINK_ERR_NUM,
};
struct hinic_cable_plug_event {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_id;
u8 plugged; /* 0: unplugged, 1: plugged */
u8 port_id;
};
struct hinic_link_err_event {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_id;
u8 err_type;
u8 port_id;
};
struct hinic_cons_idx_attr {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_idx;
u8 dma_attr_off;
u8 pending_limit;
u8 coalescing_time;
u8 intr_en;
u16 intr_idx;
u32 l2nic_sqn;
u32 sq_id;
u64 ci_addr;
};
struct hinic_clear_doorbell {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_idx;
u8 ppf_idx;
u8 rsvd1;
};
struct hinic_clear_resource {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_idx;
u8 ppf_idx;
u8 rsvd1;
};
struct hinic_cmd_set_res_state {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_idx;
u8 state;
u8 rsvd1;
u32 rsvd2;
};
struct hinic_l2nic_reset {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_id;
u16 rsvd1;
};
struct hinic_page_size {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_idx;
u8 ppf_idx;
u8 page_size;
u32 rsvd;
};
struct hinic_msix_config {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 func_id;
u16 msix_index;
u8 pending_cnt;
u8 coalesct_timer_cnt;
u8 lli_tmier_cnt;
u8 lli_credit_cnt;
u8 resend_timer_cnt;
u8 rsvd1[3];
};
/* defined by chip */
enum hinic_fault_type {
FAULT_TYPE_CHIP,
FAULT_TYPE_UCODE,
FAULT_TYPE_MEM_RD_TIMEOUT,
FAULT_TYPE_MEM_WR_TIMEOUT,
FAULT_TYPE_REG_RD_TIMEOUT,
FAULT_TYPE_REG_WR_TIMEOUT,
FAULT_TYPE_MAX,
};
/* defined by chip */
enum hinic_fault_err_level {
/* default err_level=FAULT_LEVEL_FATAL if
* type==FAULT_TYPE_MEM_RD_TIMEOUT || FAULT_TYPE_MEM_WR_TIMEOUT ||
* FAULT_TYPE_REG_RD_TIMEOUT || FAULT_TYPE_REG_WR_TIMEOUT ||
* FAULT_TYPE_UCODE
* other: err_level in event.chip.err_level if type==FAULT_TYPE_CHIP
*/
FAULT_LEVEL_FATAL,
FAULT_LEVEL_SERIOUS_RESET,
FAULT_LEVEL_SERIOUS_FLR,
FAULT_LEVEL_GENERAL,
FAULT_LEVEL_SUGGESTION,
FAULT_LEVEL_MAX
};
/* defined by chip */
struct hinic_fault_event {
/* enum hinic_fault_type */
u8 type;
u8 rsvd0[3];
union {
u32 val[4];
/* valid only type==FAULT_TYPE_CHIP */
struct {
u8 node_id;
/* enum hinic_fault_err_level */
u8 err_level;
u8 err_type;
u8 rsvd1;
u32 err_csr_addr;
u32 err_csr_value;
/* func_id valid only err_level==FAULT_LEVEL_SERIOUS_FLR */
u16 func_id;
u16 rsvd2;
} chip;
/* valid only type==FAULT_TYPE_UCODE */
struct {
u8 cause_id;
u8 core_id;
u8 c_id;
u8 rsvd3;
u32 epc;
u32 rsvd4;
u32 rsvd5;
} ucode;
/* valid only type==FAULT_TYPE_MEM_RD_TIMEOUT ||
* FAULT_TYPE_MEM_WR_TIMEOUT
*/
struct {
u32 err_csr_ctrl;
u32 err_csr_data;
u32 ctrl_tab;
u32 mem_index;
} mem_timeout;
/* valid only type==FAULT_TYPE_REG_RD_TIMEOUT ||
* FAULT_TYPE_REG_WR_TIMEOUT
*/
struct {
u32 err_csr;
u32 rsvd6;
u32 rsvd7;
u32 rsvd8;
} reg_timeout;
} event;
};
struct hinic_cmd_fault_event {
struct hinic_mgmt_msg_head mgmt_msg_head;
struct hinic_fault_event event;
};
struct hinic_mgmt_watchdog_info {
struct hinic_mgmt_msg_head mgmt_msg_head;
u32 curr_time_h;
u32 curr_time_l;
u32 task_id;
u32 rsv;
u32 reg[13];
u32 pc;
u32 lr;
u32 cpsr;
u32 stack_top;
u32 stack_bottom;
u32 sp;
u32 curr_used;
u32 peak_used;
u32 is_overflow;
u32 stack_actlen;
u8 data[1024];
};
struct hinic_pcie_dfx_ntc {
struct hinic_mgmt_msg_head mgmt_msg_head;
int len;
u32 rsvd;
};
struct hinic_pcie_dfx_info {
struct hinic_mgmt_msg_head mgmt_msg_head;
u8 host_id;
u8 last;
u8 rsvd[2];
u32 offset;
u8 data[MAX_PCIE_DFX_BUF_SIZE];
};
struct ffm_intr_info {
u8 node_id;
/* error level of the interrupt source */
u8 err_level;
/* Classification by interrupt source properties */
u16 err_type;
u32 err_csr_addr;
u32 err_csr_value;
};
struct hinic_board_info {
u32 board_type;
u32 port_num;
u32 port_speed;
u32 pcie_width;
u32 host_num;
u32 pf_num;
u32 vf_total_num;
u32 tile_num;
u32 qcm_num;
u32 core_num;
u32 work_mode;
u32 service_mode;
u32 pcie_mode;
u32 cfg_addr;
u32 boot_sel;
};
struct hinic_comm_board_info {
struct hinic_mgmt_msg_head mgmt_msg_head;
struct hinic_board_info info;
u32 rsvd1[5];
};
struct hi30_ctle_data {
u8 ctlebst[3];
u8 ctlecmband[3];
u8 ctlermband[3];
u8 ctleza[3];
u8 ctlesqh[3];
u8 ctleactgn[3];
u8 ctlepassgn;
};
struct hi30_ffe_data {
u8 PRE2;
u8 PRE1;
u8 POST1;
u8 POST2;
u8 MAIN;
};
enum hilink_fec_type {
HILINK_FEC_RSFEC,
HILINK_FEC_BASEFEC,
HILINK_FEC_NOFEC,
HILINK_FEC_MAX_TYPE,
};
enum hinic_link_port_type {
LINK_PORT_FIBRE = 1,
LINK_PORT_ELECTRIC,
LINK_PORT_COPPER,
LINK_PORT_AOC,
LINK_PORT_BACKPLANE,
LINK_PORT_BASET,
LINK_PORT_MAX_TYPE,
};
enum hilink_fibre_subtype {
FIBRE_SUBTYPE_SR = 1,
FIBRE_SUBTYPE_LR,
FIBRE_SUBTYPE_MAX,
};
struct hinic_link_info {
u8 vendor_name[16];
/* port type:
* 1 - fiber; 2 - electric; 3 - copper; 4 - AOC; 5 - backplane;
* 6 - baseT; 0xffff - unknown
*
* port subtype:
* Only when port_type is fiber:
* 1 - SR; 2 - LR
*/
u32 port_type;
u32 port_sub_type;
u32 cable_length;
u8 cable_temp;
u8 cable_max_speed;/* 1(G)/10(G)/25(G)... */
u8 sfp_type; /* 0 - qsfp; 1 - sfp */
u8 rsvd0;
u32 power[4]; /* uW; if is sfp, only power[2] is valid */
u8 an_state; /* 0 - off; 1 - on */
u8 fec; /* 0 - RSFEC; 1 - BASEFEC; 2 - NOFEC */
u16 speed; /* 1(G)/10(G)/25(G)... */
u8 cable_absent; /* 0 - cable present; 1 - cable unpresent */
u8 alos; /* 0 - yes; 1 - no */
u8 rx_los; /* 0 - yes; 1 - no */
u8 pma_status;
u32 pma_dbg_info_reg; /* pma debug info: */
u32 pma_signal_ok_reg; /* signal ok: */
u32 pcs_err_blk_cnt_reg; /* error block counter: */
u32 rf_lf_status_reg; /* RF/LF status: */
u8 pcs_link_reg; /* pcs link: */
u8 mac_link_reg; /* mac link: */
u8 mac_tx_en;
u8 mac_rx_en;
u32 pcs_err_cnt;
u8 lane_used;
u8 hi30_ffe[5];
u8 hi30_ctle[19];
u8 hi30_dfe[14];
u8 rsvd4;
};
struct hinic_hilink_link_info {
struct hinic_mgmt_msg_head mgmt_msg_head;
u16 port_id;
u8 info_type; /* 1: link up 2: link down 3 cable plugged */
u8 rsvd1;
struct hinic_link_info info;
u8 rsvd2[780];
};
/* dma os dependency implementation */
struct hinic_os_dep {
/* kernel dma alloc api */
rte_atomic32_t dma_alloc_cnt;
rte_spinlock_t dma_hash_lock;
struct rte_hash *dma_addr_hash;
};
struct nic_interrupt_info {
u32 lli_set;
u32 interrupt_coalesc_set;
u16 msix_index;
u8 lli_credit_limit;
u8 lli_timer_cfg;
u8 pending_limt;
u8 coalesc_timer_cfg;
u8 resend_timer_cfg;
};
struct hinic_sq_attr {
u8 dma_attr_off;
u8 pending_limit;
u8 coalescing_time;
u8 intr_en;
u16 intr_idx;
u32 l2nic_sqn;
/* bit[63:2] is addr's high 62bit, bit[0] is valid flag */
u64 ci_dma_base;
};
struct hinic_hwdev {
struct rte_pci_device *pcidev_hdl;
u32 ffm_num;
/* dma memory allocator */
struct hinic_os_dep os_dep;
struct hinic_hwif *hwif;
struct cfg_mgmt_info *cfg_mgmt;
struct hinic_aeqs *aeqs;
struct hinic_mbox_func_to_func *func_to_func;
struct hinic_msg_pf_to_mgmt *pf_to_mgmt;
struct hinic_cmdqs *cmdqs;
struct hinic_nic_io *nic_io;
};
int hinic_osdep_init(struct hinic_hwdev *hwdev);
void hinic_osdep_deinit(struct hinic_hwdev *hwdev);
void dma_free_coherent_volatile(void *hwdev, size_t size,
volatile void *virt, dma_addr_t phys);
int hinic_get_board_info(void *hwdev, struct hinic_board_info *info);
int hinic_set_ci_table(void *hwdev, u16 q_id, struct hinic_sq_attr *attr);
int hinic_func_rx_tx_flush(struct hinic_hwdev *hwdev);
int hinic_set_interrupt_cfg(struct hinic_hwdev *hwdev,
struct nic_interrupt_info interrupt_info);
int init_aeqs_msix_attr(void *hwdev);
void hinic_comm_async_event_handle(struct hinic_hwdev *hwdev, u8 cmd,
void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
void hinic_l2nic_async_event_handle(struct hinic_hwdev *hwdev, void *param,
u8 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
void hinic_hilink_async_event_handle(struct hinic_hwdev *hwdev, u8 cmd,
void *buf_in, u16 in_size, void *buf_out,
u16 *out_size);
int hinic_init_attr_table(struct hinic_hwdev *hwdev);
int hinic_activate_hwdev_state(struct hinic_hwdev *hwdev);
void hinic_deactivate_hwdev_state(struct hinic_hwdev *hwdev);
int hinic_l2nic_reset(struct hinic_hwdev *hwdev);
int hinic_set_pagesize(void *hwdev, u8 page_size);
void hinic_cpu_to_be32(void *data, u32 len);
void hinic_be32_to_cpu(void *data, u32 len);
#endif /* _HINIC_PMD_HWDEV_H_ */