mirror of https://github.com/F-Stack/f-stack.git
492 lines
9.2 KiB
C
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_ */
|