2014-10-21 15:49 GMT+02:00 Hans Verkuil <[email protected]>:
>
>
> On 10/21/2014 03:42 PM, Jean-Michel Hautbois wrote:
>>
>> Hi Hans,
>>
>> 2014-10-21 15:27 GMT+02:00 Hans Verkuil <[email protected]>:
>>>
>>>
>>>
>>> On 10/21/2014 03:16 PM, Jean-Michel Hautbois wrote:
>>>>
>>>>
>>>> Hi,
>>>>
>>>> I am trying to use the CODA960 driver on a 3.18 kernel.
>>>> It seems pretty good when the module is probed (appart from the
>>>> unsupported firmware version) but when I try using the encoder, it
>>>> fails allocating dma buffers.
>>>>
>>>> Here is the DT part I added :
>>>> &vpu {
>>>> compatible = "fsl,imx6q-vpu";
>>>> clocks = <&clks 168>, <&clks 140>, <&clks 142>;
>>>> clock-names = "per", "ahb", "ocram";
>>>> iramsize = <0x21000>;
>>>> iram = <&ocram>;
>>>> resets = <&src 1>;
>>>> status = "okay";
>>>> };
>>>>
>>>> When booting, I see :
>>>> [ 4.410645] coda 2040000.vpu: Firmware code revision: 46056
>>>> [ 4.416312] coda 2040000.vpu: Initialized CODA960.
>>>> [ 4.421123] coda 2040000.vpu: Unsupported firmware version: 3.1.1
>>>> [ 4.483577] coda 2040000.vpu: codec registered as /dev/video[0-1]
>>>>
>>>> I can start v4l2-ctl and it shows that the device seems to be ok :
>>>> v4l2-ctl --all -d /dev/video1
>>>> Driver Info (not using libv4l2):
>>>> Driver name : coda
>>>> Card type : CODA960
>>>> Bus info : platform:coda
>>>> Driver version: 3.18.0
>>>> Capabilities : 0x84208000
>>>> Video Memory-to-Memory
>>>> Streaming
>>>> Extended Pix Format
>>>> Device Capabilities
>>>> Device Caps : 0x04208000
>>>> Video Memory-to-Memory
>>>> Streaming
>>>> Extended Pix Format
>>>> Priority: 2
>>>> Format Video Capture:
>>>> Width/Height : 1920/1088
>>>> Pixel Format : 'YU12'
>>>> Field : None
>>>> Bytes per Line: 1920
>>>> Size Image : 3133440
>>>> Colorspace : HDTV and modern devices (ITU709)
>>>> Flags :
>>>> Format Video Output:
>>>> Width/Height : 1920/1088
>>>> Pixel Format : 'H264'
>>>> Field : None
>>>> Bytes per Line: 0
>>>> Size Image : 1048576
>>>> Colorspace : HDTV and modern devices (ITU709)
>>>> Flags :
>>>> Selection: compose, Left 0, Top 0, Width 1920, Height 1088
>>>> Selection: compose_default, Left 0, Top 0, Width 1920, Height 1088
>>>> Selection: compose_bounds, Left 0, Top 0, Width 1920, Height 1088
>>>> Selection: compose_padded, Left 0, Top 0, Width 1920, Height 1088
>>>> Selection: crop, Left 0, Top 0, Width 1920, Height 1088
>>>> Selection: crop_default, Left 0, Top 0, Width 1920, Height 1088
>>>> Selection: crop_bounds, Left 0, Top 0, Width 1920, Height 1088
>>>>
>>>> User Controls
>>>>
>>>> horizontal_flip (bool) : default=0 value=0
>>>> vertical_flip (bool) : default=0 value=0
>>>>
>>>> Codec Controls
>>>>
>>>> video_gop_size (int) : min=1 max=60 step=1
>>>> default=16 value=16
>>>> video_bitrate (int) : min=0 max=32767000 step=1
>>>> default=0 value=0
>>>> number_of_intra_refresh_mbs (int) : min=0 max=8160 step=1
>>>> default=0 value=0
>>>> sequence_header_mode (menu) : min=0 max=1 default=1
>>>> value=1
>>>> maximum_bytes_in_a_slice (int) : min=1 max=1073741823 step=1
>>>> default=500 value=500
>>>> number_of_mbs_in_a_slice (int) : min=1 max=1073741823 step=1
>>>> default=1 value=1
>>>> slice_partitioning_method (menu) : min=0 max=2 default=0
>>>> value=0
>>>> h264_i_frame_qp_value (int) : min=0 max=51 step=1
>>>> default=25 value=25
>>>> h264_p_frame_qp_value (int) : min=0 max=51 step=1
>>>> default=25 value=25
>>>> h264_maximum_qp_value (int) : min=0 max=51 step=1
>>>> default=51 value=51
>>>> h264_loop_filter_alpha_offset (int) : min=0 max=15 step=1
>>>> default=0
>>>> value=0
>>>> h264_loop_filter_beta_offset (int) : min=0 max=15 step=1
>>>> default=0
>>>> value=0
>>>> h264_loop_filter_mode (menu) : min=0 max=1 default=0
>>>> value=0
>>>> mpeg4_i_frame_qp_value (int) : min=1 max=31 step=1
>>>> default=2
>>>> value=2
>>>> mpeg4_p_frame_qp_value (int) : min=1 max=31 step=1
>>>> default=2
>>>> value=2
>>>> horizontal_flip (bool) : default=0 value=0
>>>> vertical_flip (bool) : default=0 value=0
>>>>
>>>>
>>>>
>>>>
>>>> But when I try to get a file outputed, it fails :
>>>>
>>>> v4l2-ctl -d1 --stream-out-mmap --stream-mmap --stream-to x.raw
>>>> [ 1197.292256] coda 2040000.vpu: dma_alloc_coherent of size 1048576
>>>> failed
>>>> VIDIOC_REQBUFS: failed: Cannot allocate memory
>>>>
>>>> Did I forget to do something ?
>>>
>>>
>>>
>>> I assume this is physically contiguous memory. Do you have that much
>>> phys.
>>> cont. memory
>>> available at all? If the memory is fragmented you won't be able to get
>>> it.
>>>
>>> Use cma (contiguous memory allocator). You probably have to do very
>>> little
>>> expect add
>>> a kernel option to assign enough memory for these buffers.
>>
>>
>> I added a cma=128M in order to reserve some meory, and it fails...
>> well, differently :).
>>
>> ~# v4l2-ctl -d1 --stream-out-mmap --stream-mmap --stream-to x.raw
>> [ 56.372023] alloc_contig_range test_pages_isolated(48400, 486fd) failed
>> [ 56.459627] ------------[ cut here ]------------
>> [ 56.464273] WARNING: CPU: 1 PID: 838 at
>> drivers/media/v4l2-core/videobuf2-core.c:1181
>> vb2_buffer_done+0x120/0x158()
>
>
> That looks like a driver bug. You are returning buffers in
> coda_start_streaming
> with a wrong state. Check the WARN_ON at that line.
>
> Regards,
>
> Hans
I added some instrumentation, and modified the state returned from
VB2_BUF_STATE_DEQUEUED to VB2_BUF_STATE_QUEUED and it fails when
getting bitstream payload...
Here are the modifications :
diff --git a/drivers/media/platform/coda/coda-common.c
b/drivers/media/platform/coda/coda-common.c
index ced4760..b958668 100644
--- a/drivers/media/platform/coda/coda-common.c
+++ b/drivers/media/platform/coda/coda-common.c
@@ -1033,17 +1033,21 @@ static int coda_start_streaming(struct
vb2_queue *q, unsigned int count)
q_data_src = get_q_data(ctx, V4L2_BUF_TYPE_VIDEO_OUTPUT);
if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
if (q_data_src->fourcc == V4L2_PIX_FMT_H264) {
+ v4l2_err(v4l2_dev, "fill bitstream\n");
/* copy the buffers that where queued before streamon */
mutex_lock(&ctx->bitstream_mutex);
coda_fill_bitstream(ctx);
mutex_unlock(&ctx->bitstream_mutex);
if (coda_get_bitstream_payload(ctx) < 512) {
+ v4l2_err(v4l2_dev, "fill bitstream
payload : %d\n", coda_get_bitstream_payload(ctx));
ret = -EINVAL;
goto err;
}
} else {
+ v4l2_err(v4l2_dev, "Not H264 pix fmt\n");
if (count < 1) {
+ v4l2_err(v4l2_dev, "count: %d\n", count);
ret = -EINVAL;
goto err;
}
@@ -1051,7 +1055,9 @@ static int coda_start_streaming(struct vb2_queue
*q, unsigned int count)
ctx->streamon_out = 1;
} else {
+ v4l2_err(v4l2_dev, "Not output type\n");
if (count < 1) {
+ v4l2_err(v4l2_dev, "count: %d\n", count);
ret = -EINVAL;
goto err;
}
@@ -1060,8 +1066,10 @@ static int coda_start_streaming(struct
vb2_queue *q, unsigned int count)
}
/* Don't start the coda unless both queues are on */
- if (!(ctx->streamon_out & ctx->streamon_cap))
+ if (!(ctx->streamon_out & ctx->streamon_cap)) {
+ v4l2_err(v4l2_dev, "streamon_out (%s), streamon_cap
(%s)\n", (ctx->streamon_out)?"Y":"N",(ctx->streamon_cap)?"Y":"N");
return 0;
+ }
/* Allow decoder device_run with no new buffers queued */
if (ctx->inst_type == CODA_INST_DECODER)
@@ -1083,8 +1091,10 @@ static int coda_start_streaming(struct
vb2_queue *q, unsigned int count)
if (ctx->inst_type == CODA_INST_DECODER) {
if (ret == -EAGAIN)
return 0;
- else if (ret < 0)
+ else if (ret < 0) {
+ v4l2_err(v4l2_dev, "Decoder instance error: %d\n", ret);
goto err;
+ }
}
ctx->initialized = 1;
@@ -1093,10 +1103,10 @@ static int coda_start_streaming(struct
vb2_queue *q, unsigned int count)
err:
if (q->type == V4L2_BUF_TYPE_VIDEO_OUTPUT) {
while ((buf = v4l2_m2m_src_buf_remove(ctx->fh.m2m_ctx)))
- v4l2_m2m_buf_done(buf, VB2_BUF_STATE_DEQUEUED);
+ v4l2_m2m_buf_done(buf, VB2_BUF_STATE_QUEUED);
} else {
while ((buf = v4l2_m2m_dst_buf_remove(ctx->fh.m2m_ctx)))
- v4l2_m2m_buf_done(buf, VB2_BUF_STATE_DEQUEUED);
+ v4l2_m2m_buf_done(buf, VB2_BUF_STATE_QUEUED);
}
return ret;
}
And the output is now :
v4l2-ctl -d1 --stream-out-mmap --stream-mmap --stream-to x.raw
[ 6208.240919] coda 2040000.vpu: Not output type
[ 6208.245316] coda 2040000.vpu: streamon_out (N), streamon_cap (Y)
[ 6208.251353] coda 2040000.vpu: fill bitstream
[ 6208.255653] coda 2040000.vpu: fill bitstream payload : 0
VIDIOC_STREAMON: failed: Invalid argument
Any idea ?
JM
--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to [email protected]
More majordomo info at http://vger.kernel.org/majordomo-info.html