]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
media: coda: avoid hardware lockups with more than 13 capture buffers
authorPhilipp Zabel <p.zabel@pengutronix.de>
Thu, 12 Dec 2019 14:23:27 +0000 (15:23 +0100)
committerMauro Carvalho Chehab <mchehab+huawei@kernel.org>
Mon, 16 Dec 2019 09:09:12 +0000 (10:09 +0100)
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 <p.zabel@pengutronix.de>
Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
Signed-off-by: Mauro Carvalho Chehab <mchehab+huawei@kernel.org>
drivers/media/platform/coda/coda-bit.c

index 5475de176ce367cb45c7719881503759de649047..3443396ba5f3c09b4edaae5ae2aacd32b25a5601 100644 (file)
@@ -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;