182 lines · c
1/* SPDX-License-Identifier: GPL-2.0-only */2/*3 * Huawei HiNIC PCI Express Linux driver4 * Copyright(c) 2017 Huawei Technologies Co., Ltd5 */6 7#ifndef HINIC_HW_MGMT_H8#define HINIC_HW_MGMT_H9 10#include <linux/types.h>11#include <linux/semaphore.h>12#include <linux/completion.h>13#include <linux/bitops.h>14 15#include "hinic_hw_if.h"16#include "hinic_hw_api_cmd.h"17 18#define HINIC_MSG_HEADER_MSG_LEN_SHIFT 019#define HINIC_MSG_HEADER_MODULE_SHIFT 1120#define HINIC_MSG_HEADER_SEG_LEN_SHIFT 1621#define HINIC_MSG_HEADER_NO_ACK_SHIFT 2222#define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_SHIFT 2323#define HINIC_MSG_HEADER_SEQID_SHIFT 2424#define HINIC_MSG_HEADER_LAST_SHIFT 3025#define HINIC_MSG_HEADER_DIRECTION_SHIFT 3126#define HINIC_MSG_HEADER_CMD_SHIFT 3227#define HINIC_MSG_HEADER_ZEROS_SHIFT 4028#define HINIC_MSG_HEADER_PCI_INTF_SHIFT 4829#define HINIC_MSG_HEADER_PF_IDX_SHIFT 5030#define HINIC_MSG_HEADER_MSG_ID_SHIFT 5431 32#define HINIC_MSG_HEADER_MSG_LEN_MASK 0x7FF33#define HINIC_MSG_HEADER_MODULE_MASK 0x1F34#define HINIC_MSG_HEADER_SEG_LEN_MASK 0x3F35#define HINIC_MSG_HEADER_NO_ACK_MASK 0x136#define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_MASK 0x137#define HINIC_MSG_HEADER_SEQID_MASK 0x3F38#define HINIC_MSG_HEADER_LAST_MASK 0x139#define HINIC_MSG_HEADER_DIRECTION_MASK 0x140#define HINIC_MSG_HEADER_CMD_MASK 0xFF41#define HINIC_MSG_HEADER_ZEROS_MASK 0xFF42#define HINIC_MSG_HEADER_PCI_INTF_MASK 0x343#define HINIC_MSG_HEADER_PF_IDX_MASK 0xF44#define HINIC_MSG_HEADER_MSG_ID_MASK 0x3FF45 46#define HINIC_MSG_HEADER_SET(val, member) \47 ((u64)((val) & HINIC_MSG_HEADER_##member##_MASK) << \48 HINIC_MSG_HEADER_##member##_SHIFT)49 50#define HINIC_MSG_HEADER_GET(val, member) \51 (((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \52 HINIC_MSG_HEADER_##member##_MASK)53 54enum hinic_mgmt_msg_type {55 HINIC_MGMT_MSG_SYNC = 1,56};57 58enum hinic_cfg_cmd {59 HINIC_CFG_NIC_CAP = 0,60};61 62enum hinic_comm_cmd {63 HINIC_COMM_CMD_START_FLR = 0x1,64 HINIC_COMM_CMD_IO_STATUS_GET = 0x3,65 HINIC_COMM_CMD_DMA_ATTR_SET = 0x4,66 67 HINIC_COMM_CMD_CMDQ_CTXT_SET = 0x10,68 HINIC_COMM_CMD_CMDQ_CTXT_GET = 0x11,69 70 HINIC_COMM_CMD_HWCTXT_SET = 0x12,71 HINIC_COMM_CMD_HWCTXT_GET = 0x13,72 73 HINIC_COMM_CMD_SQ_HI_CI_SET = 0x14,74 75 HINIC_COMM_CMD_RES_STATE_SET = 0x24,76 77 HINIC_COMM_CMD_IO_RES_CLEAR = 0x29,78 79 HINIC_COMM_CMD_CEQ_CTRL_REG_WR_BY_UP = 0x33,80 81 HINIC_COMM_CMD_MSI_CTRL_REG_WR_BY_UP,82 HINIC_COMM_CMD_MSI_CTRL_REG_RD_BY_UP,83 84 HINIC_COMM_CMD_FAULT_REPORT = 0x37,85 86 HINIC_COMM_CMD_SET_LED_STATUS = 0x4a,87 88 HINIC_COMM_CMD_L2NIC_RESET = 0x4b,89 90 HINIC_COMM_CMD_PAGESIZE_SET = 0x50,91 92 HINIC_COMM_CMD_GET_BOARD_INFO = 0x52,93 94 HINIC_COMM_CMD_WATCHDOG_INFO = 0x56,95 96 HINIC_MGMT_CMD_SET_VF_RANDOM_ID = 0x61,97 98 HINIC_COMM_CMD_MAX,99};100 101enum hinic_mgmt_cb_state {102 HINIC_MGMT_CB_ENABLED = BIT(0),103 HINIC_MGMT_CB_RUNNING = BIT(1),104};105 106struct hinic_recv_msg {107 u8 *msg;108 u8 *buf_out;109 110 struct completion recv_done;111 112 u16 cmd;113 enum hinic_mod_type mod;114 int async_mgmt_to_pf;115 116 u16 msg_len;117 u16 msg_id;118};119 120struct hinic_mgmt_cb {121 void (*cb)(void *handle, u8 cmd,122 void *buf_in, u16 in_size,123 void *buf_out, u16 *out_size);124 125 void *handle;126 unsigned long state;127};128 129struct hinic_pf_to_mgmt {130 struct hinic_hwif *hwif;131 struct hinic_hwdev *hwdev;132 struct semaphore sync_msg_lock;133 u16 sync_msg_id;134 u8 *sync_msg_buf;135 void *mgmt_ack_buf;136 137 struct hinic_recv_msg recv_resp_msg_from_mgmt;138 struct hinic_recv_msg recv_msg_from_mgmt;139 140 struct hinic_api_cmd_chain *cmd_chain[HINIC_API_CMD_MAX];141 142 struct hinic_mgmt_cb mgmt_cb[HINIC_MOD_MAX];143 144 struct workqueue_struct *workq;145};146 147struct hinic_mgmt_msg_handle_work {148 struct work_struct work;149 struct hinic_pf_to_mgmt *pf_to_mgmt;150 151 void *msg;152 u16 msg_len;153 154 enum hinic_mod_type mod;155 u8 cmd;156 u16 msg_id;157 int async_mgmt_to_pf;158};159 160void hinic_register_mgmt_msg_cb(struct hinic_pf_to_mgmt *pf_to_mgmt,161 enum hinic_mod_type mod,162 void *handle,163 void (*callback)(void *handle,164 u8 cmd, void *buf_in,165 u16 in_size, void *buf_out,166 u16 *out_size));167 168void hinic_unregister_mgmt_msg_cb(struct hinic_pf_to_mgmt *pf_to_mgmt,169 enum hinic_mod_type mod);170 171int hinic_msg_to_mgmt(struct hinic_pf_to_mgmt *pf_to_mgmt,172 enum hinic_mod_type mod, u8 cmd,173 void *buf_in, u16 in_size, void *buf_out, u16 *out_size,174 enum hinic_mgmt_msg_type sync);175 176int hinic_pf_to_mgmt_init(struct hinic_pf_to_mgmt *pf_to_mgmt,177 struct hinic_hwif *hwif);178 179void hinic_pf_to_mgmt_free(struct hinic_pf_to_mgmt *pf_to_mgmt);180 181#endif182