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