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

771 lines
20 KiB
C

/* SPDX-License-Identifier: GPL-2.0*/
/* Huawei HiNIC PCI Express Linux driver
* Copyright(c) 2017 Huawei Technologies Co., Ltd
*
* This program is free software; you can redistribute it and/or modify it
* under the terms and conditions of the GNU General Public License,
* version 2, as published by the Free Software Foundation.
*
* This program is distributed in the hope it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*
*/
#ifndef HINIC_HW_H_
#define HINIC_HW_H_
enum hinic_mod_type {
HINIC_MOD_COMM = 0, /* HW communication module */
HINIC_MOD_L2NIC = 1, /* L2NIC module */
HINIC_MOD_ROCE = 2,
HINIC_MOD_IWARP = 3,
HINIC_MOD_TOE = 4,
HINIC_MOD_FLR = 5,
HINIC_MOD_FCOE = 6,
HINIC_MOD_CFGM = 7, /* Configuration module */
HINIC_MOD_CQM = 8,
HINIC_MOD_VSWITCH = 9,
HINIC_MOD_FC = 10,
HINIC_MOD_OVS = 11,
HINIC_MOD_FIC = 12,
HINIC_MOD_MIGRATE = 13,
HINIC_MOD_HILINK = 14,
HINIC_MOD_HW_MAX = 16, /* hardware max module id */
/* Software module id, for PF/VF and multi-host */
HINIC_MOD_SW_FUNC = 17,
HINIC_MOD_MAX,
};
struct hinic_cmd_buf {
void *buf;
dma_addr_t dma_addr;
u16 size;
};
enum hinic_ack_type {
HINIC_ACK_TYPE_CMDQ,
HINIC_ACK_TYPE_SHARE_CQN,
HINIC_ACK_TYPE_APP_CQN,
HINIC_MOD_ACK_MAX = 15,
};
#define HINIC_MGMT_CMD_UNSUPPORTED 0xFF
int hinic_msg_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd,
void *buf_in, u16 in_size,
void *buf_out, u16 *out_size, u32 timeout);
/* for pxe, ovs */
int hinic_msg_to_mgmt_poll_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd,
void *buf_in, u16 in_size,
void *buf_out, u16 *out_size, u32 timeout);
/* PF/VF send msg to uP by api cmd, and return immediately */
int hinic_msg_to_mgmt_async(void *hwdev, enum hinic_mod_type mod, u8 cmd,
void *buf_in, u16 in_size);
int hinic_mbox_to_vf(void *hwdev, enum hinic_mod_type mod,
u16 vf_id, u8 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size, u32 timeout);
int hinic_api_cmd_write_nack(void *hwdev, u8 dest,
void *cmd, u16 size);
int hinic_api_cmd_read_ack(void *hwdev, u8 dest,
void *cmd, u16 size, void *ack, u16 ack_size);
/* PF/VF send cmd to ucode by cmdq, and return if success.
* timeout=0, use default timeout.
*/
int hinic_cmdq_direct_resp(void *hwdev, enum hinic_ack_type ack_type,
enum hinic_mod_type mod, u8 cmd,
struct hinic_cmd_buf *buf_in,
u64 *out_param, u32 timeout);
/* 1. whether need the timeout parameter
* 2. out_param indicates the status of the microcode processing command
*/
/* PF/VF send cmd to ucode by cmdq, and return detailed result.
* timeout=0, use default timeout.
*/
int hinic_cmdq_detail_resp(void *hwdev, enum hinic_ack_type ack_type,
enum hinic_mod_type mod, u8 cmd,
struct hinic_cmd_buf *buf_in,
struct hinic_cmd_buf *buf_out, u32 timeout);
/* PF/VF send cmd to ucode by cmdq, and return immediately */
int hinic_cmdq_async(void *hwdev, enum hinic_ack_type ack_type,
enum hinic_mod_type mod, u8 cmd,
struct hinic_cmd_buf *buf_in);
int hinic_ppf_tmr_start(void *hwdev);
int hinic_ppf_tmr_stop(void *hwdev);
/* CLP */
int hinic_clp_to_mgmt(void *hwdev, enum hinic_mod_type mod, u8 cmd,
void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
/* FOR windows */
bool hinic_eq_intr_handler(void *hwdev, int msix_entry_idx);
enum hinic_ceq_event {
HINIC_NON_L2NIC_SCQ,
HINIC_NON_L2NIC_ECQ,
HINIC_NON_L2NIC_NO_CQ_EQ,
HINIC_CMDQ,
HINIC_L2NIC_SQ,
HINIC_L2NIC_RQ,
HINIC_MAX_CEQ_EVENTS,
};
typedef void (*hinic_ceq_event_cb)(void *handle, u32 ceqe_data);
int hinic_ceq_register_cb(void *hwdev, enum hinic_ceq_event event,
hinic_ceq_event_cb callback);
void hinic_ceq_unregister_cb(void *hwdev, enum hinic_ceq_event event);
enum hinic_aeq_type {
HINIC_HW_INTER_INT = 0,
HINIC_MBX_FROM_FUNC = 1,
HINIC_MSG_FROM_MGMT_CPU = 2,
HINIC_API_RSP = 3,
HINIC_API_CHAIN_STS = 4,
HINIC_MBX_SEND_RSLT = 5,
HINIC_MAX_AEQ_EVENTS
};
enum hinic_aeq_sw_type {
HINIC_STATELESS_EVENT = 0,
HINIC_STATEFULL_EVENT = 1,
HINIC_MAX_AEQ_SW_EVENTS
};
typedef void (*hinic_aeq_hwe_cb)(void *handle, u8 *data, u8 size);
int hinic_aeq_register_hw_cb(void *hwdev, enum hinic_aeq_type event,
hinic_aeq_hwe_cb hwe_cb);
void hinic_aeq_unregister_hw_cb(void *hwdev, enum hinic_aeq_type event);
typedef u8 (*hinic_aeq_swe_cb)(void *handle, u8 event, u64 data);
int hinic_aeq_register_swe_cb(void *hwdev, enum hinic_aeq_sw_type event,
hinic_aeq_swe_cb aeq_swe_cb);
void hinic_aeq_unregister_swe_cb(void *hwdev, enum hinic_aeq_sw_type event);
typedef void (*hinic_mgmt_msg_cb)(void *hwdev, void *pri_handle,
u8 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size);
int hinic_register_mgmt_msg_cb(void *hwdev,
enum hinic_mod_type mod, void *pri_handle,
hinic_mgmt_msg_cb callback);
void hinic_unregister_mgmt_msg_cb(void *hwdev, enum hinic_mod_type mod);
struct hinic_cmd_buf *hinic_alloc_cmd_buf(void *hwdev);
void hinic_free_cmd_buf(void *hwdev, struct hinic_cmd_buf *buf);
int hinic_alloc_db_phy_addr(void *hwdev, u64 *db_base, u64 *dwqe_base);
void hinic_free_db_phy_addr(void *hwdev, u64 db_base, u64 dwqe_base);
int hinic_alloc_db_addr(void *hwdev, void __iomem **db_base,
void __iomem **dwqe_base);
void hinic_free_db_addr(void *hwdev, void __iomem *db_base,
void __iomem *dwqe_base);
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;
};
int hinic_get_interrupt_cfg(void *hwdev,
struct nic_interrupt_info *interrupt_info);
int hinic_set_interrupt_cfg_direct(void *hwdev,
struct nic_interrupt_info *interrupt_info);
int hinic_set_interrupt_cfg(void *hwdev,
struct nic_interrupt_info interrupt_info);
/* The driver code implementation interface */
void hinic_misx_intr_clear_resend_bit(void *hwdev,
u16 msix_idx, u8 clear_resend_en);
struct hinic_sq_attr {
u8 dma_attr_off;
u8 pending_limit;
u8 coalescing_time;
u8 intr_en;
u16 intr_idx;
u32 l2nic_sqn;
u64 ci_dma_base;
};
int hinic_set_ci_table(void *hwdev, u16 q_id, struct hinic_sq_attr *attr);
int hinic_set_root_ctxt(void *hwdev, u16 rq_depth, u16 sq_depth, int rx_buf_sz);
int hinic_clean_root_ctxt(void *hwdev);
void hinic_record_pcie_error(void *hwdev);
int hinic_func_rx_tx_flush(void *hwdev);
int hinic_func_tmr_bitmap_set(void *hwdev, bool enable);
struct hinic_init_para {
/* Record hinic_pcidev or NDIS_Adapter pointer address */
void *adapter_hdl;
/* Record pcidev or Handler pointer address
* for example: ioremap interface input parameter
*/
void *pcidev_hdl;
/* Record pcidev->dev or Handler pointer address which used to
* dma address application or dev_err print the parameter
*/
void *dev_hdl;
void *cfg_reg_base; /* Configure virtual address, bar0/1 */
/* interrupt configuration register address, bar2/3 */
void *intr_reg_base;
u64 db_base_phy;
void *db_base; /* the doorbell address, bar4/5 higher 4M space */
void *dwqe_mapping; /* direct wqe 4M, follow the doorbell address */
void **hwdev;
void *chip_node;
/* In bmgw x86 host, driver can't send message to mgmt cpu directly,
* need to trasmit message ppf mbox to bmgw arm host.
*/
void *ppf_hwdev;
};
#define MAX_FUNCTION_NUM 512
#define HINIC_MAX_PF_NUM 16
#define HINIC_MAX_COS 8
#define INIT_FAILED 0
#define INIT_SUCCESS 1
#define MAX_DRV_BUF_SIZE 4096
struct hinic_cmd_get_light_module_abs {
u8 status;
u8 version;
u8 rsvd0[6];
u8 port_id;
u8 abs_status; /* 0:present, 1:absent */
u8 rsv[2];
};
#define MODULE_TYPE_SFP 0x3
#define MODULE_TYPE_QSFP28 0x11
#define MODULE_TYPE_QSFP 0x0C
#define MODULE_TYPE_QSFP_PLUS 0x0D
#define SFP_INFO_MAX_SIZE 512
struct hinic_cmd_get_sfp_qsfp_info {
u8 status;
u8 version;
u8 rsvd0[6];
u8 port_id;
u8 wire_type;
u16 out_len;
u8 sfp_qsfp_info[SFP_INFO_MAX_SIZE];
};
#define STD_SFP_INFO_MAX_SIZE 640
struct hinic_cmd_get_std_sfp_info {
u8 status;
u8 version;
u8 rsvd0[6];
u8 port_id;
u8 wire_type;
u16 eeprom_len;
u32 rsvd;
u8 sfp_info[STD_SFP_INFO_MAX_SIZE];
};
#define HINIC_MAX_PORT_ID 4
struct hinic_port_routine_cmd {
int up_send_sfp_info;
int up_send_sfp_abs;
struct hinic_cmd_get_sfp_qsfp_info sfp_info;
struct hinic_cmd_get_light_module_abs abs;
};
struct card_node {
struct list_head node;
struct list_head func_list;
char chip_name[IFNAMSIZ];
void *log_info;
void *dbgtool_info;
void *func_handle_array[MAX_FUNCTION_NUM];
unsigned char dp_bus_num;
u8 func_num;
struct attribute dbgtool_attr_file;
bool cos_up_setted;
u8 cos_up[HINIC_MAX_COS];
bool ppf_state;
u8 pf_bus_num[HINIC_MAX_PF_NUM];
bool disable_vf_load[HINIC_MAX_PF_NUM];
u32 vf_mbx_old_rand_id[MAX_FUNCTION_NUM];
u32 vf_mbx_rand_id[MAX_FUNCTION_NUM];
struct hinic_port_routine_cmd rt_cmd[HINIC_MAX_PORT_ID];
/* mutex used for copy sfp info */
struct mutex sfp_mutex;
};
enum hinic_hwdev_init_state {
HINIC_HWDEV_NONE_INITED = 0,
HINIC_HWDEV_CLP_INITED,
HINIC_HWDEV_AEQ_INITED,
HINIC_HWDEV_MGMT_INITED,
HINIC_HWDEV_MBOX_INITED,
HINIC_HWDEV_CMDQ_INITED,
HINIC_HWDEV_COMM_CH_INITED,
HINIC_HWDEV_ALL_INITED,
HINIC_HWDEV_MAX_INVAL_INITED
};
enum hinic_func_mode {
FUNC_MOD_NORMAL_HOST,
FUNC_MOD_MULTI_BM_MASTER,
FUNC_MOD_MULTI_BM_SLAVE,
FUNC_MOD_MULTI_VM_MASTER,
FUNC_MOD_MULTI_VM_SLAVE,
};
enum hinic_func_cap {
/* send message to mgmt cpu directly */
HINIC_FUNC_MGMT = 1 << 0,
/* setting port attribute, pause/speed etc. */
HINIC_FUNC_PORT = 1 << 1,
/* Enable SR-IOV in default */
HINIC_FUNC_SRIOV_EN_DFLT = 1 << 2,
/* Can't change VF num */
HINIC_FUNC_SRIOV_NUM_FIX = 1 << 3,
/* Fcorce pf/vf link up */
HINIC_FUNC_FORCE_LINK_UP = 1 << 4,
/* Support rate limit */
HINIC_FUNC_SUPP_RATE_LIMIT = 1 << 5,
HINIC_FUNC_SUPP_DFX_REG = 1 << 6,
/* Support promisc/multicast/all-multi */
HINIC_FUNC_SUPP_RX_MODE = 1 << 7,
/* Set vf mac and vlan by ip link */
HINIC_FUNC_SUPP_SET_VF_MAC_VLAN = 1 << 8,
/* Support set mac by ifconfig */
HINIC_FUNC_SUPP_CHANGE_MAC = 1 << 9,
/* OVS don't support SCTP_CRC/HW_VLAN/LRO */
HINIC_FUNC_OFFLOAD_OVS_UNSUPP = 1 << 10,
/* OVS don't support encap-tso/encap-csum */
HINIC_FUNC_SUPP_ENCAP_TSO_CSUM = 1 << 11,
};
#define FUNC_SUPPORT_MGMT(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & HINIC_FUNC_MGMT))
#define FUNC_SUPPORT_PORT_SETTING(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & HINIC_FUNC_PORT))
#define FUNC_SUPPORT_DCB(hwdev) \
(FUNC_SUPPORT_PORT_SETTING(hwdev))
#define FUNC_ENABLE_SRIOV_IN_DEFAULT(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_SRIOV_EN_DFLT))
#define FUNC_SRIOV_FIX_NUM_VF(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_SRIOV_NUM_FIX))
#define FUNC_SUPPORT_RX_MODE(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_SUPP_RX_MODE))
#define FUNC_SUPPORT_RATE_LIMIT(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_SUPP_RATE_LIMIT))
#define FUNC_SUPPORT_SET_VF_MAC_VLAN(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_SUPP_SET_VF_MAC_VLAN))
#define FUNC_SUPPORT_CHANGE_MAC(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_SUPP_CHANGE_MAC))
#define FUNC_FORCE_LINK_UP(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_FORCE_LINK_UP))
#define FUNC_SUPPORT_SCTP_CRC(hwdev) \
(!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_OFFLOAD_OVS_UNSUPP))
#define FUNC_SUPPORT_HW_VLAN(hwdev) \
(!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_OFFLOAD_OVS_UNSUPP))
#define FUNC_SUPPORT_LRO(hwdev) \
(!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_OFFLOAD_OVS_UNSUPP))
#define FUNC_SUPPORT_ENCAP_TSO_CSUM(hwdev) \
(!!(hinic_get_func_feature_cap(hwdev) & \
HINIC_FUNC_SUPP_ENCAP_TSO_CSUM))
int hinic_init_hwdev(struct hinic_init_para *para);
int hinic_set_vf_dev_cap(void *hwdev);
void hinic_free_hwdev(void *hwdev);
void hinic_shutdown_hwdev(void *hwdev);
void hinic_set_api_stop(void *hwdev);
void hinic_ppf_hwdev_unreg(void *hwdev);
void hinic_ppf_hwdev_reg(void *hwdev, void *ppf_hwdev);
void hinic_qps_num_set(void *hwdev, u32 num_qps);
bool hinic_is_hwdev_mod_inited(void *hwdev, enum hinic_hwdev_init_state state);
enum hinic_func_mode hinic_get_func_mode(void *hwdev);
u64 hinic_get_func_feature_cap(void *hwdev);
enum hinic_service_mode {
HINIC_WORK_MODE_OVS = 0,
HINIC_WORK_MODE_UNKNOWN,
HINIC_WORK_MODE_NIC,
HINIC_WORK_MODE_INVALID = 0xFF,
};
enum hinic_service_mode hinic_get_service_mode(void *hwdev);
int hinic_slq_init(void *dev, int num_wqs);
void hinic_slq_uninit(void *dev);
int hinic_slq_alloc(void *dev, u16 wqebb_size, u16 q_depth,
u16 page_size, u64 *cla_addr, void **handle);
void hinic_slq_free(void *dev, void *handle);
u64 hinic_slq_get_addr(void *handle, u16 index);
u64 hinic_slq_get_first_pageaddr(void *handle);
typedef void (*comm_up_self_msg_proc)(void *handle, void *buf_in,
u16 in_size, void *buf_out,
u16 *out_size);
void hinic_comm_recv_mgmt_self_cmd_reg(void *hwdev, u8 cmd,
comm_up_self_msg_proc proc);
void hinic_comm_recv_up_self_cmd_unreg(void *hwdev, u8 cmd);
int hinic_micro_log_path_set(void *hwdev, u8 *log_path);
int hinic_micro_log_func_en(void *hwdev, u8 is_en);
/* 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_PHY_FAULT,
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
};
enum hinic_fault_source_type {
/* same as FAULT_TYPE_CHIP */
HINIC_FAULT_SRC_HW_MGMT_CHIP = 0,
/* same as FAULT_TYPE_UCODE */
HINIC_FAULT_SRC_HW_MGMT_UCODE,
/* same as FAULT_TYPE_MEM_RD_TIMEOUT */
HINIC_FAULT_SRC_HW_MGMT_MEM_RD_TIMEOUT,
/* same as FAULT_TYPE_MEM_WR_TIMEOUT */
HINIC_FAULT_SRC_HW_MGMT_MEM_WR_TIMEOUT,
/* same as FAULT_TYPE_REG_RD_TIMEOUT */
HINIC_FAULT_SRC_HW_MGMT_REG_RD_TIMEOUT,
/* same as FAULT_TYPE_REG_WR_TIMEOUT */
HINIC_FAULT_SRC_HW_MGMT_REG_WR_TIMEOUT,
HINIC_FAULT_SRC_SW_MGMT_UCODE,
HINIC_FAULT_SRC_MGMT_WATCHDOG,
HINIC_FAULT_SRC_MGMT_RESET = 8,
HINIC_FAULT_SRC_HW_PHY_FAULT,
HINIC_FAULT_SRC_HOST_HEARTBEAT_LOST = 20,
HINIC_FAULT_SRC_TYPE_MAX,
};
struct hinic_fault_sw_mgmt {
u8 event_id;
u64 event_data;
};
union hinic_fault_hw_mgmt {
u32 val[4];
/* valid only type==FAULT_TYPE_CHIP */
struct {
u8 node_id;
/* enum hinic_fault_err_level */
u8 err_level;
u16 err_type;
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;
struct {
/* 0: read; 1: write */
u8 op_type;
u8 port_id;
u8 dev_ad;
u8 rsvd9;
u32 csr_addr;
u32 op_data;
u32 rsvd10;
} phy_fault;
};
/* defined by chip */
struct hinic_fault_event {
/* enum hinic_fault_type */
u8 type;
u8 fault_level; /* sdk write fault level for uld event */
u8 rsvd0[2];
union hinic_fault_hw_mgmt event;
};
struct hinic_dcb_state {
u8 dcb_on;
u8 default_cos;
u8 up_cos[8];
};
enum link_err_type {
LINK_ERR_MODULE_UNRECOGENIZED,
LINK_ERR_NUM,
};
enum port_module_event_type {
HINIC_PORT_MODULE_CABLE_PLUGGED,
HINIC_PORT_MODULE_CABLE_UNPLUGGED,
HINIC_PORT_MODULE_LINK_ERR,
HINIC_PORT_MODULE_MAX_EVENT,
};
struct hinic_port_module_event {
enum port_module_event_type type;
enum link_err_type err_type;
};
struct hinic_event_link_info {
u8 valid;
u8 port_type;
u8 autoneg_cap;
u8 autoneg_state;
u8 duplex;
u8 speed;
};
struct hinic_mctp_host_info {
u8 major_cmd;
u8 sub_cmd;
u8 rsvd[2];
u32 data_len;
void *data;
};
/* multi host mgmt event sub cmd */
enum hinic_mhost_even_type {
HINIC_MHOST_NIC_STATE_CHANGE = 1,
};
struct hinic_mhost_nic_func_state {
u8 status;
u8 enable;
u16 func_idx;
};
struct hinic_multi_host_mgmt_event {
u16 sub_cmd;
u16 rsvd[3];
void *data;
};
enum hinic_event_type {
HINIC_EVENT_LINK_DOWN = 0,
HINIC_EVENT_LINK_UP = 1,
HINIC_EVENT_HEART_LOST = 2,
HINIC_EVENT_FAULT = 3,
HINIC_EVENT_NOTIFY_VF_DCB_STATE = 4,
HINIC_EVENT_DCB_STATE_CHANGE = 5,
HINIC_EVENT_FMW_ACT_NTC = 6,
HINIC_EVENT_PORT_MODULE_EVENT = 7,
HINIC_EVENT_MCTP_GET_HOST_INFO,
HINIC_EVENT_MULTI_HOST_MGMT,
HINIC_EVENT_INIT_MIGRATE_PF,
HINIC_EVENT_MGMT_WATCHDOG_EVENT,
};
struct hinic_event_info {
enum hinic_event_type type;
union {
struct hinic_event_link_info link_info;
struct hinic_fault_event info;
struct hinic_dcb_state dcb_state;
struct hinic_port_module_event module_event;
u8 vf_default_cos;
struct hinic_mctp_host_info mctp_info;
struct hinic_multi_host_mgmt_event mhost_mgmt;
};
};
enum hinic_ucode_event_type {
HINIC_INTERNAL_TSO_FATAL_ERROR = 0x0,
HINIC_INTERNAL_LRO_FATAL_ERROR = 0x1,
HINIC_INTERNAL_TX_FATAL_ERROR = 0x2,
HINIC_INTERNAL_RX_FATAL_ERROR = 0x3,
HINIC_INTERNAL_OTHER_FATAL_ERROR = 0x4,
HINIC_NIC_FATAL_ERROR_MAX = 0x8,
};
typedef void (*hinic_event_handler)(void *handle,
struct hinic_event_info *event);
/* only register once */
void hinic_event_register(void *dev, void *pri_handle,
hinic_event_handler callback);
void hinic_event_unregister(void *dev);
void hinic_detect_hw_present(void *hwdev);
void hinic_set_chip_absent(void *hwdev);
int hinic_get_chip_present_flag(void *hwdev);
void hinic_set_pcie_order_cfg(void *handle);
int hinic_get_mgmt_channel_status(void *handle);
enum hinic_led_mode {
HINIC_LED_MODE_ON,
HINIC_LED_MODE_OFF,
HINIC_LED_MODE_FORCE_1HZ,
HINIC_LED_MODE_FORCE_2HZ,
HINIC_LED_MODE_FORCE_4HZ,
HINIC_LED_MODE_1HZ,
HINIC_LED_MODE_2HZ,
HINIC_LED_MODE_4HZ,
HINIC_LED_MODE_INVALID,
};
enum hinic_led_type {
HINIC_LED_TYPE_LINK,
HINIC_LED_TYPE_LOW_SPEED,
HINIC_LED_TYPE_HIGH_SPEED,
HINIC_LED_TYPE_INVALID,
};
int hinic_reset_led_status(void *hwdev, u8 port);
int hinic_set_led_status(void *hwdev, u8 port, enum hinic_led_type type,
enum hinic_led_mode mode);
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;
u32 board_id;
};
int hinic_get_board_info(void *hwdev, struct hinic_board_info *info);
bool hinic_get_ppf_status(void *hwdev);
struct hw_pf_info {
u16 glb_func_idx;
u16 glb_pf_vf_offset;
u8 p2p_idx;
u8 itf_idx;
u16 max_vfs;
u16 max_queue_num;
u16 ovs_q_vf_num[9];
u32 resv;
};
struct hinic_hw_pf_infos {
u8 num_pfs;
u8 rsvd1[3];
struct hw_pf_info infos[16];
};
int hinic_get_hw_pf_infos(void *hwdev, struct hinic_hw_pf_infos *infos);
int hinic_set_ip_check(void *hwdev, bool ip_check_ctl);
int hinic_mbox_to_host_sync(void *hwdev, enum hinic_mod_type mod,
u8 cmd, void *buf_in, u16 in_size, void *buf_out,
u16 *out_size, u32 timeout);
int hinic_mbox_ppf_to_vf(void *hwdev, enum hinic_mod_type mod, u16 func_id,
u8 cmd, void *buf_in, u16 in_size, void *buf_out,
u16 *out_size, u32 timeout);
int hinic_get_card_present_state(void *hwdev, bool *card_present_state);
void hinic_migrate_report(void *dev);
int hinic_set_vxlan_udp_dport(void *hwdev, u32 udp_port);
bool is_multi_vm_slave(void *hwdev);
bool is_multi_bm_slave(void *hwdev);
#endif