1 .. SPDX-License-Identifier: GPL-2.0
3 ============================================
4 Debugging and tracing in the media subsystem
5 ============================================
7 This document serves as a starting point and lookup for debugging device
8 drivers in the media subsystem and to debug these drivers from userspace.
13 General debugging advice
14 ------------------------
16 For general advice see the :doc:`general advice document
17 </process/debugging/index>`.
19 The following sections show you some of the available tools.
21 dev_debug module parameter
22 --------------------------
24 Every video device provides a ``dev_debug`` parameter, which allows to get
25 further insights into the IOCTLs in the background.::
27 # cat /sys/class/video4linux/video3/name
29 # echo 0xff > /sys/class/video4linux/video3/dev_debug
31 [...] videodev: v4l2_open: video3: open (0)
32 [ +0.000036] video3: VIDIOC_QUERYCAP: driver=rkvdec, card=rkvdec,
33 bus=platform:rkvdec, version=0x00060900, capabilities=0x84204000,
34 device_caps=0x04204000
36 For the full documentation see :ref:`driver-api/media/v4l2-dev:video device
39 dev_dbg() / v4l2_dbg()
40 ----------------------
42 Two debug print statements, which are specific for devices and for the v4l2
43 subsystem, avoid adding these to your final submission unless they have
44 long-term value for investigations.
46 For a general overview please see the
47 :ref:`process/debugging/driver_development_debugging_guide:printk() & friends`
50 - Difference between both?
52 - v4l2_dbg() utilizes v4l2_printk() under the hood, which further uses
53 printk() directly, thus it cannot be targeted by dynamic debug
54 - dev_dbg() can be targeted by dynamic debug
55 - v4l2_dbg() has a more specific prefix format for the media subsystem, while
56 dev_dbg only highlights the driver name and the location of the log
61 A method to trim down the debug output to your needs.
63 For general advice see the
64 :ref:`process/debugging/userspace_debugging_guide:dynamic debug` guide.
66 Here is one example, that enables all available pr_debug()'s within the file::
68 $ alias ddcmd='echo $* > /proc/dynamic_debug/control'
69 $ ddcmd '-p; file v4l2-h264.c +p'
70 $ grep =p /proc/dynamic_debug/control
71 drivers/media/v4l2-core/v4l2-h264.c:372 [v4l2_h264]print_ref_list_b =p
72 "ref_pic_list_b%u (cur_poc %u%c) %s"
73 drivers/media/v4l2-core/v4l2-h264.c:333 [v4l2_h264]print_ref_list_p =p
74 "ref_pic_list_p (cur_poc %u%c) %s\n"
79 An internal kernel tracer that can trace static predefined events, function
80 calls, etc. Very useful for debugging problems without changing the kernel and
81 understanding the behavior of subsystems.
83 For general advice see the
84 :ref:`process/debugging/userspace_debugging_guide:ftrace` guide.
89 This tool allows you to dump or modify internal values of your driver to files
90 in a custom filesystem.
92 For general advice see the
93 :ref:`process/debugging/driver_development_debugging_guide:debugfs` guide.
98 Tools to measure the various stats on a running system to diagnose issues.
100 For general advice see the
101 :ref:`process/debugging/userspace_debugging_guide:perf & alternatives` guide.
103 Example for media devices:
105 Gather statistics data for a decoding job: (This example is on a RK3399 SoC
106 with the rkvdec codec driver using the `fluster test suite
107 <https://github.com/fluendo/fluster>`__)::
109 perf stat -d python3 fluster.py run -d GStreamer-H.264-V4L2SL-Gst1.0 -ts
110 JVT-AVC_V1 -tv AUD_MW_E -j1
112 Performance counter stats for 'python3 fluster.py run -d
113 GStreamer-H.264-V4L2SL-Gst1.0 -ts JVT-AVC_V1 -tv AUD_MW_E -j1 -v':
115 7794.23 msec task-clock:u # 0.697 CPUs utilized
116 0 context-switches:u # 0.000 /sec
117 0 cpu-migrations:u # 0.000 /sec
118 11901 page-faults:u # 1.527 K/sec
119 882671556 cycles:u # 0.113 GHz (95.79%)
120 711708695 instructions:u # 0.81 insn per cycle (95.79%)
121 10581935 branches:u # 1.358 M/sec (15.13%)
122 6871144 branch-misses:u # 64.93% of all branches (95.79%)
123 281716547 L1-dcache-loads:u # 36.144 M/sec (95.79%)
124 9019581 L1-dcache-load-misses:u # 3.20% of all L1-dcache accesses (95.79%)
125 <not supported> LLC-loads:u
126 <not supported> LLC-load-misses:u
128 11.180830431 seconds time elapsed
130 1.502318000 seconds user
131 6.377221000 seconds sys
133 The availability of events and metrics depends on the system you are running.
135 Error checking & panic analysis
136 -------------------------------
138 Various Kernel configuration options to enhance error detection of the Linux
139 Kernel with the cost of lowering performance.
141 For general advice see the
142 :ref:`process/debugging/driver_development_debugging_guide:kasan, ubsan,
143 lockdep and other error checkers` guide.
145 Driver verification with v4l2-compliance
146 ----------------------------------------
148 To verify, that a driver adheres to the v4l2 API, the tool v4l2-compliance is
149 used, which is part of the `v4l_utils
150 <https://git.linuxtv.org/v4l-utils.git>`__, a suite of userspace tools to work
151 with the media subsystem.
153 To see the detailed media topology (and check it) use::
155 v4l2-compliance -M /dev/mediaX --verbose
157 You can also run a full compliance check for all devices referenced in the
158 media topology with::
160 v4l2-compliance -m /dev/mediaX
162 Debugging problems with receiving video
163 ---------------------------------------
165 Implementing vidioc_log_status in the driver: this can log the current status
166 to the kernel log. It's called by v4l2-ctl --log-status. Very useful for
167 debugging problems with receiving video (TV/S-Video/HDMI/etc) since the video
168 signal is external (so unpredictable). Less useful with camera sensor inputs
169 since you have control over what the camera sensor does.
171 Usually you can just assign the default::
173 .vidioc_log_status = v4l2_ctrl_log_status,
175 But you can also create your own callback, to create a custom status log.
177 You can find an example in the cobalt driver
178 (`drivers/media/pci/cobalt/cobalt-v4l2.c <https://elixir.bootlin.com/linux/v6.11.6/source/drivers/media/pci/cobalt/cobalt-v4l2.c#L567>`__).
180 **Copyright** ©2024 : Collabora