* [PATCH v2 0/3] util/fifo8: Introduce fifo8_peek_buf()
@ 2023-07-05 13:18 Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 1/3] util/fifo8: Fix typo in fifo8_push_all() description Philippe Mathieu-Daudé
` (2 more replies)
0 siblings, 3 replies; 4+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-07-05 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Philippe Mathieu-Daudé
Extracted from "hw/char/pl011: Implement TX (async) FIFO":
https://lore.kernel.org/qemu-devel/20230522153144.30610-1-philmd@linaro.org/
All series reviewed.
Philippe Mathieu-Daudé (3):
util/fifo8: Fix typo in fifo8_push_all() description
util/fifo8: Allow fifo8_pop_buf() to not populate popped length
util/fifo8: Introduce fifo8_peek_buf()
include/qemu/fifo8.h | 39 +++++++++++++++++++++++++++++++++------
util/fifo8.c | 28 +++++++++++++++++++++++-----
2 files changed, 56 insertions(+), 11 deletions(-)
--
2.38.1
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v2 1/3] util/fifo8: Fix typo in fifo8_push_all() description
2023-07-05 13:18 [PATCH v2 0/3] util/fifo8: Introduce fifo8_peek_buf() Philippe Mathieu-Daudé
@ 2023-07-05 13:18 ` Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 2/3] util/fifo8: Allow fifo8_pop_buf() to not populate popped length Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 3/3] util/fifo8: Introduce fifo8_peek_buf() Philippe Mathieu-Daudé
2 siblings, 0 replies; 4+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-07-05 13:18 UTC (permalink / raw)
To: qemu-devel
Cc: Philippe Mathieu-Daudé, Francisco Iglesias, Alex Bennée
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
---
include/qemu/fifo8.h | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/include/qemu/fifo8.h b/include/qemu/fifo8.h
index 28bf2cee57..16be02f361 100644
--- a/include/qemu/fifo8.h
+++ b/include/qemu/fifo8.h
@@ -46,7 +46,7 @@ void fifo8_push(Fifo8 *fifo, uint8_t data);
* fifo8_push_all:
* @fifo: FIFO to push to
* @data: data to push
- * @size: number of bytes to push
+ * @num: number of bytes to push
*
* Push a byte array to the FIFO. Behaviour is undefined if the FIFO is full.
* Clients are responsible for checking the space left in the FIFO using
--
2.38.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 2/3] util/fifo8: Allow fifo8_pop_buf() to not populate popped length
2023-07-05 13:18 [PATCH v2 0/3] util/fifo8: Introduce fifo8_peek_buf() Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 1/3] util/fifo8: Fix typo in fifo8_push_all() description Philippe Mathieu-Daudé
@ 2023-07-05 13:18 ` Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 3/3] util/fifo8: Introduce fifo8_peek_buf() Philippe Mathieu-Daudé
2 siblings, 0 replies; 4+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-07-05 13:18 UTC (permalink / raw)
To: qemu-devel
Cc: Philippe Mathieu-Daudé, Francisco Iglesias, Alex Bennée
There might be cases where we know the number of bytes we can
pop from the FIFO, or we simply don't care how many bytes is
returned. Allow fifo8_pop_buf() to take a NULL numptr.
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
---
include/qemu/fifo8.h | 10 +++++-----
util/fifo8.c | 12 ++++++++----
2 files changed, 13 insertions(+), 9 deletions(-)
diff --git a/include/qemu/fifo8.h b/include/qemu/fifo8.h
index 16be02f361..d0d02bc73d 100644
--- a/include/qemu/fifo8.h
+++ b/include/qemu/fifo8.h
@@ -71,7 +71,7 @@ uint8_t fifo8_pop(Fifo8 *fifo);
* fifo8_pop_buf:
* @fifo: FIFO to pop from
* @max: maximum number of bytes to pop
- * @num: actual number of returned bytes
+ * @numptr: pointer filled with number of bytes returned (can be NULL)
*
* Pop a number of elements from the FIFO up to a maximum of max. The buffer
* containing the popped data is returned. This buffer points directly into
@@ -82,16 +82,16 @@ uint8_t fifo8_pop(Fifo8 *fifo);
* around in the ring buffer; in this case only a contiguous part of the data
* is returned.
*
- * The number of valid bytes returned is populated in *num; will always return
- * at least 1 byte. max must not be 0 or greater than the number of bytes in
- * the FIFO.
+ * The number of valid bytes returned is populated in *numptr; will always
+ * return at least 1 byte. max must not be 0 or greater than the number of
+ * bytes in the FIFO.
*
* Clients are responsible for checking the availability of requested data
* using fifo8_num_used().
*
* Returns: A pointer to popped data.
*/
-const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num);
+const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr);
/**
* fifo8_reset:
diff --git a/util/fifo8.c b/util/fifo8.c
index d4d1c135e0..032e985440 100644
--- a/util/fifo8.c
+++ b/util/fifo8.c
@@ -66,16 +66,20 @@ uint8_t fifo8_pop(Fifo8 *fifo)
return ret;
}
-const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *num)
+const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
{
uint8_t *ret;
+ uint32_t num;
assert(max > 0 && max <= fifo->num);
- *num = MIN(fifo->capacity - fifo->head, max);
+ num = MIN(fifo->capacity - fifo->head, max);
ret = &fifo->data[fifo->head];
- fifo->head += *num;
+ fifo->head += num;
fifo->head %= fifo->capacity;
- fifo->num -= *num;
+ fifo->num -= num;
+ if (numptr) {
+ *numptr = num;
+ }
return ret;
}
--
2.38.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [PATCH v2 3/3] util/fifo8: Introduce fifo8_peek_buf()
2023-07-05 13:18 [PATCH v2 0/3] util/fifo8: Introduce fifo8_peek_buf() Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 1/3] util/fifo8: Fix typo in fifo8_push_all() description Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 2/3] util/fifo8: Allow fifo8_pop_buf() to not populate popped length Philippe Mathieu-Daudé
@ 2023-07-05 13:18 ` Philippe Mathieu-Daudé
2 siblings, 0 replies; 4+ messages in thread
From: Philippe Mathieu-Daudé @ 2023-07-05 13:18 UTC (permalink / raw)
To: qemu-devel; +Cc: Philippe Mathieu-Daudé, Francisco Iglesias
To be able to peek at FIFO content without popping it,
introduce the fifo8_peek_buf() method by factoring
common content from fifo8_pop_buf().
Reviewed-by: Francisco Iglesias <frasse.iglesias@gmail.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@linaro.org>
---
include/qemu/fifo8.h | 27 +++++++++++++++++++++++++++
util/fifo8.c | 22 ++++++++++++++++++----
2 files changed, 45 insertions(+), 4 deletions(-)
diff --git a/include/qemu/fifo8.h b/include/qemu/fifo8.h
index d0d02bc73d..c6295c6ff0 100644
--- a/include/qemu/fifo8.h
+++ b/include/qemu/fifo8.h
@@ -93,6 +93,33 @@ uint8_t fifo8_pop(Fifo8 *fifo);
*/
const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr);
+/**
+ * fifo8_peek_buf: read upto max bytes from the fifo
+ * @fifo: FIFO to read from
+ * @max: maximum number of bytes to peek
+ * @numptr: pointer filled with number of bytes returned (can be NULL)
+ *
+ * Peek into a number of elements from the FIFO up to a maximum of max.
+ * The buffer containing the data peeked into is returned. This buffer points
+ * directly into the FIFO backing store. Since data is invalidated once any
+ * of the fifo8_* APIs are called on the FIFO, it is the caller responsibility
+ * to access it before doing further API calls.
+ *
+ * The function may return fewer bytes than requested when the data wraps
+ * around in the ring buffer; in this case only a contiguous part of the data
+ * is returned.
+ *
+ * The number of valid bytes returned is populated in *numptr; will always
+ * return at least 1 byte. max must not be 0 or greater than the number of
+ * bytes in the FIFO.
+ *
+ * Clients are responsible for checking the availability of requested data
+ * using fifo8_num_used().
+ *
+ * Returns: A pointer to peekable data.
+ */
+const uint8_t *fifo8_peek_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr);
+
/**
* fifo8_reset:
* @fifo: FIFO to reset
diff --git a/util/fifo8.c b/util/fifo8.c
index 032e985440..e12477843e 100644
--- a/util/fifo8.c
+++ b/util/fifo8.c
@@ -66,7 +66,8 @@ uint8_t fifo8_pop(Fifo8 *fifo)
return ret;
}
-const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
+static const uint8_t *fifo8_peekpop_buf(Fifo8 *fifo, uint32_t max,
+ uint32_t *numptr, bool do_pop)
{
uint8_t *ret;
uint32_t num;
@@ -74,15 +75,28 @@ const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
assert(max > 0 && max <= fifo->num);
num = MIN(fifo->capacity - fifo->head, max);
ret = &fifo->data[fifo->head];
- fifo->head += num;
- fifo->head %= fifo->capacity;
- fifo->num -= num;
+
+ if (do_pop) {
+ fifo->head += num;
+ fifo->head %= fifo->capacity;
+ fifo->num -= num;
+ }
if (numptr) {
*numptr = num;
}
return ret;
}
+const uint8_t *fifo8_peek_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
+{
+ return fifo8_peekpop_buf(fifo, max, numptr, false);
+}
+
+const uint8_t *fifo8_pop_buf(Fifo8 *fifo, uint32_t max, uint32_t *numptr)
+{
+ return fifo8_peekpop_buf(fifo, max, numptr, true);
+}
+
void fifo8_reset(Fifo8 *fifo)
{
fifo->num = 0;
--
2.38.1
^ permalink raw reply related [flat|nested] 4+ messages in thread
end of thread, other threads:[~2023-07-05 13:20 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-05 13:18 [PATCH v2 0/3] util/fifo8: Introduce fifo8_peek_buf() Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 1/3] util/fifo8: Fix typo in fifo8_push_all() description Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 2/3] util/fifo8: Allow fifo8_pop_buf() to not populate popped length Philippe Mathieu-Daudé
2023-07-05 13:18 ` [PATCH v2 3/3] util/fifo8: Introduce fifo8_peek_buf() Philippe Mathieu-Daudé
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).