cosim_pcie_proto.h 8.48 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
216
217


/******************************************************************************/
/* 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 {
218
219
220
    uint8_t pad[48];
    uint64_t timestamp;
    uint8_t pad_[7];
Antoine Kaufmann's avatar
Antoine Kaufmann committed
221
222
    uint8_t own_type;
} __attribute__((packed));
223
COSIM_PCI_MSG_SZCHECK(struct cosim_pcie_proto_h2d_dummy);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
224
225

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

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

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

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

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

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;
284
285
} __attribute__((packed));
COSIM_PCI_MSG_SZCHECK(union cosim_pcie_proto_h2d);
Antoine Kaufmann's avatar
Antoine Kaufmann committed
286
287

#endif /* ndef COSIM_PCIE_PROTO_H_ */