If we are using malloc-simple, we get into the problem, that
calls to free() won't free any memory. When using bouncebuf
in SPL with malloc-simple this means, that every allocated buffer
is lost. This can quickly consume the whole heap.

This patch addresses this memory wasting by introducing a static
allocated memory location, which is used instead of dynamically
allocated buffers.

Signed-off-by: Christoph Muellner <[email protected]>
---

 common/Kconfig     | 15 +++++++++++++++
 common/bouncebuf.c | 14 ++++++++++++++
 2 files changed, 29 insertions(+)

diff --git a/common/Kconfig b/common/Kconfig
index 1a1951f874..5fbca1e61a 100644
--- a/common/Kconfig
+++ b/common/Kconfig
@@ -702,6 +702,21 @@ config BOUNCE_BUFFER
          A second possible use of bounce buffers is their ability to
          provide aligned buffers for DMA operations.
 
+config SPL_BOUNCE_BUFFER_STATIC
+       bool "Static bounce buffer in SPL"
+       depends on SPL && BOUNCE_BUFFER
+       default n
+       help
+         This option uses a static allocated memory area as
+         bounce buffer (i.e. no dynamic allocation).
+
+config SPL_BOUNCE_BUFFER_STATIC_SIZE
+       hex "Size of static bounce buffer in SPL"
+       depends on SPL_BOUNCE_BUFFER_STATIC
+       default 0x2800
+       help
+         Size of the static allocated bounce buffer.
+
 config BOARD_TYPES
        bool "Call get_board_type() to get and display the board type"
        help
diff --git a/common/bouncebuf.c b/common/bouncebuf.c
index a7098e2caf..92ee10fb93 100644
--- a/common/bouncebuf.c
+++ b/common/bouncebuf.c
@@ -10,6 +10,11 @@
 #include <errno.h>
 #include <bouncebuf.h>
 
+#if CONFIG_IS_ENABLED(BOUNCE_BUFFER_STATIC)
+static u8 static_bb[CONFIG_VAL(BOUNCE_BUFFER_STATIC_SIZE)];
+static const size_t static_bb_size = CONFIG_VAL(BOUNCE_BUFFER_STATIC_SIZE);
+#endif
+
 static int addr_aligned(struct bounce_buffer *state)
 {
        const ulong align_mask = ARCH_DMA_MINALIGN - 1;
@@ -40,10 +45,19 @@ int bounce_buffer_start(struct bounce_buffer *state, void 
*data,
        state->flags = flags;
 
        if (!addr_aligned(state)) {
+#if CONFIG_IS_ENABLED(BOUNCE_BUFFER_STATIC)
+               if (state->len_aligned > static_bb_size) {
+                       debug("Static allocated bounce buffer too small.\n");
+                       return -ENOMEM;
+               }
+
+               state->bounce_buffer = static_bb;
+#else
                state->bounce_buffer = memalign(ARCH_DMA_MINALIGN,
                                                state->len_aligned);
                if (!state->bounce_buffer)
                        return -ENOMEM;
+#endif
 
                if (state->flags & GEN_BB_READ)
                        memcpy(state->bounce_buffer, state->user_buffer,
-- 
2.11.0

_______________________________________________
U-Boot mailing list
[email protected]
https://lists.denx.de/listinfo/u-boot

Reply via email to