Skip to content

Commit

Permalink
media: coda: avoid hardware lockups with more than 13 capture buffers
Browse files Browse the repository at this point in the history
When decoding using the CODA internal rotator (for example NV12
capture), currently the value vb2_buf.index + CODA_MAX_FRAMEBUFFERS (19)
is written into the DEC_PIC_ROT_INDEX register. At least with firmware
version 3.1.1 this causes CODA hangups as soon as the register value
reaches 32. Instead, always write CODA_MAX_FRAMEBUFFERS.

Signed-off-by: Philipp Zabel <[email protected]>
Signed-off-by: Hans Verkuil <[email protected]>
Signed-off-by: Mauro Carvalho Chehab <[email protected]>
  • Loading branch information
pH5 authored and mchehab committed Dec 16, 2019
1 parent afddf55 commit 02d76a4
Showing 1 changed file with 14 additions and 9 deletions.
23 changes: 14 additions & 9 deletions drivers/media/platform/coda/coda-bit.c
Original file line number Diff line number Diff line change
Expand Up @@ -2168,16 +2168,21 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
} else {
if (dev->devtype->product == CODA_960) {
/*
* The CODA960 seems to have an internal list of
* buffers with 64 entries that includes the
* registered frame buffers as well as the rotator
* buffer output.
*
* ROT_INDEX needs to be < 0x40, but >
* ctx->num_internal_frames.
* It was previously assumed that the CODA960 has an
* internal list of 64 buffer entries that contains
* both the registered internal frame buffers as well
* as the rotator buffer output, and that the ROT_INDEX
* register must be set to a value between the last
* internal frame buffers' index and 64.
* At least on firmware version 3.1.1 it turns out that
* setting ROT_INDEX to any value >= 32 causes CODA
* hangups that it can not recover from with the SRC VPU
* reset.
* It does appear to work however, to just set it to a
* fixed value in the [ctx->num_internal_frames, 31]
* range, for example CODA_MAX_FRAMEBUFFERS.
*/
coda_write(dev,
CODA_MAX_FRAMEBUFFERS + dst_buf->vb2_buf.index,
coda_write(dev, CODA_MAX_FRAMEBUFFERS,
CODA9_CMD_DEC_PIC_ROT_INDEX);

reg_addr = CODA9_CMD_DEC_PIC_ROT_ADDR_Y;
Expand Down

0 comments on commit 02d76a4

Please sign in to comment.