cosim_pcie_proto.h 8.94 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
71
    /* PCI number of MSI vectors */
    uint8_t pci_msi_nvecs;
72
73
74
75
76
77
78
79
80
81
82
83
84

    /* PCI number of MSI-X vectors */
    uint16_t pci_msix_nvecs;
    /* BAR number for MSI-X table */
    uint8_t pci_msix_table_bar;
    /* BAR number for MSI-X PBA */
    uint8_t pci_msix_pba_bar;
    /* Offset for MSI-X table */
    uint32_t pci_msix_table_offset;
    /* Offset for MSI-X PBA */
    uint32_t pci_msix_pba_offset;
    /* MSI-X capability offset */
    uint16_t psi_msix_cap_offset;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
85
86
87
} __attribute__((packed));


Jialin Li's avatar
Jialin Li committed
88
#define COSIM_PCIE_PROTO_FLAGS_HI_SYNC (1 << 0)
Antoine Kaufmann's avatar
Antoine Kaufmann committed
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116

/** 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 {
117
118
119
    uint8_t pad[48];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
120
121
    uint8_t own_type;
} __attribute__((packed));
122
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_dummy);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
123
124

struct cosim_pcie_proto_d2h_sync {
125
    uint8_t pad[48];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
126
    uint64_t timestamp;
127
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
128
129
    uint8_t own_type;
} __attribute__((packed));
130
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_sync);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
131
132
133
134
135

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

struct cosim_pcie_proto_d2h_write {
    uint64_t req_id;
    uint64_t offset;
    uint16_t len;
147
148
149
    uint8_t pad[30];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
150
151
152
    uint8_t own_type;
    uint8_t data[];
} __attribute__((packed));
153
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_write);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
154
155
156
157
158
159
160
161
162

#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;
163
164
165
    uint8_t pad[45];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
166
167
    uint8_t own_type;
} __attribute__((packed));
168
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_interrupt);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
169
170
171

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

struct cosim_pcie_proto_d2h_writecomp {
    uint64_t req_id;
182
183
184
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
185
    uint8_t own_type;
186
187
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_d2h_writecomp);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
188
189
190
191
192
193
194
195
196

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;
197
198
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(union cosim_pcie_proto_d2h);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215


/******************************************************************************/
/* 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
Antoine Kaufmann's avatar
Antoine Kaufmann committed
216
#define COSIM_PCIE_PROTO_H2D_MSG_DEVCTRL 0x7
Antoine Kaufmann's avatar
Antoine Kaufmann committed
217
218

struct cosim_pcie_proto_h2d_dummy {
219
220
221
    uint8_t pad[48];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
222
223
    uint8_t own_type;
} __attribute__((packed));
224
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_dummy);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
225
226

struct cosim_pcie_proto_h2d_sync {
227
    uint8_t pad[48];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
228
    uint64_t timestamp;
229
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
230
231
    uint8_t own_type;
} __attribute__((packed));
232
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_sync);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
233
234
235
236
237
238

struct cosim_pcie_proto_h2d_read {
    uint64_t req_id;
    uint64_t offset;
    uint16_t len;
    uint8_t bar;
239
240
241
    uint8_t pad[29];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
242
243
    uint8_t own_type;
} __attribute__((packed));
244
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_read);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
245
246
247
248
249
250

struct cosim_pcie_proto_h2d_write {
    uint64_t req_id;
    uint64_t offset;
    uint16_t len;
    uint8_t bar;
251
252
253
    uint8_t pad[29];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
254
255
256
    uint8_t own_type;
    uint8_t data[];
} __attribute__((packed));
257
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_write);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
258
259
260

struct cosim_pcie_proto_h2d_readcomp {
    uint64_t req_id;
261
262
263
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
264
265
    uint8_t own_type;
    uint8_t data[];
266
267
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_readcomp);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
268
269
270

struct cosim_pcie_proto_h2d_writecomp {
    uint64_t req_id;
271
272
273
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
274
    uint8_t own_type;
275
276
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_writecomp);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
277

Antoine Kaufmann's avatar
Antoine Kaufmann committed
278
279
280
281
282
283
284
285
286
287
288
289
#define COSIM_PCIE_PROTO_CTRL_INTX_EN (1 << 0)
#define COSIM_PCIE_PROTO_CTRL_MSI_EN (1 << 1)
#define COSIM_PCIE_PROTO_CTRL_MSIX_EN (1 << 2)
struct cosim_pcie_proto_h2d_devctrl {
    uint64_t flags;
    uint8_t pad[40];
    uint64_t timestamp;
    uint8_t pad_[7];
    uint8_t own_type;
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_devctrl);

Antoine Kaufmann's avatar
Antoine Kaufmann committed
290
291
292
293
294
295
296
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;
Antoine Kaufmann's avatar
Antoine Kaufmann committed
297
    struct cosim_pcie_proto_h2d_devctrl devctrl;
298
299
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(union cosim_pcie_proto_h2d);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
300
301

#endif /* ndef COSIM_PCIE_PROTO_H_ */