video: driver: buffer flow changes

When client queued a buffer, v4l2 framework
compares the client Dmabuf with the existing
dmabuf in the bufs array at the same index.
If the dmabuf is different then v4l2 framework
would call unmap_dmabuf, detach_dmabuf callbacks
for the old buffer and then calls attach_dmabuf,
map_dmabuf callbacks for the new buffer before
qbuf callback is made to driver. If the dmabuf
is same then qbuf callback will be made directly.

V4l2 framework expects that clients recycles the
same buffers in the same indices so that when
v4l2 framework compares dmabuf it won't unmap
or map buffers.

If client recycle the buffers in different indices
still usecase works but there will be unnecessary
unmap, map overhead will be incurred.

If client does not recycle the buffers at all,
meaning every time client queues new buffers
then special handling is required for decoder
output buffers which are used for reference by
video hardware.If any buffers are used by video
hardware as reference buffers then firmware returns
those buffers with READ_ONLY flag and they are kept
in read_only list and when read_only grows beyond
some limit then driver would ask firmware to release
those READ_ONLY buffers and when firmware responds
driver would delete these READ_ONLY buffers.

Change-Id: I8a0b11c986dd0b9464895498efd8c1831a754198
Signed-off-by: Darshana Patil <quic_darshana@quicinc.com>
This commit is contained in:
Darshana Patil
2022-08-25 19:37:50 -07:00
parent 08b36416ce
commit 1ef323df29
11 changed files with 603 additions and 400 deletions

View File

@@ -7,6 +7,7 @@
#define _MSM_VIDC_MEMORY_H_
#include "msm_vidc_internal.h"
#include "msm_vidc_dt.h"
struct msm_vidc_core;
struct msm_vidc_inst;
@@ -66,4 +67,15 @@ void *msm_memory_pool_alloc(struct msm_vidc_inst *inst,
void msm_memory_pool_free(struct msm_vidc_inst *inst, void *vidc_buf);
int msm_vidc_vmem_alloc(unsigned long size, void **mem, const char *msg);
void msm_vidc_vmem_free(void **addr);
struct context_bank_info *msm_vidc_get_context_bank(struct msm_vidc_core *core,
enum msm_vidc_buffer_region region);
struct dma_buf_attachment *msm_vidc_dma_buf_attach(struct dma_buf *dbuf,
struct device *dev);
int msm_vidc_dma_buf_detach(struct dma_buf *dbuf,
struct dma_buf_attachment *attach);
struct sg_table *msm_vidc_dma_buf_map_attachment(
struct dma_buf_attachment *attach);
int msm_vidc_dma_buf_unmap_attachment(struct dma_buf_attachment *attach,
struct sg_table *table);
#endif // _MSM_VIDC_MEMORY_H_