1 /* SPDX-License-Identifier: BSD-3-Clause
2  * Copyright(c) 2017 Cavium, Inc
3  */
4 
5 #ifndef _LIO_MBOX_H_
6 #define _LIO_MBOX_H_
7 
8 #include <stdint.h>
9 
10 #include <rte_spinlock.h>
11 
12 /* Macros for Mail Box Communication */
13 
14 #define LIO_MBOX_DATA_MAX			32
15 
16 #define LIO_VF_ACTIVE				0x1
17 #define LIO_VF_FLR_REQUEST			0x2
18 #define LIO_CORES_CRASHED			0x3
19 
20 /* Macro for Read acknowledgment */
21 #define LIO_PFVFACK				0xffffffffffffffff
22 #define LIO_PFVFSIG				0x1122334455667788
23 #define LIO_PFVFERR				0xDEADDEADDEADDEAD
24 
25 enum lio_mbox_cmd_status {
26 	LIO_MBOX_STATUS_SUCCESS		= 0,
27 	LIO_MBOX_STATUS_FAILED		= 1,
28 	LIO_MBOX_STATUS_BUSY		= 2
29 };
30 
31 enum lio_mbox_message_type {
32 	LIO_MBOX_REQUEST	= 0,
33 	LIO_MBOX_RESPONSE	= 1
34 };
35 
36 union lio_mbox_message {
37 	uint64_t mbox_msg64;
38 	struct {
39 		uint16_t type : 1;
40 		uint16_t resp_needed : 1;
41 		uint16_t cmd : 6;
42 		uint16_t len : 8;
43 		uint8_t params[6];
44 	} s;
45 };
46 
47 typedef void (*lio_mbox_callback)(void *, void *, void *);
48 
49 struct lio_mbox_cmd {
50 	union lio_mbox_message msg;
51 	uint64_t data[LIO_MBOX_DATA_MAX];
52 	uint32_t q_no;
53 	uint32_t recv_len;
54 	uint32_t recv_status;
55 	lio_mbox_callback fn;
56 	void *fn_arg;
57 };
58 
59 enum lio_mbox_state {
60 	LIO_MBOX_STATE_IDLE		= 1,
61 	LIO_MBOX_STATE_REQ_RECEIVING	= 2,
62 	LIO_MBOX_STATE_REQ_RECEIVED	= 4,
63 	LIO_MBOX_STATE_RES_PENDING	= 8,
64 	LIO_MBOX_STATE_RES_RECEIVING	= 16,
65 	LIO_MBOX_STATE_RES_RECEIVED	= 16,
66 	LIO_MBOX_STATE_ERROR		= 32
67 };
68 
69 struct lio_mbox {
70 	/* A spinlock to protect access to this q_mbox. */
71 	rte_spinlock_t lock;
72 
73 	struct lio_device *lio_dev;
74 
75 	uint32_t q_no;
76 
77 	enum lio_mbox_state state;
78 
79 	/* SLI_MAC_PF_MBOX_INT for PF, SLI_PKT_MBOX_INT for VF. */
80 	void *mbox_int_reg;
81 
82 	/* SLI_PKT_PF_VF_MBOX_SIG(0) for PF,
83 	 * SLI_PKT_PF_VF_MBOX_SIG(1) for VF.
84 	 */
85 	void *mbox_write_reg;
86 
87 	/* SLI_PKT_PF_VF_MBOX_SIG(1) for PF,
88 	 * SLI_PKT_PF_VF_MBOX_SIG(0) for VF.
89 	 */
90 	void *mbox_read_reg;
91 
92 	struct lio_mbox_cmd mbox_req;
93 
94 	struct lio_mbox_cmd mbox_resp;
95 
96 };
97 
98 int lio_mbox_read(struct lio_mbox *mbox);
99 int lio_mbox_write(struct lio_device *lio_dev,
100 		   struct lio_mbox_cmd *mbox_cmd);
101 int lio_mbox_process_message(struct lio_mbox *mbox);
102 #endif	/* _LIO_MBOX_H_ */
103