682 lines
14 KiB
C
Raw Normal View History

2026-01-29 22:25:33 +08:00
/* 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_ */