[U-Boot] [PATCH 1/2] bouncebuf: Add static buffer allocation method for SPL.

Christoph Müllner christoph.muellner at theobroma-systems.com
Tue May 7 13:45:45 UTC 2019



On 07.05.19 15:06, Marek Vasut wrote:
> On 5/7/19 11:09 AM, Christoph Muellner wrote:
>> 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.
> 
> When does such a scenario happen ?

RK3399 with mainline U-Boot and mainline ATF.
We have 0x4000 bytes heap in SPL.
For the SRAM part of ATF we need to allocate 0x2000-0x2200 bytes.
For the PMUSRAM part about the same again.

I tried to increase the heap size to 0x10000, but that seems
to break some unchecked assumptions about the memory layout,
because then SPL resets very early.


> 
>> 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 <christoph.muellner at theobroma-systems.com>
>> ---
>>
>>  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,
>>
> 
> 


More information about the U-Boot mailing list