2026-01-29 22:25:33 +08:00

682 lines
14 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2021 Huawei Technologies Co., Ltd */
#ifndef HINIC3_MT_H
#define HINIC3_MT_H
#define HINIC3_DRV_NAME "hisdk3"
#define HINIC3_CHIP_NAME "hinic"
/* Interrupt at most records, interrupt will be recorded in the FFM */
#define NICTOOL_CMD_TYPE (0x18)
struct api_cmd_rd {
u32 pf_id;
u8 dest;
u8 *cmd;
u16 size;
void *ack;
u16 ack_size;
};
struct api_cmd_wr {
u32 pf_id;
u8 dest;
u8 *cmd;
u16 size;
};
#define PF_DEV_INFO_NUM 32
struct pf_dev_info {
u64 bar0_size;
u8 bus;
u8 slot;
u8 func;
u64 phy_addr;
};
/* Indicates the maximum number of interrupts that can be recorded.
* Subsequent interrupts are not recorded in FFM.
*/
#define FFM_RECORD_NUM_MAX 64
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 ffm_intr_tm_info {
struct ffm_intr_info intr_info;
u8 times;
u8 sec;
u8 min;
u8 hour;
u8 mday;
u8 mon;
u16 year;
};
struct ffm_record_info {
u32 ffm_num;
u32 last_err_csr_addr;
u32 last_err_csr_value;
struct ffm_intr_tm_info ffm[FFM_RECORD_NUM_MAX];
};
struct dbgtool_k_glb_info {
struct semaphore dbgtool_sem;
struct ffm_record_info *ffm;
};
struct msg_2_up {
u8 pf_id;
u8 mod;
u8 cmd;
void *buf_in;
u16 in_size;
void *buf_out;
u16 *out_size;
};
struct dbgtool_param {
union {
struct api_cmd_rd api_rd;
struct api_cmd_wr api_wr;
struct pf_dev_info *dev_info;
struct ffm_record_info *ffm_rd;
struct msg_2_up msg2up;
} param;
char chip_name[16];
};
/* dbgtool command type */
/* You can add commands as required. The dbgtool command can be
* used to invoke all interfaces of the kernel-mode x86 driver.
*/
enum dbgtool_cmd {
DBGTOOL_CMD_API_RD = 0,
DBGTOOL_CMD_API_WR,
DBGTOOL_CMD_FFM_RD,
DBGTOOL_CMD_FFM_CLR,
DBGTOOL_CMD_PF_DEV_INFO_GET,
DBGTOOL_CMD_MSG_2_UP,
DBGTOOL_CMD_FREE_MEM,
DBGTOOL_CMD_NUM
};
#define PF_MAX_SIZE (16)
#define BUSINFO_LEN (32)
enum module_name {
SEND_TO_NPU = 1,
SEND_TO_MPU,
SEND_TO_SM,
SEND_TO_HW_DRIVER,
#define SEND_TO_SRV_DRV_BASE (SEND_TO_HW_DRIVER + 1)
SEND_TO_NIC_DRIVER = SEND_TO_SRV_DRV_BASE,
SEND_TO_OVS_DRIVER,
SEND_TO_ROCE_DRIVER,
SEND_TO_TOE_DRIVER,
SEND_TO_IOE_DRIVER,
SEND_TO_FC_DRIVER,
SEND_TO_VBS_DRIVER,
SEND_TO_IPSEC_DRIVER,
SEND_TO_VIRTIO_DRIVER,
SEND_TO_MIGRATE_DRIVER,
SEND_TO_PPA_DRIVER,
SEND_TO_CUSTOM_DRIVER = SEND_TO_SRV_DRV_BASE + 11,
SEND_TO_DRIVER_MAX = SEND_TO_SRV_DRV_BASE + 15, /* reserved */
};
enum driver_cmd_type {
TX_INFO = 1,
Q_NUM,
TX_WQE_INFO,
TX_MAPPING,
RX_INFO,
RX_WQE_INFO,
RX_CQE_INFO,
UPRINT_FUNC_EN,
UPRINT_FUNC_RESET,
UPRINT_SET_PATH,
UPRINT_GET_STATISTICS,
FUNC_TYPE,
GET_FUNC_IDX,
GET_INTER_NUM,
CLOSE_TX_STREAM,
GET_DRV_VERSION,
CLEAR_FUNC_STASTIC,
GET_HW_STATS,
CLEAR_HW_STATS,
GET_SELF_TEST_RES,
GET_CHIP_FAULT_STATS,
NIC_RSVD1,
NIC_RSVD2,
NIC_RSVD3,
GET_CHIP_ID,
GET_SINGLE_CARD_INFO,
GET_FIRMWARE_ACTIVE_STATUS,
ROCE_DFX_FUNC,
GET_DEVICE_ID,
GET_PF_DEV_INFO,
CMD_FREE_MEM,
GET_LOOPBACK_MODE = 32,
SET_LOOPBACK_MODE,
SET_LINK_MODE,
SET_PF_BW_LIMIT,
GET_PF_BW_LIMIT,
ROCE_CMD,
GET_POLL_WEIGHT,
SET_POLL_WEIGHT,
GET_HOMOLOGUE,
SET_HOMOLOGUE,
GET_SSET_COUNT,
GET_SSET_ITEMS,
IS_DRV_IN_VM,
LRO_ADPT_MGMT,
SET_INTER_COAL_PARAM,
GET_INTER_COAL_PARAM,
GET_CHIP_INFO,
GET_NIC_STATS_LEN,
GET_NIC_STATS_STRING,
GET_NIC_STATS_INFO,
GET_PF_ID,
NIC_RSVD4,
NIC_RSVD5,
DCB_QOS_INFO,
DCB_PFC_STATE,
DCB_ETS_STATE,
DCB_STATE,
QOS_DEV,
GET_QOS_COS,
GET_ULD_DEV_NAME,
GET_TX_TIMEOUT,
SET_TX_TIMEOUT,
RSS_CFG = 0x40,
RSS_INDIR,
PORT_ID,
GET_FUNC_CAP = 0x50,
GET_XSFP_PRESENT = 0x51,
GET_XSFP_INFO = 0x52,
DEV_NAME_TEST = 0x53,
GET_WIN_STAT = 0x60,
WIN_CSR_READ = 0x61,
WIN_CSR_WRITE = 0x62,
WIN_API_CMD_RD = 0x63,
VM_COMPAT_TEST = 0xFF
};
enum api_chain_cmd_type {
API_CSR_READ,
API_CSR_WRITE
};
enum sm_cmd_type {
SM_CTR_RD16 = 1,
SM_CTR_RD32,
SM_CTR_RD64_PAIR,
SM_CTR_RD64,
SM_CTR_RD32_CLEAR,
SM_CTR_RD64_PAIR_CLEAR,
SM_CTR_RD64_CLEAR
};
struct cqm_stats {
atomic_t cqm_cmd_alloc_cnt;
atomic_t cqm_cmd_free_cnt;
atomic_t cqm_send_cmd_box_cnt;
atomic_t cqm_send_cmd_imm_cnt;
atomic_t cqm_db_addr_alloc_cnt;
atomic_t cqm_db_addr_free_cnt;
atomic_t cqm_fc_srq_create_cnt;
atomic_t cqm_srq_create_cnt;
atomic_t cqm_rq_create_cnt;
atomic_t cqm_qpc_mpt_create_cnt;
atomic_t cqm_nonrdma_queue_create_cnt;
atomic_t cqm_rdma_queue_create_cnt;
atomic_t cqm_rdma_table_create_cnt;
atomic_t cqm_qpc_mpt_delete_cnt;
atomic_t cqm_nonrdma_queue_delete_cnt;
atomic_t cqm_rdma_queue_delete_cnt;
atomic_t cqm_rdma_table_delete_cnt;
atomic_t cqm_func_timer_clear_cnt;
atomic_t cqm_func_hash_buf_clear_cnt;
atomic_t cqm_scq_callback_cnt;
atomic_t cqm_ecq_callback_cnt;
atomic_t cqm_nocq_callback_cnt;
atomic_t cqm_aeq_callback_cnt[112];
};
struct link_event_stats {
atomic_t link_down_stats;
atomic_t link_up_stats;
};
enum hinic3_fault_err_level {
FAULT_LEVEL_FATAL,
FAULT_LEVEL_SERIOUS_RESET,
FAULT_LEVEL_HOST,
FAULT_LEVEL_SERIOUS_FLR,
FAULT_LEVEL_GENERAL,
FAULT_LEVEL_SUGGESTION,
FAULT_LEVEL_MAX,
};
enum hinic3_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_PHY_FAULT,
FAULT_TYPE_TSENSOR_FAULT,
FAULT_TYPE_MAX,
};
struct fault_event_stats {
/* TODO :HINIC_NODE_ID_MAX: temp use the value of 1822(22) */
atomic_t chip_fault_stats[22][FAULT_LEVEL_MAX];
atomic_t fault_type_stat[FAULT_TYPE_MAX];
atomic_t pcie_fault_stats;
};
enum hinic3_ucode_event_type {
HINIC3_INTERNAL_OTHER_FATAL_ERROR = 0x0,
HINIC3_CHANNEL_BUSY = 0x7,
HINIC3_NIC_FATAL_ERROR_MAX = 0x8,
};
struct hinic3_hw_stats {
atomic_t heart_lost_stats;
struct cqm_stats cqm_stats;
struct link_event_stats link_event_stats;
struct fault_event_stats fault_event_stats;
atomic_t nic_ucode_event_stats[HINIC3_NIC_FATAL_ERROR_MAX];
};
#ifndef IFNAMSIZ
#define IFNAMSIZ 16
#endif
struct pf_info {
char name[IFNAMSIZ];
char bus_info[BUSINFO_LEN];
u32 pf_type;
};
struct card_info {
struct pf_info pf[PF_MAX_SIZE];
u32 pf_num;
};
struct hinic3_nic_loop_mode {
u32 loop_mode;
u32 loop_ctrl;
};
struct hinic3_pf_info {
u32 isvalid;
u32 pf_id;
};
enum hinic3_show_set {
HINIC3_SHOW_SSET_IO_STATS = 1,
};
#define HINIC3_SHOW_ITEM_LEN 32
struct hinic3_show_item {
char name[HINIC3_SHOW_ITEM_LEN];
u8 hexadecimal; /* 0: decimal , 1: Hexadecimal */
u8 rsvd[7];
u64 value;
};
#define HINIC3_CHIP_FAULT_SIZE (110 * 1024)
#define MAX_DRV_BUF_SIZE 4096
struct nic_cmd_chip_fault_stats {
u32 offset;
u8 chip_fault_stats[MAX_DRV_BUF_SIZE];
};
#define NIC_TOOL_MAGIC 'x'
#define CARD_MAX_SIZE (64)
struct nic_card_id {
u32 id[CARD_MAX_SIZE];
u32 num;
};
struct func_pdev_info {
u64 bar0_phy_addr;
u64 bar0_size;
u64 bar1_phy_addr;
u64 bar1_size;
u64 bar3_phy_addr;
u64 bar3_size;
u64 rsvd1[4];
};
struct hinic3_card_func_info {
u32 num_pf;
u32 rsvd0;
u64 usr_api_phy_addr;
struct func_pdev_info pdev_info[CARD_MAX_SIZE];
};
struct wqe_info {
int q_id;
void *slq_handle;
unsigned int wqe_id;
};
#define MAX_VER_INFO_LEN 128
struct drv_version_info {
char ver[MAX_VER_INFO_LEN];
};
struct hinic3_tx_hw_page {
u64 phy_addr;
u64 *map_addr;
};
struct nic_sq_info {
u16 q_id;
u16 pi;
u16 ci; /* sw_ci */
u16 fi; /* hw_ci */
u32 q_depth;
u16 pi_reverse; /* TODO: what is this? */
u16 wqebb_size;
u8 priority;
u16 *ci_addr;
u64 cla_addr;
void *slq_handle;
/* TODO: NIC don't use direct wqe */
struct hinic3_tx_hw_page direct_wqe;
struct hinic3_tx_hw_page doorbell;
u32 page_idx;
u32 glb_sq_id;
};
struct nic_rq_info {
u16 q_id;
u16 delta;
u16 hw_pi;
u16 ci; /* sw_ci */
u16 sw_pi;
u16 wqebb_size;
u16 q_depth;
u16 buf_len;
void *slq_handle;
u64 ci_wqe_page_addr;
u64 ci_cla_tbl_addr;
u8 coalesc_timer_cfg;
u8 pending_limt;
u16 msix_idx;
u32 msix_vector;
};
#define MT_EPERM 1 /* Operation not permitted */
#define MT_EIO 2 /* I/O error */
#define MT_EINVAL 3 /* Invalid argument */
#define MT_EBUSY 4 /* Device or resource busy */
#define MT_EOPNOTSUPP 0xFF /* Operation not supported */
struct mt_msg_head {
u8 status;
u8 rsvd1[3];
};
#define MT_DCB_OPCODE_WR BIT(0) /* 1 - write, 0 - read */
struct hinic3_mt_qos_info { /* delete */
struct mt_msg_head head;
u16 op_code;
u8 valid_cos_bitmap;
u8 valid_up_bitmap;
u32 rsvd1;
};
struct hinic3_mt_dcb_state {
struct mt_msg_head head;
u16 op_code; /* 0 - get dcb state, 1 - set dcb state */
u8 state; /* 0 - disable, 1 - enable dcb */
u8 rsvd;
};
#define MT_DCB_ETS_UP_TC BIT(1)
#define MT_DCB_ETS_UP_BW BIT(2)
#define MT_DCB_ETS_UP_PRIO BIT(3)
#define MT_DCB_ETS_TC_BW BIT(4)
#define MT_DCB_ETS_TC_PRIO BIT(5)
#define DCB_UP_TC_NUM 0x8
struct hinic3_mt_ets_state { /* delete */
struct mt_msg_head head;
u16 op_code;
u8 up_tc[DCB_UP_TC_NUM];
u8 up_bw[DCB_UP_TC_NUM];
u8 tc_bw[DCB_UP_TC_NUM];
u8 up_prio_bitmap;
u8 tc_prio_bitmap;
u32 rsvd;
};
#define MT_DCB_PFC_PFC_STATE BIT(1)
#define MT_DCB_PFC_PFC_PRI_EN BIT(2)
struct hinic3_mt_pfc_state { /* delete */
struct mt_msg_head head;
u16 op_code;
u8 state;
u8 pfc_en_bitpamp;
u32 rsvd;
};
#define CMD_QOS_DEV_TRUST BIT(0)
#define CMD_QOS_DEV_DFT_COS BIT(1)
#define CMD_QOS_DEV_PCP2COS BIT(2)
#define CMD_QOS_DEV_DSCP2COS BIT(3)
struct hinic3_mt_qos_dev_cfg {
struct mt_msg_head head;
u8 op_code; /* 0get 1: set */
u8 rsvd0;
/* bit0 - trust, bit1 - dft_cos, bit2 - pcp2cos, bit3 - dscp2cos */
u16 cfg_bitmap;
u8 trust; /* 0 - pcp, 1 - dscp */
u8 dft_cos;
u16 rsvd1;
u8 pcp2cos[8]; /* 必须8个一起配置 */
/* 配置dscp2cos时若cos值设置为0xFF驱动则忽略此dscp优先级的配置
* 允许一次性配置多个dscp跟cos的映射关系
*/
u8 dscp2cos[64];
u32 rsvd2[4];
};
enum mt_api_type {
API_TYPE_MBOX = 1,
API_TYPE_API_CHAIN_BYPASS,
API_TYPE_API_CHAIN_TO_MPU,
API_TYPE_CLP,
};
struct npu_cmd_st {
u32 mod : 8;
u32 cmd : 8;
u32 ack_type : 3;
u32 direct_resp : 1;
u32 len : 12;
};
struct mpu_cmd_st {
u32 api_type : 8;
u32 mod : 8;
u32 cmd : 16;
};
struct msg_module {
char device_name[IFNAMSIZ];
u32 module;
union {
u32 msg_formate; /* for driver */
struct npu_cmd_st npu_cmd;
struct mpu_cmd_st mpu_cmd;
};
u32 timeout; /* for mpu/npu cmd */
u32 func_idx;
u32 buf_in_size;
u32 buf_out_size;
void *in_buf;
void *out_buf;
int bus_num;
u8 port_id;
u8 rsvd1[3];
u32 rsvd2[4];
};
struct hinic3_mt_qos_cos_cfg {
struct mt_msg_head head;
u8 port_id;
u8 func_cos_bitmap;
u8 port_cos_bitmap;
u8 func_max_cos_num;
u32 rsvd2[4];
};
#define MAX_NETDEV_NUM 4
enum hinic3_bond_cmd_to_custom_e {
CMD_CUSTOM_BOND_DEV_CREATE = 1,
CMD_CUSTOM_BOND_DEV_DELETE,
CMD_CUSTOM_BOND_GET_CHIP_NAME,
CMD_CUSTOM_BOND_GET_CARD_INFO
};
enum xmit_hash_policy {
HASH_POLICY_L2 = 0, /* SMAC_DMAC */
HASH_POLICY_L23 = 1, /* SIP_DIP_SPORT_DPORT */
HASH_POLICY_L34 = 2, /* SMAC_DMAC_SIP_DIP */
HASH_POLICY_MAX = 3 /* MAX */
};
/* bond mode */
enum tag_bond_mode {
BOND_MODE_NONE = 0, /**< bond disable */
BOND_MODE_BACKUP = 1, /**< 1 for active-backup */
BOND_MODE_BALANCE = 2, /**< 2 for balance-xor */
BOND_MODE_LACP = 4, /**< 4 for 802.3ad */
BOND_MODE_MAX
};
struct add_bond_dev_s {
struct mt_msg_head head;
/* input can be empty, indicates that the value
* is assigned by the driver
*/
char bond_name[IFNAMSIZ];
u8 slave_cnt;
u8 rsvd[3];
char slave_name[MAX_NETDEV_NUM][IFNAMSIZ]; /* unit : ms */
u32 poll_timeout; /* default value = 100 */
u32 up_delay; /* default value = 0 */
u32 down_delay; /* default value = 0 */
u32 bond_mode; /* default value = BOND_MODE_LACP */
/* maximum number of active bond member interfaces,
* default value = 0
*/
u32 active_port_max_num;
/* minimum number of active bond member interfaces,
* default value = 0
*/
u32 active_port_min_num;
/* hash policy, which is used for microcode routing logic,
* default value = 0
*/
enum xmit_hash_policy xmit_hash_policy;
};
struct del_bond_dev_s {
struct mt_msg_head head;
char bond_name[IFNAMSIZ];
};
struct get_bond_chip_name_s {
char bond_name[IFNAMSIZ];
char chip_name[IFNAMSIZ];
};
struct bond_drv_msg_s {
u32 bond_id;
u32 slave_cnt;
u32 master_slave_index;
char bond_name[IFNAMSIZ];
char slave_name[MAX_NETDEV_NUM][IFNAMSIZ];
};
#define MAX_BONDING_CNT_PER_CARD (2)
struct bond_negotiate_status {
u8 status;
u8 version;
u8 rsvd0[6];
u32 bond_id;
u32 bond_mmi_status; /* 该bond子设备的链路状态 */
u32 active_bitmap; /* 该bond子设备的slave port状态 */
u8 rsvd[16];
};
struct bond_all_msg_s {
struct bond_drv_msg_s drv_msg;
struct bond_negotiate_status active_info;
};
struct get_card_bond_msg_s {
u32 bond_cnt;
struct bond_all_msg_s all_msg[MAX_BONDING_CNT_PER_CARD];
};
int alloc_buff_in(void *hwdev, struct msg_module *nt_msg, u32 in_size, void **buf_in);
int alloc_buff_out(void *hwdev, struct msg_module *nt_msg, u32 out_size, void **buf_out);
void free_buff_in(void *hwdev, const struct msg_module *nt_msg, void *buf_in);
void free_buff_out(void *hwdev, struct msg_module *nt_msg, void *buf_out);
int copy_buf_out_to_user(struct msg_module *nt_msg, u32 out_size, void *buf_out);
int send_to_mpu(void *hwdev, struct msg_module *nt_msg, void *buf_in, u32 in_size,
void *buf_out, u32 *out_size);
int send_to_npu(void *hwdev, struct msg_module *nt_msg, void *buf_in,
u32 in_size, void *buf_out, u32 *out_size);
int send_to_sm(void *hwdev, struct msg_module *nt_msg, void *buf_in, u32 in_size,
void *buf_out, u32 *out_size);
#endif /* _HINIC3_MT_H_ */