cosim_pcie_proto.h 7.9 KB
Newer Older
Antoine Kaufmann's avatar
Antoine Kaufmann committed
1
2
3
4
5
#ifndef COSIM_PCIE_PROTO_H_
#define COSIM_PCIE_PROTO_H_

#include <stdint.h>

6
7
8
9
//#define COSIM_PCI_MSG_SZCHECK(s) static_assert(sizeof(s) == 64)
//#define COSIM_PCI_MSG_SZCHECK(s) _Static_assert(sizeof(s) == 64)
#define COSIM_PCI_MSG_SZCHECK(s)

Antoine Kaufmann's avatar
Antoine Kaufmann committed
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
/******************************************************************************/
/* Initialization messages on Unix socket */

/** in dev_intro.flags to indicate that sender supports issuing syncs. */
#define COSIM_PCIE_PROTO_FLAGS_DI_SYNC (1 << 0)

/** Number of PCI bars */
#define COSIM_PCIE_PROTO_NBARS 6

/** in bars.flags: this is an I/O port bar. (otherwise memory) */
#define COSIM_PCIE_PROTO_BAR_IO (1 << 0)
/** in bars.flags: this is a 64-bit bar. (otherwise 32-bit only) */
#define COSIM_PCIE_PROTO_BAR_64 (1 << 1)
/** in bars.flags: this memory bar is prefetchable */
#define COSIM_PCIE_PROTO_BAR_PF (1 << 2)

/**
 * welcome message sent by device to host. This message comes with the shared
 * memory file descriptor attached.
 */
struct cosim_pcie_proto_dev_intro {
    /** flags: see COSIM_PCIE_PROTO_FLAGS_DI_* */
    uint64_t flags;

    /** offset of the device-to-host queue in shared memory region */
    uint64_t d2h_offset;
    /** size of an entry in the device-to-host queue in bytes */
    uint64_t d2h_elen;
    /** total device-to-host queue length in #entries */
    uint64_t d2h_nentries;

    /** offset of the host-to-device queue in shared memory region */
    uint64_t h2d_offset;
    /** size of an entry in the host-to-device queue in bytes */
    uint64_t h2d_elen;
    /** total host-to-device queue length in #entries */
    uint64_t h2d_nentries;

    /** information for each BAR exposed by the device */
    struct {
        /** length of the bar in bytes (len = 0 indicates unused bar) */
        uint64_t len;
        /** flags (see COSIM_PCIE_PROTO_BAR_*) */
        uint64_t flags;
    } __attribute__((packed)) bars[COSIM_PCIE_PROTO_NBARS];
55
56
57
58
59
60
61
62
63
64
65

    /** PCI vendor id */
    uint16_t pci_vendor_id;
    /** PCI device id */
    uint16_t pci_device_id;
    /* PCI class */
    uint8_t pci_class;
    /* PCI subclass */
    uint8_t pci_subclass;
    /* PCI revision */
    uint8_t pci_revision;
66
67
    /* PCI number of MSI vectors */
    uint8_t pci_msi_nvecs;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
68
69
70
} __attribute__((packed));


Jialin Li's avatar
Jialin Li committed
71
#define COSIM_PCIE_PROTO_FLAGS_HI_SYNC (1 << 0)
Antoine Kaufmann's avatar
Antoine Kaufmann committed
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99

/** welcome message sent by host to device */
struct cosim_pcie_proto_host_intro {
    /** flags: see COSIM_PCIE_PROTO_FLAGS_HI_* */
  uint64_t flags;
} __attribute__((packed));


/******************************************************************************/
/* Messages on in-memory device to host channel */

/** Mask for ownership bit in own_type field */
#define COSIM_PCIE_PROTO_D2H_OWN_MASK 0x80
/** Message is owned by device */
#define COSIM_PCIE_PROTO_D2H_OWN_DEV 0x00
/** Message is owned by host */
#define COSIM_PCIE_PROTO_D2H_OWN_HOST 0x80

/** Mask for type value in own_type field */
#define COSIM_PCIE_PROTO_D2H_MSG_MASK 0x7f
#define COSIM_PCIE_PROTO_D2H_MSG_SYNC 0x1
#define COSIM_PCIE_PROTO_D2H_MSG_READ 0x2
#define COSIM_PCIE_PROTO_D2H_MSG_WRITE 0x3
#define COSIM_PCIE_PROTO_D2H_MSG_INTERRUPT 0x4
#define COSIM_PCIE_PROTO_D2H_MSG_READCOMP 0x5
#define COSIM_PCIE_PROTO_D2H_MSG_WRITECOMP 0x6

struct cosim_pcie_proto_d2h_dummy {
100
101
102
    uint8_t pad[48];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
103
104
    uint8_t own_type;
} __attribute__((packed));
105
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_dummy);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
106
107

struct cosim_pcie_proto_d2h_sync {
108
    uint8_t pad[48];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
109
    uint64_t timestamp;
110
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
111
112
    uint8_t own_type;
} __attribute__((packed));
113
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_sync);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
114
115
116
117
118

struct cosim_pcie_proto_d2h_read {
    uint64_t req_id;
    uint64_t offset;
    uint16_t len;
119
120
121
    uint8_t pad[30];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
122
123
    uint8_t own_type;
} __attribute__((packed));
124
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_read);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
125
126
127
128
129

struct cosim_pcie_proto_d2h_write {
    uint64_t req_id;
    uint64_t offset;
    uint16_t len;
130
131
132
    uint8_t pad[30];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
133
134
135
    uint8_t own_type;
    uint8_t data[];
} __attribute__((packed));
136
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_write);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
137
138
139
140
141
142
143
144
145

#define COSIM_PCIE_PROTO_INT_LEGACY_HI 0
#define COSIM_PCIE_PROTO_INT_LEGACY_LO 1
#define COSIM_PCIE_PROTO_INT_MSI 2
#define COSIM_PCIE_PROTO_INT_MSIX 3

struct cosim_pcie_proto_d2h_interrupt {
    uint16_t vector;
    uint8_t inttype;
146
147
148
    uint8_t pad[45];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
149
150
    uint8_t own_type;
} __attribute__((packed));
151
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_interrupt);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
152
153
154

struct cosim_pcie_proto_d2h_readcomp {
    uint64_t req_id;
155
156
157
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
158
159
    uint8_t own_type;
    uint8_t data[];
160
161
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_readcomp);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
162
163
164

struct cosim_pcie_proto_d2h_writecomp {
    uint64_t req_id;
165
166
167
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
168
    uint8_t own_type;
169
170
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_writecomp);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
171
172
173
174
175
176
177
178
179

union cosim_pcie_proto_d2h {
    struct cosim_pcie_proto_d2h_dummy dummy;
    struct cosim_pcie_proto_d2h_sync sync;
    struct cosim_pcie_proto_d2h_read read;
    struct cosim_pcie_proto_d2h_write write;
    struct cosim_pcie_proto_d2h_interrupt interrupt;
    struct cosim_pcie_proto_d2h_readcomp readcomp;
    struct cosim_pcie_proto_d2h_writecomp writecomp;
180
181
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(union cosim_pcie_proto_d2h);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200


/******************************************************************************/
/* Messages on in-memory host to device channel */

#define COSIM_PCIE_PROTO_H2D_OWN_MASK 0x80
/** Message is owned by host */
#define COSIM_PCIE_PROTO_H2D_OWN_HOST 0x00
/** Message is owned by device */
#define COSIM_PCIE_PROTO_H2D_OWN_DEV 0x80

#define COSIM_PCIE_PROTO_H2D_MSG_MASK 0x7f
#define COSIM_PCIE_PROTO_H2D_MSG_SYNC 0x1
#define COSIM_PCIE_PROTO_H2D_MSG_READ 0x2
#define COSIM_PCIE_PROTO_H2D_MSG_WRITE 0x3
#define COSIM_PCIE_PROTO_H2D_MSG_READCOMP 0x4
#define COSIM_PCIE_PROTO_H2D_MSG_WRITECOMP 0x5

struct cosim_pcie_proto_h2d_dummy {
201
202
203
    uint8_t pad[48];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
204
205
    uint8_t own_type;
} __attribute__((packed));
206
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_dummy);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
207
208

struct cosim_pcie_proto_h2d_sync {
209
    uint8_t pad[48];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
210
    uint64_t timestamp;
211
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
212
213
    uint8_t own_type;
} __attribute__((packed));
214
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_sync);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
215
216
217
218
219
220

struct cosim_pcie_proto_h2d_read {
    uint64_t req_id;
    uint64_t offset;
    uint16_t len;
    uint8_t bar;
221
222
223
    uint8_t pad[29];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
224
225
    uint8_t own_type;
} __attribute__((packed));
226
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_read);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
227
228
229
230
231
232

struct cosim_pcie_proto_h2d_write {
    uint64_t req_id;
    uint64_t offset;
    uint16_t len;
    uint8_t bar;
233
234
235
    uint8_t pad[29];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
236
237
238
    uint8_t own_type;
    uint8_t data[];
} __attribute__((packed));
239
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_write);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
240
241
242

struct cosim_pcie_proto_h2d_readcomp {
    uint64_t req_id;
243
244
245
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
246
247
    uint8_t own_type;
    uint8_t data[];
248
249
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_readcomp);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
250
251
252

struct cosim_pcie_proto_h2d_writecomp {
    uint64_t req_id;
253
254
255
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
256
    uint8_t own_type;
257
258
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_writecomp);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
259
260
261
262
263
264
265
266

union cosim_pcie_proto_h2d {
    struct cosim_pcie_proto_h2d_dummy dummy;
    struct cosim_pcie_proto_h2d_sync sync;
    struct cosim_pcie_proto_h2d_read read;
    struct cosim_pcie_proto_h2d_write write;
    struct cosim_pcie_proto_h2d_readcomp readcomp;
    struct cosim_pcie_proto_h2d_writecomp writecomp;
267
268
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(union cosim_pcie_proto_h2d);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
269
270

#endif /* ndef COSIM_PCIE_PROTO_H_ */