xref: /openbmc/linux/drivers/net/ethernet/huawei/hinic/hinic_hw_mgmt.h (revision 4b4193256c8d3bc3a5397b5cd9494c2ad386317d)
12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2a5564e7eSAviad Krawczyk /*
3a5564e7eSAviad Krawczyk  * Huawei HiNIC PCI Express Linux driver
4a5564e7eSAviad Krawczyk  * Copyright(c) 2017 Huawei Technologies Co., Ltd
5a5564e7eSAviad Krawczyk  */
6a5564e7eSAviad Krawczyk 
7a5564e7eSAviad Krawczyk #ifndef HINIC_HW_MGMT_H
8a5564e7eSAviad Krawczyk #define HINIC_HW_MGMT_H
9a5564e7eSAviad Krawczyk 
10a5564e7eSAviad Krawczyk #include <linux/types.h>
116dd8b682SAviad Krawczyk #include <linux/semaphore.h>
126dd8b682SAviad Krawczyk #include <linux/completion.h>
13c4d06d2dSAviad Krawczyk #include <linux/bitops.h>
14a5564e7eSAviad Krawczyk 
15a5564e7eSAviad Krawczyk #include "hinic_hw_if.h"
16eabf0fadSAviad Krawczyk #include "hinic_hw_api_cmd.h"
17a5564e7eSAviad Krawczyk 
186dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_MSG_LEN_SHIFT                          0
196dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_MODULE_SHIFT                           11
206dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_SEG_LEN_SHIFT                          16
216dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_NO_ACK_SHIFT                           22
226dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_SHIFT                 23
236dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_SEQID_SHIFT                            24
246dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_LAST_SHIFT                             30
256dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_DIRECTION_SHIFT                        31
266dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_CMD_SHIFT                              32
276dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_ZEROS_SHIFT                            40
286dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_PCI_INTF_SHIFT                         48
296dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_PF_IDX_SHIFT                           50
306dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_MSG_ID_SHIFT                           54
316dd8b682SAviad Krawczyk 
326dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_MSG_LEN_MASK                           0x7FF
336dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_MODULE_MASK                            0x1F
346dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_SEG_LEN_MASK                           0x3F
356dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_NO_ACK_MASK                            0x1
366dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_ASYNC_MGMT_TO_PF_MASK                  0x1
376dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_SEQID_MASK                             0x3F
386dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_LAST_MASK                              0x1
396dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_DIRECTION_MASK                         0x1
406dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_CMD_MASK                               0xFF
416dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_ZEROS_MASK                             0xFF
426dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_PCI_INTF_MASK                          0x3
436dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_PF_IDX_MASK                            0xF
446dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_MSG_ID_MASK                            0x3FF
456dd8b682SAviad Krawczyk 
466dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_SET(val, member)                       \
476dd8b682SAviad Krawczyk 		((u64)((val) & HINIC_MSG_HEADER_##member##_MASK) << \
486dd8b682SAviad Krawczyk 		 HINIC_MSG_HEADER_##member##_SHIFT)
496dd8b682SAviad Krawczyk 
506dd8b682SAviad Krawczyk #define HINIC_MSG_HEADER_GET(val, member)                       \
516dd8b682SAviad Krawczyk 		(((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \
526dd8b682SAviad Krawczyk 		 HINIC_MSG_HEADER_##member##_MASK)
536dd8b682SAviad Krawczyk 
54a5564e7eSAviad Krawczyk enum hinic_mgmt_msg_type {
55a5564e7eSAviad Krawczyk 	HINIC_MGMT_MSG_SYNC = 1,
56a5564e7eSAviad Krawczyk };
57a5564e7eSAviad Krawczyk 
58a5564e7eSAviad Krawczyk enum hinic_cfg_cmd {
59a5564e7eSAviad Krawczyk 	HINIC_CFG_NIC_CAP = 0,
60a5564e7eSAviad Krawczyk };
61a5564e7eSAviad Krawczyk 
62d0b9805eSAviad Krawczyk enum hinic_comm_cmd {
63a425b6e1SLuo bin 	HINIC_COMM_CMD_START_FLR          = 0x1,
64e2585ea7SAviad Krawczyk 	HINIC_COMM_CMD_IO_STATUS_GET    = 0x3,
657dd29ee1SLuo bin 	HINIC_COMM_CMD_DMA_ATTR_SET	    = 0x4,
66e2585ea7SAviad Krawczyk 
67d0b9805eSAviad Krawczyk 	HINIC_COMM_CMD_CMDQ_CTXT_SET    = 0x10,
68d0b9805eSAviad Krawczyk 	HINIC_COMM_CMD_CMDQ_CTXT_GET    = 0x11,
69e2585ea7SAviad Krawczyk 
70e2585ea7SAviad Krawczyk 	HINIC_COMM_CMD_HWCTXT_SET       = 0x12,
71e2585ea7SAviad Krawczyk 	HINIC_COMM_CMD_HWCTXT_GET       = 0x13,
72e2585ea7SAviad Krawczyk 
73e2585ea7SAviad Krawczyk 	HINIC_COMM_CMD_SQ_HI_CI_SET     = 0x14,
74e2585ea7SAviad Krawczyk 
75e2585ea7SAviad Krawczyk 	HINIC_COMM_CMD_RES_STATE_SET    = 0x24,
76e2585ea7SAviad Krawczyk 
77e2585ea7SAviad Krawczyk 	HINIC_COMM_CMD_IO_RES_CLEAR     = 0x29,
78e2585ea7SAviad Krawczyk 
797dd29ee1SLuo bin 	HINIC_COMM_CMD_CEQ_CTRL_REG_WR_BY_UP = 0x33,
807dd29ee1SLuo bin 
81a0337c0dSLuo bin 	HINIC_COMM_CMD_MSI_CTRL_REG_WR_BY_UP,
82a0337c0dSLuo bin 	HINIC_COMM_CMD_MSI_CTRL_REG_RD_BY_UP,
83a0337c0dSLuo bin 
84c15850c7SLuo bin 	HINIC_COMM_CMD_FAULT_REPORT	= 0x37,
85c15850c7SLuo bin 
8607afcc7aSLuo bin 	HINIC_COMM_CMD_SET_LED_STATUS	= 0x4a,
8707afcc7aSLuo bin 
887dd29ee1SLuo bin 	HINIC_COMM_CMD_L2NIC_RESET	= 0x4b,
897dd29ee1SLuo bin 
907dd29ee1SLuo bin 	HINIC_COMM_CMD_PAGESIZE_SET	= 0x50,
917dd29ee1SLuo bin 
925e126e7cSLuo bin 	HINIC_COMM_CMD_GET_BOARD_INFO	= 0x52,
935e126e7cSLuo bin 
94c15850c7SLuo bin 	HINIC_COMM_CMD_WATCHDOG_INFO	= 0x56,
95c15850c7SLuo bin 
96*088c5f0dSLuo bin 	HINIC_MGMT_CMD_SET_VF_RANDOM_ID = 0x61,
97*088c5f0dSLuo bin 
985e126e7cSLuo bin 	HINIC_COMM_CMD_MAX,
99d0b9805eSAviad Krawczyk };
100d0b9805eSAviad Krawczyk 
101c4d06d2dSAviad Krawczyk enum hinic_mgmt_cb_state {
102c4d06d2dSAviad Krawczyk 	HINIC_MGMT_CB_ENABLED = BIT(0),
103c4d06d2dSAviad Krawczyk 	HINIC_MGMT_CB_RUNNING = BIT(1),
104c4d06d2dSAviad Krawczyk };
105c4d06d2dSAviad Krawczyk 
1066dd8b682SAviad Krawczyk struct hinic_recv_msg {
1076dd8b682SAviad Krawczyk 	u8                      *msg;
1086dd8b682SAviad Krawczyk 	u8                      *buf_out;
1096dd8b682SAviad Krawczyk 
1106dd8b682SAviad Krawczyk 	struct completion       recv_done;
1116dd8b682SAviad Krawczyk 
1126dd8b682SAviad Krawczyk 	u16                     cmd;
1136dd8b682SAviad Krawczyk 	enum hinic_mod_type     mod;
1146dd8b682SAviad Krawczyk 	int                     async_mgmt_to_pf;
1156dd8b682SAviad Krawczyk 
1166dd8b682SAviad Krawczyk 	u16                     msg_len;
1176dd8b682SAviad Krawczyk 	u16                     msg_id;
1186dd8b682SAviad Krawczyk };
1196dd8b682SAviad Krawczyk 
120c4d06d2dSAviad Krawczyk struct hinic_mgmt_cb {
121c4d06d2dSAviad Krawczyk 	void    (*cb)(void *handle, u8 cmd,
122c4d06d2dSAviad Krawczyk 		      void *buf_in, u16 in_size,
123c4d06d2dSAviad Krawczyk 		      void *buf_out, u16 *out_size);
124c4d06d2dSAviad Krawczyk 
125c4d06d2dSAviad Krawczyk 	void            *handle;
126c4d06d2dSAviad Krawczyk 	unsigned long   state;
127c4d06d2dSAviad Krawczyk };
128c4d06d2dSAviad Krawczyk 
129a5564e7eSAviad Krawczyk struct hinic_pf_to_mgmt {
130a5564e7eSAviad Krawczyk 	struct hinic_hwif               *hwif;
1317dd29ee1SLuo bin 	struct hinic_hwdev		*hwdev;
1326dd8b682SAviad Krawczyk 	struct semaphore                sync_msg_lock;
1336dd8b682SAviad Krawczyk 	u16                             sync_msg_id;
1346dd8b682SAviad Krawczyk 	u8                              *sync_msg_buf;
1356dbb8901SLuo bin 	void				*mgmt_ack_buf;
1366dd8b682SAviad Krawczyk 
1376dd8b682SAviad Krawczyk 	struct hinic_recv_msg           recv_resp_msg_from_mgmt;
1386dd8b682SAviad Krawczyk 	struct hinic_recv_msg           recv_msg_from_mgmt;
1396dd8b682SAviad Krawczyk 
140eabf0fadSAviad Krawczyk 	struct hinic_api_cmd_chain      *cmd_chain[HINIC_API_CMD_MAX];
141c4d06d2dSAviad Krawczyk 
142c4d06d2dSAviad Krawczyk 	struct hinic_mgmt_cb            mgmt_cb[HINIC_MOD_MAX];
1436dbb8901SLuo bin 
1446dbb8901SLuo bin 	struct workqueue_struct		*workq;
1456dbb8901SLuo bin };
1466dbb8901SLuo bin 
1476dbb8901SLuo bin struct hinic_mgmt_msg_handle_work {
1486dbb8901SLuo bin 	struct work_struct work;
1496dbb8901SLuo bin 	struct hinic_pf_to_mgmt *pf_to_mgmt;
1506dbb8901SLuo bin 
1516dbb8901SLuo bin 	void			*msg;
1526dbb8901SLuo bin 	u16			msg_len;
1536dbb8901SLuo bin 
1546dbb8901SLuo bin 	enum hinic_mod_type	mod;
1556dbb8901SLuo bin 	u8			cmd;
1566dbb8901SLuo bin 	u16			msg_id;
1576dbb8901SLuo bin 	int			async_mgmt_to_pf;
158a5564e7eSAviad Krawczyk };
159a5564e7eSAviad Krawczyk 
160c4d06d2dSAviad Krawczyk void hinic_register_mgmt_msg_cb(struct hinic_pf_to_mgmt *pf_to_mgmt,
161c4d06d2dSAviad Krawczyk 				enum hinic_mod_type mod,
162c4d06d2dSAviad Krawczyk 				void *handle,
163c4d06d2dSAviad Krawczyk 				void (*callback)(void *handle,
164c4d06d2dSAviad Krawczyk 						 u8 cmd, void *buf_in,
165c4d06d2dSAviad Krawczyk 						 u16 in_size, void *buf_out,
166c4d06d2dSAviad Krawczyk 						 u16 *out_size));
167c4d06d2dSAviad Krawczyk 
168c4d06d2dSAviad Krawczyk void hinic_unregister_mgmt_msg_cb(struct hinic_pf_to_mgmt *pf_to_mgmt,
169c4d06d2dSAviad Krawczyk 				  enum hinic_mod_type mod);
170c4d06d2dSAviad Krawczyk 
171a5564e7eSAviad Krawczyk int hinic_msg_to_mgmt(struct hinic_pf_to_mgmt *pf_to_mgmt,
172a5564e7eSAviad Krawczyk 		      enum hinic_mod_type mod, u8 cmd,
173a5564e7eSAviad Krawczyk 		      void *buf_in, u16 in_size, void *buf_out, u16 *out_size,
174a5564e7eSAviad Krawczyk 		      enum hinic_mgmt_msg_type sync);
175a5564e7eSAviad Krawczyk 
176a5564e7eSAviad Krawczyk int hinic_pf_to_mgmt_init(struct hinic_pf_to_mgmt *pf_to_mgmt,
177a5564e7eSAviad Krawczyk 			  struct hinic_hwif *hwif);
178a5564e7eSAviad Krawczyk 
179a5564e7eSAviad Krawczyk void hinic_pf_to_mgmt_free(struct hinic_pf_to_mgmt *pf_to_mgmt);
180a5564e7eSAviad Krawczyk 
181a5564e7eSAviad Krawczyk #endif
182