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 <loic.poulain@linaro.org>
This commit is contained in:
Loic Poulain 2019-11-26 18:34:23 +01:00 committed by Maureen Helm
commit 199ccba5e4

View file

@ -14,16 +14,19 @@ K_MEM_POOL_DEFINE(video_buffer_pool,
CONFIG_VIDEO_BUFFER_POOL_ALIGN); CONFIG_VIDEO_BUFFER_POOL_ALIGN);
static struct video_buffer video_buf[CONFIG_VIDEO_BUFFER_POOL_NUM_MAX]; 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 *video_buffer_alloc(size_t size)
{ {
struct video_buffer *vbuf = NULL; struct video_buffer *vbuf = NULL;
struct k_mem_block *block;
int i; int i;
/* find available video buffer */ /* find available video buffer */
for (i = 0; i < ARRAY_SIZE(video_buf); i++) { for (i = 0; i < ARRAY_SIZE(video_buf); i++) {
if (video_buf[i].buffer == NULL) { if (video_buf[i].buffer == NULL) {
vbuf = &video_buf[i]; vbuf = &video_buf[i];
block = &video_block[i];
break; break;
} }
} }
@ -33,11 +36,11 @@ struct video_buffer *video_buffer_alloc(size_t size)
} }
/* Alloc buffer memory */ /* Alloc buffer memory */
vbuf->buffer = k_mem_pool_malloc(&video_buffer_pool, size); if (k_mem_pool_alloc(&video_buffer_pool, block, size, K_FOREVER)) {
if (vbuf->buffer == NULL) {
return NULL; return NULL;
} }
vbuf->buffer = block->data;
vbuf->size = size; vbuf->size = size;
vbuf->bytesused = 0; vbuf->bytesused = 0;
@ -46,6 +49,17 @@ struct video_buffer *video_buffer_alloc(size_t size)
void video_buffer_release(struct video_buffer *vbuf) 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; vbuf->buffer = NULL;
k_mem_pool_free(block);
} }