23951cb7ecd6ef8fc818dcca5379a3c1737cb92c
[dpdk.git] / drivers / net / hinic / base / hinic_pmd_mgmt.h
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_MSG_HEADER_GET(val, member)                       \
38                 (((val) >> HINIC_MSG_HEADER_##member##_SHIFT) & \
39                 HINIC_MSG_HEADER_##member##_MASK)
40
41 #define HINIC_MSG_HEADER_SET(val, member)                       \
42                 ((u64)((val) & HINIC_MSG_HEADER_##member##_MASK) << \
43                 HINIC_MSG_HEADER_##member##_SHIFT)
44
45 #define HINIC_MGMT_RSP_AEQN             (1)
46
47 enum hinic_msg_direction_type {
48         HINIC_MSG_DIRECT_SEND   = 0,
49         HINIC_MSG_RESPONSE      = 1
50 };
51 enum hinic_msg_segment_type {
52         NOT_LAST_SEGMENT = 0,
53         LAST_SEGMENT    = 1,
54 };
55
56 enum hinic_msg_ack_type {
57         HINIC_MSG_ACK = 0,
58         HINIC_MSG_NO_ACK = 1,
59 };
60
61 struct hinic_recv_msg {
62         void                    *msg;
63         void                    *buf_out;
64
65         u16                     msg_len;
66         enum hinic_mod_type     mod;
67         u8                      cmd;
68         u16                     msg_id;
69         int                     async_mgmt_to_pf;
70         u8                      sed_id;
71 };
72
73 #define HINIC_COMM_SELF_CMD_MAX 8
74
75 enum comm_pf_to_mgmt_event_state {
76         SEND_EVENT_START = 0,
77         SEND_EVENT_TIMEOUT,
78         SEND_EVENT_END,
79 };
80
81 struct hinic_msg_pf_to_mgmt {
82         struct hinic_hwdev              *hwdev;
83
84         /* Async cmd can not be scheduling */
85         spinlock_t                      async_msg_lock;
86         /* spinlock for sync message */
87         spinlock_t                      sync_msg_lock;
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, void *buf_out,
105                              u16 *out_size);
106
107 int hinic_comm_pf_to_mgmt_init(struct hinic_hwdev *hwdev);
108
109 void hinic_comm_pf_to_mgmt_free(struct hinic_hwdev *hwdev);
110
111 int hinic_aeq_poll_msg(struct hinic_eq *eq, u32 timeout, void *param);
112
113 int hinic_msg_to_mgmt_sync(void *hwdev, enum hinic_mod_type mod, u8 cmd,
114                            void *buf_in, u16 in_size,
115                            void *buf_out, u16 *out_size, u32 timeout);
116
117 void hinic_dev_handle_aeq_event(struct hinic_hwdev *hwdev, void *param);
118
119 #endif /* _HINIC_PMD_MGMT_H_ */