1 /*
2 * Copyright (C) 2018-2022 Intel Corporation.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #ifndef SHARED_BUF_H
8 #define SHARED_BUF_H
9
10 #include <linux/types.h>
11
12 #define SBUF_MAGIC 0x5aa57aa71aa13aa3
13 #define SBUF_MAX_SIZE (1ULL << 22)
14 #define SBUF_HEAD_SIZE 64
15
16 /* sbuf flags */
17 #define OVERRUN_CNT_EN (1ULL << 0) /* whether overrun counting is enabled */
18 #define OVERWRITE_EN (1ULL << 1) /* whether overwrite is enabled */
19
20 typedef unsigned char uint8_t;
21 typedef unsigned int uint32_t;
22 typedef unsigned long uint64_t;
23
24 /**
25 * (sbuf) head + buf (store (ele_num - 1) elements at most)
26 * buffer empty: tail == head
27 * buffer full: (tail + ele_size) % size == head
28 *
29 * Base of memory for elements
30 * |
31 * |
32 * ---------------------------------------------------------------------------------------
33 * | shared_buf_t | raw data (ele_size)| raw date (ele_size) | ... | raw data (ele_size) |
34 * ---------------------------------------------------------------------------------------
35 * |
36 * |
37 * shared_buf_t *buf
38 */
39
40 /* Make sure sizeof(shared_buf_t) == SBUF_HEAD_SIZE */
41 typedef struct shared_buf {
42 uint64_t magic;
43 uint32_t ele_num; /* number of elements */
44 uint32_t ele_size; /* sizeof of elements */
45 uint32_t head; /* offset from base, to read */
46 uint32_t tail; /* offset from base, to write */
47 uint64_t flags;
48 uint32_t overrun_cnt; /* count of overrun */
49 uint32_t size; /* ele_num * ele_size */
50 uint32_t padding[6];
51 } shared_buf_t;
52
sbuf_clear_flags(shared_buf_t * sbuf,uint64_t flags)53 static inline void sbuf_clear_flags(shared_buf_t *sbuf, uint64_t flags)
54 {
55 sbuf->flags &= ~flags;
56 }
57
sbuf_set_flags(shared_buf_t * sbuf,uint64_t flags)58 static inline void sbuf_set_flags(shared_buf_t *sbuf, uint64_t flags)
59 {
60 sbuf->flags = flags;
61 }
62
sbuf_add_flags(shared_buf_t * sbuf,uint64_t flags)63 static inline void sbuf_add_flags(shared_buf_t *sbuf, uint64_t flags)
64 {
65 sbuf->flags |= flags;
66 }
67
68 int sbuf_get(shared_buf_t *sbuf, uint8_t *data);
69 int sbuf_write(int fd, shared_buf_t *sbuf);
70 int sbuf_clear_buffered(shared_buf_t *sbuf);
71 #endif /* SHARED_BUF_H */
72