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