1 /*
2 * Copyright (C) 2018-2022 Intel Corporation.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 #include <asm/errno.h>
8 #include <string.h>
9 #include <unistd.h>
10 #include <stdio.h>
11 #include <stdbool.h>
12 #include "sbuf.h"
13 #include <errno.h>
14
sbuf_is_empty(shared_buf_t * sbuf)15 static inline bool sbuf_is_empty(shared_buf_t *sbuf)
16 {
17 return (sbuf->head == sbuf->tail);
18 }
19
sbuf_next_ptr(uint32_t pos,uint32_t span,uint32_t scope)20 static inline uint32_t sbuf_next_ptr(uint32_t pos,
21 uint32_t span, uint32_t scope)
22 {
23 pos += span;
24 pos = (pos >= scope) ? (pos - scope) : pos;
25 return pos;
26 }
27
sbuf_get(shared_buf_t * sbuf,uint8_t * data)28 int sbuf_get(shared_buf_t *sbuf, uint8_t *data)
29 {
30 const void *from;
31
32 if ((sbuf == NULL) || (data == NULL))
33 return -EINVAL;
34
35 if (sbuf_is_empty(sbuf)) {
36 /* no data available */
37 return 0;
38 }
39
40 from = (void *)sbuf + SBUF_HEAD_SIZE + sbuf->head;
41
42 memcpy(data, from, sbuf->ele_size);
43
44 sbuf->head = sbuf_next_ptr(sbuf->head, sbuf->ele_size, sbuf->size);
45
46 return sbuf->ele_size;
47 }
48
sbuf_write(int fd,shared_buf_t * sbuf)49 int sbuf_write(int fd, shared_buf_t *sbuf)
50 {
51 const void *start;
52 int written;
53
54 if (sbuf == NULL)
55 return -EINVAL;
56
57 if (sbuf_is_empty(sbuf)) {
58 return 0;
59 }
60
61 start = (void *)sbuf + SBUF_HEAD_SIZE + sbuf->head;
62 written = write(fd, start, sbuf->ele_size);
63 if (written != sbuf->ele_size) {
64 printf("Failed to write: ret %d (ele_size %d), errno %d\n",
65 written, sbuf->ele_size, (written == -1) ? errno : 0);
66 return -1;
67 }
68
69 sbuf->head = sbuf_next_ptr(sbuf->head, sbuf->ele_size, sbuf->size);
70
71 return sbuf->ele_size;
72 }
73
sbuf_clear_buffered(shared_buf_t * sbuf)74 int sbuf_clear_buffered(shared_buf_t *sbuf)
75 {
76 if (sbuf == NULL)
77 return -EINVAL;
78
79 sbuf->head = sbuf->tail;
80
81 return 0;
82 }
83