12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */ 251ba902aSAviad Krawczyk /* 351ba902aSAviad Krawczyk * Huawei HiNIC PCI Express Linux driver 451ba902aSAviad Krawczyk * Copyright(c) 2017 Huawei Technologies Co., Ltd 551ba902aSAviad Krawczyk */ 651ba902aSAviad Krawczyk 751ba902aSAviad Krawczyk #ifndef HINIC_HW_DEV_H 851ba902aSAviad Krawczyk #define HINIC_HW_DEV_H 951ba902aSAviad Krawczyk 1051ba902aSAviad Krawczyk #include <linux/pci.h> 11a5564e7eSAviad Krawczyk #include <linux/types.h> 12c4d06d2dSAviad Krawczyk #include <linux/bitops.h> 1351ba902aSAviad Krawczyk 1451ba902aSAviad Krawczyk #include "hinic_hw_if.h" 15a5564e7eSAviad Krawczyk #include "hinic_hw_eqs.h" 16a5564e7eSAviad Krawczyk #include "hinic_hw_mgmt.h" 17c3e79bafSAviad Krawczyk #include "hinic_hw_qp.h" 18c3e79bafSAviad Krawczyk #include "hinic_hw_io.h" 1951ba902aSAviad Krawczyk 2051ba902aSAviad Krawczyk #define HINIC_MAX_QPS 32 2151ba902aSAviad Krawczyk 22c4d06d2dSAviad Krawczyk #define HINIC_MGMT_NUM_MSG_CMD (HINIC_MGMT_MSG_CMD_MAX - \ 23c4d06d2dSAviad Krawczyk HINIC_MGMT_MSG_CMD_BASE) 24c4d06d2dSAviad Krawczyk 25a5564e7eSAviad Krawczyk struct hinic_cap { 26a5564e7eSAviad Krawczyk u16 max_qps; 27a5564e7eSAviad Krawczyk u16 num_qps; 28a5564e7eSAviad Krawczyk }; 29a5564e7eSAviad Krawczyk 3025a3ba61SAviad Krawczyk enum hinic_port_cmd { 3125a3ba61SAviad Krawczyk HINIC_PORT_CMD_CHANGE_MTU = 2, 3225a3ba61SAviad Krawczyk 3325a3ba61SAviad Krawczyk HINIC_PORT_CMD_ADD_VLAN = 3, 3425a3ba61SAviad Krawczyk HINIC_PORT_CMD_DEL_VLAN = 4, 3525a3ba61SAviad Krawczyk 3625a3ba61SAviad Krawczyk HINIC_PORT_CMD_SET_MAC = 9, 3725a3ba61SAviad Krawczyk HINIC_PORT_CMD_GET_MAC = 10, 3825a3ba61SAviad Krawczyk HINIC_PORT_CMD_DEL_MAC = 11, 3925a3ba61SAviad Krawczyk 4025a3ba61SAviad Krawczyk HINIC_PORT_CMD_SET_RX_MODE = 12, 4125a3ba61SAviad Krawczyk 4225a3ba61SAviad Krawczyk HINIC_PORT_CMD_GET_LINK_STATE = 24, 4325a3ba61SAviad Krawczyk 441e007181SXue Chaojing HINIC_PORT_CMD_SET_LRO = 25, 451e007181SXue Chaojing 464a61abb1SXue Chaojing HINIC_PORT_CMD_SET_RX_CSUM = 26, 474a61abb1SXue Chaojing 48*aebd17b7SXue Chaojing HINIC_PORT_CMD_SET_RX_VLAN_OFFLOAD = 27, 49*aebd17b7SXue Chaojing 50e54fbbdfSXue Chaojing HINIC_PORT_CMD_GET_PORT_STATISTICS = 28, 51e54fbbdfSXue Chaojing 52e54fbbdfSXue Chaojing HINIC_PORT_CMD_CLEAR_PORT_STATISTICS = 29, 53e54fbbdfSXue Chaojing 54e54fbbdfSXue Chaojing HINIC_PORT_CMD_GET_VPORT_STAT = 30, 55e54fbbdfSXue Chaojing 56e54fbbdfSXue Chaojing HINIC_PORT_CMD_CLEAN_VPORT_STAT = 31, 57e54fbbdfSXue Chaojing 584fdc51bbSXue Chaojing HINIC_PORT_CMD_GET_RSS_TEMPLATE_INDIR_TBL = 37, 594fdc51bbSXue Chaojing 6025a3ba61SAviad Krawczyk HINIC_PORT_CMD_SET_PORT_STATE = 41, 6125a3ba61SAviad Krawczyk 62421e9526SXue Chaojing HINIC_PORT_CMD_SET_RSS_TEMPLATE_TBL = 43, 63421e9526SXue Chaojing 644fdc51bbSXue Chaojing HINIC_PORT_CMD_GET_RSS_TEMPLATE_TBL = 44, 654fdc51bbSXue Chaojing 66421e9526SXue Chaojing HINIC_PORT_CMD_SET_RSS_HASH_ENGINE = 45, 67421e9526SXue Chaojing 684fdc51bbSXue Chaojing HINIC_PORT_CMD_GET_RSS_HASH_ENGINE = 46, 694fdc51bbSXue Chaojing 704fdc51bbSXue Chaojing HINIC_PORT_CMD_GET_RSS_CTX_TBL = 47, 714fdc51bbSXue Chaojing 724fdc51bbSXue Chaojing HINIC_PORT_CMD_SET_RSS_CTX_TBL = 48, 734fdc51bbSXue Chaojing 74421e9526SXue Chaojing HINIC_PORT_CMD_RSS_TEMP_MGR = 49, 75421e9526SXue Chaojing 76421e9526SXue Chaojing HINIC_PORT_CMD_RSS_CFG = 66, 77421e9526SXue Chaojing 7825a3ba61SAviad Krawczyk HINIC_PORT_CMD_FWCTXT_INIT = 69, 7925a3ba61SAviad Krawczyk 8025a3ba61SAviad Krawczyk HINIC_PORT_CMD_SET_FUNC_STATE = 93, 8125a3ba61SAviad Krawczyk 8225a3ba61SAviad Krawczyk HINIC_PORT_CMD_GET_GLOBAL_QPN = 102, 8325a3ba61SAviad Krawczyk 84cc18a754SZhao Chen HINIC_PORT_CMD_SET_TSO = 112, 85cc18a754SZhao Chen 861e007181SXue Chaojing HINIC_PORT_CMD_SET_RQ_IQ_MAP = 115, 871e007181SXue Chaojing 8825a3ba61SAviad Krawczyk HINIC_PORT_CMD_GET_CAP = 170, 891e007181SXue Chaojing 901e007181SXue Chaojing HINIC_PORT_CMD_SET_LRO_TIMER = 244, 9125a3ba61SAviad Krawczyk }; 9225a3ba61SAviad Krawczyk 93421e9526SXue Chaojing enum hinic_ucode_cmd { 94421e9526SXue Chaojing HINIC_UCODE_CMD_MODIFY_QUEUE_CONTEXT = 0, 95421e9526SXue Chaojing HINIC_UCODE_CMD_CLEAN_QUEUE_CONTEXT, 96421e9526SXue Chaojing HINIC_UCODE_CMD_ARM_SQ, 97421e9526SXue Chaojing HINIC_UCODE_CMD_ARM_RQ, 98421e9526SXue Chaojing HINIC_UCODE_CMD_SET_RSS_INDIR_TABLE, 99421e9526SXue Chaojing HINIC_UCODE_CMD_SET_RSS_CONTEXT_TABLE, 100421e9526SXue Chaojing HINIC_UCODE_CMD_GET_RSS_INDIR_TABLE, 101421e9526SXue Chaojing HINIC_UCODE_CMD_GET_RSS_CONTEXT_TABLE, 102421e9526SXue Chaojing HINIC_UCODE_CMD_SET_IQ_ENABLE, 103421e9526SXue Chaojing HINIC_UCODE_CMD_SET_RQ_FLUSH = 10 104421e9526SXue Chaojing }; 105421e9526SXue Chaojing 106421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_ALLOC 0x01 107421e9526SXue Chaojing #define NIC_RSS_CMD_TEMP_FREE 0x02 108421e9526SXue Chaojing 109c4d06d2dSAviad Krawczyk enum hinic_mgmt_msg_cmd { 110c4d06d2dSAviad Krawczyk HINIC_MGMT_MSG_CMD_BASE = 160, 111c4d06d2dSAviad Krawczyk 112c4d06d2dSAviad Krawczyk HINIC_MGMT_MSG_CMD_LINK_STATUS = 160, 113c4d06d2dSAviad Krawczyk 114c4d06d2dSAviad Krawczyk HINIC_MGMT_MSG_CMD_MAX, 115c4d06d2dSAviad Krawczyk }; 116c4d06d2dSAviad Krawczyk 117c4d06d2dSAviad Krawczyk enum hinic_cb_state { 118c4d06d2dSAviad Krawczyk HINIC_CB_ENABLED = BIT(0), 119c4d06d2dSAviad Krawczyk HINIC_CB_RUNNING = BIT(1), 120c4d06d2dSAviad Krawczyk }; 121c4d06d2dSAviad Krawczyk 122e2585ea7SAviad Krawczyk enum hinic_res_state { 123e2585ea7SAviad Krawczyk HINIC_RES_CLEAN = 0, 124e2585ea7SAviad Krawczyk HINIC_RES_ACTIVE = 1, 125e2585ea7SAviad Krawczyk }; 126e2585ea7SAviad Krawczyk 127e2585ea7SAviad Krawczyk struct hinic_cmd_fw_ctxt { 128e2585ea7SAviad Krawczyk u8 status; 129e2585ea7SAviad Krawczyk u8 version; 130e2585ea7SAviad Krawczyk u8 rsvd0[6]; 131e2585ea7SAviad Krawczyk 132e2585ea7SAviad Krawczyk u16 func_idx; 133e2585ea7SAviad Krawczyk u16 rx_buf_sz; 134e2585ea7SAviad Krawczyk 135e2585ea7SAviad Krawczyk u32 rsvd1; 136e2585ea7SAviad Krawczyk }; 137e2585ea7SAviad Krawczyk 138e2585ea7SAviad Krawczyk struct hinic_cmd_hw_ioctxt { 139e2585ea7SAviad Krawczyk u8 status; 140e2585ea7SAviad Krawczyk u8 version; 141e2585ea7SAviad Krawczyk u8 rsvd0[6]; 142e2585ea7SAviad Krawczyk 143e2585ea7SAviad Krawczyk u16 func_idx; 144e2585ea7SAviad Krawczyk 145e2585ea7SAviad Krawczyk u16 rsvd1; 146e2585ea7SAviad Krawczyk 147e2585ea7SAviad Krawczyk u8 set_cmdq_depth; 148e2585ea7SAviad Krawczyk u8 cmdq_depth; 149e2585ea7SAviad Krawczyk 1501e007181SXue Chaojing u8 lro_en; 151e2585ea7SAviad Krawczyk u8 rsvd3; 152e2585ea7SAviad Krawczyk u8 rsvd4; 153e2585ea7SAviad Krawczyk u8 rsvd5; 154e2585ea7SAviad Krawczyk 155e2585ea7SAviad Krawczyk u16 rq_depth; 156e2585ea7SAviad Krawczyk u16 rx_buf_sz_idx; 157e2585ea7SAviad Krawczyk u16 sq_depth; 158e2585ea7SAviad Krawczyk }; 159e2585ea7SAviad Krawczyk 160e2585ea7SAviad Krawczyk struct hinic_cmd_io_status { 161e2585ea7SAviad Krawczyk u8 status; 162e2585ea7SAviad Krawczyk u8 version; 163e2585ea7SAviad Krawczyk u8 rsvd0[6]; 164e2585ea7SAviad Krawczyk 165e2585ea7SAviad Krawczyk u16 func_idx; 166e2585ea7SAviad Krawczyk u8 rsvd1; 167e2585ea7SAviad Krawczyk u8 rsvd2; 168e2585ea7SAviad Krawczyk u32 io_status; 169e2585ea7SAviad Krawczyk }; 170e2585ea7SAviad Krawczyk 171e2585ea7SAviad Krawczyk struct hinic_cmd_clear_io_res { 172e2585ea7SAviad Krawczyk u8 status; 173e2585ea7SAviad Krawczyk u8 version; 174e2585ea7SAviad Krawczyk u8 rsvd0[6]; 175e2585ea7SAviad Krawczyk 176e2585ea7SAviad Krawczyk u16 func_idx; 177e2585ea7SAviad Krawczyk u8 rsvd1; 178e2585ea7SAviad Krawczyk u8 rsvd2; 179e2585ea7SAviad Krawczyk }; 180e2585ea7SAviad Krawczyk 181e2585ea7SAviad Krawczyk struct hinic_cmd_set_res_state { 182e2585ea7SAviad Krawczyk u8 status; 183e2585ea7SAviad Krawczyk u8 version; 184e2585ea7SAviad Krawczyk u8 rsvd0[6]; 185e2585ea7SAviad Krawczyk 186e2585ea7SAviad Krawczyk u16 func_idx; 187e2585ea7SAviad Krawczyk u8 state; 188e2585ea7SAviad Krawczyk u8 rsvd1; 189e2585ea7SAviad Krawczyk u32 rsvd2; 190e2585ea7SAviad Krawczyk }; 191e2585ea7SAviad Krawczyk 192c3e79bafSAviad Krawczyk struct hinic_cmd_base_qpn { 193c3e79bafSAviad Krawczyk u8 status; 194c3e79bafSAviad Krawczyk u8 version; 195c3e79bafSAviad Krawczyk u8 rsvd0[6]; 196c3e79bafSAviad Krawczyk 197c3e79bafSAviad Krawczyk u16 func_idx; 198c3e79bafSAviad Krawczyk u16 qpn; 199c3e79bafSAviad Krawczyk }; 200c3e79bafSAviad Krawczyk 20100e57a6dSAviad Krawczyk struct hinic_cmd_hw_ci { 20200e57a6dSAviad Krawczyk u8 status; 20300e57a6dSAviad Krawczyk u8 version; 20400e57a6dSAviad Krawczyk u8 rsvd0[6]; 20500e57a6dSAviad Krawczyk 20600e57a6dSAviad Krawczyk u16 func_idx; 20700e57a6dSAviad Krawczyk 20800e57a6dSAviad Krawczyk u8 dma_attr_off; 20900e57a6dSAviad Krawczyk u8 pending_limit; 21000e57a6dSAviad Krawczyk u8 coalesc_timer; 21100e57a6dSAviad Krawczyk 21200e57a6dSAviad Krawczyk u8 msix_en; 21300e57a6dSAviad Krawczyk u16 msix_entry_idx; 21400e57a6dSAviad Krawczyk 21500e57a6dSAviad Krawczyk u32 sq_id; 21600e57a6dSAviad Krawczyk u32 rsvd1; 21700e57a6dSAviad Krawczyk u64 ci_addr; 21800e57a6dSAviad Krawczyk }; 21900e57a6dSAviad Krawczyk 22051ba902aSAviad Krawczyk struct hinic_hwdev { 22151ba902aSAviad Krawczyk struct hinic_hwif *hwif; 22251ba902aSAviad Krawczyk struct msix_entry *msix_entries; 223a5564e7eSAviad Krawczyk 224a5564e7eSAviad Krawczyk struct hinic_aeqs aeqs; 225c3e79bafSAviad Krawczyk struct hinic_func_to_io func_to_io; 226a5564e7eSAviad Krawczyk 227a5564e7eSAviad Krawczyk struct hinic_cap nic_cap; 22851ba902aSAviad Krawczyk }; 22951ba902aSAviad Krawczyk 230c4d06d2dSAviad Krawczyk struct hinic_nic_cb { 231c4d06d2dSAviad Krawczyk void (*handler)(void *handle, void *buf_in, 232c4d06d2dSAviad Krawczyk u16 in_size, void *buf_out, 233c4d06d2dSAviad Krawczyk u16 *out_size); 234c4d06d2dSAviad Krawczyk 235c4d06d2dSAviad Krawczyk void *handle; 236c4d06d2dSAviad Krawczyk unsigned long cb_state; 237c4d06d2dSAviad Krawczyk }; 238c4d06d2dSAviad Krawczyk 23951ba902aSAviad Krawczyk struct hinic_pfhwdev { 24051ba902aSAviad Krawczyk struct hinic_hwdev hwdev; 24151ba902aSAviad Krawczyk 242a5564e7eSAviad Krawczyk struct hinic_pf_to_mgmt pf_to_mgmt; 243c4d06d2dSAviad Krawczyk 244c4d06d2dSAviad Krawczyk struct hinic_nic_cb nic_cb[HINIC_MGMT_NUM_MSG_CMD]; 24551ba902aSAviad Krawczyk }; 24651ba902aSAviad Krawczyk 247c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_register(struct hinic_hwdev *hwdev, 248c4d06d2dSAviad Krawczyk enum hinic_mgmt_msg_cmd cmd, void *handle, 249c4d06d2dSAviad Krawczyk void (*handler)(void *handle, void *buf_in, 250c4d06d2dSAviad Krawczyk u16 in_size, void *buf_out, 251c4d06d2dSAviad Krawczyk u16 *out_size)); 252c4d06d2dSAviad Krawczyk 253c4d06d2dSAviad Krawczyk void hinic_hwdev_cb_unregister(struct hinic_hwdev *hwdev, 254c4d06d2dSAviad Krawczyk enum hinic_mgmt_msg_cmd cmd); 255c4d06d2dSAviad Krawczyk 25625a3ba61SAviad Krawczyk int hinic_port_msg_cmd(struct hinic_hwdev *hwdev, enum hinic_port_cmd cmd, 25725a3ba61SAviad Krawczyk void *buf_in, u16 in_size, void *buf_out, 25825a3ba61SAviad Krawczyk u16 *out_size); 25925a3ba61SAviad Krawczyk 260c3e79bafSAviad Krawczyk int hinic_hwdev_ifup(struct hinic_hwdev *hwdev); 261c3e79bafSAviad Krawczyk 262c3e79bafSAviad Krawczyk void hinic_hwdev_ifdown(struct hinic_hwdev *hwdev); 263c3e79bafSAviad Krawczyk 26451ba902aSAviad Krawczyk struct hinic_hwdev *hinic_init_hwdev(struct pci_dev *pdev); 26551ba902aSAviad Krawczyk 26651ba902aSAviad Krawczyk void hinic_free_hwdev(struct hinic_hwdev *hwdev); 26751ba902aSAviad Krawczyk 268421e9526SXue Chaojing int hinic_hwdev_max_num_qps(struct hinic_hwdev *hwdev); 269421e9526SXue Chaojing 27051ba902aSAviad Krawczyk int hinic_hwdev_num_qps(struct hinic_hwdev *hwdev); 27151ba902aSAviad Krawczyk 272c3e79bafSAviad Krawczyk struct hinic_sq *hinic_hwdev_get_sq(struct hinic_hwdev *hwdev, int i); 273c3e79bafSAviad Krawczyk 274c3e79bafSAviad Krawczyk struct hinic_rq *hinic_hwdev_get_rq(struct hinic_hwdev *hwdev, int i); 275c3e79bafSAviad Krawczyk 276e2585ea7SAviad Krawczyk int hinic_hwdev_msix_cnt_set(struct hinic_hwdev *hwdev, u16 msix_index); 277e2585ea7SAviad Krawczyk 278e2585ea7SAviad Krawczyk int hinic_hwdev_msix_set(struct hinic_hwdev *hwdev, u16 msix_index, 279e2585ea7SAviad Krawczyk u8 pending_limit, u8 coalesc_timer, 280e2585ea7SAviad Krawczyk u8 lli_timer_cfg, u8 lli_credit_limit, 281e2585ea7SAviad Krawczyk u8 resend_timer); 282e2585ea7SAviad Krawczyk 28300e57a6dSAviad Krawczyk int hinic_hwdev_hw_ci_addr_set(struct hinic_hwdev *hwdev, struct hinic_sq *sq, 28400e57a6dSAviad Krawczyk u8 pending_limit, u8 coalesc_timer); 28500e57a6dSAviad Krawczyk 286905b464aSXue Chaojing void hinic_hwdev_set_msix_state(struct hinic_hwdev *hwdev, u16 msix_index, 287905b464aSXue Chaojing enum hinic_msix_state flag); 288905b464aSXue Chaojing 28951ba902aSAviad Krawczyk #endif 290