1
2
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
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
21#define LIO_PFVFACK 0xffffffffffffffff
22#define LIO_PFVFSIG 0x1122334455667788
23#define LIO_PFVFERR 0xDEADDEADDEADDEAD
24
25enum lio_mbox_cmd_status {
26 LIO_MBOX_STATUS_SUCCESS = 0,
27 LIO_MBOX_STATUS_FAILED = 1,
28 LIO_MBOX_STATUS_BUSY = 2
29};
30
31enum lio_mbox_message_type {
32 LIO_MBOX_REQUEST = 0,
33 LIO_MBOX_RESPONSE = 1
34};
35
36union 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
47typedef void (*lio_mbox_callback)(void *, void *, void *);
48
49struct 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
59enum 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
69struct lio_mbox {
70
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
80 void *mbox_int_reg;
81
82
83
84
85 void *mbox_write_reg;
86
87
88
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
98int lio_mbox_read(struct lio_mbox *mbox);
99int lio_mbox_write(struct lio_device *lio_dev,
100 struct lio_mbox_cmd *mbox_cmd);
101int lio_mbox_process_message(struct lio_mbox *mbox);
102#endif
103