1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * Copyright (C) STMicroelectronics SA 2015
4*4882a593Smuzhiyun * Authors: Yannick Fertre <yannick.fertre@st.com>
5*4882a593Smuzhiyun * Hugues Fruchet <hugues.fruchet@st.com>
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun
8*4882a593Smuzhiyun #include <linux/debugfs.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "hva.h"
11*4882a593Smuzhiyun #include "hva-hw.h"
12*4882a593Smuzhiyun
format_ctx(struct seq_file * s,struct hva_ctx * ctx)13*4882a593Smuzhiyun static void format_ctx(struct seq_file *s, struct hva_ctx *ctx)
14*4882a593Smuzhiyun {
15*4882a593Smuzhiyun struct hva_streaminfo *stream = &ctx->streaminfo;
16*4882a593Smuzhiyun struct hva_frameinfo *frame = &ctx->frameinfo;
17*4882a593Smuzhiyun struct hva_controls *ctrls = &ctx->ctrls;
18*4882a593Smuzhiyun struct hva_ctx_dbg *dbg = &ctx->dbg;
19*4882a593Smuzhiyun u32 bitrate_mode, aspect, entropy, vui_sar, sei_fp;
20*4882a593Smuzhiyun
21*4882a593Smuzhiyun seq_printf(s, "|-%s\n |\n", ctx->name);
22*4882a593Smuzhiyun
23*4882a593Smuzhiyun seq_printf(s, " |-[%sframe info]\n",
24*4882a593Smuzhiyun ctx->flags & HVA_FLAG_FRAMEINFO ? "" : "default ");
25*4882a593Smuzhiyun seq_printf(s, " | |- pixel format=%4.4s\n"
26*4882a593Smuzhiyun " | |- wxh=%dx%d\n"
27*4882a593Smuzhiyun " | |- wxh (w/ encoder alignment constraint)=%dx%d\n"
28*4882a593Smuzhiyun " |\n",
29*4882a593Smuzhiyun (char *)&frame->pixelformat,
30*4882a593Smuzhiyun frame->width, frame->height,
31*4882a593Smuzhiyun frame->aligned_width, frame->aligned_height);
32*4882a593Smuzhiyun
33*4882a593Smuzhiyun seq_printf(s, " |-[%sstream info]\n",
34*4882a593Smuzhiyun ctx->flags & HVA_FLAG_STREAMINFO ? "" : "default ");
35*4882a593Smuzhiyun seq_printf(s, " | |- stream format=%4.4s\n"
36*4882a593Smuzhiyun " | |- wxh=%dx%d\n"
37*4882a593Smuzhiyun " | |- %s\n"
38*4882a593Smuzhiyun " | |- %s\n"
39*4882a593Smuzhiyun " |\n",
40*4882a593Smuzhiyun (char *)&stream->streamformat,
41*4882a593Smuzhiyun stream->width, stream->height,
42*4882a593Smuzhiyun stream->profile, stream->level);
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun bitrate_mode = V4L2_CID_MPEG_VIDEO_BITRATE_MODE;
45*4882a593Smuzhiyun aspect = V4L2_CID_MPEG_VIDEO_ASPECT;
46*4882a593Smuzhiyun seq_puts(s, " |-[parameters]\n");
47*4882a593Smuzhiyun seq_printf(s, " | |- %s\n"
48*4882a593Smuzhiyun " | |- bitrate=%d bps\n"
49*4882a593Smuzhiyun " | |- GOP size=%d\n"
50*4882a593Smuzhiyun " | |- video aspect=%s\n"
51*4882a593Smuzhiyun " | |- framerate=%d/%d\n",
52*4882a593Smuzhiyun v4l2_ctrl_get_menu(bitrate_mode)[ctrls->bitrate_mode],
53*4882a593Smuzhiyun ctrls->bitrate,
54*4882a593Smuzhiyun ctrls->gop_size,
55*4882a593Smuzhiyun v4l2_ctrl_get_menu(aspect)[ctrls->aspect],
56*4882a593Smuzhiyun ctrls->time_per_frame.denominator,
57*4882a593Smuzhiyun ctrls->time_per_frame.numerator);
58*4882a593Smuzhiyun
59*4882a593Smuzhiyun entropy = V4L2_CID_MPEG_VIDEO_H264_ENTROPY_MODE;
60*4882a593Smuzhiyun vui_sar = V4L2_CID_MPEG_VIDEO_H264_VUI_SAR_IDC;
61*4882a593Smuzhiyun sei_fp = V4L2_CID_MPEG_VIDEO_H264_SEI_FP_ARRANGEMENT_TYPE;
62*4882a593Smuzhiyun if (stream->streamformat == V4L2_PIX_FMT_H264) {
63*4882a593Smuzhiyun seq_printf(s, " | |- %s entropy mode\n"
64*4882a593Smuzhiyun " | |- CPB size=%d kB\n"
65*4882a593Smuzhiyun " | |- DCT8x8 enable=%s\n"
66*4882a593Smuzhiyun " | |- qpmin=%d\n"
67*4882a593Smuzhiyun " | |- qpmax=%d\n"
68*4882a593Smuzhiyun " | |- PAR enable=%s\n"
69*4882a593Smuzhiyun " | |- PAR id=%s\n"
70*4882a593Smuzhiyun " | |- SEI frame packing enable=%s\n"
71*4882a593Smuzhiyun " | |- SEI frame packing type=%s\n",
72*4882a593Smuzhiyun v4l2_ctrl_get_menu(entropy)[ctrls->entropy_mode],
73*4882a593Smuzhiyun ctrls->cpb_size,
74*4882a593Smuzhiyun ctrls->dct8x8 ? "true" : "false",
75*4882a593Smuzhiyun ctrls->qpmin,
76*4882a593Smuzhiyun ctrls->qpmax,
77*4882a593Smuzhiyun ctrls->vui_sar ? "true" : "false",
78*4882a593Smuzhiyun v4l2_ctrl_get_menu(vui_sar)[ctrls->vui_sar_idc],
79*4882a593Smuzhiyun ctrls->sei_fp ? "true" : "false",
80*4882a593Smuzhiyun v4l2_ctrl_get_menu(sei_fp)[ctrls->sei_fp_type]);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun if (ctx->sys_errors || ctx->encode_errors || ctx->frame_errors) {
84*4882a593Smuzhiyun seq_puts(s, " |\n |-[errors]\n");
85*4882a593Smuzhiyun seq_printf(s, " | |- system=%d\n"
86*4882a593Smuzhiyun " | |- encoding=%d\n"
87*4882a593Smuzhiyun " | |- frame=%d\n",
88*4882a593Smuzhiyun ctx->sys_errors,
89*4882a593Smuzhiyun ctx->encode_errors,
90*4882a593Smuzhiyun ctx->frame_errors);
91*4882a593Smuzhiyun }
92*4882a593Smuzhiyun
93*4882a593Smuzhiyun seq_puts(s, " |\n |-[performances]\n");
94*4882a593Smuzhiyun seq_printf(s, " | |- frames encoded=%d\n"
95*4882a593Smuzhiyun " | |- avg HW processing duration (0.1ms)=%d [min=%d, max=%d]\n"
96*4882a593Smuzhiyun " | |- avg encoding period (0.1ms)=%d [min=%d, max=%d]\n"
97*4882a593Smuzhiyun " | |- avg fps (0.1Hz)=%d\n"
98*4882a593Smuzhiyun " | |- max reachable fps (0.1Hz)=%d\n"
99*4882a593Smuzhiyun " | |- avg bitrate (kbps)=%d [min=%d, max=%d]\n"
100*4882a593Smuzhiyun " | |- last bitrate (kbps)=%d\n",
101*4882a593Smuzhiyun dbg->cnt_duration,
102*4882a593Smuzhiyun dbg->avg_duration,
103*4882a593Smuzhiyun dbg->min_duration,
104*4882a593Smuzhiyun dbg->max_duration,
105*4882a593Smuzhiyun dbg->avg_period,
106*4882a593Smuzhiyun dbg->min_period,
107*4882a593Smuzhiyun dbg->max_period,
108*4882a593Smuzhiyun dbg->avg_fps,
109*4882a593Smuzhiyun dbg->max_fps,
110*4882a593Smuzhiyun dbg->avg_bitrate,
111*4882a593Smuzhiyun dbg->min_bitrate,
112*4882a593Smuzhiyun dbg->max_bitrate,
113*4882a593Smuzhiyun dbg->last_bitrate);
114*4882a593Smuzhiyun }
115*4882a593Smuzhiyun
116*4882a593Smuzhiyun /*
117*4882a593Smuzhiyun * performance debug info
118*4882a593Smuzhiyun */
hva_dbg_perf_begin(struct hva_ctx * ctx)119*4882a593Smuzhiyun void hva_dbg_perf_begin(struct hva_ctx *ctx)
120*4882a593Smuzhiyun {
121*4882a593Smuzhiyun u64 div;
122*4882a593Smuzhiyun u32 period;
123*4882a593Smuzhiyun u32 bitrate;
124*4882a593Smuzhiyun struct hva_ctx_dbg *dbg = &ctx->dbg;
125*4882a593Smuzhiyun ktime_t prev = dbg->begin;
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun dbg->begin = ktime_get();
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun if (dbg->is_valid_period) {
130*4882a593Smuzhiyun /* encoding period */
131*4882a593Smuzhiyun div = (u64)ktime_us_delta(dbg->begin, prev);
132*4882a593Smuzhiyun do_div(div, 100);
133*4882a593Smuzhiyun period = (u32)div;
134*4882a593Smuzhiyun dbg->min_period = min(period, dbg->min_period);
135*4882a593Smuzhiyun dbg->max_period = max(period, dbg->max_period);
136*4882a593Smuzhiyun dbg->total_period += period;
137*4882a593Smuzhiyun dbg->cnt_period++;
138*4882a593Smuzhiyun
139*4882a593Smuzhiyun /*
140*4882a593Smuzhiyun * minimum and maximum bitrates are based on the
141*4882a593Smuzhiyun * encoding period values upon a window of 32 samples
142*4882a593Smuzhiyun */
143*4882a593Smuzhiyun dbg->window_duration += period;
144*4882a593Smuzhiyun dbg->cnt_window++;
145*4882a593Smuzhiyun if (dbg->cnt_window >= 32) {
146*4882a593Smuzhiyun /*
147*4882a593Smuzhiyun * bitrate in kbps = (size * 8 / 1000) /
148*4882a593Smuzhiyun * (duration / 10000)
149*4882a593Smuzhiyun * = size * 80 / duration
150*4882a593Smuzhiyun */
151*4882a593Smuzhiyun if (dbg->window_duration > 0) {
152*4882a593Smuzhiyun div = (u64)dbg->window_stream_size * 80;
153*4882a593Smuzhiyun do_div(div, dbg->window_duration);
154*4882a593Smuzhiyun bitrate = (u32)div;
155*4882a593Smuzhiyun dbg->last_bitrate = bitrate;
156*4882a593Smuzhiyun dbg->min_bitrate = min(bitrate,
157*4882a593Smuzhiyun dbg->min_bitrate);
158*4882a593Smuzhiyun dbg->max_bitrate = max(bitrate,
159*4882a593Smuzhiyun dbg->max_bitrate);
160*4882a593Smuzhiyun }
161*4882a593Smuzhiyun dbg->window_stream_size = 0;
162*4882a593Smuzhiyun dbg->window_duration = 0;
163*4882a593Smuzhiyun dbg->cnt_window = 0;
164*4882a593Smuzhiyun }
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun
167*4882a593Smuzhiyun /*
168*4882a593Smuzhiyun * filter sequences valid for performance:
169*4882a593Smuzhiyun * - begin/begin (no stream available) is an invalid sequence
170*4882a593Smuzhiyun * - begin/end is a valid sequence
171*4882a593Smuzhiyun */
172*4882a593Smuzhiyun dbg->is_valid_period = false;
173*4882a593Smuzhiyun }
174*4882a593Smuzhiyun
hva_dbg_perf_end(struct hva_ctx * ctx,struct hva_stream * stream)175*4882a593Smuzhiyun void hva_dbg_perf_end(struct hva_ctx *ctx, struct hva_stream *stream)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun struct device *dev = ctx_to_dev(ctx);
178*4882a593Smuzhiyun u64 div;
179*4882a593Smuzhiyun u32 duration;
180*4882a593Smuzhiyun u32 bytesused;
181*4882a593Smuzhiyun u32 timestamp;
182*4882a593Smuzhiyun struct hva_ctx_dbg *dbg = &ctx->dbg;
183*4882a593Smuzhiyun ktime_t end = ktime_get();
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /* stream bytesused and timestamp in us */
186*4882a593Smuzhiyun bytesused = vb2_get_plane_payload(&stream->vbuf.vb2_buf, 0);
187*4882a593Smuzhiyun div = stream->vbuf.vb2_buf.timestamp;
188*4882a593Smuzhiyun do_div(div, 1000);
189*4882a593Smuzhiyun timestamp = (u32)div;
190*4882a593Smuzhiyun
191*4882a593Smuzhiyun /* encoding duration */
192*4882a593Smuzhiyun div = (u64)ktime_us_delta(end, dbg->begin);
193*4882a593Smuzhiyun
194*4882a593Smuzhiyun dev_dbg(dev,
195*4882a593Smuzhiyun "%s perf stream[%d] dts=%d encoded using %d bytes in %d us",
196*4882a593Smuzhiyun ctx->name,
197*4882a593Smuzhiyun stream->vbuf.sequence,
198*4882a593Smuzhiyun timestamp,
199*4882a593Smuzhiyun bytesused, (u32)div);
200*4882a593Smuzhiyun
201*4882a593Smuzhiyun do_div(div, 100);
202*4882a593Smuzhiyun duration = (u32)div;
203*4882a593Smuzhiyun
204*4882a593Smuzhiyun dbg->min_duration = min(duration, dbg->min_duration);
205*4882a593Smuzhiyun dbg->max_duration = max(duration, dbg->max_duration);
206*4882a593Smuzhiyun dbg->total_duration += duration;
207*4882a593Smuzhiyun dbg->cnt_duration++;
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun /*
210*4882a593Smuzhiyun * the average bitrate is based on the total stream size
211*4882a593Smuzhiyun * and the total encoding periods
212*4882a593Smuzhiyun */
213*4882a593Smuzhiyun dbg->total_stream_size += bytesused;
214*4882a593Smuzhiyun dbg->window_stream_size += bytesused;
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun dbg->is_valid_period = true;
217*4882a593Smuzhiyun }
218*4882a593Smuzhiyun
hva_dbg_perf_compute(struct hva_ctx * ctx)219*4882a593Smuzhiyun static void hva_dbg_perf_compute(struct hva_ctx *ctx)
220*4882a593Smuzhiyun {
221*4882a593Smuzhiyun u64 div;
222*4882a593Smuzhiyun struct hva_ctx_dbg *dbg = &ctx->dbg;
223*4882a593Smuzhiyun
224*4882a593Smuzhiyun if (dbg->cnt_duration > 0) {
225*4882a593Smuzhiyun div = (u64)dbg->total_duration;
226*4882a593Smuzhiyun do_div(div, dbg->cnt_duration);
227*4882a593Smuzhiyun dbg->avg_duration = (u32)div;
228*4882a593Smuzhiyun } else {
229*4882a593Smuzhiyun dbg->avg_duration = 0;
230*4882a593Smuzhiyun }
231*4882a593Smuzhiyun
232*4882a593Smuzhiyun if (dbg->total_duration > 0) {
233*4882a593Smuzhiyun div = (u64)dbg->cnt_duration * 100000;
234*4882a593Smuzhiyun do_div(div, dbg->total_duration);
235*4882a593Smuzhiyun dbg->max_fps = (u32)div;
236*4882a593Smuzhiyun } else {
237*4882a593Smuzhiyun dbg->max_fps = 0;
238*4882a593Smuzhiyun }
239*4882a593Smuzhiyun
240*4882a593Smuzhiyun if (dbg->cnt_period > 0) {
241*4882a593Smuzhiyun div = (u64)dbg->total_period;
242*4882a593Smuzhiyun do_div(div, dbg->cnt_period);
243*4882a593Smuzhiyun dbg->avg_period = (u32)div;
244*4882a593Smuzhiyun } else {
245*4882a593Smuzhiyun dbg->avg_period = 0;
246*4882a593Smuzhiyun }
247*4882a593Smuzhiyun
248*4882a593Smuzhiyun if (dbg->total_period > 0) {
249*4882a593Smuzhiyun div = (u64)dbg->cnt_period * 100000;
250*4882a593Smuzhiyun do_div(div, dbg->total_period);
251*4882a593Smuzhiyun dbg->avg_fps = (u32)div;
252*4882a593Smuzhiyun } else {
253*4882a593Smuzhiyun dbg->avg_fps = 0;
254*4882a593Smuzhiyun }
255*4882a593Smuzhiyun
256*4882a593Smuzhiyun if (dbg->total_period > 0) {
257*4882a593Smuzhiyun /*
258*4882a593Smuzhiyun * bitrate in kbps = (video size * 8 / 1000) /
259*4882a593Smuzhiyun * (video duration / 10000)
260*4882a593Smuzhiyun * = video size * 80 / video duration
261*4882a593Smuzhiyun */
262*4882a593Smuzhiyun div = (u64)dbg->total_stream_size * 80;
263*4882a593Smuzhiyun do_div(div, dbg->total_period);
264*4882a593Smuzhiyun dbg->avg_bitrate = (u32)div;
265*4882a593Smuzhiyun } else {
266*4882a593Smuzhiyun dbg->avg_bitrate = 0;
267*4882a593Smuzhiyun }
268*4882a593Smuzhiyun }
269*4882a593Smuzhiyun
270*4882a593Smuzhiyun /*
271*4882a593Smuzhiyun * device debug info
272*4882a593Smuzhiyun */
273*4882a593Smuzhiyun
device_show(struct seq_file * s,void * data)274*4882a593Smuzhiyun static int device_show(struct seq_file *s, void *data)
275*4882a593Smuzhiyun {
276*4882a593Smuzhiyun struct hva_dev *hva = s->private;
277*4882a593Smuzhiyun
278*4882a593Smuzhiyun seq_printf(s, "[%s]\n", hva->v4l2_dev.name);
279*4882a593Smuzhiyun seq_printf(s, "registered as /dev/video%d\n", hva->vdev->num);
280*4882a593Smuzhiyun
281*4882a593Smuzhiyun return 0;
282*4882a593Smuzhiyun }
283*4882a593Smuzhiyun
encoders_show(struct seq_file * s,void * data)284*4882a593Smuzhiyun static int encoders_show(struct seq_file *s, void *data)
285*4882a593Smuzhiyun {
286*4882a593Smuzhiyun struct hva_dev *hva = s->private;
287*4882a593Smuzhiyun unsigned int i = 0;
288*4882a593Smuzhiyun
289*4882a593Smuzhiyun seq_printf(s, "[encoders]\n|- %d registered encoders:\n",
290*4882a593Smuzhiyun hva->nb_of_encoders);
291*4882a593Smuzhiyun
292*4882a593Smuzhiyun while (hva->encoders[i]) {
293*4882a593Smuzhiyun seq_printf(s, "|- %s: %4.4s => %4.4s\n", hva->encoders[i]->name,
294*4882a593Smuzhiyun (char *)&hva->encoders[i]->pixelformat,
295*4882a593Smuzhiyun (char *)&hva->encoders[i]->streamformat);
296*4882a593Smuzhiyun i++;
297*4882a593Smuzhiyun }
298*4882a593Smuzhiyun
299*4882a593Smuzhiyun return 0;
300*4882a593Smuzhiyun }
301*4882a593Smuzhiyun
last_show(struct seq_file * s,void * data)302*4882a593Smuzhiyun static int last_show(struct seq_file *s, void *data)
303*4882a593Smuzhiyun {
304*4882a593Smuzhiyun struct hva_dev *hva = s->private;
305*4882a593Smuzhiyun struct hva_ctx *last_ctx = &hva->dbg.last_ctx;
306*4882a593Smuzhiyun
307*4882a593Smuzhiyun if (last_ctx->flags & HVA_FLAG_STREAMINFO) {
308*4882a593Smuzhiyun seq_puts(s, "[last encoding]\n");
309*4882a593Smuzhiyun
310*4882a593Smuzhiyun hva_dbg_perf_compute(last_ctx);
311*4882a593Smuzhiyun format_ctx(s, last_ctx);
312*4882a593Smuzhiyun } else {
313*4882a593Smuzhiyun seq_puts(s, "[no information recorded about last encoding]\n");
314*4882a593Smuzhiyun }
315*4882a593Smuzhiyun
316*4882a593Smuzhiyun return 0;
317*4882a593Smuzhiyun }
318*4882a593Smuzhiyun
regs_show(struct seq_file * s,void * data)319*4882a593Smuzhiyun static int regs_show(struct seq_file *s, void *data)
320*4882a593Smuzhiyun {
321*4882a593Smuzhiyun struct hva_dev *hva = s->private;
322*4882a593Smuzhiyun
323*4882a593Smuzhiyun hva_hw_dump_regs(hva, s);
324*4882a593Smuzhiyun
325*4882a593Smuzhiyun return 0;
326*4882a593Smuzhiyun }
327*4882a593Smuzhiyun
328*4882a593Smuzhiyun #define hva_dbg_create_entry(name) \
329*4882a593Smuzhiyun debugfs_create_file(#name, 0444, hva->dbg.debugfs_entry, hva, \
330*4882a593Smuzhiyun &name##_fops)
331*4882a593Smuzhiyun
332*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(device);
333*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(encoders);
334*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(last);
335*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(regs);
336*4882a593Smuzhiyun
hva_debugfs_create(struct hva_dev * hva)337*4882a593Smuzhiyun void hva_debugfs_create(struct hva_dev *hva)
338*4882a593Smuzhiyun {
339*4882a593Smuzhiyun hva->dbg.debugfs_entry = debugfs_create_dir(HVA_NAME, NULL);
340*4882a593Smuzhiyun
341*4882a593Smuzhiyun hva_dbg_create_entry(device);
342*4882a593Smuzhiyun hva_dbg_create_entry(encoders);
343*4882a593Smuzhiyun hva_dbg_create_entry(last);
344*4882a593Smuzhiyun hva_dbg_create_entry(regs);
345*4882a593Smuzhiyun }
346*4882a593Smuzhiyun
hva_debugfs_remove(struct hva_dev * hva)347*4882a593Smuzhiyun void hva_debugfs_remove(struct hva_dev *hva)
348*4882a593Smuzhiyun {
349*4882a593Smuzhiyun debugfs_remove_recursive(hva->dbg.debugfs_entry);
350*4882a593Smuzhiyun hva->dbg.debugfs_entry = NULL;
351*4882a593Smuzhiyun }
352*4882a593Smuzhiyun
353*4882a593Smuzhiyun /*
354*4882a593Smuzhiyun * context (instance) debug info
355*4882a593Smuzhiyun */
356*4882a593Smuzhiyun
ctx_show(struct seq_file * s,void * data)357*4882a593Smuzhiyun static int ctx_show(struct seq_file *s, void *data)
358*4882a593Smuzhiyun {
359*4882a593Smuzhiyun struct hva_ctx *ctx = s->private;
360*4882a593Smuzhiyun
361*4882a593Smuzhiyun seq_printf(s, "[running encoding %d]\n", ctx->id);
362*4882a593Smuzhiyun
363*4882a593Smuzhiyun hva_dbg_perf_compute(ctx);
364*4882a593Smuzhiyun format_ctx(s, ctx);
365*4882a593Smuzhiyun
366*4882a593Smuzhiyun return 0;
367*4882a593Smuzhiyun }
368*4882a593Smuzhiyun
369*4882a593Smuzhiyun DEFINE_SHOW_ATTRIBUTE(ctx);
370*4882a593Smuzhiyun
hva_dbg_ctx_create(struct hva_ctx * ctx)371*4882a593Smuzhiyun void hva_dbg_ctx_create(struct hva_ctx *ctx)
372*4882a593Smuzhiyun {
373*4882a593Smuzhiyun struct hva_dev *hva = ctx->hva_dev;
374*4882a593Smuzhiyun char name[4] = "";
375*4882a593Smuzhiyun
376*4882a593Smuzhiyun ctx->dbg.min_duration = UINT_MAX;
377*4882a593Smuzhiyun ctx->dbg.min_period = UINT_MAX;
378*4882a593Smuzhiyun ctx->dbg.min_bitrate = UINT_MAX;
379*4882a593Smuzhiyun
380*4882a593Smuzhiyun snprintf(name, sizeof(name), "%d", hva->instance_id);
381*4882a593Smuzhiyun
382*4882a593Smuzhiyun ctx->dbg.debugfs_entry = debugfs_create_file(name, 0444,
383*4882a593Smuzhiyun hva->dbg.debugfs_entry,
384*4882a593Smuzhiyun ctx, &ctx_fops);
385*4882a593Smuzhiyun }
386*4882a593Smuzhiyun
hva_dbg_ctx_remove(struct hva_ctx * ctx)387*4882a593Smuzhiyun void hva_dbg_ctx_remove(struct hva_ctx *ctx)
388*4882a593Smuzhiyun {
389*4882a593Smuzhiyun struct hva_dev *hva = ctx->hva_dev;
390*4882a593Smuzhiyun
391*4882a593Smuzhiyun if (ctx->flags & HVA_FLAG_STREAMINFO)
392*4882a593Smuzhiyun /* save context before removing */
393*4882a593Smuzhiyun memcpy(&hva->dbg.last_ctx, ctx, sizeof(*ctx));
394*4882a593Smuzhiyun
395*4882a593Smuzhiyun debugfs_remove(ctx->dbg.debugfs_entry);
396*4882a593Smuzhiyun }
397