On 02/07/2018 12:29 AM, Tim Harvey wrote:
On Tue, Feb 6, 2018 at 1:21 PM, Hans Verkuil hverkuil@xs4all.nl wrote:
On 02/06/2018 09:27 PM, Tim Harvey wrote:
<snip>
v4l2-compliance test results:
- with the following kernel patches: v4l2-subdev: clear reserved fields
. v4l2-subdev: without controls return -ENOTTY
v4l2-compliance SHA : b2f8f9049056eb6f9e028927dacb2c715a062df8 Media Driver Info: Driver name : imx-media Model : imx-media Serial : Bus info : Media version : 4.15.0 Hardware revision: 0x00000000 (0) Driver version : 4.15.0 Interface Info: ID : 0x0300008f Type : V4L Sub-Device Entity Info: ID : 0x00000003 (3) Name : tda19971 2-0048 Function : Unknown
This is missing. It should be one of these:
https://hverkuil.home.xs4all.nl/spec/uapi/mediactl/media-types.html#media-en...
However, we don't have a proper function defined.
I would suggest adding a new MEDIA_ENT_F_DTV_DECODER analogous to MEDIA_ENT_F_ATV_DECODER.
It would be a new patch adding this + documentation.
Hows this look for adding to my next series:
Author: Tim Harvey tharvey@gateworks.com Date: Tue Feb 6 14:12:52 2018 -0800
[media] add digital video decoder video interface entity functions Add a new media entity function definition for digital TV decoders: MEDIA_ENT_F_DTV_DECODER Signed-off-by: Tim Harvey <tharvey@gateworks.com>
--- a/Documentation/media/uapi/mediactl/media-types.rst +++ b/Documentation/media/uapi/mediactl/media-types.rst @@ -321,6 +321,17 @@ Types and flags used to represent the media graph elements MIPI CSI-2, ...), and outputs them on its source pad to an output video bus of another type (eDP, MIPI CSI-2, parallel, ...).
- .. row 31
.. _MEDIA-ENT-F-DTV-DECODER:
- ``MEDIA_ENT_F_DTV_DECODER``
- Digital video decoder. The basic function of the video decoder is
to accept digital video from a wide variety of sources
and output it in some digital video standard, with appropriate
timing signals.
.. tabularcolumns:: |p{5.5cm}|p{12.0cm}|
.. _media-entity-flag: diff --git a/include/uapi/linux/media.h b/include/uapi/linux/media.h index b9b9446..6653e88 100644 --- a/include/uapi/linux/media.h +++ b/include/uapi/linux/media.h @@ -152,6 +152,7 @@ struct media_device_info {
- MEDIA_ENT_F_IF_VID_DECODER and/or MEDIA_ENT_F_IF_AUD_DECODER.
*/ #define MEDIA_ENT_F_TUNER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 5) +#define MEDIA_ENT_F_DTV_DECODER (MEDIA_ENT_F_OLD_SUBDEV_BASE + 6)
Don't use MEDIA_ENT_F_OLD_SUBDEV_BASE for new functions.
Use this instead:
/* * Analog video decoder functions */ #define MEDIA_ENT_F_DTV_DECODER (MEDIA_ENT_F_BASE + 0x6001)
Other than this, this patch looks great.
#define MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN MEDIA_ENT_F_OLD_SUBDEV_BASE
Assigning this now shows a function but does not resolve the media compliance results:
--- a/drivers/media/i2c/tda1997x.c +++ b/drivers/media/i2c/tda1997x.c @@ -2586,6 +2586,7 @@ static int tda1997x_probe(struct i2c_client *client, id->name, i2c_adapter_id(client->adapter), client->addr); sd->flags = V4L2_SUBDEV_FL_HAS_DEVNODE | V4L2_SUBDEV_FL_HAS_EVENTS;
sd->entity.function = MEDIA_ENT_F_DTV_DECODER; sd->entity.ops = &tda1997x_media_ops; /* set allowed mbus modes based on chip, bus-type, and bus-width */
root@ventana:~# v4l2-compliance -u1 v4l2-compliance SHA : b2f8f9049056eb6f9e028927dacb2c715a062df8 Media Driver Info: Driver name : imx-media Model : imx-media Serial : Bus info : Media version : 4.15.0 Hardware revision: 0x00000000 (0) Driver version : 4.15.0 Interface Info: ID : 0x0300008f Type : V4L Sub-Device Entity Info: ID : 0x00000003 (3) Name : tda19971 2-0048 Function : Unknown (00020006)
Actually it does. The value above is now the new function.
Pad 0x01000004 : Source Link 0x0200006f: to remote pad 0x1000063 of entity
'ipu1_csi0_mux': Data
...
root@ventana:~# v4l2-compliance -m0 -M v4l2-compliance SHA : b2f8f9049056eb6f9e028927dacb2c715a062df8 Media Driver Info: Driver name : imx-media Model : imx-media Serial : Bus info : Media version : 4.15.0 Hardware revision: 0x00000000 (0) Driver version : 4.15.0
Compliance test for device /dev/media0:
Required ioctls: test MEDIA_IOC_DEVICE_INFO: OK
Allow for multiple opens: test second /dev/media0 open: OK test MEDIA_IOC_DEVICE_INFO: OK test for unlimited opens: OK
Media Controller ioctls: fail: v4l2-test-media.cpp(141): ent.function == MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN
Weird, this shouldn't happen. I'll look into this a bit more.
test MEDIA_IOC_G_TOPOLOGY: FAIL fail: v4l2-test-media.cpp(256):
v2_entities_set.find(ent.id) == v2_entities_set.end()
This is a v4l2-compliance bug that I have fixed. Just do another git pull.
Regards,
Hans
test MEDIA_IOC_ENUM_ENTITIES/LINKS: FAIL test MEDIA_IOC_SETUP_LINK: OK
Total: 7, Succeeded: 5, Failed: 2, Warnings: 0
<snip> >> >> Sub-Device ioctls (Source Pad 0): >> test Try VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK >> test Try VIDIOC_SUBDEV_G/S_FMT: OK >> test Try VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported) >> test Active VIDIOC_SUBDEV_ENUM_MBUS_CODE/FRAME_SIZE/FRAME_INTERVAL: OK >> test Active VIDIOC_SUBDEV_G/S_FMT: OK >> test Active VIDIOC_SUBDEV_G/S_SELECTION/CROP: OK (Not Supported) >> test VIDIOC_SUBDEV_G/S_FRAME_INTERVAL: OK (Not Supported) >> >> Control ioctls: >> test VIDIOC_QUERY_EXT_CTRL/QUERYMENU: OK (Not Supported) >> test VIDIOC_QUERYCTRL: OK (Not Supported) >> test VIDIOC_G/S_CTRL: OK (Not Supported) >> test VIDIOC_G/S/TRY_EXT_CTRLS: OK (Not Supported) >> test VIDIOC_(UN)SUBSCRIBE_EVENT/DQEVENT: OK (Not Supported) >> test VIDIOC_G/S_JPEGCOMP: OK (Not Supported) >> Standard Controls: 0 Private Controls: 0 > > Why doesn't this show anything? You have at least one control, so this should > reflect that. Does 'v4l2-ctl -d /dev/v4l-subdev1 -l' show any controls? > > I think sd->ctrl_handler is never set to the v4l2_ctrl_handler pointer. > > Have you ever tested the controls? > > Looking closer I also notice that the control handler is never freed. Or > checked for errors when it is created in the probe function. Hmm, I should > have caught that earlier. >
Yes thanks - I missed this also:
--- a/drivers/media/i2c/tda1997x.c +++ b/drivers/media/i2c/tda1997x.c @@ -2726,6 +2726,12 @@ static int tda1997x_probe(struct i2c_client *client, &tda1997x_ctrl_ops, V4L2_CID_DV_RX_RGB_RANGE, V4L2_DV_RGB_RANGE_FULL, 0, V4L2_DV_RGB_RANGE_AUTO);
state->sd.ctrl_handler = hdl;
if (hdl->error) {
ret = hdl->error;
goto err_free_handler;
}
v4l2_ctrl_handler_setup(hdl); /* initialize source pads */ state->pads[TDA1997X_PAD_SOURCE].flags = MEDIA_PAD_FL_SOURCE;
@@ -2774,6 +2780,8 @@ static int tda1997x_probe(struct i2c_client *client,
err_free_media: media_entity_cleanup(&sd->entity); +err_free_handler:
v4l2_ctrl_handler_free(&state->hdl);
err_free_mutex: cancel_delayed_work(&state->delayed_work_enable_hpd); mutex_destroy(&state->page_lock); @@ -2801,6 +2809,7 @@ static int tda1997x_remove(struct i2c_client *client)
v4l2_async_unregister_subdev(sd); media_entity_cleanup(&sd->entity);
v4l2_ctrl_handler_free(&state->hdl); regulator_bulk_disable(TDA1997X_NUM_SUPPLIES, state->supplies); i2c_unregister_device(state->client_cec); cancel_delayed_work(&state->delayed_work_enable_hpd);
root@ventana:~# v4l2-ctl -d /dev/v4l-subdev1 --list-ctrls
Digital Video Controls
power_present 0x00a00964 (bitmask): max=0x00000001
default=0x00000000 value=0x00000000 flags=read-only rx_rgb_quantization_range 0x00a00965 (menu) : min=0 max=2 default=0 value=2 rx_it_content_type 0x00a00966 (menu) : min=0 max=4 default=4 value=0 flags=read-only, volatile
And various sets/gets appear to work as designed (found that I wasn't updating the csc when quantiation range was changed via ctrl and fixed it).
Regards,
Tim