Skip to content

Commit 7461781

Browse files
authored
Merge pull request #89 from venvenk/video.qclinux.main
video: driver: fix RO buffer DMA memory leak on teardown and fix raw buffer size for interlace handling
2 parents 624d696 + 5ef5403 commit 7461781

4 files changed

Lines changed: 31 additions & 12 deletions

File tree

driver/vidc/src/msm_vidc_buffer.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -282,8 +282,8 @@ u32 msm_vidc_decoder_output_size(struct msm_vidc_inst *inst)
282282
f = &inst->fmts[OUTPUT_PORT];
283283
colorformat = v4l2_colorformat_to_driver(inst, f->fmt.pix_mp.pixelformat,
284284
__func__);
285-
size = video_buffer_size(colorformat, f->fmt.pix_mp.width,
286-
f->fmt.pix_mp.height, true);
285+
size = video_buffer_size(colorformat, f->fmt.pix_mp.width, f->fmt.pix_mp.height,
286+
inst->capabilities[CODED_FRAMES].value == CODED_FRAMES_INTERLACE);
287287
return size;
288288
}
289289

@@ -313,12 +313,13 @@ u32 msm_vidc_encoder_input_size(struct msm_vidc_inst *inst)
313313
width = f->fmt.pix_mp.width;
314314
height = f->fmt.pix_mp.height;
315315
colorformat = v4l2_colorformat_to_driver(inst, f->fmt.pix_mp.pixelformat,
316-
__func__);
316+
__func__);
317317
if (is_image_session(inst)) {
318318
width = ALIGN(width, inst->capabilities[GRID_SIZE].value);
319319
height = ALIGN(height, inst->capabilities[GRID_SIZE].value);
320320
}
321-
size = video_buffer_size(colorformat, width, height, true);
321+
size = video_buffer_size(colorformat, width, height,
322+
inst->capabilities[CODED_FRAMES].value == CODED_FRAMES_INTERLACE);
322323
return size;
323324
}
324325

driver/vidc/src/msm_vidc_driver.c

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5246,6 +5246,9 @@ int msm_vidc_flush_read_only_buffers(struct msm_vidc_inst *inst,
52465246
if (ro_buf->attach && ro_buf->dmabuf)
52475247
call_mem_op(core, dma_buf_detach, core,
52485248
ro_buf->dmabuf, ro_buf->attach);
5249+
if (ro_buf->kvaddr && ro_buf->device_addr)
5250+
dma_free_attrs(&core->pdev->dev, ro_buf->buffer_size,
5251+
ro_buf->kvaddr, ro_buf->device_addr, ro_buf->dma_attrs);
52495252
if (ro_buf->dbuf_get)
52505253
call_mem_op(core, dma_buf_put, inst, ro_buf->dmabuf);
52515254
ro_buf->attach = NULL;
@@ -5324,10 +5327,9 @@ void msm_vidc_destroy_buffers(struct msm_vidc_inst *inst)
53245327
buf->attach, buf->sg_table);
53255328
if (buf->attach && buf->dmabuf)
53265329
call_mem_op(core, dma_buf_detach, core, buf->dmabuf, buf->attach);
5327-
if (buf->kvaddr && buf->device_addr && refcount_read(&buf->refcount) > 0)
5328-
i_vpr_e(inst,
5329-
"%s: destroy ro buffer with Non-Zero refcount %d, daddr 0x%llx\n",
5330-
__func__, refcount_read(&buf->refcount), buf->device_addr);
5330+
if (buf->kvaddr && buf->device_addr)
5331+
dma_free_attrs(&core->pdev->dev, buf->buffer_size,
5332+
buf->kvaddr, buf->device_addr, buf->dma_attrs);
53315333
if (buf->dbuf_get)
53325334
call_mem_op(core, dma_buf_put, inst, buf->dmabuf);
53335335
list_del_init(&buf->list);
@@ -5345,10 +5347,10 @@ void msm_vidc_destroy_buffers(struct msm_vidc_inst *inst)
53455347
buf->attach, buf->sg_table);
53465348
if (buf->attach && buf->dmabuf)
53475349
call_mem_op(core, dma_buf_detach, core, buf->dmabuf, buf->attach);
5348-
if (buf->kvaddr && buf->device_addr && refcount_read(&buf->refcount) > 0)
5349-
i_vpr_e(inst,
5350-
"%s: destroying ext buffer, refcount %d, daddr 0x%llx\n",
5351-
__func__, refcount_read(&buf->refcount), buf->device_addr);
5350+
if (buf->kvaddr && buf->device_addr)
5351+
dma_free_attrs(&core->pdev->dev, buf->buffer_size,
5352+
buf->kvaddr, buf->device_addr, buf->dma_attrs);
5353+
53525354
if (buf->dbuf_get) {
53535355
print_vidc_buffer(VIDC_ERR, "err ", "destroying: put dmabuf",
53545356
inst, buf);

driver/vidc/src/msm_vidc_vb2.c

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -267,10 +267,23 @@ void msm_vb2_put(void *buf_priv)
267267
if (IS_ERR_OR_NULL(buf_priv))
268268
return;
269269

270+
if (refcount_read(&buf->refcount) == 0)
271+
return;
272+
270273
inst = buf->inst;
271274
if (!inst || !inst->core)
272275
return;
273276

277+
if (is_decode_session(inst) && is_output_buffer(buf->type)) {
278+
list_for_each_entry_safe(temp, dummy, &inst->buffers.read_only.list, list) {
279+
if (temp->device_addr != buf->device_addr)
280+
continue;
281+
buf->kvaddr = NULL;
282+
buf->device_addr = 0x0;
283+
return;
284+
}
285+
}
286+
274287
core = inst->core;
275288

276289
region = call_mem_op(core, buffer_region, inst, buf->type);

driver/vidc/src/venus_hfi_response.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2048,6 +2048,9 @@ static int handle_property_with_payload(struct msm_vidc_inst *inst,
20482048
break;
20492049
case HFI_PROP_CODED_FRAMES:
20502050
inst->subcr_params[port].coded_frames = payload_ptr[0];
2051+
msm_vidc_update_cap_value(inst, CODED_FRAMES,
2052+
inst->subcr_params[port].coded_frames,
2053+
__func__);
20512054
break;
20522055
case HFI_PROP_BUFFER_FW_MIN_OUTPUT_COUNT:
20532056
inst->subcr_params[port].fw_min_count = payload_ptr[0];

0 commit comments

Comments
 (0)