[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PULL 28/43] FIFO: Add a FIFO32 implementation
From: |
Peter Maydell |
Subject: |
[Qemu-devel] [PULL 28/43] FIFO: Add a FIFO32 implementation |
Date: |
Thu, 12 May 2016 14:32:50 +0100 |
From: Jean-Christophe DUBOIS <address@hidden>
This one is build on top of the existing FIFO8
Reviewed-by: Peter Maydell <address@hidden>
Signed-off-by: Jean-Christophe Dubois <address@hidden>
Signed-off-by: Peter Maydell <address@hidden>
---
include/qemu/fifo32.h | 191 ++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 191 insertions(+)
create mode 100644 include/qemu/fifo32.h
diff --git a/include/qemu/fifo32.h b/include/qemu/fifo32.h
new file mode 100644
index 0000000..2e5a0cc
--- /dev/null
+++ b/include/qemu/fifo32.h
@@ -0,0 +1,191 @@
+/*
+ * Generic FIFO32 component, based on FIFO8.
+ *
+ * Copyright (c) 2016 Jean-Christophe Dubois
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version
+ * 2 of the License, or (at your option) any later version.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef FIFO32_H
+#define FIFO32_H
+
+#include "qemu/osdep.h"
+#include "qemu/fifo8.h"
+
+typedef struct {
+ Fifo8 fifo;
+} Fifo32;
+
+/**
+ * fifo32_create:
+ * @fifo: struct Fifo32 to initialise with new FIFO
+ * @capacity: capacity of the newly created FIFO expressed in 32 bit words
+ *
+ * Create a FIFO of the specified size. Clients should call fifo32_destroy()
+ * when finished using the fifo. The FIFO is initially empty.
+ */
+
+static inline void fifo32_create(Fifo32 *fifo, uint32_t capacity)
+{
+ fifo8_create(&fifo->fifo, capacity * sizeof(uint32_t));
+}
+
+/**
+ * fifo32_destroy:
+ * @fifo: FIFO to cleanup
+ *
+ * Cleanup a FIFO created with fifo32_create(). Frees memory created for FIFO
+ * storage. The FIFO is no longer usable after this has been called.
+ */
+
+static inline void fifo32_destroy(Fifo32 *fifo)
+{
+ fifo8_destroy(&fifo->fifo);
+}
+
+/**
+ * fifo32_num_free:
+ * @fifo: FIFO to check
+ *
+ * Return the number of free uint32_t slots in the FIFO.
+ *
+ * Returns: Number of free 32 bit words.
+ */
+
+static inline uint32_t fifo32_num_free(Fifo32 *fifo)
+{
+ return DIV_ROUND_UP(fifo8_num_free(&fifo->fifo), sizeof(uint32_t));
+}
+
+/**
+ * fifo32_num_used:
+ * @fifo: FIFO to check
+ *
+ * Return the number of used uint32_t slots in the FIFO.
+ *
+ * Returns: Number of used 32 bit words.
+ */
+
+static inline uint32_t fifo32_num_used(Fifo32 *fifo)
+{
+ return DIV_ROUND_UP(fifo8_num_used(&fifo->fifo), sizeof(uint32_t));
+}
+
+/**
+ * fifo32_push:
+ * @fifo: FIFO to push to
+ * @data: 32 bits data word to push
+ *
+ * Push a 32 bits data word to the FIFO. Behaviour is undefined if the FIFO
+ * is full. Clients are responsible for checking for fullness using
+ * fifo32_is_full().
+ */
+
+static inline void fifo32_push(Fifo32 *fifo, uint32_t data)
+{
+ int i;
+
+ for (i = 0; i < sizeof(data); i++) {
+ fifo8_push(&fifo->fifo, data & 0xff);
+ data >>= 8;
+ }
+}
+
+/**
+ * fifo32_push_all:
+ * @fifo: FIFO to push to
+ * @data: data to push
+ * @size: number of 32 bit words to push
+ *
+ * Push a 32 bit word array to the FIFO. Behaviour is undefined if the FIFO
+ * is full. Clients are responsible for checking the space left in the FIFO
+ * using fifo32_num_free().
+ */
+
+static inline void fifo32_push_all(Fifo32 *fifo, const uint32_t *data,
+ uint32_t num)
+{
+ int i;
+
+ for (i = 0; i < num; i++) {
+ fifo32_push(fifo, data[i]);
+ }
+}
+
+/**
+ * fifo32_pop:
+ * @fifo: fifo to pop from
+ *
+ * Pop a 32 bits data word from the FIFO. Behaviour is undefined if the FIFO
+ * is empty. Clients are responsible for checking for emptiness using
+ * fifo32_is_empty().
+ *
+ * Returns: The popped 32 bits data word.
+ */
+
+static inline uint32_t fifo32_pop(Fifo32 *fifo)
+{
+ uint32_t ret = 0;
+ int i;
+
+ for (i = 0; i < sizeof(uint32_t); i++) {
+ ret |= (fifo8_pop(&fifo->fifo) << (i * 8));
+ }
+
+ return ret;
+}
+
+/**
+ * There is no fifo32_pop_buf() because the data is not stored in the buffer
+ * as a set of native-order words.
+ */
+
+/**
+ * fifo32_reset:
+ * @fifo: FIFO to reset
+ *
+ * Reset a FIFO. All data is discarded and the FIFO is emptied.
+ */
+
+static inline void fifo32_reset(Fifo32 *fifo)
+{
+ fifo8_reset(&fifo->fifo);
+}
+
+/**
+ * fifo32_is_empty:
+ * @fifo: FIFO to check
+ *
+ * Check if a FIFO is empty.
+ *
+ * Returns: True if the fifo is empty, false otherwise.
+ */
+
+static inline bool fifo32_is_empty(Fifo32 *fifo)
+{
+ return fifo8_is_empty(&fifo->fifo);
+}
+
+/**
+ * fifo32_is_full:
+ * @fifo: FIFO to check
+ *
+ * Check if a FIFO is full.
+ *
+ * Returns: True if the fifo is full, false otherwise.
+ */
+
+static inline bool fifo32_is_full(Fifo32 *fifo)
+{
+ return fifo8_num_free(&fifo->fifo) < sizeof(uint32_t);
+}
+
+#define VMSTATE_FIFO32(_field, _state) VMSTATE_FIFO8(_field.fifo, _state)
+
+#endif /* FIFO32_H */
--
1.9.1
- [Qemu-devel] [PULL 20/43] hw/display: QOM'ify exynos4210_fimd.c, (continued)
- [Qemu-devel] [PULL 20/43] hw/display: QOM'ify exynos4210_fimd.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 08/43] hw/intc: QOM'ify slavio_intctl.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 14/43] target-arm: Fix descriptor address masking in ARM address translation, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 24/43] ACPI: move acpi_build_srat_memory to common place, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 04/43] hw/intc: QOM'ify exynos4210_combiner.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 29/43] i.MX: Add the Freescale SPI Controller, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 27/43] i.MX: Add i.MX6 System Reset Controller device., Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 35/43] hw/arm: QOM'ify armv7m.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 22/43] ACPI: Add GICC Affinity Structure, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 16/43] gen-icount: Use tcg_set_insn_param, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 28/43] FIFO: Add a FIFO32 implementation,
Peter Maydell <=
- [Qemu-devel] [PULL 32/43] hw/display/blizzard: Expand out macros, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 25/43] ACPI: Virt: Generate SRAT table, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 37/43] hw/arm: QOM'ify integratorcp.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 03/43] hw/intc: QOM'ify etraxfs_pic.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 39/43] hw/arm: QOM'ify pxa2xx_pic.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 33/43] hw/display/blizzard: Remove blizzard_template.h, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 38/43] hw/arm: QOM'ify pxa2xx.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 10/43] hw/intc: QOM'ify omap_intc.c, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 34/43] target-arm: Avoid unnecessary TLB flush on TCR_EL2, TCR_EL3 writes, Peter Maydell, 2016/05/12
- [Qemu-devel] [PULL 36/43] hw/arm: QOM'ify highbank.c, Peter Maydell, 2016/05/12