Commit 02d76a47 authored by Philipp Zabel's avatar Philipp Zabel Committed by Mauro Carvalho Chehab

media: coda: avoid hardware lockups with more than 13 capture buffers

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: default avatarPhilipp Zabel <p.zabel@pengutronix.de>
Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: default avatarMauro Carvalho Chehab <mchehab+huawei@kernel.org>
parent afddf553
...@@ -2168,16 +2168,21 @@ static int coda_prepare_decode(struct coda_ctx *ctx) ...@@ -2168,16 +2168,21 @@ static int coda_prepare_decode(struct coda_ctx *ctx)
} else { } else {
if (dev->devtype->product == CODA_960) { if (dev->devtype->product == CODA_960) {
/* /*
* The CODA960 seems to have an internal list of * It was previously assumed that the CODA960 has an
* buffers with 64 entries that includes the * internal list of 64 buffer entries that contains
* registered frame buffers as well as the rotator * both the registered internal frame buffers as well
* buffer output. * as the rotator buffer output, and that the ROT_INDEX
* * register must be set to a value between the last
* ROT_INDEX needs to be < 0x40, but > * internal frame buffers' index and 64.
* ctx->num_internal_frames. * 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_write(dev, CODA_MAX_FRAMEBUFFERS,
CODA_MAX_FRAMEBUFFERS + dst_buf->vb2_buf.index,
CODA9_CMD_DEC_PIC_ROT_INDEX); CODA9_CMD_DEC_PIC_ROT_INDEX);
reg_addr = CODA9_CMD_DEC_PIC_ROT_ADDR_Y; reg_addr = CODA9_CMD_DEC_PIC_ROT_ADDR_Y;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment