From 199ccba5e4404758b3e5ce529bc5e807eacf81e7 Mon Sep 17 00:00:00 2001 From: Loic Poulain Date: Tue, 26 Nov 2019 18:34:23 +0100 Subject: [PATCH] drivers: video: Fix video buffer alignment k_mem_pool_malloc reserves some space for block descriptor at the start of the data block, causing misalignement of returned video buffer. In our context we want to return a video buffer with aligment matching the video buffer poll alignment config. Fix that by using the simpler k_mem_pool_alloc function. Signed-off-by: Loic Poulain --- drivers/video/video_common.c | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/drivers/video/video_common.c b/drivers/video/video_common.c index c02cc4a6f3f..d900d722129 100644 --- a/drivers/video/video_common.c +++ b/drivers/video/video_common.c @@ -14,16 +14,19 @@ K_MEM_POOL_DEFINE(video_buffer_pool, CONFIG_VIDEO_BUFFER_POOL_ALIGN); static struct video_buffer video_buf[CONFIG_VIDEO_BUFFER_POOL_NUM_MAX]; +static struct k_mem_block video_block[CONFIG_VIDEO_BUFFER_POOL_NUM_MAX]; struct video_buffer *video_buffer_alloc(size_t size) { struct video_buffer *vbuf = NULL; + struct k_mem_block *block; int i; /* find available video buffer */ for (i = 0; i < ARRAY_SIZE(video_buf); i++) { if (video_buf[i].buffer == NULL) { vbuf = &video_buf[i]; + block = &video_block[i]; break; } } @@ -33,11 +36,11 @@ struct video_buffer *video_buffer_alloc(size_t size) } /* Alloc buffer memory */ - vbuf->buffer = k_mem_pool_malloc(&video_buffer_pool, size); - if (vbuf->buffer == NULL) { + if (k_mem_pool_alloc(&video_buffer_pool, block, size, K_FOREVER)) { return NULL; } + vbuf->buffer = block->data; vbuf->size = size; vbuf->bytesused = 0; @@ -46,6 +49,17 @@ struct video_buffer *video_buffer_alloc(size_t size) void video_buffer_release(struct video_buffer *vbuf) { - k_free(vbuf->buffer); + struct k_mem_block *block = NULL; + int i; + + /* vbuf to block */ + for (i = 0; i < ARRAY_SIZE(video_buf); i++) { + if (video_block[i].data == vbuf->buffer) { + block = &video_block[i]; + break; + } + } + vbuf->buffer = NULL; + k_mem_pool_free(block); }