1 | /* SPDX-License-Identifier: GPL-2.0-only */ |
2 | /* |
3 | * Huawei HiNIC PCI Express Linux driver |
4 | * Copyright(c) 2017 Huawei Technologies Co., Ltd |
5 | */ |
6 | |
7 | #ifndef HINIC_HW_MGMT_H |
8 | #define HINIC_HW_MGMT_H |
9 | |
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 0 |
19 | #define 11 |
20 | #define 16 |
21 | #define 22 |
22 | #define 23 |
23 | #define 24 |
24 | #define 30 |
25 | #define 31 |
26 | #define 32 |
27 | #define 40 |
28 | #define 48 |
29 | #define 50 |
30 | #define 54 |
31 | |
32 | #define 0x7FF |
33 | #define 0x1F |
34 | #define 0x3F |
35 | #define 0x1 |
36 | #define 0x1 |
37 | #define 0x3F |
38 | #define 0x1 |
39 | #define 0x1 |
40 | #define 0xFF |
41 | #define 0xFF |
42 | #define 0x3 |
43 | #define 0xF |
44 | #define 0x3FF |
45 | |
46 | #define (val, member) \ |
47 | ((u64)((val) & HINIC_MSG_HEADER_##member##_MASK) << \ |
48 | HINIC_MSG_HEADER_##member##_SHIFT) |
49 | |
50 | #define (val, member) \ |
51 | (((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \ |
52 | HINIC_MSG_HEADER_##member##_MASK) |
53 | |
54 | enum hinic_mgmt_msg_type { |
55 | HINIC_MGMT_MSG_SYNC = 1, |
56 | }; |
57 | |
58 | enum hinic_cfg_cmd { |
59 | HINIC_CFG_NIC_CAP = 0, |
60 | }; |
61 | |
62 | enum 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 | |
101 | enum hinic_mgmt_cb_state { |
102 | HINIC_MGMT_CB_ENABLED = BIT(0), |
103 | HINIC_MGMT_CB_RUNNING = BIT(1), |
104 | }; |
105 | |
106 | struct 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 | |
120 | struct 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 | |
129 | struct 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 | |
147 | struct 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 | |
160 | void 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 | |
168 | void hinic_unregister_mgmt_msg_cb(struct hinic_pf_to_mgmt *pf_to_mgmt, |
169 | enum hinic_mod_type mod); |
170 | |
171 | int 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 | |
176 | int hinic_pf_to_mgmt_init(struct hinic_pf_to_mgmt *pf_to_mgmt, |
177 | struct hinic_hwif *hwif); |
178 | |
179 | void hinic_pf_to_mgmt_free(struct hinic_pf_to_mgmt *pf_to_mgmt); |
180 | |
181 | #endif |
182 | |