1 /* SPDX-License-Identifier: BSD-3-Clause 2 * Copyright(c) 2017 Huawei Technologies Co., Ltd 3 */ 4 5 #ifndef _HINIC_PMD_MGMT_H_ 6 #define _HINIC_PMD_MGMT_H_ 7 8 #include "hinic_pmd_api_cmd.h" 9 #include "hinic_pmd_eqs.h" 10 11 #define HINIC_MSG_HEADER_MSG_LEN_SHIFT 0 12 #define HINIC_MSG_HEADER_MODULE_SHIFT 11 13 #define HINIC_MSG_HEADER_SEG_LEN_SHIFT 16 14 #define HINIC_MSG_HEADER_NO_ACK_SHIFT 22 15 #define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_SHIFT 23 16 #define HINIC_MSG_HEADER_SEQID_SHIFT 24 17 #define HINIC_MSG_HEADER_LAST_SHIFT 30 18 #define HINIC_MSG_HEADER_DIRECTION_SHIFT 31 19 #define HINIC_MSG_HEADER_CMD_SHIFT 32 20 #define HINIC_MSG_HEADER_PCI_INTF_IDX_SHIFT 48 21 #define HINIC_MSG_HEADER_P2P_IDX_SHIFT 50 22 #define HINIC_MSG_HEADER_MSG_ID_SHIFT 54 23 24 #define HINIC_MSG_HEADER_MSG_LEN_MASK 0x7FF 25 #define HINIC_MSG_HEADER_MODULE_MASK 0x1F 26 #define HINIC_MSG_HEADER_SEG_LEN_MASK 0x3F 27 #define HINIC_MSG_HEADER_NO_ACK_MASK 0x1 28 #define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_MASK 0x1 29 #define HINIC_MSG_HEADER_SEQID_MASK 0x3F 30 #define HINIC_MSG_HEADER_LAST_MASK 0x1 31 #define HINIC_MSG_HEADER_DIRECTION_MASK 0x1 32 #define HINIC_MSG_HEADER_CMD_MASK 0xFF 33 #define HINIC_MSG_HEADER_PCI_INTF_IDX_MASK 0x3 34 #define HINIC_MSG_HEADER_P2P_IDX_MASK 0xF 35 #define HINIC_MSG_HEADER_MSG_ID_MASK 0x3FF 36 37 #define HINIC_DEV_BUSY_ACTIVE_FW 0xFE 38 39 #define HINIC_MSG_HEADER_GET(val, member) \ 40 (((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \ 41 HINIC_MSG_HEADER_##member##_MASK) 42 43 #define HINIC_MSG_HEADER_SET(val, member) \ 44 ((u64)((val) & HINIC_MSG_HEADER_##member##_MASK) << \ 45 HINIC_MSG_HEADER_##member##_SHIFT) 46 47 #define HINIC_MGMT_RSP_AEQN (1) 48 49 enum hinic_msg_direction_type { 50 HINIC_MSG_DIRECT_SEND = 0, 51 HINIC_MSG_RESPONSE = 1 52 }; 53 enum hinic_msg_segment_type { 54 NOT_LAST_SEGMENT = 0, 55 LAST_SEGMENT = 1, 56 }; 57 58 enum hinic_msg_ack_type { 59 HINIC_MSG_ACK = 0, 60 HINIC_MSG_NO_ACK = 1, 61 }; 62 63 struct hinic_recv_msg { 64 void *msg; 65 void *buf_out; 66 67 u16 msg_len; 68 enum hinic_mod_type mod; 69 u8 cmd; 70 u16 msg_id; 71 int async_mgmt_to_pf; 72 u8 seq_id; 73 }; 74 75 #define HINIC_COMM_SELF_CMD_MAX 8 76 77 enum comm_pf_to_mgmt_event_state { 78 SEND_EVENT_START = 0, 79 SEND_EVENT_TIMEOUT, 80 SEND_EVENT_END, 81 }; 82 83 struct hinic_msg_pf_to_mgmt { 84 struct hinic_hwdev *hwdev; 85 86 /* mutex for sync message */ 87 pthread_mutex_t sync_msg_mutex; 88 89 void *async_msg_buf; 90 void *sync_msg_buf; 91 92 struct hinic_recv_msg recv_msg_from_mgmt; 93 struct hinic_recv_msg recv_resp_msg_from_mgmt; 94 95 u16 async_msg_id; 96 u16 sync_msg_id; 97 98 struct hinic_api_cmd_chain *cmd_chain[HINIC_API_CMD_MAX]; 99 100 struct hinic_eq *rx_aeq; 101 }; 102 103 int hinic_msg_to_mgmt_no_ack(void *hwdev, enum hinic_mod_type mod, u8 cmd, 104 void *buf_in, u16 in_size); 105 106 int hinic_comm_pf_to_mgmt_init(struct hinic_hwdev *hwdev); 107 108 void hinic_comm_pf_to_mgmt_free(struct hinic_hwdev *hwdev); 109 110 int hinic_aeq_poll_msg(struct hinic_eq *eq, u32 timeout, void *param); 111 112 int hinic_msg_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd, 113 void *buf_in, u16 in_size, 114 void *buf_out, u16 *out_size, u32 timeout); 115 116 void hinic_dev_handle_aeq_event(struct hinic_hwdev *hwdev, void *param); 117 118 #endif /* _HINIC_PMD_MGMT_H_ */ 119