cosim_pcie_proto.h 8.09 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
/******************************************************************************/
/* 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)
Antoine Kaufmann's avatar
Antoine Kaufmann committed
25
26
27
/** in bars.flags: this memory bar is a dummy bar (device doesn't get MMIO
 * messages for this, but it dose get exposed to software. used for MSI-X). */
#define COSIM_PCIE_PROTO_BAR_DUMMY (1 << 3)
Antoine Kaufmann's avatar
Antoine Kaufmann committed
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
55
56
57

/**
 * 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];
58
59
60
61
62
63
64
65
66
67
68

    /** 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;
69
70
    /* PCI number of MSI vectors */
    uint8_t pci_msi_nvecs;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
71
72
73
} __attribute__((packed));


Jialin Li's avatar
Jialin Li committed
74
#define COSIM_PCIE_PROTO_FLAGS_HI_SYNC (1 << 0)
Antoine Kaufmann's avatar
Antoine Kaufmann committed
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
100
101
102

/** 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 {
103
104
105
    uint8_t pad[48];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
106
107
    uint8_t own_type;
} __attribute__((packed));
108
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_dummy);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
109
110

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

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

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

#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;
149
150
151
    uint8_t pad[45];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
152
153
    uint8_t own_type;
} __attribute__((packed));
154
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_interrupt);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
155
156
157

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

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

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;
183
184
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(union cosim_pcie_proto_d2h);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203


/******************************************************************************/
/* 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 {
204
205
206
    uint8_t pad[48];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
207
208
    uint8_t own_type;
} __attribute__((packed));
209
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_dummy);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
210
211

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

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

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

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

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

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;
270
271
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(union cosim_pcie_proto_h2d);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
272
273

#endif /* ndef COSIM_PCIE_PROTO_H_ */