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

1253 lines
32 KiB
C

/* SPDX-License-Identifier: GPL-2.0 */
/* Copyright(c) 2021 Huawei Technologies Co., Ltd */
#ifndef HINIC3_CRM_H
#define HINIC3_CRM_H
#include <linux/pci.h>
#include "mpu_cmd_base_defs.h"
#define HINIC3_DRV_VERSION ""
#define HINIC3_DRV_DESC "Intelligent Network Interface Card Driver"
#define HIUDK_DRV_DESC "Intelligent Network Unified Driver"
#define ARRAY_LEN(arr) ((int)((int)sizeof(arr) / (int)sizeof((arr)[0])))
#define HINIC3_MGMT_VERSION_MAX_LEN 32
#define HINIC3_FW_VERSION_NAME 16
#define HINIC3_FW_VERSION_SECTION_CNT 4
#define HINIC3_FW_VERSION_SECTION_BORDER 0xFF
struct hinic3_fw_version {
u8 mgmt_ver[HINIC3_FW_VERSION_NAME];
u8 microcode_ver[HINIC3_FW_VERSION_NAME];
u8 boot_ver[HINIC3_FW_VERSION_NAME];
};
#define HINIC3_MGMT_CMD_UNSUPPORTED 0xFF
/* show each drivers only such as nic_service_cap,
* toe_service_cap structure, but not show service_cap
*/
enum hinic3_service_type {
SERVICE_T_NIC = 0,
SERVICE_T_OVS,
SERVICE_T_ROCE,
SERVICE_T_TOE,
SERVICE_T_IOE,
SERVICE_T_FC,
SERVICE_T_VBS,
SERVICE_T_IPSEC,
SERVICE_T_VIRTIO,
SERVICE_T_MIGRATE,
SERVICE_T_PPA,
SERVICE_T_CUSTOM,
SERVICE_T_VROCE,
SERVICE_T_CRYPT,
SERVICE_T_MAX,
/* Only used for interruption resource management,
* mark the request module
*/
SERVICE_T_INTF = (1 << 15),
SERVICE_T_CQM = (1 << 16),
};
enum hinic3_ppf_flr_type {
STATELESS_FLR_TYPE,
STATEFUL_FLR_TYPE,
};
struct nic_service_cap {
u16 max_sqs;
u16 max_rqs;
u16 default_num_queues;
};
struct ppa_service_cap {
u16 qpc_fake_vf_start;
u16 qpc_fake_vf_num;
u32 qpc_fake_vf_ctx_num;
u32 pctx_sz; /* 512B */
u32 bloomfilter_length;
u8 bloomfilter_en;
u8 rsvd;
u16 rsvd1;
};
struct vbs_service_cap {
u16 vbs_max_volq;
u8 vbs_main_pf_enable;
u8 vbs_vsock_pf_enable;
u8 vbs_fushion_queue_pf_enable;
};
struct migr_service_cap {
u8 master_host_id;
u8 rsvd[3];
};
/* PF/VF ToE service resource structure */
struct dev_toe_svc_cap {
/* PF resources */
u32 max_pctxs; /* Parent Context: max specifications 1M */
u32 max_cctxt;
u32 max_cqs;
u16 max_srqs;
u32 srq_id_start;
u32 max_mpts;
};
/* ToE services */
struct toe_service_cap {
struct dev_toe_svc_cap dev_toe_cap;
bool alloc_flag;
u32 pctx_sz; /* 1KB */
u32 scqc_sz; /* 64B */
};
/* PF FC service resource structure defined */
struct dev_fc_svc_cap {
/* PF Parent QPC */
u32 max_parent_qpc_num; /* max number is 2048 */
/* PF Child QPC */
u32 max_child_qpc_num; /* max number is 2048 */
u32 child_qpc_id_start;
/* PF SCQ */
u32 scq_num; /* 16 */
/* PF supports SRQ */
u32 srq_num; /* Number of SRQ is 2 */
u8 vp_id_start;
u8 vp_id_end;
};
/* FC services */
struct fc_service_cap {
struct dev_fc_svc_cap dev_fc_cap;
/* Parent QPC */
u32 parent_qpc_size; /* 256B */
/* Child QPC */
u32 child_qpc_size; /* 256B */
/* SQ */
u32 sqe_size; /* 128B(in linked list mode) */
/* SCQ */
u32 scqc_size; /* Size of the Context 32B */
u32 scqe_size; /* 64B */
/* SRQ */
u32 srqc_size; /* Size of SRQ Context (64B) */
u32 srqe_size; /* 32B */
};
struct dev_roce_svc_own_cap {
u32 max_qps;
u32 max_cqs;
u32 max_srqs;
u32 max_mpts;
u32 max_drc_qps;
u32 cmtt_cl_start;
u32 cmtt_cl_end;
u32 cmtt_cl_sz;
u32 dmtt_cl_start;
u32 dmtt_cl_end;
u32 dmtt_cl_sz;
u32 wqe_cl_start;
u32 wqe_cl_end;
u32 wqe_cl_sz;
u32 qpc_entry_sz;
u32 max_wqes;
u32 max_rq_sg;
u32 max_sq_inline_data_sz;
u32 max_rq_desc_sz;
u32 rdmarc_entry_sz;
u32 max_qp_init_rdma;
u32 max_qp_dest_rdma;
u32 max_srq_wqes;
u32 reserved_srqs;
u32 max_srq_sge;
u32 srqc_entry_sz;
u32 max_msg_sz; /* Message size 2GB */
};
/* RDMA service capability structure */
struct dev_rdma_svc_cap {
/* ROCE service unique parameter structure */
struct dev_roce_svc_own_cap roce_own_cap;
};
/* Defines the RDMA service capability flag */
enum {
RDMA_BMME_FLAG_LOCAL_INV = (1 << 0),
RDMA_BMME_FLAG_REMOTE_INV = (1 << 1),
RDMA_BMME_FLAG_FAST_REG_WR = (1 << 2),
RDMA_BMME_FLAG_RESERVED_LKEY = (1 << 3),
RDMA_BMME_FLAG_TYPE_2_WIN = (1 << 4),
RDMA_BMME_FLAG_WIN_TYPE_2B = (1 << 5),
RDMA_DEV_CAP_FLAG_XRC = (1 << 6),
RDMA_DEV_CAP_FLAG_MEM_WINDOW = (1 << 7),
RDMA_DEV_CAP_FLAG_ATOMIC = (1 << 8),
RDMA_DEV_CAP_FLAG_APM = (1 << 9),
};
/* RDMA services */
struct rdma_service_cap {
struct dev_rdma_svc_cap dev_rdma_cap;
u8 log_mtt; /* 1. the number of MTT PA must be integer power of 2
* 2. represented by logarithm. Each MTT table can
* contain 1, 2, 4, 8, and 16 PA)
*/
/* todo: need to check whether related to max_mtt_seg */
u32 num_mtts; /* Number of MTT table (4M),
* is actually MTT seg number
*/
u32 log_mtt_seg;
u32 mtt_entry_sz; /* MTT table size 8B, including 1 PA(64bits) */
u32 mpt_entry_sz; /* MPT table size (64B) */
u32 dmtt_cl_start;
u32 dmtt_cl_end;
u32 dmtt_cl_sz;
u8 log_rdmarc; /* 1. the number of RDMArc PA must be integer power of 2
* 2. represented by logarithm. Each MTT table can
* contain 1, 2, 4, 8, and 16 PA)
*/
u32 reserved_qps; /* Number of reserved QP */
u32 max_sq_sg; /* Maximum SGE number of SQ (8) */
u32 max_sq_desc_sz; /* WQE maximum size of SQ(1024B), inline maximum
* size if 960B(944B aligned to the 960B),
* 960B=>wqebb alignment=>1024B
*/
u32 wqebb_size; /* Currently, the supports 64B and 128B,
* defined as 64Bytes
*/
u32 max_cqes; /* Size of the depth of the CQ (64K-1) */
u32 reserved_cqs; /* Number of reserved CQ */
u32 cqc_entry_sz; /* Size of the CQC (64B/128B) */
u32 cqe_size; /* Size of CQE (32B) */
u32 reserved_mrws; /* Number of reserved MR/MR Window */
u32 max_fmr_maps; /* max MAP of FMR,
* (1 << (32-ilog2(num_mpt)))-1;
*/
/* todo: max value needs to be confirmed */
/* MTT table number of Each MTT seg(3) */
u32 log_rdmarc_seg; /* table number of each RDMArc seg(3) */
/* Timeout time. Formula:Tr=4.096us*2(local_ca_ack_delay), [Tr,4Tr] */
u32 local_ca_ack_delay;
u32 num_ports; /* Physical port number */
u32 db_page_size; /* Size of the DB (4KB) */
u32 direct_wqe_size; /* Size of the DWQE (256B) */
u32 num_pds; /* Maximum number of PD (128K) */
u32 reserved_pds; /* Number of reserved PD */
u32 max_xrcds; /* Maximum number of xrcd (64K) */
u32 reserved_xrcds; /* Number of reserved xrcd */
u32 max_gid_per_port; /* gid number (16) of each port */
u32 gid_entry_sz; /* RoCE v2 GID table is 32B,
* compatible RoCE v1 expansion
*/
u32 reserved_lkey; /* local_dma_lkey */
u32 num_comp_vectors; /* Number of complete vector (32) */
u32 page_size_cap; /* Supports 4K,8K,64K,256K,1M and 4M page_size */
u32 flags; /* RDMA some identity */
u32 max_frpl_len; /* Maximum number of pages frmr registration */
u32 max_pkeys; /* Number of supported pkey group */
};
/* PF OVS service resource structure defined */
struct dev_ovs_svc_cap {
u32 max_pctxs; /* Parent Context: max specifications 1M */
u32 fake_vf_max_pctx;
u16 fake_vf_num;
u16 fake_vf_start_id;
u8 dynamic_qp_en;
};
/* OVS services */
struct ovs_service_cap {
struct dev_ovs_svc_cap dev_ovs_cap;
u32 pctx_sz; /* 512B */
};
/* PF IPsec service resource structure defined */
struct dev_ipsec_svc_cap {
u32 max_sactxs; /* max IPsec SA context num */
u16 max_cqs; /* max IPsec SCQC num */
u16 rsvd0;
};
/* IPsec services */
struct ipsec_service_cap {
struct dev_ipsec_svc_cap dev_ipsec_cap;
u32 sactx_sz; /* 512B */
};
/* Defines the IRQ information structure */
struct irq_info {
u16 msix_entry_idx; /* IRQ corresponding index number */
u32 irq_id; /* the IRQ number from OS */
};
struct 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;
};
enum hinic3_msix_state {
HINIC3_MSIX_ENABLE,
HINIC3_MSIX_DISABLE,
};
enum hinic3_msix_auto_mask {
HINIC3_CLR_MSIX_AUTO_MASK,
HINIC3_SET_MSIX_AUTO_MASK,
};
enum func_type {
TYPE_PF,
TYPE_VF,
TYPE_PPF,
TYPE_UNKNOWN,
};
enum func_nic_state {
HINIC3_FUNC_NIC_DEL,
HINIC3_FUNC_NIC_ADD,
};
struct hinic3_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;
/* Configure virtual address, PF is bar1, VF is bar0/1 */
void *cfg_reg_base;
/* interrupt configuration register address, PF is bar2, VF is bar2/3
*/
void *intr_reg_base;
/* for PF bar3 virtual address, if function is VF should set to NULL */
void *mgmt_reg_base;
u64 db_dwqe_len;
u64 db_base_phy;
/* the doorbell address, bar4/5 higher 4M space */
void *db_base;
/* direct wqe 4M, follow the doorbell address space */
void *dwqe_mapping;
void **hwdev;
void *chip_node;
/* if use polling mode, set it true */
bool poll;
u16 probe_fault_level;
};
/* B200 config BAR45 4MB, DB & DWQE both 2MB */
#define HINIC3_DB_DWQE_SIZE 0x00400000
/* db/dwqe page size: 4K */
#define HINIC3_DB_PAGE_SIZE 0x00001000ULL
#define HINIC3_DWQE_OFFSET 0x00000800ULL
#define HINIC3_DB_MAX_AREAS (HINIC3_DB_DWQE_SIZE / HINIC3_DB_PAGE_SIZE)
#ifndef IFNAMSIZ
#define IFNAMSIZ 16
#endif
#define MAX_FUNCTION_NUM 4096
struct card_node {
struct list_head node;
struct list_head func_list;
char chip_name[IFNAMSIZ];
int chip_id;
void *log_info;
void *dbgtool_info;
void *func_handle_array[MAX_FUNCTION_NUM];
unsigned char bus_num;
u16 func_num;
u32 rsvd1;
atomic_t channel_busy_cnt;
void *priv_data;
u64 rsvd2;
};
#define HINIC3_SYNFW_TIME_PERIOD (60 * 60 * 1000)
#define HINIC3_SYNC_YEAR_OFFSET 1900
#define HINIC3_SYNC_MONTH_OFFSET 1
#define FAULT_SHOW_STR_LEN 16
enum hinic3_fault_source_type {
/* same as FAULT_TYPE_CHIP */
HINIC3_FAULT_SRC_HW_MGMT_CHIP = 0,
/* same as FAULT_TYPE_UCODE */
HINIC3_FAULT_SRC_HW_MGMT_UCODE,
/* same as FAULT_TYPE_MEM_RD_TIMEOUT */
HINIC3_FAULT_SRC_HW_MGMT_MEM_RD_TIMEOUT,
/* same as FAULT_TYPE_MEM_WR_TIMEOUT */
HINIC3_FAULT_SRC_HW_MGMT_MEM_WR_TIMEOUT,
/* same as FAULT_TYPE_REG_RD_TIMEOUT */
HINIC3_FAULT_SRC_HW_MGMT_REG_RD_TIMEOUT,
/* same as FAULT_TYPE_REG_WR_TIMEOUT */
HINIC3_FAULT_SRC_HW_MGMT_REG_WR_TIMEOUT,
HINIC3_FAULT_SRC_SW_MGMT_UCODE,
HINIC3_FAULT_SRC_MGMT_WATCHDOG,
HINIC3_FAULT_SRC_MGMT_RESET = 8,
HINIC3_FAULT_SRC_HW_PHY_FAULT,
HINIC3_FAULT_SRC_TX_PAUSE_EXCP,
HINIC3_FAULT_SRC_PCIE_LINK_DOWN = 20,
HINIC3_FAULT_SRC_HOST_HEARTBEAT_LOST = 21,
HINIC3_FAULT_SRC_TX_TIMEOUT,
HINIC3_FAULT_SRC_TYPE_MAX,
};
union hinic3_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 if err_level == FAULT_LEVEL_SERIOUS_FLR */
u8 rsvd1;
u8 host_id;
u16 func_id;
} chip;
/* valid only if 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 if 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 if 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 hinic3_fault_event {
/* enum hinic_fault_type */
u8 type;
u8 fault_level; /* sdk write fault level for uld event */
u8 rsvd0[2];
union hinic3_fault_hw_mgmt event;
};
struct hinic3_cmd_fault_event {
u8 status;
u8 version;
u8 rsvd0[6];
struct hinic3_fault_event event;
};
struct hinic3_sriov_state_info {
u8 enable;
u16 num_vfs;
};
enum hinic3_comm_event_type {
EVENT_COMM_PCIE_LINK_DOWN,
EVENT_COMM_HEART_LOST,
EVENT_COMM_FAULT,
EVENT_COMM_SRIOV_STATE_CHANGE,
EVENT_COMM_CARD_REMOVE,
EVENT_COMM_MGMT_WATCHDOG,
EVENT_COMM_MULTI_HOST_MGMT,
};
enum hinic3_event_service_type {
EVENT_SRV_COMM = 0,
#define SERVICE_EVENT_BASE (EVENT_SRV_COMM + 1)
EVENT_SRV_NIC = SERVICE_EVENT_BASE + SERVICE_T_NIC,
EVENT_SRV_MIGRATE = SERVICE_EVENT_BASE + SERVICE_T_MIGRATE,
};
#define HINIC3_SRV_EVENT_TYPE(svc, type) ((((u32)(svc)) << 16) | (type))
#ifndef HINIC3_EVENT_DATA_SIZE
#define HINIC3_EVENT_DATA_SIZE 104
#endif
struct hinic3_event_info {
u16 service; /* enum hinic3_event_service_type */
u16 type;
u8 event_data[HINIC3_EVENT_DATA_SIZE];
};
typedef void (*hinic3_event_handler)(void *handle, struct hinic3_event_info *event);
struct hinic3_func_nic_state {
u8 state;
u8 rsvd0;
u16 func_idx;
u8 vroce_flag;
u8 rsvd1[15];
};
/* *
* @brief hinic3_event_register - register hardware event
* @param dev: device pointer to hwdev
* @param pri_handle: private data will be used by the callback
* @param callback: callback function
*/
void hinic3_event_register(void *dev, void *pri_handle,
hinic3_event_handler callback);
/* *
* @brief hinic3_event_unregister - unregister hardware event
* @param dev: device pointer to hwdev
*/
void hinic3_event_unregister(void *dev);
/* *
* @brief hinic3_set_msix_auto_mask - set msix auto mask function
* @param hwdev: device pointer to hwdev
* @param msix_idx: msix id
* @param flag: msix auto_mask flag, 1-enable, 2-clear
*/
void hinic3_set_msix_auto_mask_state(void *hwdev, u16 msix_idx,
enum hinic3_msix_auto_mask flag);
/* *
* @brief hinic3_set_msix_state - set msix state
* @param hwdev: device pointer to hwdev
* @param msix_idx: msix id
* @param flag: msix state flag, 0-enable, 1-disable
*/
void hinic3_set_msix_state(void *hwdev, u16 msix_idx,
enum hinic3_msix_state flag);
/* *
* @brief hinic3_misx_intr_clear_resend_bit - clear msix resend bit
* @param hwdev: device pointer to hwdev
* @param msix_idx: msix id
* @param clear_resend_en: 1-clear
*/
void hinic3_misx_intr_clear_resend_bit(void *hwdev, u16 msix_idx,
u8 clear_resend_en);
/* *
* @brief hinic3_set_interrupt_cfg_direct - set interrupt cfg
* @param hwdev: device pointer to hwdev
* @param interrupt_para: interrupt info
* @param channel: channel id
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_set_interrupt_cfg_direct(void *hwdev,
struct interrupt_info *info,
u16 channel);
int hinic3_set_interrupt_cfg(void *dev, struct interrupt_info info,
u16 channel);
/* *
* @brief hinic3_get_interrupt_cfg - get interrupt cfg
* @param dev: device pointer to hwdev
* @param info: interrupt info
* @param channel: channel id
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_get_interrupt_cfg(void *dev, struct interrupt_info *info,
u16 channel);
/* *
* @brief hinic3_alloc_irqs - alloc irq
* @param hwdev: device pointer to hwdev
* @param type: service type
* @param num: alloc number
* @param irq_info_array: alloc irq info
* @param act_num: alloc actual number
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_alloc_irqs(void *hwdev, enum hinic3_service_type type, u16 num,
struct irq_info *irq_info_array, u16 *act_num);
/* *
* @brief hinic3_free_irq - free irq
* @param hwdev: device pointer to hwdev
* @param type: service type
* @param irq_id: irq id
*/
void hinic3_free_irq(void *hwdev, enum hinic3_service_type type, u32 irq_id);
/* *
* @brief hinic3_alloc_ceqs - alloc ceqs
* @param hwdev: device pointer to hwdev
* @param type: service type
* @param num: alloc ceq number
* @param ceq_id_array: alloc ceq_id_array
* @param act_num: alloc actual number
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_alloc_ceqs(void *hwdev, enum hinic3_service_type type, int num,
int *ceq_id_array, int *act_num);
/* *
* @brief hinic3_free_irq - free ceq
* @param hwdev: device pointer to hwdev
* @param type: service type
* @param irq_id: ceq id
*/
void hinic3_free_ceq(void *hwdev, enum hinic3_service_type type, int ceq_id);
/* *
* @brief hinic3_get_pcidev_hdl - get pcidev_hdl
* @param hwdev: device pointer to hwdev
* @retval non-null: success
* @retval null: failure
*/
void *hinic3_get_pcidev_hdl(void *hwdev);
/* *
* @brief hinic3_ppf_idx - get ppf id
* @param hwdev: device pointer to hwdev
* @retval ppf id
*/
u8 hinic3_ppf_idx(void *hwdev);
/* *
* @brief hinic3_get_chip_present_flag - get chip present flag
* @param hwdev: device pointer to hwdev
* @retval 1: chip is present
* @retval 0: chip is absent
*/
int hinic3_get_chip_present_flag(const void *hwdev);
/* *
* @brief hinic3_get_heartbeat_status - get heartbeat status
* @param hwdev: device pointer to hwdev
* @retval heartbeat status
*/
u32 hinic3_get_heartbeat_status(void *hwdev);
/* *
* @brief hinic3_support_nic - function support nic
* @param hwdev: device pointer to hwdev
* @param cap: nic service capbility
* @retval true: function support nic
* @retval false: function not support nic
*/
bool hinic3_support_nic(void *hwdev, struct nic_service_cap *cap);
/* *
* @brief hinic3_support_ipsec - function support ipsec
* @param hwdev: device pointer to hwdev
* @param cap: ipsec service capbility
* @retval true: function support ipsec
* @retval false: function not support ipsec
*/
bool hinic3_support_ipsec(void *hwdev, struct ipsec_service_cap *cap);
/* *
* @brief hinic3_support_roce - function support roce
* @param hwdev: device pointer to hwdev
* @param cap: roce service capbility
* @retval true: function support roce
* @retval false: function not support roce
*/
bool hinic3_support_roce(void *hwdev, struct rdma_service_cap *cap);
/* *
* @brief hinic3_support_fc - function support fc
* @param hwdev: device pointer to hwdev
* @param cap: fc service capbility
* @retval true: function support fc
* @retval false: function not support fc
*/
bool hinic3_support_fc(void *hwdev, struct fc_service_cap *cap);
/* *
* @brief hinic3_support_rdma - function support rdma
* @param hwdev: device pointer to hwdev
* @param cap: rdma service capbility
* @retval true: function support rdma
* @retval false: function not support rdma
*/
bool hinic3_support_rdma(void *hwdev, struct rdma_service_cap *cap);
/* *
* @brief hinic3_support_ovs - function support ovs
* @param hwdev: device pointer to hwdev
* @param cap: ovs service capbility
* @retval true: function support ovs
* @retval false: function not support ovs
*/
bool hinic3_support_ovs(void *hwdev, struct ovs_service_cap *cap);
/* *
* @brief hinic3_support_vbs - function support vbs
* @param hwdev: device pointer to hwdev
* @param cap: vbs service capbility
* @retval true: function support vbs
* @retval false: function not support vbs
*/
bool hinic3_support_vbs(void *hwdev, struct vbs_service_cap *cap);
/* *
* @brief hinic3_support_toe - sync time to hardware
* @param hwdev: device pointer to hwdev
* @param cap: toe service capbility
* @retval zero: success
* @retval non-zero: failure
*/
bool hinic3_support_toe(void *hwdev, struct toe_service_cap *cap);
/* *
* @brief hinic3_support_ppa - function support ppa
* @param hwdev: device pointer to hwdev
* @param cap: ppa service capbility
* @retval zero: success
* @retval non-zero: failure
*/
bool hinic3_support_ppa(void *hwdev, struct ppa_service_cap *cap);
/* *
* @brief hinic3_support_migr - function support migrate
* @param hwdev: device pointer to hwdev
* @param cap: migrate service capbility
* @retval zero: success
* @retval non-zero: failure
*/
bool hinic3_support_migr(void *hwdev, struct migr_service_cap *cap);
/* *
* @brief hinic3_sync_time - sync time to hardware
* @param hwdev: device pointer to hwdev
* @param time: time to sync
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_sync_time(void *hwdev, u64 time);
/* *
* @brief hinic3_disable_mgmt_msg_report - disable mgmt report msg
* @param hwdev: device pointer to hwdev
*/
void hinic3_disable_mgmt_msg_report(void *hwdev);
/* *
* @brief hinic3_func_for_mgmt - get function service type
* @param hwdev: device pointer to hwdev
* @retval true: function for mgmt
* @retval false: function is not for mgmt
*/
bool hinic3_func_for_mgmt(void *hwdev);
/* *
* @brief hinic3_set_pcie_order_cfg - set pcie order cfg
* @param handle: device pointer to hwdev
*/
void hinic3_set_pcie_order_cfg(void *handle);
/* *
* @brief hinic3_init_hwdev - call to init hwdev
* @param para: device pointer to para
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_init_hwdev(struct hinic3_init_para *para);
/* *
* @brief hinic3_free_hwdev - free hwdev
* @param hwdev: device pointer to hwdev
*/
void hinic3_free_hwdev(void *hwdev);
/* *
* @brief hinic3_detect_hw_present - detect hardware present
* @param hwdev: device pointer to hwdev
*/
void hinic3_detect_hw_present(void *hwdev);
/* *
* @brief hinic3_record_pcie_error - record pcie error
* @param hwdev: device pointer to hwdev
*/
void hinic3_record_pcie_error(void *hwdev);
/* *
* @brief hinic3_shutdown_hwdev - shutdown hwdev
* @param hwdev: device pointer to hwdev
*/
void hinic3_shutdown_hwdev(void *hwdev);
/* *
* @brief hinic3_set_ppf_flr_type - set ppf flr type
* @param hwdev: device pointer to hwdev
* @param ppf_flr_type: ppf flr type
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_set_ppf_flr_type(void *hwdev, enum hinic3_ppf_flr_type flr_type);
/* *
* @brief hinic3_set_ppf_tbl_hotreplace_flag - set os hotreplace flag in ppf function table
* @param hwdev: device pointer to hwdev
* @param flag : os hotreplace flag : 0-not in os hotreplace 1-in os hotreplace
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_set_ppf_tbl_hotreplace_flag(void *hwdev, u8 flag);
/* *
* @brief hinic3_get_mgmt_version - get management cpu version
* @param hwdev: device pointer to hwdev
* @param mgmt_ver: output management version
* @param channel: channel id
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_get_mgmt_version(void *hwdev, u8 *mgmt_ver, u8 version_size,
u16 channel);
/* *
* @brief hinic3_get_fw_version - get firmware version
* @param hwdev: device pointer to hwdev
* @param fw_ver: firmware version
* @param channel: channel id
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_get_fw_version(void *hwdev, struct hinic3_fw_version *fw_ver,
u16 channel);
/* *
* @brief hinic3_global_func_id - get global function id
* @param hwdev: device pointer to hwdev
* @retval global function id
*/
u16 hinic3_global_func_id(void *hwdev);
/* *
* @brief hinic3_vector_to_eqn - vector to eq id
* @param hwdev: device pointer to hwdev
* @param type: service type
* @param vector: vertor
* @retval eq id
*/
int hinic3_vector_to_eqn(void *hwdev, enum hinic3_service_type type,
int vector);
/* *
* @brief hinic3_glb_pf_vf_offset - get vf offset id of pf
* @param hwdev: device pointer to hwdev
* @retval vf offset id
*/
u16 hinic3_glb_pf_vf_offset(void *hwdev);
/* *
* @brief hinic3_pf_id_of_vf - get pf id of vf
* @param hwdev: device pointer to hwdev
* @retval pf id
*/
u8 hinic3_pf_id_of_vf(void *hwdev);
/* *
* @brief hinic3_func_type - get function type
* @param hwdev: device pointer to hwdev
* @retval function type
*/
enum func_type hinic3_func_type(void *hwdev);
/* *
* @brief hinic3_get_stateful_enable - get stateful status
* @param hwdev: device pointer to hwdev
* @retval stateful enabel status
*/
bool hinic3_get_stateful_enable(void *hwdev);
/* *
* @brief hinic3_get_timer_enable - get timer status
* @param hwdev: device pointer to hwdev
* @retval timer enabel status
*/
bool hinic3_get_timer_enable(void *hwdev);
/* *
* @brief hinic3_host_oq_id_mask - get oq id
* @param hwdev: device pointer to hwdev
* @retval oq id
*/
u8 hinic3_host_oq_id_mask(void *hwdev);
/* *
* @brief hinic3_host_id - get host id
* @param hwdev: device pointer to hwdev
* @retval host id
*/
u8 hinic3_host_id(void *hwdev);
/* *
* @brief hinic3_func_max_qnum - get host total function number
* @param hwdev: device pointer to hwdev
* @retval non-zero: host total function number
* @retval zero: failure
*/
u16 hinic3_host_total_func(void *hwdev);
/* *
* @brief hinic3_func_max_qnum - get max nic queue number
* @param hwdev: device pointer to hwdev
* @retval non-zero: max nic queue number
* @retval zero: failure
*/
u16 hinic3_func_max_nic_qnum(void *hwdev);
/* *
* @brief hinic3_func_max_qnum - get max queue number
* @param hwdev: device pointer to hwdev
* @retval non-zero: max queue number
* @retval zero: failure
*/
u16 hinic3_func_max_qnum(void *hwdev);
/* *
* @brief hinic3_er_id - get ep id
* @param hwdev: device pointer to hwdev
* @retval ep id
*/
u8 hinic3_ep_id(void *hwdev); /* Obtain service_cap.ep_id */
/* *
* @brief hinic3_er_id - get er id
* @param hwdev: device pointer to hwdev
* @retval er id
*/
u8 hinic3_er_id(void *hwdev); /* Obtain service_cap.er_id */
/* *
* @brief hinic3_physical_port_id - get physical port id
* @param hwdev: device pointer to hwdev
* @retval physical port id
*/
u8 hinic3_physical_port_id(void *hwdev); /* Obtain service_cap.port_id */
/* *
* @brief hinic3_func_max_vf - get vf number
* @param hwdev: device pointer to hwdev
* @retval non-zero: vf number
* @retval zero: failure
*/
u16 hinic3_func_max_vf(void *hwdev); /* Obtain service_cap.max_vf */
/* *
* @brief hinic3_max_pf_num - get global max pf number
*/
u8 hinic3_max_pf_num(void *hwdev);
/* *
* @brief hinic3_host_pf_num - get current host pf number
* @param hwdev: device pointer to hwdev
* @retval non-zero: pf number
* @retval zero: failure
*/
u32 hinic3_host_pf_num(void *hwdev); /* Obtain service_cap.pf_num */
/* *
* @brief hinic3_host_pf_id_start - get current host pf id start
* @param hwdev: device pointer to hwdev
* @retval non-zero: pf id start
* @retval zero: failure
*/
u32 hinic3_host_pf_id_start(void *hwdev); /* Obtain service_cap.pf_num */
/* *
* @brief hinic3_pcie_itf_id - get pcie port id
* @param hwdev: device pointer to hwdev
* @retval pcie port id
*/
u8 hinic3_pcie_itf_id(void *hwdev);
/* *
* @brief hinic3_vf_in_pf - get vf offset in pf
* @param hwdev: device pointer to hwdev
* @retval vf offset in pf
*/
u8 hinic3_vf_in_pf(void *hwdev);
/* *
* @brief hinic3_cos_valid_bitmap - get cos valid bitmap
* @param hwdev: device pointer to hwdev
* @retval non-zero: valid cos bit map
* @retval zero: failure
*/
int hinic3_cos_valid_bitmap(void *hwdev, u8 *func_dft_cos, u8 *port_cos_bitmap);
/* *
* @brief hinic3_stateful_init - init stateful resource
* @param hwdev: device pointer to hwdev
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_stateful_init(void *hwdev);
/* *
* @brief hinic3_stateful_deinit - deinit stateful resource
* @param hwdev: device pointer to hwdev
*/
void hinic3_stateful_deinit(void *hwdev);
/* *
* @brief hinic3_free_stateful - sdk remove free stateful resource
* @param hwdev: device pointer to hwdev
*/
void hinic3_free_stateful(void *hwdev);
/* *
* @brief hinic3_need_init_stateful_default - get need init stateful default
* @param hwdev: device pointer to hwdev
*/
bool hinic3_need_init_stateful_default(void *hwdev);
/* *
* @brief hinic3_get_card_present_state - get card present state
* @param hwdev: device pointer to hwdev
* @param card_present_state: return card present state
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_get_card_present_state(void *hwdev, bool *card_present_state);
/* *
* @brief hinic3_func_rx_tx_flush - function flush
* @param hwdev: device pointer to hwdev
* @param channel: channel id
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_func_rx_tx_flush(void *hwdev, u16 channel, bool wait_io);
/* *
* @brief hinic3_flush_mgmt_workq - when remove function should flush work queue
* @param hwdev: device pointer to hwdev
*/
void hinic3_flush_mgmt_workq(void *hwdev);
/* *
* @brief hinic3_ceq_num get toe ceq num
*/
u8 hinic3_ceq_num(void *hwdev);
/* *
* @brief hinic3_intr_num get intr num
*/
u16 hinic3_intr_num(void *hwdev);
/* *
* @brief hinic3_flexq_en get flexq en
*/
u8 hinic3_flexq_en(void *hwdev);
/* *
* @brief hinic3_get_fake_vf_info get fake_vf info
*/
int hinic3_get_fake_vf_info(void *hwdev, u8 *fake_vf_vld,
u8 *page_bit, u8 *pf_start_bit, u8 *map_host_id);
/* *
* @brief hinic3_fault_event_report - report fault event
* @param hwdev: device pointer to hwdev
* @param src: fault event source, reference to enum hinic3_fault_source_type
* @param level: fault level, reference to enum hinic3_fault_err_level
*/
void hinic3_fault_event_report(void *hwdev, u16 src, u16 level);
/* *
* @brief hinic3_probe_success - notify device probe successful
* @param hwdev: device pointer to hwdev
*/
void hinic3_probe_success(void *hwdev);
/* *
* @brief hinic3_set_func_svc_used_state - set function service used state
* @param hwdev: device pointer to hwdev
* @param svc_type: service type
* @param state: function used state
* @param channel: channel id
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_set_func_svc_used_state(void *hwdev, u16 svc_type, u8 state,
u16 channel);
/* *
* @brief hinic3_get_self_test_result - get self test result
* @param hwdev: device pointer to hwdev
* @retval self test result
*/
u32 hinic3_get_self_test_result(void *hwdev);
/* *
* @brief hinic3_get_slave_host_enable - get slave host enable
* @param hwdev: device pointer to hwdev
* @param host_id: set host id
* @param slave_en-zero: slave is enable
* @retval zero: failure
*/
void set_slave_host_enable(void *hwdev, u8 host_id, bool enable);
/* *
* @brief hinic3_get_slave_bitmap - get slave host bitmap
* @param hwdev: device pointer to hwdev
* @param slave_host_bitmap-zero: slave host bitmap
* @retval zero: failure
*/
int hinic3_get_slave_bitmap(void *hwdev, u8 *slave_host_bitmap);
/* *
* @brief hinic3_get_slave_host_enable - get slave host enable
* @param hwdev: device pointer to hwdev
* @param host_id: get host id
* @param slave_en-zero: slave is enable
* @retval zero: failure
*/
int hinic3_get_slave_host_enable(void *hwdev, u8 host_id, u8 *slave_en);
/* *
* @brief hinic3_set_host_migrate_enable - set migrate host enable
* @param hwdev: device pointer to hwdev
* @param host_id: get host id
* @param slave_en-zero: migrate is enable
* @retval zero: failure
*/
int hinic3_set_host_migrate_enable(void *hwdev, u8 host_id, bool enable);
/* *
* @brief hinic3_get_host_migrate_enable - get migrate host enable
* @param hwdev: device pointer to hwdev
* @param host_id: get host id
* @param slave_en-zero: migrte enable ptr
* @retval zero: failure
*/
int hinic3_get_host_migrate_enable(void *hwdev, u8 host_id, u8 *migrate_en);
/* *
* @brief hinic3_is_slave_func - hwdev is slave func
* @param dev: device pointer to hwdev
* @param is_slave_func: slave func
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_is_slave_func(const void *hwdev, bool *is_slave_func);
/* *
* @brief hinic3_is_master_func - hwdev is master func
* @param dev: device pointer to hwdev
* @param is_master_func: master func
* @retval zero: success
* @retval non-zero: failure
*/
int hinic3_is_master_func(const void *hwdev, bool *is_master_func);
bool hinic3_is_multi_bm(void *hwdev);
bool hinic3_is_slave_host(void *hwdev);
bool hinic3_is_vm_slave_host(void *hwdev);
bool hinic3_is_bm_slave_host(void *hwdev);
bool hinic3_is_guest_vmsec_enable(void *hwdev);
int hinic3_get_vfid_by_vfpci(void *hwdev, struct pci_dev *pdev, u16 *global_func_id);
int hinic3_set_func_nic_state(void *hwdev, struct hinic3_func_nic_state *state);
int hinic3_get_netdev_state(void *hwdev, u16 func_idx, int *opened);
int hinic3_get_mhost_func_nic_enable(void *hwdev, u16 func_id, bool *en);
int hinic3_get_dev_cap(void *hwdev);
int hinic3_mbox_to_host_sync(void *hwdev, enum hinic3_mod_type mod,
u8 cmd, void *buf_in, u16 in_size,
void *buf_out, u16 *out_size, u32 timeout, u16 channel);
int hinic3_get_func_vroce_enable(void *hwdev, u16 glb_func_idx, u8 *en);
#endif